extrema-4.4.5/0000755012702201742730000000000011445144676012223 5ustar spangspangextrema-4.4.5/acinclude.m40000644012702201742730000064050311274636625014424 0ustar spangspang# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- ## Copyright 1996, 1997, 1998, 1999, 2000, 2001 ## Free Software Foundation, Inc. ## Originally by Gordon Matzigkeit , 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 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. # # Check for the wxGTK library. (See http://www.wxwidgets.org) # The output variables WX_CXXFLAGSS and WX_LIBS will contain the # compiler flags and libraries necessary to use wxGTK. # # The user must use --with-wxGTK=DIR which will cause the # macro to look for wx-config in DIR, e.g., # with-wxGTK=/usr/local/wxGTK-2.6.3/build-release # # test -n test if length of string $WX_CONFIG is non-zero # test -d test if $with_wx exists and is a directory # AC_DEFUN([AX_CHECK_WX], [ AC_ARG_WITH([wxGTK],AC_HELP_STRING([--with-wxGTK(=DIR)],[use the wxGTK wxWidgets package (in DIR)]),[],[]) if test "$with_wxGTK" = "no"; then AC_MSG_ERROR([fatal error: wxGTK is required to build extrema]) elif test "$with_wxGTK" = ""; then AC_PATH_PROG(WX_CONFIG,wx-config,[],[$PATH]) if test -n "$WX_CONFIG"; then WX_CXXFLAGS=`$WX_CONFIG --cxxflags` WX_LIBS=`$WX_CONFIG --libs` else AC_MSG_ERROR([fatal error: could not find wx-config. wxGTK is required to build extrema]) fi else AC_PATH_PROG(WX_CONFIG,wx-config,[],[$with_wxGTK:$PATH]) if test -n "$WX_CONFIG"; then WX_CXXFLAGS=`$WX_CONFIG --cxxflags` WX_LIBS=`$WX_CONFIG --libs` else AC_MSG_ERROR([fatal error: could not find wx-config. wxGTK is required to build extrema]) fi fi AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_LIBS) ]) # # Check for the MUon Data (MUD) library. (See http://musr.org/mud/) # The output variables MUD_CXXFLAGSS and MUD_LIB will contain the # compiler flags and libraries necessary to use the MUD library, # e.g., # with-MUD=/usr/local/mud # AC_DEFUN([AX_CHECK_MUD], [ AC_ARG_WITH(MUD,AC_HELP_STRING([--with-MUD(=DIR)],[use the MUon Data package (in DIR)]),,with_MUD=no) if test "$with_MUD" != "no" && test "$with_MUD" != ""; then MUD_CXXFLAGS="-DHAVE_MUD -I$with_MUD/src" MUD_LIB="-L$with_MUD/lib -lmud" fi AC_SUBST(MUD_CXXFLAGS) AC_SUBST(MUD_LIB) ]) # # Check for the Minuit library. (See http://seal.web.cern.ch/seal/snapshot/work-packages/mathlibs/minuit/) # The output variables MINUIT_CXXFLAGSS and MINUIT_LIB will contain the # compiler flags and libraries necessary to use the Minuit library, # e.g., # with-MINUIT=/usr/local # AC_DEFUN([AX_CHECK_MINUIT], [ AC_ARG_WITH(MINUIT,AC_HELP_STRING([--with-MINUIT(=DIR)],[use the Minuit minimization package (in DIR)]),,with_MINUIT=no) if test "$with_MINUIT" != "no" && test "$with_MINUIT" != ""; then MINUIT_CXXFLAGS="-DHAVE_MINUIT -I$with_MINUIT/include/Minuit" MINUIT_LIB="-L$with_MINUIT/lib -llcg_Minuit" fi AC_SUBST(MINUIT_CXXFLAGS) AC_SUBST(MINUIT_LIB) ]) AC_DEFUN([AX_SETCXXFLAGS],[ EX_CXXFLAGS='-I${top_srcdir}/src -I${top_srcdir}/src/Commands -I${top_srcdir}/src/Expression -I${top_srcdir}/src/Functions -I${top_srcdir}/src/Graphics -I${top_srcdir}/src/Operators -I${top_srcdir}/src/Parsing -I${top_srcdir}/src/Utilities -I${top_srcdir}/src/Variables -I${top_srcdir}/src/wxForms -DEX_DATADIR="\"$(datadir)\"" -DEX_BINDIR="\"$(bindir)\""' AC_SUBST(EX_CXXFLAGS) ]) # serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_LINK_IFELSE(AC_LANG_PROGRAM,[ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD else $2=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # -------------------- AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_unknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && test "X$CXX" != "Xno"; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 dll's AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- #- set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognise shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognise a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) case $host_cpu in alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) lt_cv_deplibs_check_method=pass_all ;; *) # glibc up to 2.1.1 does not perform some relocations on ARM # this will be overridden with pass_all, but let us keep it just in case lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; esac lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' else lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided and an installed libltdl is not found, it is # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # -------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' _LT_AC_SYS_COMPILER # # Check for any special shared library compilation flags. # _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= if test "$GCC" = no; then case $host_os in sco3.2v5*) _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' ;; esac fi if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : else AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no fi fi # # Check to make sure the static flag actually works. # AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) # Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; darwin* | rhapsody*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' ;; esac fi ;; esac output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sco*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 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 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. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris* | sysv5*) symcode='[[BDRT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux*) case $CC in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; sco3.2v5*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi4*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; sco3.2v5*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4.2uw2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv5*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done SED=$lt_cv_path_SED ]) AC_MSG_RESULT([$SED]) ]) extrema-4.4.5/COPYING0000644012702201742730000004311011274636625013255 0ustar spangspang GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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 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 Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. extrema-4.4.5/doc/0000755012702201742730000000000011274636625012770 5ustar spangspangextrema-4.4.5/doc/Data_Analysis.doc0000644012702201742730000100600011274636625016170 0ustar spangspangࡱ> 7 SbjbjUU "7|7|Nl4!4!4!4!!!!"77787T8l"X88888 ::4:eXgXgXgXgXgXgX$\ ^X-!:: :::X+=4!4!88gX+=+=+=:4!8!8eX+=:eX+=~ +=FP@!6!W8|8 @="7<4W8WlX0XUW4_<F4_W+=""4!4!4!4!Extrema Tutorial Data Analysis  Introduction Extrema provides numerous tools for data analysis, , including data transformation tools, filtering tools, cutting and selection tools. Elementary data manipulation is done using Extremas built-in expression evaluation capabilities. Any expression involving a variable will return a similar variable, each element of which has been modified by the expression; the return value of the expression can be saved to another variable, or operated on directly. Examples: Y = SIN(X)^2 + COS(X)^2 ! save expression results in variable Y GRAPH X 3*X^2-6X+2 ! graph expression directly Expressions are built up of constants, variables, operators, and functions, which can be combined in any algebraic syntax, as in the examples above. Data Representation Data is stored internally in variables, which have names that you use to reference the data they contain. Except for a few automatically generated variables, these names are chosen by the user. The first character of a variable name must be an alphabetic character, that is, A to Z, and the maximum number of characters in a name is thirty-two (32). Except for these restrictions, variable names can be any combination of: alphabetic characters (ABC XYZ), digits (0123456789), underscore (_), and dollar sign ($). NoteVariable names are case-insensitive, e.g., variable x is the same as X. Function names are reserved names and cannot be used as variable names.Variables can contain character data or numeric data. Numeric data are always stored as double-precision real values. Character (or string) variables can be one of the following types: string scalar: a simple string of text string array: an array of text strings Numeric variables can be one of the following types: scalar: a number vector: a one-dimensional array of numbers matrix: a two-dimensional array of numbers tensor: a three-dimensional array of numbers (to be implemented) The contents of arrays are indexed sequentially, with a starting index of one (1). Except for physical memory limitations, there is no limit to the number of variables, or to the length of strings, or to the size of arrays. Addressing parts of arrays To refer to an entire array, simply use the variables name. To select an individual element from the array, provide the index of the element in square brackets: x[8] ! 8th element of vector x y[2,6] ! value from 2nd row, 6th column of matrix y In all of the above cases, you are referring to a single value, i.e., a scalar. You can also specify a range of indices using the colon (:) character: x[8:20] ! 8th through 20th elements of vector x y[1:10,1] ! first 10 rows from the first column of y It is also possible to replace any part of an index with a mathematical expression. For example: x[2^3:10*2] ! 8th through 20th elements of vector x y[1:sqrt(100),1] ! first 10 rows from the first column of y Variables can also be used in indices. For example, suppose you have a vector z which holds the values 1, 2,, 10. The following are then valid: x[z[2]^3:z[#]*2] ! 8th through 20th elements of vector x y[z,1] ! first 10 rows from the first column of y Such expressions can result in scalars, arrays, vectors, or matrices, depending on the number of dimensions of the result. The special characters * and # are also available for use in indices. For example: x[*] ! all values from vector x x[#] ! the last value from vector x x[#-1] ! the next to last value from vector x m[*,*] ! all rows and all columns of matrix m m[*,#] ! all rows and the last column of matrix m m[*,1:#-1] ! all rows and all but last column of matrix m Constants You can type numeric values or constants anywhere a scalar variable or value is expected. Constant arrays are expressed as a list of values inside square brackets. When typing out vector or matrix values, separate successive indexes with a comma, and successive values within an index with a semicolon. 5.03E-8 ! scalar value [1;2;4;8] ! vector with 4 values [1;0;0, 0;1;0, 0;0;1] ! 3 by 3 identity matrix You can also use the [start:stop:step] notation to specify regular sequences of values with which to fill the variable: [0:2*pi:0.1] ! vector from 0 to 2( in steps of 0.1 [10:-10:-2] ! descending sequence from 10 to 10 in steps of 2 Expressions Extrema allows you to use mathematical expressions anywhere it would expect a variable or value, provided the expression evaluates to the expected type. Simple expressions involving dimensioned variables generally return a value of the same dimension. Thus, if x has 10 values, then the expression sin(x)+1 also has 10 values. Other examples: m[x,#-2:#] ! the rows denoted in x, and the last 3 columns of m x*m[n,*] ! x times the nth row of m sin(a+b) ! the sines of the sums of respective values in a and b x^2*sin(x)+1 ! a non-linear function of the values in x NoteThere is no limit to the length or complexity of a mathematical expression in Extrema .You can also index the results of an expression, e.g., (sin(x)+1)[4:8] ! selects 4th through 8th values of the expression Generating Data Commonly, you will need to create data spontaneously. In simple cases, you can type in the data directly. Usually, however, you will be working with data sizes that make this approach too tedious. There are numerous methods you can use for bulk data generation. Sequences Simple sequences can be generated using the [start:stop:step] array notation. pi = acos(-1) ! define scalar pi with value equal to ( X = [0:pi:.01] ! make a sequence of values from 0 to ( in increments of 0.01 You can create a regular sequence of values using the GENERATE facility. The generated data can be specified using any of the following methods: minimum value, maximum value, number of values minimum value, maximum value, step size minimum value, step size, number of values You can also request random values instead of a regular step size. Operators In addition to the simple arithmetic operators: + -plus - -minus * -times / -divide ^ -exponentiation () -grouping there are also special vector and matrix operators: >< - outer product <> - inner product <- - matrix transpose >- - matrix reflect /| - vector union /& - vector intersection // -append and a set of Boolean operators that return true (1) or false (0) values: | - or || - exclusive or & - and \ - not = - equal to ~= - not equal to > - greater than < - less than >= - greater than or equal to <= - less than or equal to Functions By applying an expression to an already-existing variable, you can generate a new variable in which every element of the input variable has been modified by the expression. Capture this data in a new variable by simply setting the new variable to equal the expression: y = 10*SIN(x) ! If x is a vector, then so is y If your source data is a monotonically increasing sequence that serves as the dependent variable, then you will get a fair representation of the function itself over that range. For instance, to produce data representing the function SIN(x) over the range 0 to 2(: pi = acos(-1) x = [0:2*pi:0.01] y = sin(x) Extrema has over 200 built-in functions that can perform a wide range of other operations on your data. Examples include: conventional mathematical functions, such as the trigonometric functions, logarithms, roots and exponentials, and rounding functions. advanced functions, such as Bessel, Clebsch-Gordan, etc. calculus functions, such as integral and derivative. probability functions programmers' functions, such as random number generation, variable tests, looping functions array and matrix functions, such as where, eigenvectors and eigenvalues, etc. string functions, such as case, date/time, etc. In all cases, these functions accept data of a certain type, and return data of a certain type; they may be freely used in any expression, so long as the types they return make sense in the expression context. For further information, consult the Online Help or the Extrema Command Reference. Fitting Fitting data, that is, describing a set of data points as some sort of function, is one of the most important forms of data analysis. Extrema's data-fitting capabilities are sophisticated and flexible; complete details are provided in the Extrema Command Reference, but some simple examples are given here. Smoothing Smoothing is a simple way of fitting a set of data points to a smooth curve. There are several methods of calculating these smooth curves, notably cubic splines under tension (SMOOTH and SPLSMOOTH functions), and Saviztky-Golay filters (SAVGOL function).  Smoothing functions return a smoothed set of data, that is, they accept your data as input, and output a new set of values that fall on a smooth curve of the appropriate type. They can operate on any shape of data without any prior knowledge of the data's shape. (In some cases, there is a requirement that the data be monotonically increasing.) They will not, however, return an actual algebraic function describing the shape of your data. For this you need to do a proper fit (see below). There are also interpolation functions that will fill in missing data using similar smoothing techniques (INTERP and SPLINTERP functions. Fitting to a function To describe your data as a function, you'll need to know in advance what function you will be fitting to. This function will be expressed with a number of free parameters, whose precise values are unknown. The purpose of the fit is to determine what values of those free parameters best match the data. NoteFitting is an uncertain process by its very nature. There is no guarantee that an appropriate fit will be found in all cases, and there is no guarantee that there is only one such fit that describes the data.A free parameter is like a scalar variable, except that instead of being set by you (or your data analysis operations), it is set by Extrema in the course of making the fit. This difference in behaviour means that free parameters are declared differently, so that Extrema knows it can vary the parameter, instead of treating it as a fixed constant in the fitting expression. SET PLOTSYMBOLCOLOR RED ! GRAPH X Y ! graph the raw data SCALAR\FIT A B ! declare free parameters FIT Y=A+B*X ! perform the fit SET PLOTSYMBOL 0 ! graph the fit function as a line SET CURVECOLOR BLUE ! GRAPH X A+B*X !  Free parameters should be initialized to an appropriate guess value, from which the fit will begin. In simple cases, the actual value of the guess is not terribly important; Extrema will find the correct value regardless. In more complex cases, the initial guess will affect how the fit progresses, and could affect the final result. In other words, in some cases, different fits can be found depending on where you start, so choosing a reasonable guess to initialize the free parameters can be important. Once the fit is complete, the free parameters will have their fitted values. If Extrema failed to find a good fit, the free parameters will have the last values Extrema tried to fit with; or, optionally, they can be reset to their initial values upon failure. Normally, fitting results in multiple lines of text output describing the fit. The values of the free parameters, and various other values describing the accuracy of the fit, are all contained in this output. Extrema can optionally write some of this information into variables, for access by scripts and expressions later in the analysis process. Fitting different data segments to different functions In some cases you will want to divide the data into segments or groups, and fit each group separately. For example, suppose you want to fit two line segments to the data such that they join at one end point. Below, on the left, is an example where the two segments are forced to join and, on the right, an example where they are allowed to float. X=[1:19] Y=[1;2;3;4;5;6;7;8;9;10;9;8;7;6;5;4;3;2;1]+5*ran(x) Window 5 Set plotsymbol 1 Graph x y Scalar\fit a b c d X0 = 10 Fit y=(a+b*x)*(x<=x0)+(c+d*x)*(x>=x0)+(a+b*x-c-d*x)*1000*(x=x0) Set plotsymbol 0 I1 = where(x<=x0) I2 = where(x>=x0) Y1 = a+b*x Y2 = c+d*x Set curvecolor red Graph\overlay x[i1] y1[i1] Graph\overlay x[i2] y2[i2] Window 7 Set plotsymbol 1 Graph x y Fit y=( a+b*x)*(x<=x0)+(c+d*x)*(x>=x0) Set plotsymbol 0 Y1 = a+b*x Y2 = c+d*x Set curvecolor red Graph\overlay x[i1] y1[i1] Graph\overlay x[i2] y2[i2] Replot\all  Binning Binning data is a means of converting one-dimensional data into two-dimensional data (BIN command), or two-dimensional into three-dimensional (BIN2D command). Simply put, binning counts the data points falling into a certain range. This results in a vector (or vectors, in the 2-D case) describing the ranges (the bins), and a second vector (or matrix) describing the counts. Simple binning is straightforward. An input vector of values is taken as input, and two output vectors containing the bins and the counts are returned. BIN X XBIN XCOUNT ! bin the values in X GRAPH\HISTOGRAM XBIN XCOUNT There are many binning options, among them: various options for defining the bin boundaries the averages of the values in each bin can be returned values can be counted conditionally counts can be weighted Lagrange binning Interpolation There are many cases where one needs to interpolate data, for instance: estimating missing data values converting an irregular data sample to a monotonically increasing data sample representing a set of data points as a smooth function Interpolation presumes the data can be represented as a smooth function, and that this function passes through all of the data points. Interpolation therefore consists of looking up the y-values of this function for any x that is not represented in the original data. This is normally done by means of the INTERP function, which returns a data vector containing the interpolated values. The INTERP function accepts three arguments: x-vector, a monotonically increasing set of x values. y-vector, the values of y at each of the above x values. x-interpolation points, a set of x-values at which to interpolate new y-values. The method of interpolation is normally interpolating splines, but an optional fourth argument can be used to select an alternate interpolation method: LINEAR simple linear interpolation LAGRANGE general Lagrange interpolation FC Fritsch and Carlson method of monotone piecewise cubic interpolation If one's starting data is not monotonically increasing, then one can use the SPLINTERP(x,y,n) function instead. It accepts an arbitrary set of x and y values, and a number of points to interpolate. The output is a 2-column matrix, the first column of which gives the interpolated points (i.e., x-values), and the second of which gives the interpolated values (i.e., y-values). 2-D interpolation Beginning with a scattered set of 3-D data points in three vectors (say, x, y, and z), you can interpolate a regular matrix using the GRID command. The three vectors are assumed to represent scattered points, where z[i] is the altitude corresponding to the coordinates (x[i],y[i]). The set of scattered data points is used to construct a Thiessen triangulation of the plane and a regular matrix, m, is interpolated. For example, the following script produces the pictures below. X=[1;0;1;0;0.2;0.3;0.5;0.8] Y=[5;5;0;0;1;1.5;2.5;4] Z=[10;10;10;10;-100;10;-100;500] GRID\XYOUT X Y Z M XOUT YOUT SET PLOTSYMBOL 14 GRAPH X Y ! produce the graph on the left SET PLOTSYMBOL 0 DENSITY\DITHER XOUT YOUT M ! produce the density plot  Integration Integration is the summing of areas and volumes under curves and surfaces. Extrema provides you with several tools to accomplish this. The INTEGRAL function is the simplest method; it accepts two vectors representing the x-values (monotonically increasing) and y-values of the function to be integrated. The return value is the integrated function, i.e., the integral at each x-value; there is one additional value appended to the end of this output vector, and that is the integral over the full range of x. For example, to find the area under cos3(x)+sin4(x) for 0 d" x d" (: PI = ACOS(-1) X = [0:PI:.1] YI = INTEGRAL(X,COS(X)^3+SIN(X)^4) VALUE = YI[#]  Other functions Please refer to the DERIV function (derivative of a function); and the AREA function (area within a polygon), and the VOLUME function (volume under a surface). There are also numerous special integration functions, such as elliptic integral, Fresnel integral, exponential integral, sine integral (SININT) and cosine integral (COSINT). Two-dimensional integration is typically done using the VOLUME function, which can operate on a variety of data types: vectors containing scattered (x,y) points vectors containing scattered polar coordinate points (angle, radius) regular matrix Data selection Filtering, cutting, and other forms of conditional data selection are a big part of many analysis tasks. There are many ways this can be accomplished in Extrema. Many of these techniques involve selecting subsets of vectors, matrices, or tensors, according to some arbitrary condition. A trivial form of data selection simply consists of selecting the desired indexes, for example: good_data = m[#,*] ! only the last column of the matrix is good If the good data is scattered throughout a vector (say data), and you have the indexes of the good values in another vector good, then you can select the good data using the notation: good_data = data(good) Determining which indexes are good and which are bad is the tricky part. The WHERE function is invaluable for this. It accepts a vector as input, and returns the indexes where the input vector was not equal to zero. The input vector is usually some kind of Boolean operation on the actual data vector, such that a vector of true/false (1/0) values is actually passed to the WHERE function. The return vector of indexes is then used to select the values from the original data vectors. The power of this function is best illustrated with a few simple examples: Example 1: select the data points within 1 unit of the origin We have a scattered set of data points in the vectors x and y, but we want only the ones that lie within the unit circle, i.e., the points that satisfy SQRT(x^2+y^2)<=1. I=WHERE(SQRT(X^2+Y^2)<=1) ! select data in unit circle ! i is our list of selected indexes GRAPH X[I] Y[I] ! graph the selected data Example 2: select only the data points collected within a time window We have an unordered, scattered set of data points in the vectors x and y, and the times of each in a vector t. Say our time window is defined by tmin and tmax. I=WHERE(T>=TMIN & T<=TMAX) ! select data in time window GRAPH X[I] Y[I] ! graph the selected data Example 3: select only the data points whose error is below a threshold We have a set of data points in the vectors x and y, with errors denoted by vectors xerr and yerr. We want to reject any data point with an x-error exceeding xthresh or y-error exceeding ythresh. I=WHERE(XERR<=XTHRESH|YERR<=YTHRESH) ! select good data GRAPH X[I] Y[I] XERR[I] YERR[I] ! graph the selected data Example 4: eliminate spikes from the data We have a set of data points in the vectors x and y, with occasional anomalous (single-point) spikes where the y-value goes very high. In the simple case, we can simply filter out any data over a certain y-value (say, ymax): I=WHERE(Y?@Vqr8A 01256   " & [ \ l m r   1 7 \ b : > 6]OJQJmH sH B*OJQJph B*phB*OJQJphB*OJQJ^Jph5\ B*^JphB*OJQJphB*OJQJph B*ph5B*\ph jU B*CJ0ph B*CJXph8!.Ar" ' o $IfUUZ$a$SSS / r  1 \ } }k}}}kA he5]e^5`A ht$$Ifl    0,"  0    64 la } : Z &V"^(\+Ms?Iy> @ W X Y Z ` a &-.STUV_` !"23[\]^%&'(1YZ[\ +2JKLMTpqrs{ B*ph OJQJ^JB*OJQJph CJOJQJB*OJQJ^Jph CJOJQJB*CJOJQJphN<=>?y ^k6@BXYuvwB*OJQJphB*OJQJ^Jph5B*\ph jpB*phB*CJOJQJph B*phB*CJOJQJph CJOJQJB*OJQJ^JphD^6wst}yt$$Ifl    0,"  0    64 la$If iprt>O`ein~";Euwx0J jpOJQJOJQJ^J jpOJQJOJQJ;B*^Jph B*^Jph;B*OJQJ^Jph5B*\ph B*phOJQJmH sH B*OJQJ^JphB*OJQJ^JphB*OJQJph7`v;EuIw@ h@ hee]e^e`UU$a$   58IL^awy !35AB`cP#[#c#|# $$v$"0J5>*B*CJOJQJ\ph5>*B*\ph5B*\ph ;B*ph jp B*^JphOJQJB*OJQJph B*phB*OJQJ^Jph=A{t 3!h!~!!("X"+#~##$$%$a$@ hUUv$$u%{%%%%%%%''($()(2((())`*n***g+o+++++,,',@,P,a,u,,,,,,,,,,,-u-|-//g/o/0022 B*CJph j."U B*^JphB*OJQJphB*OJQJph B*ph5B*\ph5\OJQJmH sH  OJQJ^J6] j1UB*OJQJ^Jph"0J5>*B*CJOJQJ\ph9%%'>(T())]*^*++,A,b,|xttttUt$$Ifl    0,"  0    64 la$IfZ$a$ b,,,,,/'1^12223330383x33333333 44'414Z$a$UU2233333'383;3x333333333333 444#4'4,41444X4f44444444443565l5q56777579999B:H:::::::::;;&;';0;1;Q;R;v;w;<<<<D<d<6]B*OJQJphB*OJQJph B*phB*OJQJ^Jph j^.U B*CJph;B*CJphN14X4i4t44444444|5V66757a777788"8j88@ h@ hee]e^e`UZ$a$UU889::0;;<<<d<<,>>>?@;@S@t@@@@@AA*AAUU@ h@ hee]e^e`d<f<<=A=B=G=H===!>">>>>>>>>>>>????L?M?N?R?S?U?[???@@@AAAAAAuAx CJmH sH jsCJUaJmH sH j<CJUaJmH sH B*OJQJmH phsH B*mH phsH !B*OJQJ^JaJmH phsH  aJmH sH  ^JmH sH OJQJmH sH OJQJ^JmH sH mH sH CJaJmH sH 6]B*OJQJ^Jph,uA}AAABB/B0BBB%C&CRCSCTCUCZC[C\C]CDDDDD D DDDDDDE^EfEhEEEFFFFFFFFLGQGVH]HD|z*8Ng;{^z /]g^3o7^W//Fy^}{Ox'|OC/?Oo_o!/Dw%;>O/?|w}^w|/7u|/_Wwzw3fV]±@=76E_X{k631}=Mv&r? sV\/50w]=wO/S/0]Es5:V9[?|oTx>'=wǟ)|zr2F|ݷ?u?ϵ>rrU^FMUj;&ay8w;mo mƛ/uk2Ϲ;E8~QכJkU|c62KRtEoK;-d;w?k1kz?읿.EWԜ~o oFUwlIimtE](z~*z>֟dGy9~/}LFͷEo6tnav|vtw(zO2S {~?4ϟ?3Y'onnn+as5]_Qt}z䯎Nj 9N'=&S##^;;DEwҼTgt|cه(ec=GA۵#k}.D}??_aUG~/,221v09F8ρg!ǘaՀi\wY­ .4fYn >X`\x.܆"Z[c>"2? =x 9@}Tڣ`5CQ@#O<#| 9|}\m-9m %ḵܦ2/|Z{)1Zn yu@rŖ7Y nX}Jcܬct`*rtmrk@*r۞k2c\>9Dk̵gdh{409h}V2g =x9HM̅mf ǘgdmZX+! Oc߸& Xo :@cSwބ&4º3Xk}1YPYw4шXcek}ۈm#d Lz,w[mv#8`6 I&!;Di\^YGt!x=>@2!5P;Yi2/fn4D'ki-s@14i1u'Ji.5Δ5B=]FYԸrgZpYGKBDgi92^"sj.9XnXk #X!q8UL(+O`}dFᮄu,w\Z5i 4jZrS\'@'h5r/d>Z@tF}}٨̜amDtF{>\[`mAtFs2o##^nNYz"DtFE,w|wڍfn^^Dig VݡQrws= k@׉ft],wW={4-[2pjT'rT= (5n܃:APu.sO:a,5:s G4Y1o$/ǿca?IDfm\rDt ,ԾLen@)b: z1o1lMU""h"Pku2{.GrB {',)+ȴK-װȴK1[%dj۬5נ\r/Zv-$ע]dZv[#c\^csAjp%\K,OL FB7i?ItK^/{9< ÑcZ.)ߖ3I$m,&:pW1^\@_ n D1ro%\^hmtC!蜷"UC#hd=T1PUٿEm<9F\y2򁶻ct܇Ȭ% hn&mlOᶠ@rHyOStEbMd.O-73&d,64c>IfO=4x9FJ3r-?&!r[ͳh{39fmGf7J,Fx^ޣ n"FDڇv3^cEgp>C$3Brc_=LHWӋTi\mǷ2&3.L1v(l)rOȌOGcqp*@Ey{u`At %, &3&1w0]Nոr˞P QC)RSΣeé 4P&SGPkM (hjc割?܉Ԋ&Rrs<ɸxc50L_F?1wi$hgd>q鸫w5Z{d ̔oΤ$I=$˝*4Kҙ;:,Thw臹s9PC-wmgͤ$T*M,p| ]#|dL2w1Zk1T1ryyeԒ4ZZ|,'󞅹˩-gF]$+D]zH.wɌ]Mh5=LK5YǢd$%5Oz;mFnȬ7P>@5i=@4gLg3է|q> =sQFw,K;:qja$zSw>Bޤd"{E`-U#\|%ko8w^~2m/2c,y7~;@۫1VY70}@Ӏ 1Y>#5XNܿȗg_Iy*^O,VQ,ucv]cX}"vORNĪ˷=5~z$gԎE>x }LgW&WMת4߇2sD3̒qw ɵa.NOn g*Ï#9,i9e]89TN,م;Iջxr3zi1s;$1EQgK=o/W:dzmW%NX&xm>㝥3d3oLŪ~J^D2?k5%#ßG4J{'IM58<堂.,!=7z(p.=wKnjy=p,Ù2CzH?_=C$w.=?|YyGʮ]`=:_=JAcr gCzÄ[cXWWƘH\zt=Wze.2G"(!;O|9y5,_n{9$.码:@4P'j`n^i=icXsB1+s@L.4poɿW>cC6 pk`^^h KJ]YT@f^i`}c.2B 9h !J}K8v5(-JBr@\j7ƨ:πP7ge/Ϩ V;9B s.50?c[y[@$W,nJmUW;]uQwT]aT=qxuJD*RmiVpVQ#Eq@Dq.s1 h"9W!_m/ȍK?Z1o }涎h;Cmpɕ~6Wڎ䊞Emaı%1^ɻu譨KW.!ganS\AEñP?<co~D?rO\.nu*wIC~~~[c~D?B?!ĘZi TBO);.R栙gI.s,γVxt;NFnxcUZH e9?an4ϴy\j1ѧTFu*Tءanmvѵ۳szϙzsso$92ڧsuԏ9)e*rw\4 Dd6T  C 0Asmooth1.pngbU xb6jkA],1 un) xb6jkA],PNG  IHDR!{j,tEXtCreation TimeThu 24 Oct 2002 15:01:26 -08009tIME +3g pHYsodgAMA a oIDATx݋r@Qqk}=&fkUWW{GBng]o9<8~|wٌ3 Zcx󯅶~Z('DѴ`W{[[^֖ǿ|VA Bb K4444444>;}N^Tc҂"uD5#~[pxWrTcIҤ cnjࡿKð'_?Au5AcPcִ*sEB`XDu V4eXtX`Ec\Бq5Vќ…?sE Ƹ11w V4F h i>A4Ѭ11T V44?F(A4sEZS V44F+K bEcMcA4E+}/12ssUS`EcMcuNکV<8|A8A L¡2I~n˘tP[σ?<+BWYà~OˋXib1^<>9FXY[X+dq9 <* V444FJY&EcMcKcKchgh 7ro$5Q,McKcKcdngh i bi bi42A4CAh i biNs[ s[ "K=Q,hXXjwƊ ƨWŢ1111*XDsn rn 2WFA4Q11 V44vU701*Dh iJAhJ&9-RTvYXǓGu'Xjx!oOcWk꟔3u;q؀0fFbH[/s?DF[ 5m7o|NVeX˒4VXp܌XĎ^пvP14Z4֦]ļ7 JhfɖdX}ev ګ˪hgC1>uneu^86̃[+." Fhy[ki0( e|vLB9삕~(|)ţeG1 V>j̆+4ᚁM<q%@s+ߗ l`e~>Uc u3d_9Z|ZV*:"<&6]N Q=_klrF44ŗRrߖLSpeA, A,%5e1l)c)[=Ku3%q'8ɿ~IcKc[[4bKe̒X&HcciĒr2W 0QLMcKcKcKc3 ƪfgXmXmX+~6\18U赸}ns;F+.]Nk40c'n4|dEƧziWiIˍ orK'3Fnc)uffؘf&G84؛hb{lWPmXmylIa+%Bmc 5f(65s2Z1Tc]Se0Mؗ V;nrNc;2]dGW鉎G:6.1NnxA`k#/mW`KW͛Yɴ ·O{o p{aƸ9GKI?z] h'7>[y[j^bknÿ;#ξ|_>v8̙+nѤbL`dmnًjHN8 u#\v0.mHW,J?f?DR6h bi bi bk̂k rĊz?-xN A,AL#LAFXXi3FRi4r4fH^9bHj!sEI h&dh?߳jcɑ+G,zwln9uq|| w8`Јw犲mCjnR֜l5QI(#g`McԐ61 XKXCX"15J`ͽ@5Fb8cp51kc4 iiFi 4FZ5k#25PȦX`McR/1(X$֬m!5sEX}ifi^& i. iMX'-14a`Mcf8Ǵ5qk#5A4k[dkֶG`W抄؍8i 8il8h셨H!׌c'k}Bcyxdߊv3~|%K"ݏ"jӪj~lV ;{`&_'?'4[|Ҋ)^U#ÿMgcyúu]+؁4#Kc1X:x<^͸x!/@`qV\ \}l2B-kPI<}Z8 J4`uۧrO`q^Q6|/^qF`KcU '1}y,n$ccf+(TЅkfqd`,a>Ʀ`yB>uu8V\+\qUfh@ce , $<4VR:rߖj b٘+"4VrXKKcY{2s8Ӻ3 beY."FVA<|50ǟ'" l Ʊ8F,46 JccظfXvbj+@cy %%24*X:+Fc%"4X +Lc 6u&4֓fn6 k[%0^GƏ4>$06;vM`좱}^A`Ac[ hl6L`|+}k_+0>=^X\^-oX>u+0bq  ci?4xō#zO!;Xʛq2s=,7f >,8};08v{L31sp-w&Zg f+YMј~c *7&02(ۘHfc# T5&0)՘HNc#" *4&021F~Cu(0F1dcc 5&02Xcc8#5&0F4LccPc4&05@cchKݘ( oc 226&0*IE`km'\Q`F)C>֍(q>d!`pV[| ٘)"38\Z y21Cy\p<__ǝ{392nj`&ZE[9v'#0J81c:cmY1ع 1AkL`p ф15*^-y@IXdZ~ggI11˝獻?Oηojg޳ߋ7qLBc/x߱Ɏineqb8{WaH;.>$?#T;sۥ;ǒdg/GK]T;sۍ޻ǒdg/XsJΏŷ]l;aP r=%zIcSř ٓ$cn3V֬p}n{}OLcP[1KcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcvˋvIENDB` Dd X  C 4Afit2parts.pngb ۚX((Qx7 .n ۚX((Qx7 PNG  IHDR]BL,tEXtCreation TimeThu 24 Oct 2002 15:38:45 -0800tIME '`_| pHYsodgAMA a IDATxz*Q<[IZlf_ڞ |>' B( B( B( B( B( B( B΋X#y 9S#U! M*cg{<"0(jE18DBaZQf gXa=w>i"/syZQYZaJG ZO{P Z'&yG^H0 +NGyBp 1Ieeoq_CbɍVV>i.=å¥\SSy֍ (Gs]5<{ ?fhn1J1_%5T %h$DWYP1xԴn2Q ]os]nɼ`[C)q;+)p$TmDa]85AM;gFU |YC _P\Y W,pS~1JIahw\m4|1eÚ &)?f. rK4YڹhyR;Mܟ*7y2%"W2Qc\z252!w28ʐcʑ<&,1mLy:|;] nkӉEox18 ׬c\sNysV?wMv?ȏ1ywm{{rwQr|pA5B)q]#&I AvOhr6٧gڇavPTdiLoО\lbwy|'rlӒY1k'M]ƔX?9F/Պ18.6L[ gG( 79"yycE[|W#.縺Qley6 h2p/;9BPͳQQ&NXE26NvU]sy yf K?9x\u-G y^+< nb9]?/I.ʹO:=^毨ȡy޾J.ܣ/!S폒8&lw%ӣ$ѐ[(]5{1TsR@Ʊyq4֏Y#LE.ՅE[r =\.g$Z`8.硛<T+<†.y_ΐٱS~uk T|LgZc@ yFǺ,:|11ïA12gz[(O񍺼El1e|p<#} ,=s>^9-#YRJߟ\Gy<L<X>7񘷒Z2R K;ϡ^|Z!ZI7*KJShyUy_A+y"^+*t(Ph%W(\)} T7wQvˆB[i=|$">:G2 \=RGeJL( B( B( B( B( B( BcIENDB`7Dd(#P  C ,Agrid1.jpgR7kf?<cZR5/6G<F6kf?<cZR5/JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+_]o.]cZ0YMyZKs4mF8iUX V)=VĞ2dώ7#ľ0o{EH4}SG]-n!d-# ga`e(??|@¢E|wc]x^bC\^kޝI Be@5f`YYR0< QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW~z6Wۍ;Rskyi+E4#YXA}~7dEN s?oĚΡ jGt7mnQwaUTd(((((O^wZgT$o6y'm숊pҰQO'*%U][\4)QFD.B@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsc+%-n\WR24NYX AA_Õ>6?_@ই;|'оnPt?$ $NV 8PEPEPEPEPEPEP^U?:&xK*Z6^* gG!/4ޑ. E(#܆P@ ui1CYG[jI -ťA #gr[$)w  62mEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^U?:&xK*Z>|UI|7m[FKeTiZ;[+H]RyvX_ψW%QkZΗqk[=NBH'ʦ㓱8?+o?t|%Kh5yM02Q Oc]WYKGE|Gqk˟j]X縍u#qY d!jN% :|ou+UL/J(M̖z&my2DTR7b3݌e+((((((((((((((((((((((:|K&u-kGΧXk'q /ڿgOuԳq;sp=V ( ( ( ( ( ( ( ( ( ( ( ( >&|+I|7<'x%HD9Sy!7w&T -R2GוxN% =+IQҬ,.4Idhkfe7t,v\#ۢ((((((((((((((((((((((((((((((((((((+¾,o'4m\ԏH[zl+4<;k[pA`w }ּt?L/hTZLiVRjvzuoipFI Q  tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xWś/__ zKoHRfsnCn(wo FӐGוxN% =+I*=NRHQn--e(;R!KYn((((((((((((((((((((((((((((((((((((>!x\ݞ; ^;2$S41mXD‡ܠ]xWş?αkoIpkwTŅ憠m%p,T2@c;gIѼCLiZ^ykovO"nh <3Ŀ]Pi:d:.e۽Ėows%̪Aydfyv,$I5n((((((((((((((((((((((((((((((((((((+#GxVD=X{>Kyh[bh '.QOkEyWh(_:Y_k_yv%^e7WavSD" J/Ώ6/ x;=n+RQy$0Wq׺ׅ|Y_}O&+/[Gyg o46*v8R{|uUS|/]JXM&mg3YX^4RT!ۜeA+NcVZ{o鷰ͭ夫,3$GRC+)0$An ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( <3Ŀ]Wׅ|Y6_Kޙ=c7/D:$Q 6`9l‘=֊ͨVWw]Xݴm52csRpJ;.AmEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^U?:&xK*Z7* G5#/,ޯ. .$mui2_MYIO 5սO R$dB 1D$Jp-EPEPEPEPEPEPEPEPEPEPEPEPEP~?k?Ljk+gWY޷kXO?: P"nBrFT3k\~_LMK1?_ӥ}U\߅-M3 ?7dD~d+98 (((((((((((((((((((((*?*i,<p$}Ee$(yi,Bʌ0hMveiqq\A E%Ƴ\G f#$"*(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|BoK'K5WW4}/ey"6o<"" ]q_$¿ɬcMiWҹy i%UR$nk+z^E~II,/$9(VU|G'OvV.ugWX5}M5g]^x" hox7,Y};}?S-m.MnJ-;.FTW௄:5Yu 2Wm5j!K+"  pր ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( <3Ŀ]Wׅ|Y{__}3U/\gEy J/45X 7c8b;Z*UY[m)mkgi "H [((((((((((((((((((((((((((((((((((((+ώ4~_ NX^$T4KV`C`LVJS 9`וxN% =+Iִ-B.#.#Ki-Ue " Q}hSjp\c[&xZF]=u]9,UU<h((((((((((((((((((((((((((( mG¿{3znjn^$tIl572wqm@ra#${yWؙ_.ШҴٵ*KKfPLncwBN Ge8b0M((((((((~%xľ布M˝*[FU"& +\H#8=+r~ (|go j.}RD䝷")JaGu<@(((((((((((((((((((((((((((jڵ^zB7WrP)g݈ Ā$7* G5#/,ޯ. .$m_tWF&uXP?: PIpr3<3Ŀ]Pi2_MYIO 5սO R$dB 1D$Jp-EQEQEQEQEVO|UI|77C.hh o>ּY|H<%UY xV9V,`k#8$8 ύP}˚Z+¼q[m3PxmUZ[;o"R[X#i d`8#s?A=VG>7C.k?o>nt?G淟SuVk3 o/fA]` K 1A$u+VƏ B8ΛWgM5SJXI*#ύP}˚~|a>$xjZV}AhFa A|@^U(s|aCSx4LҮ-̑OD셵 FqzP^U(|o;\^ោ|+xSy.>f^y*Dc!BI \V[q[7U++y-Λjv U0F<#?5&|H8Դ2J%-]Ki,c%YD  uύP}˚!|&+%#is]Ki[ř"& k rA uύP}˚?EwU+? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.hh o>?mCG᷃SӵUko+laIm`Kt 1 ύP}˚Z+ʿEw 0E4}OQY| x%Uu6.(B@=ָ[Ʒ<+:n_UVV[[6(N+{)`A$`yG>7C.kM7qiZeK[%YK)AEyW#?5BMW4xWntW<,:lQ VRIT |o;\?{ o#RҴ*KEu-3팖 eR3=֊G>7C.kįxďeΕu-odx'd-0 3Ҁ=֊G>7C.hs?A=V &]kŚďq]M5[ścl_.3Is?EwU+ 0E5 ONU xe%%6-0J:G>7C.hh*s?A& L$xky=GUf-0kT$p NI[V4OSӴ(^U"E,;UTXKYmO%/nEouHmOu m&ؾb\]ʐzfߊj~:=暞՚wM,B]6@b l`>Ix[Śt+]ozΟ w..mdJYNH+ZU\ɉ2.(((((+'>s]h$Ѵh[~ѧjso6pUʬ28*QZPxIļhƋ躾5kk ֑Mj,!Oږbvࣙw&}ǩZjztHgDhƲ5FY ]n?T|xBG5-'Lti4oQN⼖c8FE0*v~p}jY}qpq .>64 |<&?- ~Ѧjqp\ml{1ҵß8`InoᏗcO縼<.Lʹ{hz]lhcxo1~((((4c>}KV5fMW[ӥaH岄-㸷;Ѽ7 !+Mo5oiz5+$3cqd31dks ?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip)x^?dV6}?>H4K{bś!;8J>=Lj|w%ןj⋫Ҭ tKBgWP ( ( ( (xCO.OֵM_U1]8K/]4pn<!ށ" WߎwMi<\&ww}jbp_nh&,ys\$!CK D@<'x|:k~ Dῴ\[ɚ$}fVsw, <5 1ìiǓmZK3m}o /QEQEQEQE_'5Oαx[Ot-k,eVCKXyH E&4g3;K>7*WxCL K_Zv̰I3V!C8$N3zWU{%\-1[ǚhb܇B0%vJp~\<5jL~'ӟAFuq[M /`J~E'|?oῆ>_u?SXt2?6K]tfmϱ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?LDd(#P  C ,Agrid2.jpgRn }D] tF|n }D]JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+_]o.]cZ0YMyZKs4mF8iUX V)=VOέfS  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??ZO<7` ֤P]ƧDG+v+kA Ib ( ( ( ( ( ( >!x_\%7E浥Kw2]ۤmTJe]|* t^]oVOjsjidPJU!R/[Amav%?m~>VDo,md/C ofX2^_:к?hxMuzҡmΊ^LwI2,FEjvf64xr9ᙃ[#I4Dk]74{*iym}[ϳ]g[vÿjZۧ>w%rk{!kEy[ $B.Vi /ggO,# !DڌO[kwVn.㲶M|'8K|t˱Co)5=>m2oo&@_z#&_gh/oݾwyZVFu]em$&OpB*b R$,i|:?b?b1,AHQ651vb.>mKo<϶E6q!V$ri6b7_ص>G9\r}ȭs#S5=OOG>?3f?ŜNyx&eIEjۿ>wq{!?dFx -8>J|H6WfO7?|?>g3[w[<֭պxNmorY\W=ҾiK"e Oiym}[ϳ]g[vÿjZۧ>w%rk{!kEy[ $B.Vi /ggO,# !DڌO[kwVn.㲶M|'8K|t˱Co)>X]:u[¾Nk 3ZJVUhePҵ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H7W o5̇Kԯl('6qm[t+wfy(DUhBEqOo,MhfZ/7 #7VvK9"w;umkn*nD=ܖVɭ})o7|u>&@+gk]W⇕ak~oyR_]@o[gWGU^8}>e^gkbBXApVwsq9hˀzVi /ggO,# !DڌOS4E/!>ۧg<ć#E[oDϚ럳g+X53F4zdwuy!-fXiv>i Wa c|T7X?˿Z:ey~xO3ɸ̾w=/9oÍWIyii ;BK4 6 *E.Ta{#G%H_>gߴwngf o Mj j[}GD?-4$*Y?4GrUI1Aў i ψq\ [?dFx 6~h7Tz]Քvy~Gl{y7ygc$ ~e/u]~߲[&yMe|ZH[jV'A֤NzDW7Ip.V0ehXE`:'xVS}jW0m=pM,QlڹeFRNwIA.j_O3ɸ̾w/v/mth-jȖ)_!(n&&TG B stq#f2A#;̖m5]SSRi4ǼR mC+,Δ %$*8zy/?hR%߭YKlw,Hl?(ʱ i'_l^a ƥ }Kg}_h7ߍgϝUC)s쿿CʶM<~"H|`~e/|yVɷ|gq|tN:ƧԮa{ŹXi8rʍ4T#5-|qYY薖-4=PE'4 (1!1v^ʴ ^;|!ZA{g.,V&E夾P6e8l|v2j(^&h˶HGt)̛ռ7^8ԯlKX%LVꘗ0Ƒ"@[w&m9?g>m ^5χ E#FFWhb,М7G?7|>{Ig|:i  \{?.r)dҼG%>ˉŝ3[(P^r3f[3 z᳨xE֭%tM}&{ij[DѲ)r_:жZƏGk6x.%/):/\ RaTR=I/ov2 pd4~Z,{ee2bTs;v~G/6g7m?wmUt(k2qaou) o繏{Č_aew)FG#0}k?jO7ngj#onjAp fyKI#GUQVŋ*z:qi]ͷV(,[s3`79Fg਍oUح3c[qo|Mei ? 7~ǜ~~V[y{}θz[|pʊ[DʕBL6U,c[rI|5[x㷷m5k$cC+)R}?dc߼/qn[1/mmZ?cN\^_>vϗ;|>Ӯgo/{_eF7sV;gͿq|u[䷷]5a[3<bM?G?`D~o;Nիm?Jo}~^+w+jZ~ya|L(us%v-;.r|f.b̈́U~K+LO ٿw?<3.O#$f|w<ُo3oCχ~ iC3ִxN8g-J1UAKڍf% O*/߈7#-t8|qy$SKju) -+l3kpR[W̻PK 6tMc)؞+I0;6lS̨mYMzV z᳨xE֭%tM}&{ij[DѲ)rO3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w︯!A.(n,;tJO;Ww;Q@ӴQIEVe8KZ:?oHo`<&2߾;J&kZmk}uy.[V{vQJ1\oKiW*E42)I%Ţ%%C抚wA4xe/qoc$chms}2}<o_> X[jE}vdpi?}eif:;lE\,~7#!7cU?0j84{qݧtHl,Gki ڽEtcacuIVH7O[7j dIPO*i_'xὕafV@F`7\2DX l)t3fbxZ"W %e.GkotP7&eo.Y7)g~)>Y?AxsGO'eg,gڛ3gʾ|)] [ [.5+X4tżBe226"3Rߴw NԬ@%ߎ, Rz SW)w޹\zō{MHtTkVv$EibkwF73G$sIw,[?c_/3Ɵ6-m|{{}Ÿ.7Bjs_d/?!7_ٖ?ev??X_|~X |haRyy q",G}||hq-j>7xH_ w_j^1ծeg"#Q $N"%\N_g>Z"W2Kˆ>\,~7#!7c}:4Ykk[,qdWܿgk,~43öD_*DzᏗ#ߺ}MXH<,ڞéKkLҵ I՞'oDKLkI&w@?kW/yWX_|~͚u9vh\x̖= |X>oFBoǖDd&y`u 3~|xmZV }Ÿ.7jjs_GcC^oڿOW<\u6-m|}K&>\ou,~/76َu:4xi|A5ώXdgx+EEL&U7$Ҵ3fbxZ"W %e.GkotP7&eo.Y7)g~)>Y?iαwشO7<3 3e7f>ճ~^>Ѩ~6N}=Ǜ}~w?{GcC^oڿOVVlӬWCD_*dcmms}2}<_|Ww|=T :ץ$J MwA$h7p9 |z-G1ho"ڶ~{]CLߧ_/#0uUht^ K[OhQG%dc p  @O|M:`ʸc$cMX>oFBoǖ C ueo"9dpˍdWܿgk, u -G7}l<ݘVxsF u -o?7}~<ݙ.ygq@ IC?7g5;g}=发?x? ue/q"Icpˑ|}hu,{WM#_/ٿټxG;VV u -G7}l<ݘVxs@?sί f↣h%LֶOk "0U2ffi,W mOdP$b"o?=_g_/wIU?#ξ0ŭ_g|ϴ/<'?e/?l+W&?}w}]#OqSA|Xx=SQ{HњٜFmwZGca}D~ho>O7f>ճ~^>ѨG}a}[h_y{O7f~˿~^~P&_4McQou4խ5O'@KU!HD9Y>x-gğ- n/uƵo&l,sNNKn˷" X~u .@RkvVmp V5I&Gu ?ϚbG8h[Fv,+pMϗ,\=[[4掀: ~|7"odҴ__F $j·tHvrVW<'Cxu?dU<4[Gii hQ3Cb ##C7n#}3XݜOt ڍ踞IЙmEDc2𧉦WG qcycO %x|_5fܢO0((((((+sߴc.-'7Vݧ)M慱5t.JB@ 2#+_>7 2Q, =m6Uj0nV] mtՆUݭux PQB6>ͮgl3_eF+~ng[vj]yf& Q)mkn*nD=ܖVɭ})o7|u>&@Zfã&( -?ȳbT$j3[?`f"5ndzQ⻛wT;T/`ghrS#[;ź =[-&UD.2l!OLm ІnYHg@mLpqG:6:O]eszOy*R9R# }\gWg?|y{sVjIqnkCn&ICI;IVSUJ9,N3Os'k>E3CoMݻ-wVoFBoǖ CLߧ_/#0uUG23fbxZ"W %e.GkotP7&eo.Y7)g~)>Y43fbxZ"W %e.Gkot?/]jn|AK-qm폈ow];Xye2F"U~ yjEv?O{#y?\Wa_^55#^/ Vy@I'Umnbw]15a_ 6i|KSΗ%cK<^n9֖Y,|2㋻/ ^xW֥\4eK׏pe_.#;쵻cj7^.j>sm֙]e62ήgkq3Ld[fx%cX9麏xJM# K֞۝s5ӣ)Hk@f4(_u}_NE]]4;</`UXQefW1,mu"w+]&O۴;o'?d7g,~_f|(´:\cv6g'贗ҳIJmG&.4W^yllVӖc[$yjK"K-ZflElLVͽWٯi!7cWu"oO/\n6yqM6y?uܟ÷w:v?n6r~9};mN?Z<]3NViD.G!Ve-E5đ|yshQ\?I[|ͽ[8Q佈FGm{0>Εo|B>p-KDRJZ8eugUK`jWE9io h*Ew'7Ak'xͣAŴy>T݈5!iisM ^[)V?4.p.YY:Gj:n7?I5%*k+yZWq1Jmn!Q˱]>>Z^¶~<__cv~&mWd5ƫ wBP sj k;Aby |A.l~1{amۻR6yqg;{{oQ񆵢d_xr)R iMmq V_]KfPHNw[<Z[xK_@E&. 5"#[.'yVL6]ߌ~8/?G{nOՎosq7A>W;WL Mxt>-YFk#h[0mTM #v֣j0k]JK+ƶ閯q2bChc}s/Ox\GD$kj7:D ͨM4,RHm%~fWu]b}7ϟ#i>.7>wcy ú.>4 ݏ?V;<hW|au|1'_3,վٛ|~|g4 .|?Ŗݿ3ϕ}^oϟi9gtX4!ҢLΜUٮ4$ZyYỶ,,m٨|]qd xzO3w#.h-PU>0?/Zv>V~qy>>xsW U)]5"?mJm>әR[fUi|M'M|@71Ok5;gĎD $о!EO&X֮R{@%[晣hWҵowi~"jWz5 hznG{lkHH.r |S:/m|ItM3ğlU#VEK}߾Gi$a4nHmM#z9xtۓ|IHGet'ֳ׉4 2P𾭦Og/ B] Le$*4@+N'?6uZIVgO,ҫDVFKڋ4;UHHxWJͥlawI+]U RZg;CҴ[_4w"D{sCtB\ZMk4Y#qUw:GPn@VMm |-4SC#GZ9P>Z0HPQEQEQEQEQEQEQEW|O[oH~Iz 镢XEd~`FE{]|:O#'MnٵhbKEU \[vw%̑kExm+$&QቌW 7?>_~/[o;V?iVaK&#o'_C +gvyq>Ӯgo/{_eF7sV;gͿUۮ쭤D "3h_4y]2P DOOGLxB/Zf#͜9H>VFA|u[䷷]5a[3<bMK[qFӴWi-90D3TFZãY|m Cϳb'ۨycY痌mF['Qθz#\i|WsmՊ+t " Q*#b\K=m>[weE-]J!& ]ś1sun*ӭ[=ܖW2Go}q|șF>&2_z#&_gh/oݾwy]_ V8Mhei(hXe,ԩD_y)S:v?m_m|'>oyl~-ZhI4M#<.6GU.پ@H[մ >5?mZm/V_uy9aEģ%$l9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ ʼmמ O/u n gSڤֿg\Mqve%KFh =')s*6n?s/?L?=X~h s}$L.yW!2XNAH,ۘ xJGĭ S!|r$Dl{C$ySng=*wIA.j_N֕%ݫ h PJ"")ZKZ:?oHo`<&2߾/,lğ֬Ϋ_O3ɸ̾wWն|Nkk>3ZM޽e&0ѴOw[>ih,"E2K2{U]Քvy~Gl{y7++VZ4W\)n,[[&ԒKg$ͤ<:GcC^oڿOVVlӬWCD_*dcmms}2}<k G|DѼA}B[RNlp6ΨmM2Gⲵ 3~|xmZV }Ÿ.7jjs_GcC^oڿOP|hmoßFk\C>ss,fv@Yn$#hA߁v_ P;}ӵeigXyb<ߴcyg~fϓُlߗ4gi}O&E.<3gv|mǗ#HӣtM+GDM3V;hbfKem9mPAG}a}[h_y{O7f~˿~^~VM#_/ٿټxG;Wt.hx${:z*Jٕdl4/ͨCT?4çyw"o^vy>O@k5_Yӵ[tFq-2g1&.BͿd"MƼ_hxg7'MzVAeӭ" n2MM< 𖁭BI<;*E՝ńXۻ.'O$6lWzF4="M+G' nfm&JӅѻVٺS(qb+Yƕ;8s4ψ>+y}yZ6eY]cI-qpmoZ&Il[;?h_>nᲳ濏O^K!˓JC1f[BO jw@!?ų.G#Ryo_ge߻w??jh?~9Upfѥ4oM{,)3M?'WT3ncwG5ow?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hhxZw?+LP\kDzvmJ]RxKh7ay >Nj~A/>'xzͿ'~=uQo`3^x9#c-*eYf,q;8֖? f^ZO}GIK|9ӿ|oe/|+3s\}i~>ӿ|oe/|+3s\}o?A@~>ӿ|oe/|+3s\}i~>ӿ|oe/|+3s\}o?A@sjFm[cuK▛i4QDN?In:(v}_|;4O[X[LZA#2ƯVRT܉ sGdUPLXC-u*h䵿6l"M-%ϏeFsoKR@ʬJϧxwvm?wݺͤZi iRU]6ɢgLn3ğ^ěO,Oj {uG̲H^Iyc2K>#zdm⵽X<9x qseDyhu>.G#Ryo_ge߻w??j|? "֧TҦ4!*&SFxr1<; H>fH-/>MyUkuxY|Z}2kw#QÍ ͬ^H RHVIs紸պ>"z~ϙ'|??AofG9vo~ˮ8q$1,nd4cee1PTϼkm%-;e.r3f({MVNK +S ٿy_?</c_2n~ VCb򼿴}Ǜ/g;w][kgw6ewKOܨ_=ωSF$wU;uVV{vc3Z?-M*C)F,]dCs(sfmG_ifZcQ[yg>~ϙ'|>ͮgl3_eF+~ngyŻ_?lؿ巙ejkg-ƣwYbtKܰo! 8aE.dzQ⻛wT;T/`ghrS#?cN\^_>vϗ;|G#0}k?jO7ngj$Gqnj*nfyKGɼUQ(e(ŋ zf?hoow~7~3^m?Jo}~^+wG$foڿ|oߟo/wZOXROA0)ԝmS#+<2Hv 1Br ~/tI+ oWVzlC|f/'V+:tG?H>/hyUbfys?Joϕ~^<7o<{+eK-Z~B&|LƇ(ʜ25#:[ʳ۵RnoUTJJ1bC&uo| wm-/RR.{``g<~S5[=C棦GfN.<][tMhYgN[pd|{{Wٵ:y`+hy~v|߳߷痷5n8q$1,nd4cee1PTϼ,lğ֬Ϋ_O3ɸ̾w=')s*6n?s/?O4+֟p}[[FG{F&I;@5$IqZIm4jZӤ4MJ鬯"'\B/UEZ^b93uW{?O wVRU/IUm'~_;U3>^j:'ӡ+NfUE->(, b,qFdygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|q^g~$xgS嗊5x,Bbiw@$\ٓQ כ__lǷ</|E{}}s/[M-|Y ^ޢ*bX ,iD0V& ?M"E }jڥ]^(R~\{-BJ& vw?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh}<7/f3L2k5<#7'ey]Mw}[&|]F<3w#0˿w?T3ncwG5ow?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGM~u풯υ|yCao]kmi`&d{VŨί扞vYf`-~_?i |NP+okR-4TL-%%QqWw5o7ĭ?|mF]Ve7M∥l#`-2ut<$M࣠;U_kM]c+[xʫH(a9#5d[+]~/?>-di*噘rXnH̃ [R? £T?0U#2*?nH̃ [R? ¯&~z ռAqiqdk&-'m(! 2-aQ sGdU5,?xǎ>(}/xſaOR{߳ۿ]ؙ3sPW-aQ sGdUWE~?A_ubO#zdm⵽X<9x qseDyhu U#2*~&,^!O4rZ[ &ْDzA9% teVP|#7'ey]Mw}[&>Z7kt$ B? .auq B˨iz^&e2.ui3r#M$=__g㷁fǃ5_h}|%'Ѿ֍ڮ>(((((((7߽[ |C<{O De[#eI>R7x{/$[ g\nZ!匾dVAdP:ꚮxVRLmZm0H%JtO^"mIg-?4G?/Zf?Ŝ8I &fF2Ej][uwh?dFy\m 8]|HVh /hCyP$y)G܊??9:S4E/!>ۧg<ć#E[oDέͭNmq\Dgh7Tejzie|6~gu>98Ms$] չOiK+#7>֊W>IdLiP ?#od뿴| g7v;y߻[k[tVp'䲶Mod#h9K}wèA26F?gGжնj6;+i$7~ȌqWL?f!` 3L^ φYG1g*Bь3wih6_hCy}O,$y G܊&?88#L!Ũyg<㔌#EkaD z|:?m<1,sQ6-HvNb(VU\6c[ "3^qo4yQP*DaB5siXiFZi>>-xg ddr7V:ݵes$z&G^J,`?8bc+|A[}VMqo[-g3@9+<#xK–յ-sNK\w,ֲKauq!ggBcEbŸ@NkVt7 o{kjr-G"J*UKPOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C(y/Qk6!{xi=bWHTȱ[,1w ͭNmq\Dgh7T3okzPqI l,D'A|͹yÿ ?|ooOI kspuo ,8Iܯi< q<p9"w;umkn*nD=ܖVɭ})o7|u>&@A'>&x>K ÷+.fP>X.y-GAX$ vO-;P/E~ؾk9<#\MK_w6Z7`Jec FQyQǠ5=>m2oo98Ms$] ]gS|1⭕ƒ.;;6&(H"g4(ILRLqI{,!=')s*6n?s/[tVn䲹=|#h{|D0A11_Vs%lbּҺ[rXm im{9w귖{?O wVRU/IUm'~_;ܯ W]Лi$ԡ+淂 o{dkyK,C|/⶗y⫏CFM=]pQ'$_f"_ CixfwH{?O wVRU/IUm'~_;UHc/{כ|Oqu/Aq,}̑\"2wq CLߧ_/#0uU8Q?7]ӼA[_i_o]b=w[ Jö85Z`H4])JL*GU%XhoNbfrL]xO kPZ5=wd:nɅdWv"g,n^\9HLoi&:j;ux ^ά^+.eY+j, 3mU_WӣuW}WGDM3' V;YYUKae~m9xczw]39xS>K4FFхizV&Uc$`%-5C~g6y? MCw&v7v6ڛhM4脽2ٚ"Xb&3[ᅶ[> 4[.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh){?Zg_f^쥕<2)xH[ndto.F{S֕xvAЮ!ż+jvvmwMp'Ҵ}3S-7RN_ J-H8 ?5T?0U#2*5m ^}xKZƫ-F|S}qsq/O_.4ieY&8綑[R?  T?0U#2*?nH̃ [R?  lj#cǍId6vsHYu}Sn!%⠏>__ڽ<+Q_wm$PIsicHw|HOQEQEQEM3m͟> ]&o) 4oŚb3)aTz[R? ¯e_n4}VҦhD^ KN| eXK;Qq-aPn7/ >8cLj%Űݽϛ$G>0'o(7on߿qV_үtOǖ{ ]YexJnVRAR kb#Lz$zETx.qhayd$Ly& P((((((+_^6ռ!Q,4}S]|?m6[4eeJ|K #Ȫ@?>EW|bU_-ŭMY2͜Ahmݕs"ɂRHч*(۝r_쯷}djfyuEaO:#+yl6Gguo+hN|߳ٷߙ|*xJ}~+OpZ՝& 2[l,QVSOjn13NW93#hyv9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ ض%Z>?/|_n|_6>gV#~7_>y˷g?o巗]j\gw쨥tKܩ_=$سa_5$U;{vZZ{a2J?-=2K1u*QWJsG?H>/hyUbfys?Joϕ~^<7o<{oyl~UK{uV c3ZO1=*v,]T (sfmG_ifZcQ[yg>~ϙ'|-nudzN⻛oQ_XgoXrQW:Ymoiû*)o*Wq 0fbv,EW䱍r}ٿj]o?y~~-߾?mAoi}G8}6̠I/ov2 pd4~Z,{ee2bT2_Kρ[*L!kb',Ȅ3FpB2pҮ~ VCb򼿴}Ǜ/g;w^?&7i?3o>+~/y_@VBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wGhV; C˟//-Ȏb{XJ&6YFkQԼ=qh&d,Bj-u ;G׼'q -v2"xbP6 Y$U;{vZZ{a2J?-=2K1u*QWJTN;O|#}|3ϛy[66ǎ<ͬO6ZZilX-4Ovdkyb;Ɩ',~+^ zִcG$\}ݵe ` 4[z_ygc$ ~e/u]~߲[&yMe}W~M3Sޱik՜7WtFmA[Q0~oӯM[_*\oSm]_r0S}|?kW/yWX_|~[w:6(`}-4)WZdPPQ*Vs 7MCWg߈]cT+Պgpjp@ Kȗ'kp@U_uLu_j%Ɲ541jRJ \\_BgYQ_<1Ľ]Ẅ́1xLMwκ"Y+426*Zʯ%gKi`lӬWCD_*dcmms}2}<|I;ῈqY/5N^u_\][#2E.^#*=R=zM#_/ٿټxG;VV u -G7}l<ݘVxs^6 QY_o>4<1Σ7KʳMik;NnH ݼ R6cφ^+'oiJś\[x$pIn~\O6q@~#N2kg&t-{/U4=ZGlA, X0ùoQ~*|/oOsx6SRb.2<(f㘵חduZIVgO,ҫDVFKڋ4;UH>O;: 7)q<ϵgnP6< " ׾|/rCφY\iq@좎٭%X-nB =H%h.w?g_y˅G%-G,uC<73/\+ʾᇉUmVI'}+w^K1|[~Vҧxw@!?ų.G#Ryo_ge߻w??k5o7ŗ B[DtmtU2]oqq湑E̖Y;+>.G#Ryo_ge߻w??k|+io[u+>FI<5:95 }NBIР/4˯Z@GyW-aW~.#ھN'_ao袊((((((+¾,xo5CԇH\kzD-4<;rqCy6=ּt?L/hTWKgᯈRxO.ei~%>Bb֒Y&wghGR̞ms;g/7y^_7w?yU|CԏT 6[YY"sGpS i#]*8O0VOv gDZ]s2,;{;e7V2G|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHxQ]rY[G&WiK; OXifO|6~_ش"99PpMmd]պ[[}GOmR`Pz s2LnHo$w리2ng~[UURXɰ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H0ms;g/7y^_7w?y[;I%Żi K۰% '&YLAT"(9?#od뿴| g7v;y߻[k[tVp'䲶Mod#h9K}wèA2-mijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ3OGLQx'>?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* @: #:[ʳ۵RnoUTJJ1bC&ʿh?oyqo>-L.--"|'!Hdo-r8>S\ۿ>wq{!?dFx -8>J|H6m_E 3=*KٓU[ -Y^Z?&V,l ,ةT+s)([:eި!s\}D[ a0P|3ne,POMHoWrV^en9+;yf7Ae{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/| NJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f%ɪ-Ė,| +F6ÖpTOY^usim0)h)̏c <8FJsOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C( >a~t-A.~m%-%iz[CެWgqg݇.um=ۿ-?r|>&cCeN OH< \Zj]헝3bI}V9^6(Bn᷂uCY5֠i616kttH 7lx`dU7Ğ]?Y^Gi.{kx΅eI˟1&m򬱆[/:[m~&q×BFVG"c 1_&I-sm3:yDK; AOEommUKI)".bb2O Zqe3L[7M+]tN 8-.gT[6i[X o%W̷*gWW+it746YÚvG$wzN&˝g5K p1Fִ?xB]gv 6ye⤕.whfV6~̈?=U]Քvy~Gl{y7F=G:ΓeZ~R77!^fhȚ;-K"I }*?7~ >GS7^i=:=\o,~/7:cߵj;g}=发?x+H4])ULue&YYs*XoQ`aj4j:"i(vy> ^ޢ*bX ,iD0V&?ٻ7[_ xM[WFNOM/< N?1$ W^ע[]xWǾ(]tU_IN)#[Qksj YQ#E$]Bd8U_x+V#*šuq] Dh'vg%kn>$hׄ)[-B./1 ]gT{2{rЫ?52_,lUfKh(S#!IX1"[.m>|UAj:}5[65:w1_[j2ʁU ڨ\5YMowK}:k>":Ez}̂hfktᦼD\3M%A_i查^MWR;Q:'AeѲ#cLuHLksY_Y!_[w"aX8 sGdUWU6//FQMbԮ^V\gdXrd-+| T?07QË@xO{ukCq,1WmX{C|WEPEPEP_U~.Wo?3W0f7}|_j~>9cfk ojY~ OfSn1[n>U#2*_~_RCx3XW}ëyL7mw_?A^ڞ*OH|k0j;u/;o>((((((>!x\ݞ; ^;2$S41mXD‡ܠ]xWş?αkoIpkwTŅ憠m%p,T2@c;gIѼCLiZ^ykovO"nh <3Ŀ]PkhzITRXbr .d M++2"Mn#! \iuմ溲mZh,QU0<(%OMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C(UG9\r}ȭs#S? |e +{ YC)W%OLڍ+-hLZ?Zg5Ɲw6XwKOܱo! ω ް6=>ol϶}sq9(Q$I'1Asun*ӭ[=ܖW2Go}q|șF>&2θz[|pʊ[DʕBL6U,c[rI|5[x㷷m5k$cC+)R}?9mo>wm;mun*m[EvVIo q/<⮙v(~"Buo+hN|߳ٷߙn9/q리14 pgb4{UU`XOOGLxB/Zf#͜9H>VFAКãY|m Cϳb'qh&d,BcF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB;ź =[-&UD.2l!xKS_x[MI[} ;+MnRdq3 ϫrXVzѲ6nd/c*L~n%`+CAER԰<[y+x?>)'C 2Oͷs[h9?|G|u[y#]5agkv3oxEŌ2uXnhCAv$1=hL"v>tꚶuK^Tu%=Y-sA %>vKmphV>fe8k!GD3#eq^-!cxD<B}xq@ {8Vxn)e%'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJ<i_Lof(~5 FH%#sx/~"j.-!wJb2I=GuN&]"PgQׅ.Fۚ"X3 O-Bs)fA2o;{6{}I̗ѭɊ(926b h /hCyP$y)G܊??9:W^>zu}7;xe/΅`΍\G kFEψmMf5 )MIwk8KH\e%-~\ǣ.t ()$!a˺10H2XƠUwu_蚵$Ԧ]VOIZ%6py[K RIu*#6~ m<#qk7 QT˽5-HLf"ٛdjonkC+Op &ICGǰVS)f.J N+_ $i3״׎W{Ye4Y-Y〉fLVwIA.j_{{NQ{KZ$򉶽 %ym$.gZ~ҬO|1+bFnhmllL,ۼ)C#xg5˽"oYړhC%\%Ьi |M0Y&Dſ|Du#E' jvwO$k5_'+[DfH!2"\KZ:?oHo`<&2߾򫿉~ӭa> xḵ:Zƫn{ǾἛhg[i. R$Iv4IxgOQk0RrI; 4wyKfܦ#uo,lğ֬Ϋ_O3ɸ̾w_!NJW]kZ>.=, MqeG,A, 2<WA!7_ڿ_iocy'^+U_4 ψ5+6H}QҜ\n& ze%RoV0$(rOj7֠g#巊Di |[C 4^u L|@ؚ}|Z˨0-g{XE-тY^XL!@2Zt%YkpKӼEfp]B.(^ ]:%𷋴WYBun|Dȅo$U H?ϰl~j66am۹qʇn>Me\n_, |9 K<'Cf<]h ״FHq{\"$Qp,Oqt?kM<1⫿;DZϩϢ4*dp4[3D(֍jw_&˿<[vOaۻwoڷ@9_I0yfF?a~]hh|ltoP|W+}k@K$qq{-! y>"y$DW@|~Z'yfMK}{ͼ DF4 <7y-V5cky?4p]w?`<.h-PnH̃ |YxWYn%,:|$Q7cȎ+A}rጱzo%Ѯڼܛx_;H3koo7y 4-aP]>?A~l.ѫ> ofy$8Mf{1WF$7PEPEP_z~/-O[zk!b,s HGtˎ5m"%Q>č𮓦MjZ}qw2[w1BFTryw`2I_ QoLJ<;om?Hi5Rg#t̂wJŒ-vT?0cUSI cf_'uSo0ݷZߕzwJj{/?!<a]((((((A[`i-捣n%o5.8S E=_߃o< :t? f~k ڼy0\mOw<9?|++ox:?ؼ%K!IE憢@+]g Gs^^g~_ ?G/Im/)FFPX9ۜIh7Ÿ8oFt;x/692p*H'`o@dmKyaWVɅ 8v*U 'Jѯow~wPܶejXLo,賒,{d HmY#:[ʳ۵RnoUTJJ1bC&+\|}k 4Mi$,frdM'I`ޘr7| ƛ;_ZIȒyma#hy y"~GHnO2y;乿ky`i F)#a#yF .}Vf}F֗H@{HV13FӢ*mq)-j6 7?ǜ[V}[y}V*ӷh}W>W{<ݿs?y_:-Wth揦xJHӥb%Bn IG* C5@;ź =[-&UD.2l!993#hyv[oUح3c[qo|Mf?hoow~7~3^ոĒ\[İ[ Pyo!B)RK>??AofG9vo~ˣS ٿy_?</c_2mmijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ Uoخ|/cyq~oueģ>Q}G}ӵtG|u[y#]5agkv3?/|_n|_6>gוY}ᗎ) 7BxFBm_-NYg4eCWGn$ݴֆ%mLvy JrYWχğZ]{O[&YKsɼnd#/0rke{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/|>'cⷱi-aVfҮ?gbnZ+nEDu Hc略4+QZO}l[͵ypţޢ@[ U-{2jaq%++Gхp;*qe%V{5_ลKo x(+tG؅ #nҥYVHo$w리2ng~[UURXɰqj%C2y.bKtԮV&fy/j2X Jrf( ( kxG.<9+HD6aUetKy@I>h4/֊O}«d➙o41Cm%h,Oqs<Me$H`V:Go5ܻz&oh[ ~L,XYñRW>RP=g/5mC\4>񉴩GkUـ=*kKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%Cy2*|M=>f c{9WMcCu ,B2$GЖD&q3vZEōŶO7MDI>q8 9G{2jaq%++Gхp;*qe%W>X>(^iVFb֞XIn&P <K59FVHo$w리2ng~[UURXɰ,K f۴m ^Z1v7$m ȻIRoxg+R_ikdGJ+bC/;>,79\ C+-xgPn>^ܙWS($Bdkar#=uIm 't֓l[md7\>qh&d,Bn+ſ<%K:,IsWK g<2 hz7*vh}Vo{߸soy>_&}ٿj]o?y~~-߾늲G_ \߶;G k/qbekc}c,1FK)?7`SRO YڦlޯYl ,3myP%򢷻&5Y?v|I{Wcx7*"o ’_3OB/k!5 %sZhϋi渰T70YDVIc.9b[<%\h>0*FpczOxqaS7sG|u[y#]5agkv3X(Ј䍡1)ZKZ:?oHo`<&2߾?XJ&oXմCS]AZګ#\A(f}o 4 57:~ ,?.vfpmVfV2Mg4ExcT6:Y[ 6&v s0?Z?&sq > ]n~fH}7 FmR md*{_x7Z^(Qtj退+b%VI%xGDnwIA.j_>0k-5Kq ۬7ͫ?(SC~^jא SF-}le^)f;xK"6%$xW[xHӼMj-:K{Fr-MLu!hS7][6SxD6_N^N;4JX唼jR[)i[Y$*Mʹo|H]U_ x6V0:o m~M(-$M8#ܽDw&Y,|AZM?}SF$hmn;iu&Yg2r%e$}\~ֳx_S4 iP6Wwa" E$/Img*}JG/oJ}.-BW]նS@ӴۤCLMu 1E,6eVeoZm׮/7JxPg5{-FƳGrvR{3~sdI7+<-aW^c̚N G-ψ!״HG+';C-`2?A@~5> V-?S%\+ݖR̠m%, 0~OS :։O nNG5?|OL:vk~U sGdU}OKJ.54K]!F eB|<h((((((+ʼG'Ov^^gڏi/zg?IXG4jo42d& FH'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| Pkv>*k-f.[ՎWm.A1kU27٤`);_kfjj+$g3[w[<֭xQ]rY[G&WiK; OXiym}[ϳ]g[vÿj][uwh?dFy\m 8]|HVi /ggO,# !DڌOS4E/!>ۧg<ć#E[oDɦjz|?eyb<3 lqF"0NF"=>ol϶}sq9(Q$I'1@skn*ӮDEvW1ǭ/owm;mkn*nD=ܖVɭ})o7|u>&@Zfã&( -?ȳbT$j3[?`f"5mZhI4M#<.6GU.پ@H[+L!Ũyg<㔌#EkaDo m.46k\4qr‘jĮXb#yڙ-ޒ?4 #m_[yy<0[;}/>un| 1.]ŝLV#oO)wǗꩬ>a~t-A.~m%-0 ]|.5~dȋab &< m̥$5[{EXeaehrB2e?Kaqecaۻ{-Q-Wndu+}6h?/lQEQEQEQExW>%O?X>x@ӝ[Km# "dudF :(ijeq{Xe>8xX]ؑ_[\2y h#,9er7᷎41u0i=Ė2,iH8b.pZEYvQ@`@=;;Uܕיags ! rXVzѲ6nd/c*L~n%`Vx;U>^[.\ m"iXb kIȑFB%߃5~3Rxb+]CI"YM{{1Fs gn֬hϥ ]B5'<$Ef Z6R͕>$_%oX~¿3mo0HCtW]\-Ś[L"i2JcG#BvFiRY} Z]KZyaG \y~a*xw^cu/mΉwrZ&h佡m(- dmbyV)|#6"~!Xæ]IG'8lexP #>%ɪ-Ė,| +F6ÖpTOY^usim0)h)̏c <8FJxRhڿ\/4Q8:ovO"iJͳMf+ j wso7Ki-i+K$33r>DmlxJojL`Gq>∣Xlt!."2+x@E$3Go"Z4>1EliEsr$(Q1q/oŚ?WU%;8+9Ĩܪ96D槂$xLL1SAdȓ1U٠VK'~P7&eo.Y7)g~)>YռKZ:?oHo`<&2߾ u-g|P}3R> Ԭ5xbYB\h;sY;xfHy5|N ~"Zx .M^u;.ImuhakI$xj$ʷ$j&:j;ux ^ά^+.eY+j, 3mU[Ö:톧cQou7.O'LNn5)0sre0yooPv{/!S[ Ɨ"C!3{mkr<<15q$<:"zcS֐΍iFh sU{,bF\5u'_//Q'+4>m*gqqԱ až(vdGj[Xk2I8EҍR.'e\r6I >"xNd|mkIqvݦ[N\ Eho"vMO~8p4^'MKšb_}2G,Rxu.gfY,)2 k u/`NZ_,4~do-!P>Bhۘib\G<λZ\w?`<.h-PnH̃ [R? ®V~Ӽ / }0lwd:Ym,^f1Iq6饷~5Y_%.K]iw~ShkkG*+WFd*H[R? £T?0U#2*?nH̃ <d5hwg9n|A^\Gr=]9yh{_wIX4 xOҭl DkcQywE?A@-aQ sGdTTվ7âW[-!{\ʪX? 6Y(վ7âW[-!{\ʪX? 6Y+?`}/\~Mm)|EKwqxN[ko6io.ۮ. :21_|Ro|{ڝ<%}kQ%(((((((*?2ogOOxgw6ڴ6i="oۂ4 r,Rm 't֓l[md7\>qh&d,BkrG|u[y#]5agkv3,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0xOs~x.?Tҵm<I{ !ݪxA/n[UK{uV c3ZO1=*v,]T ^"G$foڿ|oߟo/wZ5?y}_e-`yf>-Ϳ(Ki =\0% YL(+%*}\_o?<|}E*ӷh}W>W{<ݿs?y_:Qcھۿڀ::r[ۮ\-RyUTDUb ^θz#\i|WsmՊ+t " Q*#bj;?>+o7G~Vy7/YZgG?|H>ߵh.߷U?m^yt~_iӼO5WźFeEpҋm>IԮR%[+M\u!oFa:{kIo^-y.8{H2?YKyJ+h0{?Aԛ jWV:Zw<%Dsa$r˅GC76PrSķriQ_jCI4QxgxtR,$wU;uVV{vc3Z?-M*C)F,]dCxP(nloKnK,3^@kW/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RxĞ"Γைa xYx2ҩ3 {Uwh5ibgECş q -!9PPZßk:燼A<;4p_}Z8/b0_[]`oL1`As_$Q@Q@Q@Q@Q@s5~"Qi#mKx&V(+5«*\[ʤ<v4L!9V(*/cwr^d< M} mtOi)>ku\X[n`dtKO>4 |\cGdt:O V[=F~7א2OU]l tG|u[y#]5agkv3,iYsr$ l^HA&][kB=7/żY ǗZ=$ ,ХZܑVH-MXeY݌)hY7% t!a?4 #m_[yy<0[ڷ/i-+maO:y0Y61|¤ V xpjWٚOLZ'!-ҙquFL++][> z%j ^PH^[s2C4;]ua˵QC$g" aPfYxC^=GXOKM hmcмYη̂Q.'s7Qŕ=I/ov2 pd4~Z,{ee2bT|y+>ImN -5[ߤ׉#[3ƱEp!x&.i)e 5 xO 躾նD۬[c,k݇jZ|]xI֬P+>!Ya/*K9L;.E\O!>>0k-5Kq ۬7ͫ?(SCr,[K5?LדE Z怾 %a~w$K%cr'i~'ntR֬fQĶ 6C~5F;N浆ox3]ntK~*|eaxUӼLuMgc8y $|~аoҵh4m_ѵ6;=֛wi {we14D9M>g@5Ve/yCgm= oHjc)# `쫍>&C/U bSӵ]RSRӮ.<<` v ܿGWԲ%xOu+-'Q.>"cZnfᴽjK؋ϞaWu>:MJž,G~=cśFC,k"ϛlPy\_Δ}<7/f3L2k5Ӽ;㫟]o ֋ubܧXZT^'f(Z[%wi'Ӽ;x5δӉe3{4k- zm~]m[ͦ:15u,纒=y_J@tl+ȓ;_I0yfF?a~]hh}<7/f3L2k5> j? 7<Ck)>7on߿pxGho*O?71S }GGMOojn7ZJO}\}UEPEPEPEPEPEPEP^U?:&xK*Z>|UI|7DmnW⏅M~Fݯ|WPc[6v"2!#1,|-\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ pW-񷇴彶-֊>Ig|:i  \3L^ φYG1g*Bь3wVko]ͻ*Yl*A03`v49FTੑ~$J+ ѥxlKlV[K˽IתYqh&d,BkrG|u[y#]5agkv3ߥ^[go}uI3'p˕ WOTXZ+ʿ~dEOTXZ+ʿ~dEZO7{_l3⿁JdO+Td%I ( ( ( O?WZ'4m?-ߴiڥ\͵l2 V>W K0ֿ>& [6@ GGCX#dx}KٓU[ -Y^Z?&V,l ,ةT+s)(h&R=]iWMe[].&mF]6A,($4j! |m=Aỻ&$_;~gM &+ge{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/|G|7wqo=!h$b$o0HۀAvޢ[kB=7/żY ǗZ=$ ,ХXm3AԴO]RRl>D6FՑ2m@I@ýK\|awrOҮu{+BiDd΃SI[E,1%#:[ʳ۵RnoUTJJ1bC&4h>*}v=?Wtֱ+a\S-cgt cHmR4#`;I%Żi K۰% '&YLAT"(<+DЮ> x?jCPt_VAx8$oc"۽I"n\UxQ]rY[G&WiK; OX^(m.qZMgwiM+h+@!a!.i t{?O wVRU/IUm'~_;U{?S*].YC+X5_"LzVDh2yvG)>Ķ(Ek2hZ9EG^$5? jvY˨+C}[UwDkT5%\ w2|Mkxg[u?WozN}mHix>k7\-lĨtesֿ]A^w&vڮ-"$rU'1fGx2-aOº-ɷգlͭo,votrMc4q\EkRXQj7OB`O MpE1'$kMKcP)Q'ttԕUYl@<*4 [Úle!/]Q*y"=Lݎ2Eig8kiwŸz^&xBa<+/><^]xkwtD;iɍ:iUMTH?ϰl~j66am۹qʇn>Me\ng k:Uo iPOg/[a"HDcpD"*p?}<7/f3L2k5<#7'ey]Mw}[&:wc&*58gӮ vxJ?[{)"w{4(P.|:c=4MV6}ߔi=[lL4u$ p"`w?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh}<7/f3L2k5<#7'ey]Mw}[&|]F<3w#0˿w?ן߇uxNcᤛFVc̢8䙤؂fuy<#7'ey]Mw}[&_g㷁fǃ5_h}|%'Ѿ֍ڮ<~,x~a~t-A.~m%-6lƓ ݽ/wp[Lt"XpHat@eI`iym}[ϳ]g[vÿq^;g x? xaxZ5WBF)gFUK8TWuo+hN|߳ٷߙ[][uwh?dFy\m 8]|HVh /hCyP$y)G܊??9:9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ +StK/>ۨycY痌mF['QWſEӛ+=j[*l2wj^KbIrͰ8풫LuWW:Ymoiû*)o*Wq 0fbv,EW䱍m%mݴֆVLEa R]J@Wo wM♬<;i"ԢT5k7e,?U>,/v5~dAL2yj7ۙK7I}Zu {}?gᮗOCoe2#EuH.[lf[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P?_ >'AOxs)֬Na,ve[ dJoU B=GKoa4V閗%Y-`ۤ;ڨq *.$2mY/fMVl.$e{hYZ0.bP"}̤rkKiQM3FVLhd{P6*U hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDMf+ j wso7Ki-i+K$33r>Dmkr^̚\Io,20ac`\9gJ\DI@4gQׅ.Fۚ"X3 O-Bs)fVMԭ_cmޮé#ĶѽHM3D]\ J?$`UW7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Jsୟ #Y\_˫]y_߹Q:ݗK/|_ƃoc0NWIuH/'R@PSk#FgY/fMVl.$e{hYZ0.bP"}̤rkKiQM3FVLhd{P6*UşM [Mg][cV6%&u%X0bh_46[[}+~R[Wp- m4m,q/,qmt}DGI>a~t-A.~m%- 񿉵j—Zh% Ҽ' G4siwAxUb9',JR5xG<[}&XRMcNo;HD{n"ܯEJN?-9Oux <CS[K+_.M[[n[6>;ҵ۫] אxGJ[[6onƒ%eKId.cGnuijN廇wTRߺ%T`Yc M:-uZhwZ啻yiEf4Z6+P <jz>/ x{{k+;mem[[{Xn 5)V;^#Քw"O[\i-Zit0[=xGW{G].Ѥh-XJMcVu OOӵho+hwjt*do;M?,Cs5[֣;"Y ݯRB>c`E"C,xoK6/ig#k~&V6֖N+i|[{yrOVs>ŧ@!-?Vukݭ emdK<" ƺ -cxetO(nN>JK]..bakycWb0:!eĺEn^F-źD5y$V5I|3c{7$yŬ-;eG&--.]:D؞^wgWQ߻ nl;wcVo?>P;}ӵy Q_Guۘt{WC- -7_k7~"Wm0TЭBD؞^wgWQ߻ nl;wcVo?./\gP}K(aFīFLk(K7Č,n|a*x'xZ5%#h~)g(gKXcK[X}yoo~gO_Pq;M1>,)D׶mm'?nT *B6op%{Wޡ_i> oϋu i-ֳ, nmF~n}C#l{gߙ.iķ?g# <+/pO|Nmx; o9eA[i~nX&y/ ̭+W=OßL>)~.jJ ̨e/l#cY]JUOU?.o?`˯GyW_?F wK~ ]|=P3 <;byz O]F~-w'yηݏ[_ =GW}cdӼWq̹prZ-p=H%h.w?g_y˅r$i3]$}|w&>(((((((*?$_%oX~¿3mo0HCjz'$ez}-5 ._@$+gF!^t}+55{'zI}}u{[=Uy ?/|_n|_6>gV#~7_>y˷g?o巗]e| s¶%}>g[.~S͞6 x%h#U2#ez[mq,Etn,Vw !31Gl"rXHZG?H>/hyUbfys?Joϕ~^<7o<{+eK-Z~B&|LƇ(ʜ25#:[ʳ۵RnoUTJJ1bC&մ k5;-cQ/u7Y'w*025JH*A6ă\ũk:WeN?`y.nYJ8bٵ:y`+hy~v|߳߷痷5徭↱ Ծx4'J5+M^4"/,Ko6Elch (W@=)-XD}헋`mˇ-̏RhRnHo$w리2ng~[UURXɰ>hV-ů_fXgHFX-Д4aeo&S]{Uе rLLKML7L ɔ[`eQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!: #:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KKNJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ ~~ 0| ImnJk̰3q9~go?`չ},xNIoh\k2yΗɱ &?7he` vQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!: #:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KKNJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ ~~ 0| ImnJk̰3q9~go?`չ},xNIoh\k2yΗɱ &?7he` vQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!9 ѼK#[<) WÓa}yt%ᢔCv"HnO1%KY*|95~gU1C;_s,jV"+U_K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥u?[NH`čG-46B}eX 숶c,KL.%Qdq)> |C5 _e֟x/]H^sD7[&i7Zmi6j hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDݔws~wۼv@RF.FYi*]%4+QZO}l[͵ypţޢ@[ Uua˵QC$g" aPfY6گ<sWvͭ `Ho$w리2ng~[UURXɰ,K f۴m ^Z1v7$m ȻIRR9%erm>@:_ &0/TݡJua˵QC$g" aPfYa:{kIo^-y.8{H2?YKyJzd?>6tlIr2COx H&:`6گ<sWvͭ c^nj 5뻛)N]JXIc$S0dQ@7G?H>/hyUbfys?Joϕ~^<7o<{ 7Pd9S@.7Y#:[ʳ۵RnoUTJJ1bC&¼ !x~ ҼI7tXXK EDe|2s"Ȭ$+K߅|co Դ]n KhuH$,H*KWS/|^mHt=[GޗǬՔm A ILHy@b)GZмQK]Mc.gfۭK#\KZpWM(Mç -Wiu. A fC$FK䍤i)m|[_ojqkiW7w߭DmyDSyʊR"=)#|9Zk #zvk>jZnOȴ^w٥ta|X^0l=kñx7ZmK ~؟zg8ةnʊUg|@uO[ZmN]55q1}a{mHb)/ۀ]\[M3̫V#NEґ44 `UX]U1,m&i+Z5i߈Y:Ʃo亡XMhmxH"U.O^k:60|7-5wl+{mY[tK%|GJ'g> phz{ɥojmퟃ58/4صKim%;j ae@u*Cx~]ZӴm#xW#eo9TR?EC`C%ҵ}_NE]]4;</`UXQefW1,mu"w+Z6ڛhM4脽2ٚ"Xb&3+ú'~-`*m6m۷so|}ʸxw@!?ųUln*6qC~g6y? MCw&v7r|Pl{-/ פxηqΰm-qBW+ifwgxnnHw^Ja4Kf[۫8KJ]@O=Vٖ8\2zWt "O/C[>Uln*6q]>h Y -- Ϡy~6H嶙^pbebyCs ;xK|cVhT!H@DJ ?$jVv&JO|;4'7a9l<=0س"im-e(#d2yrfZ( ( ( ( ( ( ( >8ӼI|75;mb_ xSD/uY 1ZE+OT(8>^U?:&xK*'SZҬ t.U0`򎡔"EQEQE4 jneqZ>=YD6yq* w ,lIi3EtPOfe8k!GD3#e[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY#:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KᏊiYZXxDK%64x t ZMf!hUVlPoGF[3+ hIjzf6hO7gt"G8}ȫmcS9չi };+B~Ȍ[qT|"?fʑo*qgž}\EK际c@maG9\r}ȭs#S5=OOG>?3f?ŜNyx&eIEqR~[{{/ӝd״}k QSŲx ,w^9'⇝߲VhӟMVwzպxNmorY\W=ҾiK"e Oiym}[ϳ]g[vÿqQ}VѮ~$Go1J']ffiFj% E,YTCk ×z$ i5 iV_L-![ #䴿;Mξmun*m[EvVIo q/<⮙v(~"BZfͣ&Xm -Cϳ?War+\b @<-2ioĭd>VAYChtbp]GYsDۨycY痌mF['Q?o-`oh5!^H^Z\LRz&oh[ ~L,XYñRW>RP?+x7>~1En^c[ᑡCx"6}ЉD{Ѕ Z2|4W5šVwzi7^0 5Hd%2j)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PܯO뚎_ xW{ Ւ -,[^f6*1R;-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&4>ռ=&Y8v,2 ft*JD|i/ i1oiCL}+֐[HA4aSs;v{)ciSlK f۴m ^Z1v7$m ȻIR7>ho&Ӯլ;knO3ɸ̾w9x7Z^(Qtj退+b%VI%xGDkz~N_G&ž񕖧nG= " ui%ILһAfWK}Ndf%uYxAD49'VO*xf #%"@ hf6zlquH4Vf<0I#[k$8g%)YPNsYjze\ZK˧bhdIR`LrFN_GO7f>ճ~^>ѨG}a}[h_y{O7f~˿~^~W)!k~x~J|)5͇.XIn.%NO)daV}#NEQ#$gVY/QV[2hv@M#_/ٿټxG;VV u -G7}l<ݘVxsG}&wt;o;R?yk7gy~_ά^JeY , j,U"l!"y^*K6$qvUWL(UH~ HEQEQEQEQEQEQEW|Y6_Kޙ=c7/D:$Q 6`9l‘=ּt?L/hTZMڎewqaqO K%F[3(&71e'1&PEPEPEP^?H'{NCp ̐7Z9Ee'K,2K#f[?`2n_K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥> ~@kᵿ/['Q?y\`b#2*e 񭏏uM.+0\\*g*~wG/Nʒ*  6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%C/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf]rwt iCgmc? 7Lc6ԭ%k+Y Lw>Zxžm |ckiڼ1Dѫ^I2[{\zRk7X_ PKy[IoO5_"_(!ˑ#o/%C[dmKyaWVɅ 8v*U 'J]vm2ᾟK2SM7JIkakC0F7 ,FgAt?5Iwq*1EskD:aiee{5R\Y(+t42=(ghtnv*Q忉{\k\GY K!vܕY~a*G%n#tՆ&nF` "pU6-nudzN⻛oQ_XgoXrQyW*/^o.켖>#R'}^yJʛ#x?Y4Cz6߳x]vPg-F *)ӎ2w_+tY(nuijN廇wTRߺ%T`YcےKi =\0% YL(+%9O#$f|w<ُo3oչ%Zv?/|gn|g6_Ps;v~G/6g7m?wm[KG% M1-'UDEX;.l93#hyv[oUح3c[qo|M:qi]ͷV(,[s3`79Fg਍q,Ӵnw+縄31t;l"XƹZgG?|H>ߵh.߷U?m^ytj6 7?ǜ[V}[y}PA$U;{vZZ{a2J?-=2K1u*QWJTN;O|#}|3ϛy[66Uoخ|/cyq~oueģ>Q}G}ӵU񯂯W}c-i4O4,iڂKGXC/->=%Ӭv< +HZvix Ԥ(u(gV`$j;?>+o7G~Vy7/\Woi:Ʃ4WZ# EoluyX"yq5,1f;[NJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f['HWBDcECoRP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%C/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%Cyé/ӭRN:} 6~,kM?mu{H"C|u[䷷]5a[3<bMp=yៈBPuBEь֯yK`rKؐ.JIcQ[yg>~ϙ'|?q Ot]>hS0 [9$!Cթi "Fng^^Kn!cfnoce"hь>ceX >[~N_G\o,~/7<>Wqmxgm\~c̷O16dI_aHtQEQEQEQEQEQEQU5mZ@үu=NNl{˹V(`UPIb@hxWśX~_ 뚑K}oWMbfGmpKn6NO:_|+xDnYCXm$ V \ؙ_.ШҴ/Ҭ'ᧆ)J2!u %W8袀 ( ( ( ( &nu_ k|Sq.-ϰ*>T4~Uю.#Q (o"ѭ?IG'.泵WE΁\#XI TR@5H$cG|u[y#]5agkv3,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0«?_ Ο Yb[S\ķ6E{YK[m"Eszj״KE Emz< [K[DϖPOMHoWrV^en9+;yf7? I5>|wqov:~ 5̪$h][[!n$Y;_k?tW~ѻgߛo/ojq VI.-MhbX-݄(i(ĭ7N_Z\%y±[2 > Q-hIƞ s 6V)Y]DI! tə]\̂-<Yq÷VX,C10fb7Ed䰑Kmqt,i 砘0w;*pT+~ҟ46i ƶYʋ*[^4L"U/h$i,|??ym3 lC"IN";ź =[-&UD.2l!}\gWg?|y{sEͭNmq\Dgh7Tefiym}'ȳ]hm<黷yųt|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHxQ]rY[G&WiK; OXifO|6~_ش"99PpMmd]պ[[}GOmR`Pz s2LnHo$w리2ng~[UURXɰ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H0_ZwSͽ"@"J:`iv_)fF*=_$&I|j7yahbhP-g U9"w;umkn*nD=ܖVɭ})o7|u>&@W1íx]vMvc '[d _$WObCF Ta:{kIo^-y.8{H2?YKyJ+x~.O-OGM5R˥R,8n 2/?_x'J~XHO/\k!񄰬$󃬑](ŌQ{TVH-MXeY݌)hY7% t!aYG|7wqo=!h$b$o0HۀAvޥcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹ m 't֓l[md7\>qh&d,BkrG|u[y#]5agkv3$_%oX~¿3mo0HCjܾfe8k!GD3#e3okzPqI l,D'A|͹eA?4 #m_[yy<0[VH-MXeY݌)hY7% t!auzԻ>2x~k->i)6n:V tw8핽V9%erm>@:_ &0/TݡJ}-fX_|3B5'ȋab &< m̥mmijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ3OGLQx'>?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* @5u2=>wvW{e}ؠ_gWmb > [܃AmZѼAmE5515!R4 +4r3[wVp'.㲹=od'{}żG)Coռ3^.<qwZ5#_:I#o0J.jwIA.j_?}eif:;lE\,~7#!7c6Oo5[}vz m|K{kx[[{H-$Iiy)+۷fmm KHaS'tb",ͭHؖpP7&eo.Y7)g~)>Y.k 7 o3>#o6Ίey1"J2NWPu >ZؚF"GVbs4q[y HpYOxW/G[:տt&cEZK(D\)E1b#I& $*((((((jzMlM sȫ,R,H$YT [҇ohZQums,V|Y!-"Z"h?wOxIQ󵥲LQ$Qs"< 1`$lf[ 4E4enƏG؅ #nҥYkEҢGL.^PVk;VTHx'@hdBr5¸ǁD{B}OT.Xn~۳ryqG8~VBn[dW>Hfg| P余5[{EXeaehrB2}>3z/izmίYT"$DH2_R&bcٽWMԿ WOݓN[/3h&ugeC[)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)(ʬfs૏#78hG̞#2;ƢnFY(W$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wSEh?Aa+xÚM[4A|Z| Lv ';Gы߶?O`q%-a|ǹVG3%R\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ p+!_Yh.󵥲I&~tGmXwyt#3 D Ijz|?eyb<3 lqF"0NF"O/Շtn;ռ҂47k!hKv):!vⴟdq!E4 gPt&U ,mgg72.dV8H=>ol϶}sq9(Q$I'1Asun*ӭ[=ܖW2Go}q|șF>&2?5qe3YXmuNeȱC5dd)Bah]PKi =\0% YL(+%9=??ooky뿴|_ n;w߼[kwVn.㲶M|'8K|t˱Co)>Ӯgo/{_eF7sV;gͿq|u[䷷]5a[3<bM?jz|?eyb<3 lqF"0NF"SA|%XU3jv2C1#u&([9-ߵDk;OmڱE~bCAAa3?Dl]\gw쨥tKܩ_=$سa_5Y>VMy-՗TU88xddXaqJg];4X}*o [5 ƶt&*=I/ov2 pd4~Z,{ee2bTs;v~G/6g7m?wmyUx V๼׉y4=kuđǕxʌ dW0ʑ]vUdmKyaWVɅ 8v*U 'Jijn`x[_,GmdxlI*5_4#0Zlо6p̴>l`)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| Pke៍ v7t9iEORGd-fZ+)BF;,MDCЬ,$f{K*O(K q*G&2LC@%ɪ-Ė,| +F6ÖpTO_oOB>]|xzt]ʾt/W8ihm He݄dg'ho6 Mibaj}KR!uK`,mfEu}_&y-c~$n<}mOLѥXyv֑BYZT$l$9;]3S,^6ІٟHg+R0фr1t&6_gg}P#/Dڌ?"O9 [[qFӴWi-90D3TFθz[|pʊ[DʕBL6U,cPO3ɸ̾w︯ |L|c ցx=Nzoj/C($m<'kygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|{?O wVRU/IUm'~_;]Քvy~Gl{y7ygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|y>Wqmxgm\~c̷O16dI_aI{?O wVRU/IUm'~_;u\xiǨ[yy~tW-&!6ǙWw{]Q@Q@Q@Q@Q@Q@Q@xWş?αkoIpkwTŅ憠m%p,T2u ¿ i/MWM^$[hl##(,Up4ZNYiq%)os3*P^YF݋1$M[NcVZ{o鷰ͭ夫,3$GRC+)0$An ( ( ( ( ( ( ( (?K{xOӵ#LnuK:o&/"n*/@Y>|-~kk> wF :@)3fkI:F +j3xmCwě%\_&$ZA_E/s HQfo:Vb*ʞ/t]xNMN9Mim>6M463hB'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PWîj}U|wsO:GZӣ`%>r,or;YîXgo2ĝ"x;PlJGiެ7eRXo,fYe)06;(sfmG_ifZcQ[yg>~ϙ'|/cBޭb}_zcMnՓQn$ ^J35#T[kC[/bmy[B{,GjHd)kdc'߻Wr[mFo?~K>yŻ_?lؿ巙ey7 =|M}?q|5o|0!a'Qh1k\yhB72oCGCt{}Nsj0ڵŲDbMtMn d` W?cN\^_>vϗ;|G#0}k?jO7ngj$Gqnj*nfyKGɼUQ(e(ŋ zf?hoow~7~3^m?Jo}~^+wG$foڿ|oߟo/wZ#jIqnkCn&ICI;IVSUJ9,JYq÷VX,C10fb7Ed䰑@2?y}_e-`yf>-Ϳ+Vi>++Gynyyy/Eնz:|Wsnʖ[tʅL ;Q8*dkrG|u[y#]5agkv3ow~wUKvZ ua2JO1M2E*QgsgG?|H>ߵh.߷U?m^yuTm7ow~- VCb|ϴ}?nǛ3;O5dc'߻Wr[m]q VI.-MhbX-݄(i[vj]yf& Q(+/ xS?Nk o%MN+y1MxsydY;Iq L] ռ9>*x̺In5"&K)zG1!4GdzQ⻛wT;T/`ghrS#[;ź =[-&UD.2l!<*oDŽt|aGqAũ^q4[EGpKhv4?W߆Ρ]ZQ5kdiKmF4e26GO|?}/ϛϺ_|U -[PFq)3izۚ/-""FxpU]Քvy~Gl{y7C~og|Fmߝ|6|i$[̋VXz^/n RӦj NVmHf/-$6V2U[—MdPuDwZHȕR nc Q^U cC'*,TG6oh3<2#(h41.c l ( lv^ OZYxWna]= ԚbmZLӼd47 du[}2O8MJn`mOÂibY$T*4`0 7 {7o0u>MVŭSxCxg&Xl-o"qZ}vU|cv>6Z:牗PH!ȫ!IL*9 Exσ~'>*Ӭ5ߎ:~xtx^k3BmCtQoU"8MA-]ߌ_,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KO't+ׇH+Z\;p yP9f1}WF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB~ xBVS⟝Ο =X%xR ^󏳨c,/v5~dAL2yj7ۙK0Iqxߊ>]ީ𴍛:[4^D2z>~дC-,.--Bv<2Ce+I)Q캰OMHoWrV^en9+;yf7?߅^ռdu /W/J:.b-%ż,I,q+\0_̭@ih6_hCy}O,$y G܊&?88#[[wVp'.㲹=od'{}żG)Co'm/|;:u1-4sakؤy!S~m.#MqR}V?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* M3S,^6ІٟHg+R0фr1t&6_gg}P#/Dڌ?"O9 [[wVp'.㲹=od'{}żG)Co? FGOgGywngչOiK+#7>֊W>IdLi\=??ooky뿴|_ n;w߼ [k[tVp'䲶Mod#h9K}wèA24>1EliEsr$(Q1qmun*m[EvVIo q/<⮙v(~"BZfͣ&Xm -Cϳ?War+\b @ OLm ІnYHg@mLpqG:6:O]eszOy*R9R# z|:?m<1,sQ6-HvNb(V?/Zf?Ŝ8I &fF2EyխqᧇDʒ IBomEcbͅT2|#7i6b7_ص>G9\r}ȭs#S{I$so |F*>%,aEPk(((((((*?RP>V's]!PK U1b(\#HUmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W/ j<+)b<7j*%(/*[H^KIG ++jZ~ya|L(us%v-;.r|f.b̈́U~K+LO ٿw?<3.O#$f|w<ُo3o$jonkC+Op &ICGǰVS)f.J Ji?gioo}oy9~+f3~fQs?Joϕ~^<7o<{&zÔf~ ض%Z>?/|_n|_6>gV#~7_>y˷g?o巗]j\gw쨥tKܩ_=$سa_5$U;{vZZ{a2J?-=2K1u*QWJsG?H>/hyUbfys?Joϕ~^<7o<{oyl~UK{uV c3ZO1=*v,]T (sfmG_ifZcQ[yg>~ϙ'|-nudzN⻛oQ_XgoXrQy% [{x-^$[7iWy2.\mTmDt}ٿj]o?y~~-߾ q᯳hy_mGyߓߙm{]Q@Q@Q@Q@Q@Q@dŚ+oĚΟo5R-|BYFO%kZ'_?9=oh~9Эu :4[gtkm!*ee8<#t?L/hT|;oGjX ' \jK{G'̰,MY~JT@ hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDdo?VoVO?d/^)E?!Mhh~d)2}sUUPgQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!k??i;ƺ_._K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥ ?'_ R1Z߀YQkojR5QC3Nks?A:'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJ 0E5 ONU xe%%6-0J:G>7C.hџK}G^l[?nkOxHab &< m̥* 0| ImnJk̰3q9~go?`Ew 0E4}OQY| x%Uu6.(B@=~9%erm>@:_ &0/TݡJ6l][[zfj$8aU2VH\IGg(s 0F|<5-+LҠ| yWRK#0`Q >A Ҡ6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+?Ewo?_j<:UԶY)h0W$2Jua˵QC$g" aPfY6گ<sWvͭ nWύP}˚?Ew9%erm>@:_ &0/TݡJua˵QC$g" aPfY? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.h hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcID@:_ &0/TݡJ 0E5 ONU xe%%6-0J:G>7C.hџK}G^l[?nkOxHab &< m̥* 0| ImnJk̰3q9~go?`Ew 0E4}OQY| x%Uu6.(B@=~9%erm>@:_ &0/TݡJ6l][[zfj$8aU2VH\IGg(s 0F|<5-+LҠ| yWRK#0`Q >A Ҡ6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+?Ewo?_j<:UԶY)h0W$2Jua˵QC$g" aPfY6گ<sWvͭ nWύP}˚?Ew9%erm>@:_ &0/TݡJua˵QC$g" aPfY? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.h hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcID$xjZV}AhFa A|@K/KT|+M_42Cy N]wG֧$_Df04/۾$hs\ ̬"X ^ҽG>7C.kįxďeΕu-odx'd-0 3Ҁ=Ho$w리2ng~[UURXɰms;g/7y^_7w?y| kZ|%ݞ^Լ=y"w,5exيDb gOHӿ+O𥄗W6kq\] %_TJFPֱ|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHwQ^ g&'/aug%Ǔo1kBTiʻxi$9˚~|S--UC_n4 (1!1v^[mqt,i 砘0w;*pTGqnj*nfyKGɼUQ(e(ŋ =|EK@|_麮aqEJpVa*C `#O|aUwԭ }xf)65휪CeƄh}\gWg?|y{sVjIqnkCn&ICI;IVSUJ9,OaO;?`o\y_jGھѷco?}ϟ;|-G/PFO_]_׷Zy$jD[GOڲ``B3q+'%溼wW-- xv^$b$o0HۀAvޥvVz%h{Ҧ|"2}KV5fMW[ӥaH岄-㸷;Ѽ7 !+Mo5oiz5+$3cqd31dks ?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip)x^?dV6}?>H4K{bś!;8J>=Lj|w%ןj⋫Ҭ tKBgWP ( ( ( (xCO.OֵM_U1]8K/]4pn<!ށ" WߎwMi<\&ww}jbp_nh&,ys\$!CK D@<'x|:k~ Dῴ\[ɚ$}fVsw, <5 1ìiǓmZK3m}o /QEQEQEQE柴wo|&/x_Cu}'LEEin[K;K>P"#wxԘм]q_}+࿏!KoPҭefXRYʫ@'=+.l{wpѴ1ynCơH`vk;n%B8|9j%dž'ya2{{u8۷.%H6 h|$ַ7s^kNsG=ik.Ͷy4b17@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPn|Dd(#V  C 2Aintegral.jpgR{XZeyV\y#g{UIF{XZeyV\y#gJFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((|Y$b/[հ>[m95,!smcm[ukJ;h+kpp_L>Y_.PExľ<ѮxCN7B]ys1Ql#(#s$*x??V|+Y '<3o ;>uOal,E;=J d\W/h^?eZE g'P @$f1b2@’;Z((((.|_Y֝wJ50H? coCI٤)Υ"ݕݻ-ߢ5袊faEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPMZ;鴫ˋ{=IuiRcj]C`@eGi㏆jľ/u{{e5F`"EEX?.(1Pj ;Z[ㆯc⛍ZU1JIcUI7u[t%A@X|e|]C}KP>y~wao&;sz1nJUi=z5N*>;YN/g(Uc(=R|]SѢ?5ϊ_Dݲ{oEϹvFzy^9ƤT~gbpU熭nh;5%u6QEhryčwM[ Ckfգ{Q2Iv,Z6yM3+aa >]zx.~"ӡ]V-#KfKtvQYᘨgkP)lE>ti\D.? =,EW޾ݤYhǪwH+Ҽmo6s4>gkh'7ZFYv3GU«vz5}^)WJb^-[N-8I4I f//? $_j>^~q5S8ՂtTb#:rq٫f;QZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^gw?i/m][/[h%0cy&+Hu\)ʅkʼG'Ov@pZUn—ݴ*UlQ2U((((~1gMW ?d?Z5|G~˰3̖ c  :ВZ(G-O-P)Vw^ޗ{kћ-Ot?cWſ>VHgů,_2@'iVs9S^{j>4=Nf[!|gG`ϴ$B_ ,~24kDҵ /Vk SʙpFn`FGe4o񇌼;sw~%9)T.۔0$$*ԦyZӽO#ў`ѭC N*xH?{K_鿵7>!,~/[[[8d-pLn)Hyk i m9ͨjNO jWޥffLqk6CF}o'ÿ:~kZi~$K_-{1ܤ?)#6joÏ~8ՓG_lʓ(r-dUHϕW?z|/_u?x৏bkK ,lAr%BSO>GX/kds^G c+7oc)7# >_%o 8bմKFK ;8'yov_fh8|;ݖݥqNK> Z/z/d[-& $  X=ztȬWWeN>OrQ{݇<יk}?lEAP]E%7$/b2A9]5 5'`DiV/S]"NeXW-%/y,x5J,eKm~ hxwzuoh:ܶ&vd3E*rʡM>'> |Kj^l4`KJL`2(<'Ҿ7|4>%=-믵. 7mV˝uK/cyCQJ7( 7dakksi+[4^cnrpEpשo.utu _W$^ng+|Zy/d_5mf"6Y[KñoBK/9Y6ctśw~0X3~h3RҵMkGoo,7QFTo@O>ÿ<+qO?=HkͭZ[b;*xeH`*!mv _ɣƚݝgkv46puy-w EyJxjyGF>s8դSf:2q$p%#bċ9.[&Ot?B__ o |2|1aI$Mvy-frҤw:3IrKlrB7*|9Þ [o%;;>-_pt*I*xsE77kIEI?k{d/|SӬi7iH>yp<4w8«o?f#oBs?]>5;4,3=Cq"ʣQ#֚JNJu2u(9ԡ4ť5Q[pQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW|YΣKὦc /J$VRM" Ȼ6 l}ּ+ώ4~_ NX^$T4KV`C`LVJS 9`i6SiUƩq)krʠFp` uSIִ-B.#.#Ki-Ue "~gS:*`nJVڻvKŸ |ЧѼ#diܵܐ}YJʨ[t|95EmFT`cb+bʾ"nsɶoVQEYQEP±R6dy|ȷoUu, O2MyRI-;s;OBB5]?QλjV&u;wܡUP@_K`$y+OoՅQL((zMޡ囦G`.rۿn/̩DhOr9E5d~jAT?Noԅwvo.-QIn`_ˏq>ZmE 'Fr]Fx#,O'燑y*!NȒWbOT"f,VW+Z k폆F"Fvff 3*(,ʪ W%|K欟پ 'dPt7EypI67 X)NϕjgR>֣妺ۯdmv[/SxWFlX-JݟwĞdB >'mɨiL+mbP2A-ԥF;  騢ch#z֛o (+#мiat];]A2[jvF@p 0\ZRiIY )ԝ)Ԗh5 kZSۦӕ+ئv8rmB꫶9# /#O`/8%'y+!Nܶ ۼJ?|V~g:b𕦭"?xVmukei:u7Iv,y|XFҗ-_x.o>j?ub[nnᷖIt[ $V#TN@W'-,/W4V;}W:l.Ù$.]݀A0Ah(((((((((((((( }nZqt,N1ǘ興w;Y%EjuKV}–}}#-AP3MAn e0^HȌ-/j/?Uچpo/s@v70U")ڊ\,>/B*'VQ[={mdԕ MM.MJ3g ΦJdyq:(^LD.vK ( ( ( ( ( V>%ҧӵ r8& T$veTG5 BǷ:Fs5m#Ai{KW :A3o{~Ot khl쭣X`$qFEQ¨ v_Ǩ R*d]_h?=4- ZTvi;33wwbYݙؖfff$jV$:sI9ݽ[{QE2((((((( c]*};Qϴi*# C+*@5m3Zƙy"c A;Љ5fcUUrDL[\v_Puk ho,chgS~=Q\ww Ѵbˆ3HOGP<]Դ2UetR+nbXLV&Fep\0(_stJ_dWiÝsUUfH   V|WOzmxV$Αyi>4sȢ9j %$ Cy{ #_ [),V@ij't CmcU~ȿm= Ԡ[oxÓK xdytV/hyq$vn$yWؙ_.ШҴ/Ҭ'ᧆ)J2!u %W8袀 M[{S}鴴Wu)ً7ig<~U*[tP>~⾟sLOxF!hYeBBH$KEY^U \i}Y$1T[xO9=V< #Kۭ4kN5 Yk[B%O,E <!#(((((Ot |VrE)uV ܥs ,0XGKZ oVuvrLP.oooy"k{fBVXՉ3\)䡅~wf{ÊƩ]K뺃!TC$ ώV +f4}/-H7 Xˤm-n8vO_ |7]X=}YmV9En cohXK!k'wm\U)я,?'/utW|#>8#lQuNԭ7\]M[z+]z6w.-dhY%kZ ( ( kI~k=Dže"Ś$VEoۖ)X w>L"EQ"F@okvknytSKYԴE msch&#Ɏk/@[KukYVFу,r!ꎒ!WGEeeer|SZ뺧|Uu{NM/͈bX:nj:/wPG@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^g~%~_ gGVIsa)(HE`+݌kk¾,o'4m\ԏH[zl+4<;k[pA`w @=Ilt *L,6bBhUUM&K鴫)5;{{=IFiRz$]Cd( U(([JwlPCG*$ly'"veCaw2[xGEҰK,֓/ 䅘K:[M[I3St^%u*0!T$EyW 'W_kR (Uύ ɖ(#k( 3Cۭlg&l]_׎2>Ĭwlb G*$O$l@:( ( +#,a޳Cc W$s102N3PMs_[2 X)TQ|WV_3uaf!|ʝe~ *j]X[7[qɷZYv _k+>ҏpFZwox[~Uwww%f];W ?q|GDKh^BC򇷚4+J0Ȩ 2 x^dbYA' $0,nJdfZַ7:_vo:ذ[+9Te?+⧈32O 36o"Dv#;$8u/`2Q#?4rA['}HdH%$exhch5TOdItKE<^!>$98Уvl"@#FtMV*(((((((,xfOx7ڵ$:F!CržUq$Һd_|+o[nYM[yc7! V#*A@W&N{o}>6\kjRfKЪ2Fn5 @((((((((((((((((((?|SxĿh_bִ zϖy3k$[ +<: >>kz. \γ_[k 7OiunҴ[VPxb|Ym/>|7E,ﭼƏ΂T1ț\ AW þ*Ok^15{)u,b;2S]FJwN' o~ƚ߈t&Nd6Lz\:hEvJ4>I5 kxGjTU*pUƜaZ?~5|e|JQ/ulWU (8Š((((((((((?mRK~g|? Mkvʠ7lj< LxO:_|+xDnYCXm$ V ZZZ/oxChgc2BL%D v񩵈zQ@Q@Q@Wcm?@'ֵ'B﵋}K}Zo6-і61aVo՛Qook{]xrDr>mjt)d^#nVOܴ$QEQEQEQEWοE/OG5k;-WUּG m,"r1+]t5ռUQEQEQEQEQEQEQEQEQE_|xow:ŭ^%¾Se'eRpHʂ=ּ+ω _ 1 x&%hhdM eZNYiq%)os3*P^YF݋1$M[MڎewqaqO K%F[3(&71e'1&QEU w_/O:ͼa=w;X2y$y>!I-߄|04Km!T#wޜ0C+_?c!<~ߌ>$,}xIƙP#ܯ7@ 2 $^u BghnM%226ۧpJ {k?9 /_&&q}MJw[O"pΊ#]B{Ĉ[B<^o|;em,,uecJFu ەCnxռW#w<m?/u׎ﴝvT^\*4 f_13_*/|!hZI 8&1}qNn`c-19NSq3*c!<~ߌ>$,}xIƙP#ܯ7@ 2 $ |UF|955~/ҤѤ#RxH%sͧYxSZj <]T,M;2:Z0|xX-t}%㷺fK?=ؙYܑ~*[<^6> Ufgeyq*nyr%_zmޠ0סO?]/G${ ;d.˺,6MFS1<-Mxᮨ_E0RF`nV3m[y@K@_a.#i 4 W̡fX<#%.*[ǟG~GFoMao9/ok’oaYwp2Ŕ7(u/mKĐ|^4 jyG:%YYm}c7䲷}J Ax)(KI2 E|1CqkxJeyjSxAľqIyf)PZ5iƸ+;_o<mq?M8a>kbxdٴ%s(Нb<~?(J?)F9@'}&ͿOF4m^LT5{M7XX:Yxą#ll(h<;g^5pM6SocmzkEw/F|iL-xWE4sN[}xoڒش3[wy3`-Eel"/W1:znk/Ŭ*j2xU-K+HVD! "x x3u)ѧx/;mY.`ٰ`g>5_UPEPEPEPEPEPEPEP^U?:&xK*Z>ӼI|7;b/ x_Dt @2KX8$eAETtt]*O{-!KxKUB6.YI$juψ#A®#I!d+-Gls)k+CP.oooy"k{fBVXՉ3\)䡅~wm xWMlS*!ieBiY(.ąDQPҞۿ޺K *mjWNɦ`&wsCo čcBA³gSr%2@m-ה_i-c+ʼ⟇ ̝n?˻-Fw#lZ/?;U5?~ -:[IEylH6JϰQ@xC-|sOei4"[w$wr.ŋ$wGxI Po W ØF+ޠ6uZ(7ȿhWL!2_ԴZn-&"P*HRW=_ +/wBI6JI$fyWs!UaU@h* DϾ6z_b,i<[IDf0R mB{oWPuŬ[7q&B1*w^T3##/c-P_~/x\'&DnmZզ&C" 5VI+. `|_/GWi66>++jGt7r@+FyHb;aQ9bcPEP^{RxռC,1} ՛L0Aw-QsP=֊OfxN/ [x{XO4+g{n\9(ۤ-Mt[ x2ҴϲşcڽDb&b>E\''Sÿ |1OZV_xWhXV#1DڌGȫ^kC8ƓkW5;yA+K6דEE#<E2˜i9QCHZ(7+׺`ѥԦneUGbwƯ"勷WbjAw/vf5(,/nJbD*yq # (?dx6_>)񷉵/B^Zl[Tc@\) +k(((((((ciW{oiPܫ0DYwb$ 5+}˦iXԒrzm9(V4I]4ٵ*KKfPLncwBN Ge8b0O|Q杩%ʗ<1B ԩ!el's3TY?|7+Olyn0|mvoeT-+ jGo{ *zߣޣw}?Ol-lma0G *Vh-&wl(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE i~9n.e6}m4~tD܄2Xg kQ@S:[#w_l_A|SƑ4M^R}$m@*[~|Vo2vɸ&;.$ڞdch((((((((((((((((?i&_~+eƣ^KVy^UH@ $r'/ V%'?t#Zy_} ho0[{HFv6=֊_?x~2x3ؚΩAmgyWZgplKgmg\ǂx{2ִtWRem^Vv,H ;:)R>ǯ ;}CS.-4MU1RBNXon-44G?i 'Wi::֕e[vpiwm%ʬxUxu AnU  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz=J5;j:m/mugw 8!Z(ʿ|#AqC4G?h*i 'Q  @ÏNU<??G3O/?:Vf_u>8!Z(ʿ|#AqC4G?h*i 'Q  @ÏNU<??G3O/?:Vf_uu^i|;wU.ٳٻ_';6;W]QEQEQEQEQEQEQEWxN% V+φu~_ 4kO xV"i^h`Eݼ鴖!eF UM&m;J. "cYYT#3rN n ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<7[k Յu n[Jϙip #vAk6s^^ڦG? :o4E2=ƚ9]Bdܑ}+x[:_4+]cG]ѴNRHxGWGº:2)Z((((((((((((((((+ώ4~_ NX^$T4KV`C`LVJS 9`וxN% =+Iִ-B.#.#Ki-Ue "HtfCbB%I/EZ ռ9Kqko o,RPCEsn#%LF9Q@|*^[ѵx**K 6՞kk BDh((((((((((((((/kP|$.7<7;hvsݽ̉u-L-7A/@W|YΣKὦc /J$VRM" Ȼ6 lm~Пu|7.}{<'x X@{,kMwh1XymZ??ŋm'ONJ^)^ԜQсqlym)J@e6YZ\_jBI}v,h' \W/h^?eZE g'P @$f1b2@’;Z((((((((((((((((((((n/#izK̒Mr~fD HJ=HC^U-77uW|wϤ "Z^mHDҐU((((((((((((((iw w?꼯yUW|9;a4N{ctG-wљ>ƌF7 (V~%yj[:Fmo"ʑD[ 7O5}|cYjͮ/jY35/5}m(o Oq(8#?EW|YU%?k:> xu(Z/hyAw66vm9{SI*=NRHQn--e(;R!KYn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >$x {kNTҵAm.mH bw2#IGD>x }uc[ִ'͗I-ݷzʛu4?5+ PD5ð%P\Oh.TYV-x@ukJ}GM.mo-%Ya'P":YH!  tQEQEQEQEQEQEQEQEQEQEQEQEQEQE_~!xW%S KĖkwY aeƽּt?L/hTZNcVZ{o鷰ͭ夫,3$GRC+)0$An((((((((((((((((((((((*/hxWPInnVCld䘯fH̘ !6SVlu*L6exJnee$ -^i {ן=ڟm|5/ {Pie]fªF$qHTk ¿ t?G,;n+8^R02Q Oc^{X OLtxU{Du$2CAVG'Ov^iNJ,<_ԴxJ-oCSxO$أ+XX灀h +ʿEw? 0WZfi#\xSMVf-X[+k0˴w3=֊_ 0J|!H<n\WRxfHvB\H#8=+s?A=V|&kzďqM[5dlI_.CAܨsA?EwU*7>/GΥ:T7o<[ce ZPĒT$|o;\AƷ?Eo  4[eeSugN9b0k^|ďo>>f^y*Dc!BI'>|amj< [xXg{ JKkm2[a,{_|o;\?{ o#RҴ*KEu-3팖 eR3=֊G>7C.ko>ּY|H<%UY xV9V,`k#8$8 u+o?_j<:UԶY)h0W$2J?Ew5閑[o_M^4ţtB4d0HH#k8H# 7o>*ּ'HA koU⿉ZeVkVm i"m+O-!,Ao2Aڨ1IEw? 0WZfi#\xSMVf-X[+k0˴w3=֊_ 0J|!H<n\WRxfHvB\H#8=+s?A=V|&kzďqM[5dlI_.CAܨsA?EwU*7>/GΥ:T7o<[ce ZPĒT$|o;\{Ʒ𥆧o5 [fQkg+Õ9`27h:f#[ϩ:5ρo^J%ÅPrI㏄|iďojV2yLc%KAEyW#?5&|H8Դ2J%-]Ki,c%YD  uύP}˚3ujv<%lju4ooU !|H 's9h įxďeΕu-odx'd-0 3ҺG>7C.hh 7o>*ּ'HA k5o>"Ϋ{|<-u3]SXI^L^i"tk9p7JXC<ҵEw? 0WZfi#\xSMVf-X[+k0˴w3*|XT|,}_Z-֗o7Go"o+l-١tFso澀 įxďeΕu-odx'd-0 3Ҹd_ik?|V :NH׾vGhbD}+?/7OúԺՕ)őP A.qF\^(zV_ 0xY|<u-WLҧ yV(bײ$B's?A=V& L$xky=GUf-0kT$p NIsJH\BbIQEQEQEQEQEQER=&VS5+bbQ4F4q,JUI29snh7^E,zu͢V&v!;,|Kfo7J?鶛|,bEe  `9?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip9j%dž'ya2{{u8۷.%H6 h|$ַ7s^kNsG=ik.Ͷy4b17@PEPEP_?5?g&;??~v}v}_@W|q_B %i!_mj۟WE|V>WCOkEϢ^k1AKsq#Yq.-vǼ{u~ xPn_i7×xHCqey<.H 0]kf+ v%M6Z6i͖y|cI XԲGS WJi)F.Osemm-I"ٔnT*U ( ( ^ͧiWv4k5*#C#b0 H-@/Z_OugKyuh$uVrSq؀4X>-Dc}G4/5'K4ޗB3!_@osnOԵuWy>٩[$S4,񫰍C3Z߆H|?qΈg۵CSGm2O*-Kj&]1|(((4ox__hvjsX_7s]GJrX52I& "* Kǿ $Vc֓];[S$0fi"Ou4lV}mW*_]N[x5 [ř46Y w mW9񽿋|16++}.lS "pc$qb_0cƿiO.|/R?eY"TU3(g*=VᇄT2oaX__ w#-+GH͛n۸8@]Q@Q@yGĽWOa+kEsTۧW8bh|&.ğjPLM+7o/u]3Iд? 0ƝxMSv_.MXc~76|aˋ=5$,mg(xQ`v (xƺZ;j_قM > Ky)wL /zzVos²XYͧ[Zn{iNȋ C Dұi&xk^!ռj'X5k-y22jd@=.oGo1^h>i&0VrB`[g'?x^?g }C->I/57eH&# C[ƞ6ߎ4/֓e荣j:ZKȺKIXJOt>N82tk} GS=JSkVHgDfcAg()w۽Zx*>v-ާ7Ih-ʦE bB\ bbQEQEa/[Y߅UOcdH".w"_3jaRfBk}ޟj[]@VJmE ̰}n.c.#9H0x?Nkxa5ᝤhZ+uÆE*yB0.K% SWχ˄ﵭSWLWNwwś.k3wip||Cw]еwO@"> Heading 4$$@&a$;@V@"V Heading 5"$(&#$@&@CJOJQJ>@"> Heading 6$&#$@&@" Heading 7t<&#$$d %d &d 'd -D/@&M N O P Q 6@CJ@" Heading 8L$$d<D&#$$d&d@&NPa$;@<CJOJQJ> @"> Heading 9 $P<@& 56KH<A@< Default Paragraph Font6'@6 Comment ReferenceCJN@N Comment Text$ Ed$x^`EO" Block Quotationq$XX$d %d &d 'd -D M N O P Q ]X^Xa$@CJ8B@"8 Body Text $a$@CJO Block Quotation Firsta$<$d%d'd-D M NOQ]^`<@CJOJQJO" Block Quotation Lastp$$$d%d&d'd-DM NOPQ]^a$6@CJOJQJ<C@!R< Body Text Indent h`h4O!"4 Body Text Keep$*"@"* Caption@^O"^ Chapter Label$&dP;@FCJKHOJQJ\O"\ Chapter Subtitle$$dh]6@CJKHhOh Chapter Title$$pdh]p@B*CJ,KHOJQJphFOF Company Named< ;CJ&KH$>L@!> Date$a$5@CJOJQJHOH Document Label $h 5CJ$KH0X`0 EmphasisCJOJQJkH:*@: Endnote ReferenceCJH*R+@R Endnote Text$ Ed$x^`ECJN @N Footer'!$$ !$dNa$OJQJ*O"* Footer Even"HO2H Footer First# !$dN@0OB0 Footer Odd $ 6OR6 Footnote Base%CJ<&@< Footnote ReferenceCJH*2@Qr2 Footnote Text'xB@B Header($ !;@<CJOJQJ8O8 Header Base)$ !*O* Header Even*@O@ Header First + ! 5OJQJ6O6 Header Odd,$ a$LO"L Heading Base -$x5CJ$KHOJQJpOp Icon 15.$d`<&`#$-D /M a$5@B*CJOJQJphL @L Index 1 / x 0d^`0 CJOJQJD @D Index 20 x d^ CJOJQJ< @< Index 31 x d^CJ< @"< Index 42 xd^CJ<@2< Index 53 xd^CJ:@: Index 64  `^``:@: Index 75  ``^```:@: Index 86  `^``:Or: Index Base7 xdCJL!@L Index Heading 8$d ;B*CJ$KHph8O8 Lead-in Emphasis;CJ6(@6 Line NumberCJOJQJkH,/@!, List; h^h22@2 List 2< 88^823@2 List 3= ^24@2 List 4> ^25@2 List 5? pp^pB0@B List Bullet@ & F hh]h66@6 List Bullet 2 A8^867@"6 List Bullet 3 B^68@26 List Bullet 4 C^t9@Bt List Bullet 5CD & FdD&#$&d(dPRCJ\O\ List Bullet FirstE$P]a$@CJOJQJRO"R List Bullet LastF$]a$@CJOJQJD@r List ContinueqG & F >Th.Tf:E@q: List Continue 2 H8^8:F@q: List Continue 3 I^:G@q: List Continue 4 J^:H@q: List Continue 5 Kp^pVOV List First L$PP^`a$@CJOJQJLO"L List LastM$^`a$@CJOJQJ1@ List NumberN & F h>T h.Tf]h^`6:@6 List Number 2 O8^86;@6 List Number 3 P^6<@6 List Number 4 Q^6=@"6 List Number 5 Rp^pO List Number FirstuS$P>Th.Tf]a$@CJOJQJO" List Number LastmT$>Th.Tf]a$@CJOJQJ4-@!R4 Macro TextUxOJQJ*)@* Page Number5zOz Part Label=W$d@&P#$-D./M a$B*CJOJQJphTO"T Part SubtitleX$$hxa$6CJ KHOJQJvOrv Part Title?Y$$$d &P#$-D./M a$@CJ$OJQJ&O!r& PictureZ$>O> Return Address[$a$@CJLO"L Section Heading\d;@<CJOJQJVOV Section Label]dh@B*CJ0OJQJphHJ@"H Subtitle^d5;@CJOJQJ`>@` Title'_$dd&dPa$5@B*CJ0OJQJphZOZ Subtitle Cover `$d $dN @CJ,KH.O. SuperscriptEHH*L,@"L Table of Authoritiesb !JCJL#@2L Table of Figuresc !J0^`0O Title Cover~d$$XXd`$d%d&d'd-D M NOPQ]X^Xa$5@CJOJQJ|.@| TOA Heading@e$ d<<$d(dNRa$5@CJOJQJ8@b8 TOC 1f Bd@ CJOJQJ@ar TOC 2g8@8 TOC 3h d@ CJOJQJR@R TOC 42i dh&d(dPRCJR@R TOC 52j dh&d(dPRCJ.@. TOC 6k   ^ .@. TOC 7l  ^.@. TOC 8m  `^`.@. TOC 9n  ^$Oq$ TOC BaseoT^@T Normal (Web)pdd[$\$B*OJ PJ QJ ^J ph:b`: HTML CodeCJOJ PJ QJ ^J aJNN!.Ar"'o/r1\}: Z & V " ^ ( \ + M s ?Iy^6wst`v;EuIwA{t3h~(X+~ !!#>$T$%%]&^&''(A(b(((((+'-^-...///0/8/x//////// 00'010X0i0t00000000|1V22353a333344"4j4445660778<8d88,:>:;<;<S<t<<<<<==*==(?n?|??????AAABB!BBCCDDEFF"GGH(HUHH0>0>0>0>0>0>0>(0000000000000(00U0U00 @0 @0 @0000:0:0:0:0:0:0:0:0:0:0:0:0:0:0:00zU0z0zU0zU0zU0z0z @0 z @0 z @0 z @0 z @0 z @0z @0z0z0z00}(0}0 Z0 0 0 (0}0=$0=$0=$0=$0=$U0=$U0=$U0=$U0=$U0=$U0=$U0=$Z0=$0=$0=$(0}0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-U0&-Z0&-0000000U00U0000 @00 @00 @00 @00 @00004 @04 @04 @0404 @04 @04 @0404 @04 @04 @0404(040+:0+:U0+:U0+:U0+:U0+:U0+:U0+:U0+:U0+:0+:00=0=0=U0=U0=U0=U0=Z0=00?0? @0? @0? @0 ?00@0@U0@0@U0@0@0@0@0@0U0@0U0@0@0U0U0@0@0U0U0@0@0U0U0@0U0U0U0U00> v$2d<uAMS@EFHJLORSU } %b,148AgMSSACDGIKMNPQTVWSB?b$aq9U0WDSɀ2$!;(+2$Q")v CM@0(  B S  ?N _Hlt16144269 _Toc24275101 _Toc24275108 _Toc24275117 _Toc24275118 _Toc24275121T$4,:=N@'-!4=:)=N ?N,!!!?/B/O/R/_/b/////90<0I0L0n0q0y0|0i8p89 9;;O;P;T;U;;;AACCDDHH-I1I6I:I=JAJFJJJJJJJ(L,LLLMMNN!)=NNNNN !!)=NNNNNN Joe ChumaqC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Getting Started\Getting Started.doc Joe ChumaqC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Getting Started\Getting Started.doc Joe ChumaqC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Getting Started\Getting Started.doc Joe ChumamC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Data Analysis\Data Analysis.doc Joe ChumamC:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Data Analysis.asd Joe ChumamC:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Data Analysis.asd Joe ChumamC:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Data Analysis.asd Joe ChumamC:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Data Analysis.asd Joe ChumamC:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Data Analysis.asd Joe ChumamC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Data Analysis\Data Analysis.doc||}d~v2 udJ*p.̧6qs` !8  V%xwָd6v)pE|Z0QL8GDD{aO9I WxwָrZaC_fq@ Tbxwָ.+cM{Pp 8ހrt:v^`.^`.88^8`.^`. ^`OJQJo( ^`OJQJo( 88^8`OJQJo( ^`OJQJo(hh^h`. hh^h`OJQJo(*@h@h8^8`CJOJ QJ o(.@h ^`CJOJQJ. hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJQJo( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJQJo( ^`OJQJo( ^`OJQJo(o PP^P`OJQJo(@h hh^h`OJQJo(@h^`.@h ^`CJOJQJ.@h^`CJOJ QJ o(. hh^h`OJQJo(@h ^`CJOJQJ.@h@h@h%~}|l п 4   %I W Tb` aC_ QL0› › .+c` rt{Pp)pE{aO{aOÛ {aOXÛ {aOÛ {aOě rZ8  d6x `@h h^h`CJOJQJ1ܿ `u@h h^h`CJOJQJ!@ `@h h^h`CJOJQJ: @h h^h`CJOJQJ& @h ^`CJOJQJl @h^`CJOJ QJ o( @hh^h`CJOJ QJ o(1<› @ ^`CJOJ QJ o(› @h8^8`CJOJ QJ o( Û @h8^8`.dÛ @h^`.Û @h^`.ě @hp^p`.        "'st%%]&^&N@ Z?? (e?e@N0@0D0@UnknownGz Times New Roman5Symbol3& z Arial9Garamond?5 z Courier NewO1CourierCourier New?& Arial Black5CMTT10;WingdingsWTms RmnTimes New RomanI& ??Arial Unicode MS9 Webdings="HelvArialA"GenevaArial"qh*u& +u&Rs&:K `@ $0dO2QUsing Colormaps and Gradients Joe Chuma Joe ChumaOh+'0 (4 P \ h tUsing Colormaps and GradientsMisin Joe Chumarmoe oe  Normal.dotm Joe Chumam3e Microsoft Word 9.0 @=@N1@3@`<K `@՜.+,D՜.+,L hp  TRIUMF O Using Colormaps and Gradients Title` 8@ _PID_HLINKSA*XM fit-demo.emf)*% smooth1.pngRO, fit1.png4fit2parts.pngUHA grid1.jpgVHA grid2.jpgED integral.jpg  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry F@ =Data Y1Table4_WordDocument"SummaryInformation(DocumentSummaryInformation8CompObjjObjectPool@ =@ =  FMicrosoft Word Document MSWordDocWord.Document.89qextrema-4.4.5/doc/Getting_Started.doc0000644012702201742730000067600011274636625016557 0ustar spangspangࡱ> l@ 'WbjbjFF ",, O"%"%"%"%%%%%ZuZuZu8ulu%(v(vvvvIx<{|Rq%~ExIx~~"%"%vvg~"%v%v~@%6%:vv `kvCZu ^8n,ǘ0p:%%"%"%"%"%%:4}hi}J}<}}}}%%'vM'څ%%vMExtrema Tutorial Getting Started  Introduction This tutorial is an introduction to using Extrema for data analysis and visualization. It is not a comprehensive manual detailing all Extrema features, but rather a concise guide to accomplishing the types of tasks most commonly performed by researchers. It intended to be useful to new users, and for experienced users who would like a quick introduction to features or methods they have not used before. In most cases, this tutorial instructs by example. Typical data analysis and visualization tasks are described and then performed, both using the GUI and using the scripting language. The tasks described are generally simple, but practical. Extending them to cases that are more complex is generally straightforward, although you may need to consult the other documentation for further details. Documentation that is more comprehensive is available in the following references: Extrema Command Reference: a comprehensive guide to the Extrema command language. Extrema Online Help: detailed online help is available through the program itself. In many of the brief procedures described in this guide, the reader will be referred to commands and functions for more information. These commands and functions may be looked up in the above references. Conventions used in the Tutorials Examples of messages and prompts written by the program, as well as examples of user typed input are displayed in typewriter type style. Curly brackets, {}, enclose parameters that are optional and/or have default values, and indicate that it is not necessary to enter these parameters. Parentheses, (), besides being used in mathematical expressions, also enclose formats. The backslash, \, separates a command from a command qualifier, or a parameter from its qualifier. Literal quote strings can be delimited by the opening quote, `, and the single quote, , or by the single quote at the beginning and the end, or by the double quote, , at the beginning and the end. For example, `ABC, ABC, and ABC are all valid literal quote strings. Parentheses, the back slash and quotes must be included where indicated. Extrema is case-insensitive, so input may be provided in upper or lower case, or with a mix of cases. In the examples in this guide, Extrema keywords are given in UPPER CASE, while variables and user-defined words are given in lower case, but this is simply for clarity; you do not have to follow this convention. Words that you should replace with your own variable names are given in italics. Installing Extrema Extrema is distributed as a self-extracting compressed file. You simply need to execute the extremainstall program to begin the installation process. After agreeing to the licensing agreement, you then select an installation directory (the default is C:\Extrema); and everything else is automatic. The installation program places the Extrema icon on the desktop. Extrema does not modify the registry, so to uninstall Extrema simply delete the files. Running Extrema Double-click on the Extrema icon to launch the program. By default, the program raises the visualization (graphics) window and the analysis (command input) window. Commands may be typed directly into the analysis window, if you are familiar with the Extrema command language. If not, you will probably be more comfortable selecting your actions from the menus and toolbars. A typical Extrema session involves the following steps: load or generate data to work on graph the data, or analyze the data repeat previous two steps until the results are satisfactory customize the presentation of the graph(s) output the graph(s) save data for archival purposes, or for further analysis Once you become familiar with Extrema, or with your particular data analysis and presentation requirements, many of the above steps can be automated. In that case, you can build scripts to automatically perform the routine steps in the above sequence, and possibly the entire sequence itself. Extrema's scripting capabilities include looping and decision-making features, so a fair amount of intelligence can be built into your scripts. The examples in this guide include instructions for performing operations interactively using the GUI, or using the command language. Command language examples can be used interactively in the command window, or in scripts. Data Representation Data is stored internally in variables, which have names that you use to reference the data they contain. Except for a few automatically generated variables, these names are chosen by the user. The first character of a variable name must be an alphabetic character, that is, A to Z, and the maximum number of characters in a name is thirty-two (32). Except for these restrictions, variable names can be any combination of: alphabetic characters (ABC XYZ), digits (0123456789), underscore (_), and dollar sign ($). NoteVariable names are case-insensitive, e.g., variable x is the same as X. Function names are reserved names and cannot be used as variable names.Variables can contain character data or numeric data. Numeric data are always stored as double-precision real values. Character (or string) variables can be one of the following types: string scalar: a simple string of text string array: an array of text strings Numeric variables can be one of the following types: scalar: a number vector: a one-dimensional array of numbers matrix: a two-dimensional array of numbers tensor: a three-dimensional array of numbers (to be implemented) The contents of arrays are indexed sequentially, with a starting index of one (1). Except for physical memory limitations, there is no limit to the number of variables, or to the length of strings, or to the size of arrays. Addressing parts of arrays To refer to an entire array, simply use the variables name. To select an individual element from the array, provide the index of the element in square brackets: x[8] ! 8th element of vector x y[2,6] ! value from 2nd row, 6th column of matrix y In all of the above cases, you are referring to a single value, i.e., a scalar. You can also specify a range of indices using the colon (:) character: x[8:20] ! 8th through 20th elements of vector x y[1:10,1] ! first 10 rows from the first column of y It is also possible to replace any part of an index with a mathematical expression. For example: x[2^3:10*2] ! 8th through 20th elements of vector x y[1:sqrt(100),1] ! first 10 rows from the first column of y Variables can also be used in indices. For example, suppose you have a vector z which holds the values 1, 2,, 10. The following are then valid: x[z[2]^3:z[#]*2] ! 8th through 20th elements of vector x y[z,1] ! first 10 rows from the first column of y Such expressions can result in scalars, arrays, vectors, or matrices, depending on the number of dimensions of the result. The special characters * and # are also available for use in indices. For example: x[*] ! all values from vector x x[#] ! the last value from vector x x[#-1] ! the next to last value from vector x m[*,*] ! all rows and all columns of matrix m m[*,#] ! all rows and the last column of matrix m m[*,1:#-1] ! all rows and all but last column of matrix m Constants You can type numeric values or constants anywhere a scalar variable or value is expected. Constant arrays are expressed as a list of values inside square brackets. When typing out vector or matrix values, separate successive indexes with a comma, and successive values within an index with a semicolon. 5.03E-8 ! scalar value [1;2;4;8] ! vector with 4 values [1;0;0, 0;1;0, 0;0;1] ! 3 by 3 identity matrix You can also use the [start:stop:step] notation to specify regular sequences of values with which to fill the variable: [0:2*pi:0.1] ! vector from 0 to 2( in steps of 0.1 [10:-10:-2] ! descending sequence from 10 to 10 in steps of 2 Expressions Extrema allows you to use mathematical expressions anywhere it would expect a variable or value, provided the expression evaluates to the expected type. Simple expressions involving dimensioned variables generally return a value of the same dimension. Thus, if x has 10 values, then the expression sin(x)+1 also has 10 values. Other examples: m[x,#-2:#] ! the rows denoted in x, and the last 3 columns of m x*m[n,*] ! x times the nth row of m sin(a+b) ! the sines of the sums of respective values in a and b x^2*sin(x)+1 ! a non-linear function of the values in x NoteThere is no limit to the length or complexity of a mathematical expression in Extrema .You can also index the results of an expression, e.g., (sin(x)+1)[4:8] ! selects 4th through 8th values of the expression Reading Data From Files In most cases, your data will be contained in files. You will need to read these files into Extrema variables before you can operate on the data. Extrema is quite flexible in allowing you to read files of different formats, although in more complex cases you will need to know the details of the file's data format. Text files Text files are human-readable, that is, they contain data written in ASCII format, and they can be viewed or edited with a simple text editor such as Notepad (. Many spreadsheets can export their data into such a format. If your text file contains data arranged in rows and columns, with columns delimited by commas or white space, then reading the file is simple. To read each column into its own vector: READ file1.dat x y ! read 2 columns into vectors x and y READ file2.dat a a_err b b_err ! read data and errors into vectors To read all columns into a single matrix, you must also specify the number of rows in the matrix: READ\matrix file3.dat m nrows ! read file into matrix m There are also options to read matrices in other ways, for example, by specifying the number of columns in the matrix. See the READ command for more information. Generating Data Commonly, you will need to create data spontaneously. In simple cases, you can type in the data directly. Usually, however, you will be working with data sizes that make this approach too tedious. There are numerous methods you can use for bulk data generation. Sequences Simple sequences can be generated using the [start:stop:step] array notation. pi = acos(-1) ! define scalar pi with value equal to ( X = [0:pi:.01] ! make a sequence of values from 0 to ( in increments of 0.01 You can create a regular sequence of values using the GENERATE facility. The generated data can be specified using any of the following methods: minimum value, maximum value, number of values minimum value, maximum value, step size minimum value, step size, number of values You can also request random values instead of a regular step size. Functions By applying an expression to an already-existing variable, you can generate a new variable in which every element of the input variable has been modified by the expression. Capture this data in a new variable by simply setting the new variable to equal the expression: y = 10*SIN(x) ! x is a vector of values If your source data is a monotonically increasing sequence (see above) that serves as the dependent variable, then you will get a fair representation of the function itself over that range. For instance, to produce data representing the function SIN(x) over the range 0 to 2(: pi = acos(-1) x = [0:2*pi:0.01] y = sin(x) Operators In addition to the simple arithmetic operators: + -plus - -minus * -times / -divide ^ -exponentiation () -grouping there are also special vector and matrix operators: >< - outer product <> - inner product <- - matrix transpose >- - matrix reflect /| - vector union /& - vector intersection and a set of Boolean operators that return true (1) or false (0) values: | - or || - exclusive or & - and \ - not = - equal to ~= - not equal to > - greater than < - less than >= - greater than or equal to <= - less than or equal to One-dimensional graphs One-dimensional graphs are created from a single data vector. GRAPH [-1:1:0.1] NoteIf you do not provide an independent variable to graph against, Extrema will use the vector index as the independent variable. Alternatively, you can bin the values in the vector, to turn it into data pairs (i.e., bins and counts). The resulting vectors can be plotted using any of the two-dimensional graph types. Two-dimensional graphs Two-dimensional graphs represent data pairs. Typically, you will have two vectors of the same size, which should be plotted against each other in some way. Line graphs Line graphs connect each subsequent (x,y) data point with a line. This presumes that the points are ordered, so that they are connected in sequence. GRAPH x y ! draw y(x) as a line graph A parametric line graph is also easy to make. If our parametric independent variable is T, then we generate X and Y vectors by passing T through appropriate parametric functions: t = [0:2*pi:.1] x = t*SIN(t) y = t*COS(t) GRAPH x y  NoteThe plotting symbol (characteristic PLOTSYMBOL) must be set to 0 to get a line graph. This is the default, so no special action needs to be taken unless the plotting symbol has been otherwise set.If your data is already in polar coordinates, you can graph it directly using the \POLAR option, e.g.: GRAPH\POLAR radius_vector angle_vector NoteAngles are presumed to be in degrees.Scatter plots Scatter plots take the corresponding elements of each vector, and plot them as (x,y) data points, using whatever plot symbol has been selected. There is no requirement that the vectors be ordered in any particular way. To plot scattered points that are not joined by a line, select a negative symbol type. SET PLOTSYMBOL -1 GRAPH x y  If we have errors in the data also stored in a matching vector, then we can add that information to the plot by specifying the error vector(s): GRAPH x y yerr  If your data is ordered, and you would like the data points to be joined with a line, then simply use a positive plotting symbol number: SET PLOTSYMBOL 1 GRAPH x y  Histograms and bar charts Histograms (bar charts) with tails going to y=0 are drawn by using the \HISTOGRAM qualifier with the GRAPH command. x values are assumed to be bins, and y values are assumed to be counts. X = [1:19] Y = sin(x/(2*pi)) GRAPH\HISTOGRAM x y The other types of histogram are shown below, each with the appropriate value of HISTOGRAMTYPE.  The above picture was created with the following commands: CLEAR WINDOW 5 DEFAULTS SET %XNUMBERHEIGHT 6 %YNUMBERHEIGHT 6 HISTOGRAMTYPE 1 SCALES -1 11 0 11 GRAPH [1:10] SET %XTEXTLOCATION 12 %YTEXTLOCATION 90 TEXTALIGN 1 TEXTINTERACTIVE 0 %TEXTHEIGHT 6 TEXT 'HISTOGRAMTYPE 1' WINDOW\INHERIT 6 5 SET HISTOGRAMTYPE 2 SCALES -1 11 0 11 GRAPH [1:10] SET TEXTINTERACTIVE 0 TEXT 'HISTOGRAMTYPE 2' WINDOW\INHERIT 7 5 SET HISTOGRAMTYPE 3 SCALES 0 11 -1 11 GRAPH [1:10] SET TEXTINTERACTIVE 0 TEXT 'HISTOGRAMTYPE 3' WINDOW\INHERIT 8 5 SET HISTOGRAMTYPE 4 SCALES 0 11 -1 11 GRAPH [1:10] SET TEXTINTERACTIVE 0 TEXT 'HISTOGRAMTYPE 4' Multiple plots on the same drawing Researchers commonly need to combine graphs into the same drawing, plot multiple data sets on the same graph, draw different graphs with a common axis, and so on. There are many ways Extrema can be used to get these effects. Graphics sub-windows Use the WINDOW command to choose and/or define a graphics sub-window. Graphics sub-windows are an easy way to subdivide the graphics output page into rectangular regions, allowing multiple graphs and/or multiple figures and/or multiple text regions. A window is a subset of the page. A window, other than the default zero level window, has a smaller plotting unit range than the full page. NoteCommensurateness is never lost in a sub-window.Pre-defined windows Some of the initial pre-defined windows in PORTRAIT orientation are displayed below.      Tile numerous graphs on the same drawing Extrema divides the drawing area into windows, which can be selected by their number to confine a graph to a particular section of the drawing. Window number 0 is the default. For example, to tile four graphs on the same drawing, simply select windows 5, 6, 7, and 8 in order, and issue an appropriate GRAPH command for each. window 5 graph x y1 window 6 graph x y2 window 7 graph x y3 window 8 graph x y4 The WINDOW command can also be used to define your own custom set of drawing windows. Draw two sets of data on the same graph at the same scale Method 1: Manually set the axis scales to values that are appropriate for both graphs. Then draw your first graph. Without clearing the graph, draw the second graph without axes. SCALE 0 2*pi -1 1 ! sets xmin xmax ymin ymax GRAPH x y SET CURVECOLOR RED ! change color for overlaid curve GRAPH\OVERLAY x z  Method 2: Draw the graph that should be used to autoscale the axes first, then freeze the axes at those values, before drawing the second graph without axes. GRAPH x y SCALE S ! freezes the current scale GRAPH\OVERLAY x z Method 3: Graph either of the two data curves first, then overlay the second data curve. Then use the REPLOT command to redraw both curves on a common scale. GRAPH x y GRAPH\OVERLAY x z REPLOT Draw two sets of data on the same graph, but at different Y-scales Method 1: If you only need a labelled y-axis for one data set, the task is easy: GRAPH x y ! y-axis is for this graph GRAPH\OVERLAY x z ! no y-scale shown for this graph Method 2: By default, the y-axis is drawn at the left hand end of the x-axis. The GRAPH\YONRIGHT command draws the y-axis on the right. For example, the following commands produce the figure below. X = [1:100] GRAPH\YONRIGHT X SIN(X/20)  EMBED Word.Picture.8  If you need a labelled y-axis for both data sets, just graph the first data curve with the y-axis on the left (the default), and then graph the second data curve with the y-axis on the right. You might want to change the color for the second y-axis and curve to distinguish it from the first. For example: x=[1:20:.5] y1=x^2 y2=EXP(SIN(x/5)) SET XLABEL 'This is the x-axis label' xlabelon 1 %XLABELHEIGHT 5 ylabel 'x<^>2' YLABELON 1 %YLABELHEIGHT 5 GRAPH x y1 SET YAXISCOLOR blue YNUMBERSCOLOR blue CURVECOLOR blue XAXIS 0 YLABELCOLOR blue YLABEL 'e<^>sin(x/5)' GRAPH\YONRIGHT x y2  EMBED Word.Picture.8  NoteThe GRAPH\XONTOP command draws the x-axis on the topPrinting graphics Printing your graphs is very easy; simply select Print and proceed as you would for any other Windows printing job.  Exporting graphics Researchers commonly need to include their graphs in other documents, such as research papers, written reports, or web pages. For these purposes, Extrema can export to several industry-standard graphics formats: PostScript (EPS), Portable Network Graphics (PNG), and Joint Photographic Experts Group (JPEG). The HARDCOPY command is used for saving the graphics to a file in one of the supported formats. Encapsulated PostScript is the default format, if no qualifier is entered with the HARDCOPY command. PostScript & EPS PostScript (EPS) is the industry standard for printed documents; it provides excellent, publication-quality output that is completely scalable, and is compatible with documents conforming to the Portable Document Format (PDF) or to the TeX and LaTeX systems that are common in scientific publishing. PNG Portable Network Graphic (PNG) is a bitmap image format that is supported by most major web browsers, including Explorer and Netscape. As a bitmap format, it is inferior for regular publication purposes, but it is convenient for in-lined image display in web pages. It gives high rates of compression for conventional drawings and plots, and is the recommended graphics format for most drawings. JPEG Joint Photographic Experts Group (JPEG) images are also stored in a bitmap format, and suffer from all the drawbacks of PNG images. They are also optimized for displaying photographic images, and do not generally give good compression for conventional drawings and plots. Some complex drawings that involve smoothly varying gradients of tone or color may benefit from being exported to JPEG format, however. !"Za   = iklmSTlmO­­ߟwiwiwwiwiwiwiwiwiwiwhM]B*OJQJ^JphhM]B*phhM]B*phfhM]B*OJQJphhM]B*OJQJphhM]B*OJQJ^Jph(hM]0J5>*B*CJOJQJ\phhM]0JCJOJQJ hM]0JhM]5B*\phhM]jh0UhM]B*CJ0phhM]B*CJXph)!#0 V O  = \(q_!!!!f!!!!!!!!f! !i!!i!!!!f!!f!!!O & F$$a$;^;x^Z W!W&WOTqxn|biipYb'+QRSVW*+?@Cݺݳݳݥ쥍hM]B*OJQJphhM]B*OJQJphhM]B*OJQJ^Jph hM]5\hM]OJQJ^JhM]B*OJQJ^JphhM]6B*]phhM]hM]5B*\phhM]B*phhM]5B*\ph2DXG(<CH!!!!!!!!!f!RN|G$If$a$O & F$ CG|}'-RX}[_axyz{9 : G N O t u v w !!!@!A!B!C!S!T!|!}!~!!!!̴̴̴̴̪̪̾̾̾̾̾̾hM]B*OJQJphhM]CJOJQJhM]CJOJQJhM]B*CJOJQJphhM]B*OJQJ^Jph hM]6] hM]5\hM]B*phhM]hM]OJQJmH sH >P'R}}!{!s!a!{!s!s!s!a!{!A he5]e^5`A h}kd'4$$Ifl    0,"  0    64 lap [{G w !C!!"I"}""L#n####%$`$j$$%%%!!!!!!!i!!!!!!8!!!!!!!!!!!!!!!!!!"!"F"G"H"I"R"z"{"|"}"######)#*#L#S#k#l#m#n#u################"$#$$$%$1$]$^$_$`$%%%%%%%%䦘䦘hM]B*CJOJQJphhM]B*phhM]B*CJOJQJphhM]B*phhM]B*OJQJphhM]CJOJQJhM]CJOJQJhM]B*OJQJ^JphhM]OJQJ^JhM]<%&&&-&&&&&&&&&&&'(( ( ()(1(;(=(W(a(c(y(z(((((((((((((((((((( ) )5)6)7);)<))龳ͥ;;ͥ;;;ͥͥhM]OJQJmH sH hM]B*OJQJphhM]B*OJQJ^JphhM]5B*\phhM] jphM]B*phhM]B*OJQJ^JphhM]B*CJOJQJphhM]B*CJOJQJphhM]B*ph7%&&&&&W((((7)<)))!!!G !!!p !!!C!C|Gs}kd4$$Ifl    0,"  0    64 lap $If ))))))))****,, -!-?-@-E-F-G-h-- . .%.&...0*0;0@0D0I0Y0[0p0q0000000ڴ語}r jphM]OJQJhM]OJQJ hM]^J jphM]OJQJhM]OJQJhM];B*^JphhM]B*^JphhM]B*CJOJQJph jhM]H*hM];B*OJQJ^JphhM]B*OJQJ^JphhM]hM]B*phhM]5B*\ph,))*(*h+s+Q,, -G---'...//;0r00Q1111!!!f!!! !!!!!!!i!f!!!!G !G !i!!!@ h@ hee]e^e`UU$a$00000.3;3=3>3?3@3A3V3N4T4j4k4m4r4v44444444444444444455Q5T5g5j5z5}555555566(6+6;6=6G6I6O6Q6_6ɾؤؤhM]B*phhM];B*ph jphM]hn2WhM]^Jhn2WhM]OJQJhn2WhM]B*OJQJphhM]B*phhM]B*OJQJ^JphhM] hM]^JhM]OJQJ=12 2.3W3m4{44444445Q5z5556:6O6q6666"737!!!!! !a!a!a!!!!!!!!!!!!!!!!f!!aUUU_6b6q6s66666666"73777x7777\9`99999L:M:`:a:f:g:{:|::::::;;;<<7<;<<<===Q>`>a>ɽɒɽɊɂjXh0Uj8MhM]Uj@hM]UhM]6]^J hM]6]jC6hM]UhM]5B*\phhM]OJQJmH sH hM]B*phhn2WhM]B*ph!hn2WhM]B*OJQJ^JphhM]hM]B*OJQJ^Jph33787777w88+97999::|G{v!r*t!r!ft!p!t!t!t!l!aUZ$a$}kd5$$Ifl    0,"  0    64 lap $If ::::::;;<7<<<b<!a!a!a!M*|G nj!1 !a|G}kdK$$Ifl    0,"  0    64 lap $IfZ$a$UU b<c<q<====Q>`>b>>>?}!{!w!as!an!r*{!s!an!3{!w!as!aZ$a$UU}kdL$$Ifl    0,"  0    64 lap a>>??N?P?i?s???????????@@@@@g@t@v@w@@BCCDDEEFF2F3F6FȾ}qijthM]UhM]OJQJmH sH hM]5B*\phj~hM]U#hM]B*OJQJ^JmH phsH hM]mH sH jvhM]UhM];B*CJphhM]B*CJph hM]CJhM]6]^JhM]B*OJQJ^Jph hM]6]jghM]UhM]B*phhM]'??"??????@@@@v@x@@@@@!(*!f! l 1l 1l 1l 1l 1l M*!i!״?!!a!a!aUIkd~$$IfTl0 Q D y4 laT$IfU$IfU$IfZ$a$@@@@AAA'A+A>AQA^AqAAAAAAAAA BB3BEBRBhBBBB!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!aUBBBBBCC DEEEEE!a!a!a!a!f!!!|Gmi!}kd$$Ifl    0,"  0    64 lap $IfUU E2F§ `K堸  +x,@@D ֭|}wt","־5BšJ!WoE]0x :@rdpТ [ht¹sSS M *g\uSMy!wCSZq(!%vfV\ya|iqom3 Aǂ}9}Oz&m Ċ}nI ~+0}:ZEkhȨ$@KfCgc70(9kСKU宒K G3uUS%%5t=*v޽;&W~<5u@h(XyyV.((ꢬ \a{D2xc}b[c6loisJ"'{¥KMhP]@(9$vfxu~H;v'E:@BY͞qdK %@ 4 DʞWSF$iVu;3qzL2XއEc';Z:3XǔrC< _ <ɦ pʵ'FF<O1OA'?L{jZ(;w,tℲ{o-,lu&xg[3ӗ TS 3TJK9_l3%{P-\uի(`+PdLAL/A[g+Ҷ!Nge [*=ޑu]g:jg.zOxg>:ny׉ⲉ+h[#t/J*8E*dq~qMMeel.OE/kdIzzzgJeeeu9 A6Ά©hliIWtt;֙[FIr9fȑZ' cf pff&--Mr %eg1,;TNգOZXP:JJK9ŵ~5f&7 I-7Lb?  ^_[Rbn'+欮_R7.m{;{aXIp[uKwTI}oCIɫNz rJ._\S8~|eDa("s;U}|Γ%wA~/f{Z)K%ޏY׽w]p-(YpQթɳEO*NOXuvz{=f׹?)>Q7񯔜Pt#sO#Fe' q;#|IYKYE;jP-$cvee& 0!G|რwY'gki猭 <˩IJJ~gh% R7&R~wsLwSc}tO6|cOR&4 2:+ߺ_W6丸Ug.{g=S^pgG;skv( IY^Oz/_=CnuΞI_n,TJT{2*x&޺9;?ڤ笯JdAE+ =9 *S]]#4e7I=}hnmP= <쩬TV+K}Ç?veSIˤaJ^:gDEɞ7xp|ⱟ ♚~ŽȔLX'7@Bi+YY^׹4!}=Ǘ^q| Ny߃9ywO}dd?{ [rZ-m^wpկ9glH{Vi?њ?lzǿTstI  9ùgΜ7'Yر8`Id%ӉRwUr/o%YY?[]ßRh_~+9kOv #%PUzhߟ8}˳|+]NK+`ePӗg/_qxƼccy='W>tG#GF=ɫkzuRҦ)94P Isdž=J㗦'ia̭ğҿ‚ NhpqVSf6m-<_6ʡu+nfMh]A֯aML V4 Q o͙R9 0 Ѵr7 ="ե'.w߀[kdeSce{ϝmaKב' 5a@=  @h@0M= :gcoMי&gMeyighw{c澶}ʄ6,n9S_]D.opD]eqЄ{|Yl+kjiȣ+R֝lP+ r/ZQ$`{{kO:ۃ̕}®w rM;:-'K UkWȹkNSd|=iihmpWQ'd PGjʋ)/aξ Cz#:'JOywA9([ԡI;+zm8+E#>}kBI>+;3%a(`Ur_~1:GwM`1YEJ@\pwRyRi˗=S+_P?"H1(sT Mz(rGEڳ6Dlpڍ oe\>+|n{c^5WNMyѥ4WTt;@ѱ=ٝ A -"`-v‘Bs컂b򼠾Fм9G-;Pc5J]V6> ꇿ/',rUeقq(I_ss [6+v,տ~I3|Pp,#}{5V6{@ f45~2l|=+a"8ue3a(]$d `velMłm_0O- b̕@@Dd\ou= ˖.5,0+BNѡ3@|IRa IY$9mFgrR&T Ud->fR LLm*я0r\dM(u:&o,di1|͙YhjjI7zZ~饗4V&54tw'[(N2婖hrc]$fuqqiwx`BY<qq@+yF5jR|^-/hebeuɒ%.Lwo噤..sV&OsrM 2S21sXi.heJ:@‡=$oad\}vc>z7b Xϸ;'ъwVsf́V.+-ӟo>++K&v, و-54?fқ}Br<2uܕogUhuz;.[Jɷkk#a؞r7̌,l>Glaq}/nA48Մ(8/v]c2)9';5V;lM $f aLf2fVf Ml%qU=%Z_5IΓ5N)ȸ)ВjLJ nlleŷ QWb̨\PЄfD+(@A2}sS1T?T`fATWce`VW.ra5]Y2[P̭L ~&՟+fn͆rLJ`fj+빂MJZz5]OlʟJ[|@+'X9g\᩸4=8d)ե.9vUV"ۙչW :m2rl$ 3c#+ @At%PAp֮]q$M#SP3Mn^Qot1 Mmeߪ2=ݥ~K3W뇙+T|ʄ2WuZ,3wZVa+ؾ?u/ иI.׷G72%Pјinn4?@OM4v/I+qg+D`e6OɄύA7ԑfe4]Q?IfkԂk9"ddoq2woM45ј]KVO5f)51>=\Z Mt)(P&fGh +23x[me*A5WN{ Ҍ Q)ь<捛u$QC3ٹȭ"rdb]t1[ߠ)2͛P4͌Vy>he6fC͕Y|`̕y>Wf!Ų?f\l]]]=Sce)L3riƼz [qCy|*\\+Ӡc1m"ǡkׁԗ- \y[esf3G2w6yb4ʔM/6je$mseZrVxrەE0V=k}ef@VۋN?"xSuPdz9zVh<㨫+F-k4>2]fiL PVmRv{>V/ȬL%e%4KfJVfovrr22[G?#X Y9hYVYrwħFYYclRr4|W63_з#ՠ0_YHGB5lz4AKGlBaxfzG"+CB H?GG5L] lõ#d5aݳ~'0T8|8VG@\C䂡~8!&>M2#I'[=b,Tg{#nTs!"[%菚@ M=VH  ̕c?vohʲ=XYEAV؍JV^ * Be5{P*5@VLMM*2VRQWke 6$+j+"26 C⯧fThAlK~s5}?sSDz'T@h2XCV؍J +ITjf\M\lz˷jV:65[36'XYV#]'b֨[SSWM@M\Tv9\ `X9c7j + zR3l[3+B[RM(IVhW D`eCPUT..`Ceȡ2 +$JV؍Jl+cP,Юom[ҏ!ؙ@j`؏ݨ[F"Y!] : ܼqV @ r$ԐJVkϣV"r@@ 6LVwP7,Z>eQ$+Iy۰2`e"!+GB i@`e b@$`H! ؕlמG"+[E倀 `ezm,rn XYA}d#+֣hIV6. Z  `lR} {5Q AV q jH.\ր`es"w'+g  X9jHv%+۵nVF9 XY^DD&+;FVGPʲ(fͤA> `l₀q+g `_}-l grGB\}x`e5,W5 `.X\`e  Y!&DBVҀ] vy*UQ@V "EG6l=`e3"o!+ `ƙ!ؗl߾G˭!+[`e9,nߠf XY>A"+՟h KV6/rX~~V #4 `W]{li2eEAdȽh`ez,[= `&XLn/ FFh!.'qfH%+۷rkpF) XY~D+%+7GVOP#r'ZAV> b@$`H! ؕlמG"+[E倀 `ezm,rn XYA}d#+֣hIV6. Z  `lR} {5Q AV q jH.\ր`es"w'+g  X9jHv%+۵nVF9 XY^DD&+;FVGPʲ(fͤA> `l₀q+g `_}-l grGB\}x`e5,W5 `.X\`e  Y!&DBVҀ] vy*UQ@V "EG6l=`e3"o!+ `ƙ!ؗl߾G˭!+[`e9,nߠf XY>A"+՟h KV6/rX~~V #4 `W]{li2eEAdȽh`ez,[= `&XLn/ FFh!.'qfH%+۷rkpF) XY~D+%+7GVOP#r'ZAV> b@$`H! ؕlמG"+[E倀 `ezm,rn XYA}d#+֣hIV6. Z  `lR} {5Q AV q jH.\ր`es"w'+g  X9jHv%+۵nVF9 XY^DD&+;FVGPʲ(fͤA> `l₀q+g `_}-l grGB\}x`e5,W5 `.X\`e  Y!&DBVҀ] vy*UQ@V "EG6l=`e3"o!+ `ƙ!ؗl߾G˭!+[`e9,nߠf XY>A"+՟h KV6/rX~~V #4 `W]{li2eEAdȽh`ez,[= `&XLn/ FFh!.'qfH%+۷rkpF) XY~D+%+7GVOP#r'ZAV> b@$`H! ؕlמG"+[E倀 `ezm,rn XYA}d#+֣hIV6. Z  `lR} {5Q AV q jH.\ր`es"w'+g  X9jHv%+۵nVF9 XY^DD&+;FVGPʲ(fͤAȻffU_׫fRO~6Zik*6!+ 1|RQw47#7q(Y}R~+8@lN띤XY~+o|=ԁ `[Z".@D!`ʢTMX9Qmʶj4|$+/@X{NV61 Yʲ$!0XYA@@,XHIV[(0lU !@tuB49;mhn,跲gM$ +bFv"y/Z  ޸i'K%]Zebaekif'bu֙g7DܚF!`e;Ym,gRHxd2J'rTHZ l8DVx88XJڶ* V%Vk V7#˓G M33\9bM+[;N4;c;ZzP+_3tZO[NeelA3ؚeK +9l'KbsFLmrF5ꭰrwl8DVJ̕XϏbV˘Y60ʠXXYF`e;Ym$Zt15ߤͯQ/P-,+!QrA[g%6 V%Vk ʱL-V63QdeM`/V%Vk ʋtXSmDAsYO'`ekif',| 0l'K0d嘟 1'@?M+1 j۷g::Nc> 1'+ `X9*@Ԭ|@h0* 1!@1!BA`qDVޮ,_YfvڂƔk4XC%aPD`V@CRr^띌ӓ~ࡿ)ɑ}t Lt[Q4WԤMܮ5?6+,RmvL%@ Eؖw5,+sP9X߂mBP8|Ȟ6hz$=c Cxw*}+g `CLɦ͕}l74 D#{Gʂ`3( T\M27򉊞+3Î̌sft_Ƞ)9āvOĄDZNNqRw.\&8;wlNͬ;eY?.lڴAGYpѨJe2Ӑ~4,HI_]?+/ZtUEyuߴR7KfsVeB̲b-SO%'ёaeBʊ9W9 3VL\y$'2+TSM8Dߚ8[gn+Za& 'KQ|MP()'ap&ĜesG/zrR\xt^ a(͚+'RKr]N8y깯V&ֳG`2fzVL&7'( Uǹ++ i;3䄔pJyMX9PfشONXY f8^ vjwR7E{_0T_fw2;uSDLA滐K鑎jꠜѩ|2t4$ `rK4^p_*c(M(WU&<{1]NMߠܥlZT6(ZwXl2eΎPo嚹*%P5pv@o޹ᙰ8ww݄޹sz[D: [s͜G}_YM)y]ȷ)=[PH Dnr8D"@B/!c)Dg\D.c"p.4LS#s+<#>@4XyÆ^{ma۶}G1A^a@EoMiAC`Ӧu!Joe9X9] ]@@D!u F_5IENDB`$$If!vh55#v#v:V l  0    6554p $$If!vh55#v#v:V l  0    6554p $$If!vh55#v#v:V l  0    6554p g DdrR  C .Alinegraph1b \)]!\"Ȋ 6n \)]!\"ȊPNG  IHDR$Ho,tEXtCreation TimeThu 24 Oct 2002 10:23:47 -0800.n+tIME  v$A pHYsodgAMA aIDATxђPVv)BhtRNe0fl_Y__bH bH bH bH bH bH bH bH bH bH bH bu?:?]'6\6qs ܍%Mn MZ"n1C1?= \B,C1C1G=f@|ƺ+;(mmIN'[4/K'ѳ}`=-SgYi^_ѳ} ֖yVyANGbsҼ G{^@ѳ} Q֖54/۠ѳ}`\#-CwYi^0ѳ}`,AK9F0dѳh^пuA@<+_g>Эѳh^С =;~Yi^Бyg>ЏgѼ,H6ȳ:iY(s- UC@8SoԁC>)Ҽ9#OmV ӀCjF<-i^Ә҇yh^LM20)m+aFF4μDO'b.<rǝDOɉni^es҇<ӼHH AEz"}H3@>/ƦmKb`FŨD>GA0#O#=}aF4/z'z2/m+ #OzvZOм苑gV虊ه.h[>3I"虖ه0nסc ,Fsg`ES+C;Fy'!zرϋDi^e#҇<3I=ty}c^g'?<,pQ(9\yQCqSzx#Fм~D8>aжmFpϋ{D}Jۢ,%FӼxMPه3HyJ9Cmf-Fo>yhN S4/f=Έb}mHC,kRpfh[tBC?4bEO~Fu=t>D=ӼrCOBF{6QHTDѼpOFFy O0(36ø4QYatgHFk<E&0<$D}zm隑4~r7l]鮟7h[F>O>]600 ͫ/y^uvMb6y\0fBڐlô #3;L+7arޅኺBۂN In5sT+j3X-رǽi3NiQ聧>i[pBbsQ18u=pUNc[q/C]ҧoм>b&}gOh^o=!ӼHy6g6y:K@Kfi[О1@ҧk&i!z tͫ +}<Џ=ЕYG@o7/ =Чcnen^z6}Dt.aCȖ>FEo=0}<0︋#z`hC6/ =xcUOo})vӳlj^ܐ#Yf'Oa߸a&;=ːiѹ ,liҧ| >??7Kb Fb Fb Fb Fb Fb3g}||\FgGk`@1#=VщiX"Mh67 b܄>))ǷaMh Fb F뀀뀀S0 Fb F뀀뀀S0 Fb cx cx   fIpװ}2:?@ꦑ wxN*:8*@N[hB+tٝsNE߄>L9ᝆF7/( w(ix)y7a)tw)k;\t~d vez:]4h$遧/xu@Y !L#=0=Jz`}~KoLehq4RAGS}{d_:RͰ=5dyyK٘M0a`#\>2&@W}l*gݕ>h |C~>PZd,y@>P |derf@qH}9>l6cxS0@̡_,@3i `&diH}`>=L LFN.oHpװ)-?0S0`VtW\Ē_s2CtwHq `z14db+ 72@Oqxư rdy@j2 b Fr뀀uXĘ1#@@111`@155so֑ysRr3JF럹ԗet:\ܡ: AZrSӃɎ2IήD6eAN7MFh3 "udhXv/^g̒hީc}>5^xʩA2\t㛏;A32`;Uz wf Y]fdWPTAnBvr 0`V#iT]UCB 5/"뀀67k)x V)@Thw ЦA04^UG#LN;hu vAWm(Ka3h im '9ӥfPGKc?8j vIiijmmnKCmhklpßm AA8Ԡopßmu@lC|/O}UsS0%}j|4nx#@@1}|K;fc , @`lQp4 |F{ZtƾP8>j%*`қ#=81DNMLgaCVta5G [ ] T @@c#@@1/&-\ Zڭ\vЫPdS?oF-.˱s.uƷa E=S0++XUXyc_S7A qn@{@(>.$ dX K]i-)UP6;yy~wz޿.r<)+2?7:b|7qoFD_A` Fb lvdIENDB`$$If!vh55#v#v:V l  0    6554p $$If!vh55#v#v:V l  0    6554p N DdV  C 2Ascatterplot1b P*הx |Mnx P*הxPNG  IHDR$(q,tEXtCreation TimeThu 24 Oct 2002 10:30:50 -0800 q6tIME *G:~Z pHYsodgAMA a IDATx풣8Pjb{k۱[pS9?&f&1Jϟ? @? % F1@@b# F1@@b# F1@@bw\}[7}nCg#=S0 F1-k@ݖ.L`N7D%(BAj@@b)B,mKf WaFX K@@b#b1`@b# F1b# 2<c|څ;^ƤG-p-j@s:{`Ǥ]ـ״I+>`5EkICrLGC)BFʱI+7q@LM'4"ԏ/SN5sRb##S?8T}|* S*m@c b1Q.M c}sKJ@2,x2<c  Fp]:j v hKb,19d 3$K j@*4 <k91}|2Ϟ޽)h(XZՀz|q-G@EZESo^bf #5:^0g5EМBoyz!q@b#TaȊ;`@}@@qN4:z E32<#Xb:^aл^WԀTxUE3 tz+ZPEpo5 ՏMt<PÌyȌVbs:$$j@ֿO3Lq#chوhL"t,0*  F1< UgPs^0 J0Sѐ߉cv  F1ၘ*&Tb̢; :_"-& Nc[L,*鏝jLT%/q{]|fL5M+@b |m.Z7sgq7~OR> H$ΗGܼm ;|aGnׁWjS*_zwMZ^ػ :e:s9);wF,VW3/ĩk`W9mgd}5 @A`[DȒ}@W)bj|j^)c W)<'R4|eU ! 8X#/4 ki,#BG_"|=%xKpůl}@0K^ K蹨 v8;j@!T 6tړ::g^BV}@Vw_O}@@LS0`+# E7@Ɠ.P<5 @Kj]Y @U0 H1*B^a^3Jb16nb5~̰}@{a&\1`Eٛ0. 0.mЖ@-hsw)<(]>'mIF+ebu(Zx'2zљh @ @>0|tjbŽ z4)3"p$\jcX G"&#sI@u)w*M_-,g>;8>8{5^9.LơpӫVP_&"Pi&CnKo!:! &1r|#VFL{7fծxoFt)}@(?fD㔂__jިLd[qi<T'ICQbN㽁%Sf#83y_bLI6pTU؛@qh@qEr5OEeqhu N4oM㼸Ћ$*-6 fS0/`6_R@oM T % @@b{+ƪq1[ v-9݆%-쩏Y :Rg`|зP䳧>~0Lv 3ky*fT !.PXԖķI_LXLnI@f[۰Zw8䯹EvϜ <#?sEν-:eEex8_c VnoFD_ApbS0`Z@@b_>p)ZIENDB`yDdN  C *Aimage009buq텙gAhXnuq텙gAhPNG  IHDR_՜5PLTE   111333///,,,%%%***"""'''888666$$$(((>>>:::<<<444---MMMQQQFFFZZZVVV@@@BBB]]]OOOJJJyyywwwttt|||iiioooqqqdddbbbt IDATx w ]8`yb&l2#Zc굚f=:ԑvW͌F(!0000HHH####0000HHHxq@('_\_?lRP^3 oz)((R۲FAyR<lMe2{']ܦ=#F{GC0z(gYlb=f!on0zͨEڷc,{Fa$`$`F  aFFFaF aFa$`$`F+w`hu" 4_0#aXR^Qa-`p0c0 z=pޟbNyDRk?k.0jT1uy^6{(xZ3&Ty N<rIFվ1Usn}ksfQMk'8w/W$͔tj㱿˯,x3+;> aq{S.1/w6}֝Dƍ[0è 'q#0#0zq'-FqcT3NaFk`gmȸN1Z3M~/0X/l&cZc6 #0X%#-600cJatQi0+0&% f6u6#0˜vK0R#X38cj c}SGV$a|dYG|OpqRB6h6>G F)+XŐdQ#72lF.D#0.ȫŒTM2ò#E~c<`t`m![Řz1QFa$FmFFbm###0˜wQEt8ڒD͌'g-bUF#`F>%-u~a$`Fap׌?gt240@02nûV'f\';)k 7o]Pu&mj?3c;O7lիAa|+7gf#C6^ FW;猣rY;q6madƜahQrpdp FFm ]+#*UIFbFQtWH2TSuR$6HWY/ɹeF SFRg'(e^0N7ccm|6R1f&d6H.feheN+Ƭ8c\cJuit'f)㨻NaTn1+Ҝl1_L c󌑛E0z06B=݉ƹ15atr1}Zv6yNV'DԌӴsc:զ"S>t˜Yu]dսZ5x'+ӌNFB8cLk(2c<F`,8.g#lK!˫SEɌkVr-sK+Rpt4;;8iRH~e, viu`a`A}<+dc0VY'# UW0K+2:*g39%+TWrl)ZO-˥>ɩ0&,;oZc7U%.ϙ:$^nл0X8cJeqEU3)k?&9M)FխX\$ UY 04ԟ:XRŨy`/+ʲ1er]#ܠS0ƬׄYJM#R_(&ȹhbF21vs\iIJ6hQm`$FgH6ေQFFqٔFq's0KT.:ā_tQ=f$ݺ-J^~t1#0N5a crB68ӴIh^0&h0`qGgLvaQ0s,-H#Y 'Wɸ >X ,~ñ&OvKdT~k:clG.vg7SdS{)`L0Zw`6*llshcrFFT%\\,-O}Q{-{?lE+3Ok`|˥gRփ}}bTy\ w.8c#gPjW)5Vn3^p1Hrj-ؘMٳ1F?U~:*2ZoZIt16[KvA`t3SCnR3L f5ZӝgLy"(M(v٘Z1?6̨ՕdfA1~0z]}g gÌW1IyŘ6͌ ZDn3&Z/Ƭ50 #?0sSgvʻFzF hn3Cu g3܅X`Ңh-Em c$2g͹ճE+aT%%h=x!tQ;As&"1`4aLXn yJwJU-/['hQL0֗1Zd8-{ڲyC`,H4^jTTXQ?AUaԼӣ0V¨T~3<F3\oсlp+&ui(bX}yɘ 0qYj=>26\`#0fcE`crp[SGV:ƘZc(Wl$w>d|& w>f?q{gqb>}##Wy/ rqa$\a$Ҳl/'%{mI-L1ꯘ(2UXI ߑGofk_¤I oo+}1)዁MGGv?%MoaҊmU%vbRX(Fǧ;¤Gp.V%vbZU:%:3y VtJ8XA_b/%^??$,֏IZ1&7)a>\Jn_~xӃ7*l+m ߨp0in,0Nu4>t/Cm"oaJu5\.7 ńq<mٌQQ&MKR\Wh/&7\o5`x2:8 ;kU3ZIET>"_i煜q@l S%%=X_nWh/&%2Oxj¨Y ^Y43e[0HHH####06D6IENDB`DdTV  C 2Ascatterplot3bt e:}l*FCcP ChnH e:}l*FCcPNG  IHDR}"Õ$,tEXtCreation TimeThu 24 Oct 2002 10:32:23 -08002tIME ! Juy pHYsodgAMA a IDATx۲6PT'SqbcՒzHen>a {Ñ;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D\2'tY%qMъz1"єɝ?q~^Y+M*++v]'UgD N*#ye   gMMMM8 &whr&whr::ut Z܁/g ;4i2Fm);/ޙ8P&w2kV#Gk7kqA.8ܱOpһ| dNaF7e䦕WI M؅ZW,w :|4+sx2ҐY0;\sQK9̒ȶH |LZ*^wU+Qy>]~7M#exHq`<g ';g)b^gZIthc[9ɝ~,Q&3Ӽw6 Ғ;I}l;$V쐙kwv5)HHN3l7'5w%㬌M BB8;xSTbɝg038ѣW 8Űb,A[rfp)l9{Kȝb%w:h #w.6HAkU߹lNspqj(B"q_k4@)s#sYtPQܙ+Uf]&Y(;-޽uTߙ=WOS@2s@yTK`T*@C;_r+s ^-aТB7W >C[F̝*2Oy䇴Ё|I@u>n[;f!;s[ANЁz19u;*H7yBQ@+gȯܙ6'8_G7洝;BZphT)_j:dhT׳7ck,wt 8 t)uLG͌mI;B:}~UفΝ?ebS,w%ɝUURHQ@r8S:zh Q=63);GFg :}@7 N:E}+9*:eZɾCG2Xe8LHA\?ww*GAR<gA)ڛxP30D B-wd30U{qǵ,')wg-k &[Y CI;PM\G_R:~eZw|9_?w 3ɲ Itw;H%/ \K;3ȝm4L֪~WgOn|遐"w7\r| v2yw=k KɝUR;M;˰WKzMq֬{+e|g-U[Nܙ6˭}rİwf]5wW)/48z:az+xZC̓sG!,NACC쎹nL*ke┫wZ  <G!\}MKGo5n~GH)|ElȮ~o#w&w-$Q33nyYbgJؿ%k{.*sgwtdϝ]\i@8VN¼<hQ㬙ݾZKi>w&'jix%kQλt[ɝ+Ws0l۹SLüfȬܙDze~MϹ34Ccn\|;zA[V0mo=vۿsiI z{MH=РB;Ӛd,ᄫknr~=pCXV5o˜ɼذ2q[Y֥yъDrكb1]2lǪngE+Z#sZ@&V iKYJcBg;[LߏH%-̝w^O{}"Voѭuf~j@P{S7Xɾ͖:V72V5 W{;Y(* ԁ-{\ pg3S0fw %zɝnDwa蛄oGrg%U}tual\}U\%whx"J.-vtf=w:Qd\Vī\uvcBr`'gGgmemwhjYz}|qȥh8O?\OHzH =@@zH =@@zH ^} pϺ,.s8RXpI `+g=yɦhx%NkZu~*&HG/dtIOV'$=si؍-@H =@@zRl)\@@zl޼f56e/_pOLK|{g,;f=7[ Nht&؁Oª8J;\@@zSc5K+f=RuFXp>s~h ?K ?doXpH =@g[  =@@z f\@@z@ڟ)sY3`)؁ =@B `K!βrF%Vgr};Xž֥ܤqY~cY[Gwf9&UpB[gGk\Zzn#K2<@`z so7 ` {}x HT @ H =@@z[ K~&xu/K'1fH `K!ڕ.=pDo5fH =@nf `73,g5#Mϵ)˔|92=qA'<h `ǶO8=3_roGn_`C3wc%4 wo{q_Φ+̑yҳj'>os3Kӛrřݔlof=ɱXpmlGn8ے8Mz6ӳ̆Fy,qfۣo|=3 93pf_|>q  . =@@zs IENDB`a$$If!vh5D 5y#vD #vy:V l5D 5y4TDd)#Z  C 6AhistogramTypes"?8?/cSŸB@=?8?/cSŸ׬Y5WMmBxݝ lUgJ룰>ZHlyj ,ŶjYmA[J"HYX`MD TR@@7R0! ְ]vbwν¹{eL&w~:?s30Rkkomw[(i\}a=nI2 4v5FWo̵|1CQ1ήF}J{jmǬ=hO P~Ow@DᏂ? .  >ii#WW/_jk|- [ׁ!zz~#'O 3gE/_P.l?<+/N7=_C O?|>]w Muׂ_V/rjjp|<W^Bǂ= 4!C 7 $?a9[4FŮت^WiEYczڭ'(vV =H5fW::Qw? .? < |8p\\||W^rr**K_ x ׂ|+V::W^}?~ w ρ~2eW_ʅǂǂ7{׿|aޟwo |:uk׀/_|1xx\7'3 >|0x}_ 3x|6l W ^ +W_| W^]?~(Qw4ς~ gFracw .l5>}?| G WgK[{|ZZ͈o3oUW_eK|9s _!dO>|(#!aC?| ddz'? <<|§iF[Ϯ*ޣgD>GM)nvWdo8 <<̯'O// >UW ׃Ձ.? ~? g/_oo~Q\!Xxx.]{ [x~z|z~ kk׀_ -5x%x%x9x9x)x)L7|烏 2S >|?{{''w~?_{hGO~_7C3W__ e/hO|Ά6E;)WyOU.s8|naʼc;Qs .%cF5__fuC4Tk_{XKqƇMxrGGkRh4K&*k>%p\WV>ܡe[ʈD8no[njYԷ>mVvR#1~:.()_}dɨm⌫N>5ǹSWk?uq7g~STaܥk'u[_Y{k <)'SA&F6˗kRs'k GŘQ1AcsA G]kzԥQ֣.UT=jQzT*;&]YԬ [sf{ gDr_ 5(7=Un Xzf$kFL{Gպ[y,\8,FM{G}n <ﱵG&_?j4d{>ꚻ5PtqsĨ@= 3j859۟.^0T0ƳPA٭ ҥK50cyYNh` 17H~.@ХNh`@Fl ҥK50cyNh`,&٘K?jckV˜PLژK?j`rs"_~ 3ץ:Ni=* D~GY$'G0]|s|nwj)?wݍ3sY"x4ƒ3ZUNk{`䁾f$$If!vh55#v#v:V l  0    6554p Dd,v:F   C "A  w1-12Pxİ+̤+hu,`!$xİ+̤+hu|F7_oxkFƛ;нH4YJ,Yw0$nJ6^),/+z^W~'˶bhmȒ{;,[b3K`v=}ۈ=fh~vŘY1cbrX1۶zn; )N4gѱomy}mvX 핱|Yū3_au7`Ci۾\DfL7{6`Eʞ]Dv1YĈφ.3p2J2&3]u;=_Df jM b_(Dfn"snp闔sVe"ˌNY戋{}ez׶nZ塋ʞG.q٠:ߥL틡b2^}/{|m ]Tfdlo}u?s,"7v7p]DַM,gyuQwגyvX"23pRe[dfR5G#z;)ە}y:ojTORɖ4r7oSGT=56w,A 5,J%4:iOEuн_{dž-kXN >و=DVϟ7TwgНCXMYZCd7^A*Ui{j,6dZeھs4؉щ>xZ}P!̵'괎vxx-Ȫ6N'.d :/6=?|]^Gu;8v@PSˍVA_~ΞY:rJV/3s6*;BNdCsskQZk){{w:=g4EOtRZ%rx(74:ȚXr3tPԕT2śruoBEjI틯;wwWSENKgsE]pSj{mMJŝaB֥)WnxJmW]0e0cƛz#WSL|j2߭5JCKPmO%>堏۹v.my;]S]ngsq/mz(ߪ߅?>oxz|kuFx-}Ȝ#o*oJ5׆PҐ$w~;\ADd,:F   C "A  w2-1 2=Hjn] :.`!{=Hjn] :.&IޟnVIxkGYٱ[%ZB!Pl҃IV$q VR-kږC8rpP)aC ,~irH>cO"2q~/ |l:z.M, s|fH"gsO.6rGcg3-Mv _uD춺uN~Ӯ^':tСC:tСC:tСC:tСCN6k0` #Ecwl^t6IN^3Տ Nt3ک{tT5#6-mg=y5S8mLr׎C"~I]ZRsZeuS,:\]Dq8uWE^ qNBܽ,Q? 8utBAJ~Z%z9=h2ٮwf7 K{Δ>jܽ8ٙC&0}kFf#^ Sn3qMpܱ.I5zuDz%СC:tСC:tСC:tЍwoc^tСC:tСC:tСC:tСC-p. @[r|Ǥ.n(@>88 9_>!O|B. |-p 0DP>&2 }'DY@>f 9_> ' Z". @Kh \|]I n$СC:tСC:tСC:to~ S$략=Cw+tES2[ْBXUue_Y1ZZNV n%лyTӚU6U@Ŝn Fk#ZK4AY̩nn"tq1J.SRzAIۚB3SIJPmzc{T N_;D#᪮V*JUݭkPݧE+tz*%5_ s4&1uX$\9`_h0A9÷TdNďX[Kr ߥ㺥(J!QT,u) F, Cg}mGjx|~xH#WT;wFPƣuX6k崻]]s{Ƽ'40Z\-etߖ[1RG͐}mrWy5%(ۚpKU&]f*~e*bʏ-K֖Raz|>2O*X+ZR7"p\Hz*?3I#a~vȱ ޑثbv ϟׇؗjnmBb\wFT6>]6JZZ)9/k{͓'D⻍~s^,ղNځh|^ׯO,q.cIX/Zedl-09?#ND"(Dm?>2Œ]$:oyb:oW BwD-Idz{ؐNDd,:F   C "A  w3-1 2yT v&`ӷ`!yT v&`ӷ&I7_oVVxkVǯ4ʠV7M su}eV/el%qhwG SbVcI s+Y~e= q|=^Y&BWÁ|~vK ăsaH}v3!{} |:}脑c;B(gFH‘p0:2Kز4r3Kњr!r!r!r!r!r!r!r(gt:hH(}R}p.JcakOd } ڈtm.D3I庠%$kflsoq١ifF&#>r._QR!}ik݌i:#t[B/V`\v4{Qh&h>̤ h.wyQpq٬m,MU44G͓fy0f\q\6聦9J F|sKFd\ ttj<3Ds\- B4ssX0YaIz3m@ $g@<\@sMts8ft3 \nXکFIh.AvAbP9/D3q.!,%u4#¹}Ndni@38qfetz (4gQ/ r!r!r!r!r!r!r>]<@9C9C9C9C9C9C9C 0ht>,'`r|c."g@D>֤ '~oqQ9" x@O|4&|4&˅ p0M('rah62;:J6:ÅpYfB 8:Dswhd>jv# 0)*u# \FG|42'p!" 1t' sAa>C9C9C9C9C9C9iH#z%wŵ\ߪʶ*K?S7vPCUowfyG>f`l[".-ZE-y`@R:[}u91/qwcü\̋bJ\7]y-Y.۲㧹YךջCcQTv{(w2w q:VfS Eu|ցblNì[cV @?'mqczS0!wb{xөA;ʡ*"$DV^Nq1ؐaCgcmsbZv )щ\'`>s;VN8܈x҇u{P9s{Ƽ7mo r]/ۖ:C#7Tuo.zqUeKߐDx|.ҩٻAZkU::e1YsFUZ{2V[vQ]U E荬P)7=,lZJ]I$٪@Uc~Tl=ٝRyx$M3#cmT,JQܓq5oN.,rE5ٳ4cΝ[oc|K1Z70cxj\ R7)fLr:pyǮo݄w㓗|^8`- ΄؅Vps66uj]kT*.UN-o-m\\U'-H"{?g yɿma- KD5q^% g-VVam#rX o-0|o|ߡ.$i=P_Dd,v:F   C "A  w4-1 24J.AwY1`!4J.AwY~Fޟnx]kV#7cPN/4K)khA [-%XFV_Fg3HīevsttD"i67rKr4IGӓ,¤(vDbr:|k̈́18 &h+]9{E}_U-WJ E;Z{GћQ{ܡߵ4фc#۪cGC#Gi3'\W ^ՏBN!V˽hWqڡ]Wn'nlwFD:;cڍµeUv?Wȵ} jZ4cϵ<9{2QRWMrUwn$BÁkk\MwCz~t0)_* wq3|_U}>l:astûNNN8)O*Sg~9øG=-ꗳuO= {tl;jlQH4{kM[zm%u9ohJ;b-r9]6{za];8888888888888888888888888888888888888888888t{yt|T2ݍjحd7t~(jsV[nܠ0o"]Z䩤kPGe)?00o.Dx:o%-gmSRUdbD~~=?=>.X"vaxjas,s(6^~Ţ@bQR)vI}/>.г{D+XD(\Xu4,xljꎱ]֊;FxSKLטּDenWfR(ݲdlmeN5%C>[ `č]1%us#"3[ԬxULcS )﮼ArX?S0h?xln|[ҟ0ܼ8}M'clake &-ȣZ/*|X֍P^LŅA%גZ2ua-}-K'g\|?\b|kf%П>f1w:r?tNIlݔX*˶$ wb-ؔ@Dd,:F   C "A  w5-1 2tL:7\8@ el̬`!ztL:7\8@ el6IޟnVHxoEY'ERKviNUFz@nYw8^kIfU"P qF\RzD. <{8ַ~;ߛ/_2y˰ |L`Xu%(\i#RxfL"4 @>M Bv᜷S|>ڵkrDwn؁;R":-pu8~5k$\wpH]m.jp>;M9'2<仦9AoI]=V_(ػXs.Ι}dŵ98Y^,F٢s;݁h|wڕ|J/R)R2uN]SS0QbjPդjcK3[,1h*#1|mM%Q φ$1k2EDdrJ  C &A4plots bdqIHiu n{dqIHiuPNG  IHDR!7,tEXtCreation TimeThu 24 Oct 2002 11:17:18 -0800YJtIME %K@ pHYsodgAMA aIDATx6SoyO24e-Ic*9SF,??(?߿wƅRYy+i'1q w6ǫ? 4Lq[?ΆܧŅI`ѮNt ⾦RGnw C>j9Tny!4ZpĠ){P?u}oIMyD6^*d`ǛU=P'?-`E99mx뜖Gy0w^9> =O*w[s o ԕ> =w[6"ye1z@>Rx]%W5 aT N_a]5ss!9 y&:z{>BE_縅ޛ1&Yc;[@M=JȚ;*?ЏuE|jywD*rˊ:ͯ46?A^W8Gk3kqU!zGKGxYNFO (HRa/: }=#X]}TDŽ]ބ6.O&^Zy9Ӽ(!"}<"HQĪ+ܟA:Odq%h]q5] 4w K_HsKr\:"z.P? MW'S +*:gy;P1W|ʳ"}^ zЏ*Zu~pug_h=*HQAѠ]oH+D:QB|5ZPB9Ȃx)'>)Q7D =DP7A_ :qz;R%c_iC4Lݸ1̚U"zF9jW~zHd%kߐ?] dg|WɁ1Rd`t ˠiN]x2ہ ]?PkZk+etEp w ^}:SSѯLJ|%  6.]V!zd~ڐ)8CCJ{Eݠ%d-gP7ylCݠiRui0ǢV?g$]g<I/Jh w^\Љrwt0UF?QԮ3 ܻD:rM*rCѠU R߇F zDǥCbRL)$)|Fbr Q.2X|d#ŝG'Ӄpѣz^gwq\2ϙQK^}btP) 'ejIٻ5NN =℞6V0OM jQN!HO!zr 7mCAnڞx>?s6/=÷3lt6u,e'ÃnEë-l؝It۴W!~b5AME$5SHL?ԺdiNszI}bR}w?McLK~&|qXGh-٭o? 2~?\?ryMxkWˇg Ѭc`wy1?~.E ;/E>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|˪1C<Ѹ`>*Y E C}` e*~v >}ۅ2 SnFs~J9mՉ?Lmzof.Jʘiho>zԕ>ntAkwd]fjr ȸlޑC޴(*ׄ]bZScjە=oJJĝW-R'žm"} O2.HT UH$ij\IF =IBDqѳ >)'vMyHwOfΓ( rκ:9;O`d b8py?9:IeC4>YчT0Ng}lv[E9O(:!J( U?FZ$}t6P uf:xi[FFM葚sUuz/L鴟y9 9JidzΰrwGdC'Uu+l3>DϱE]DFՎBOlRQu߸V=YQ>Q%8Ij OH9N]1o9N:y]xj^1q 'FeCD$ν8nD4Y7?' M 1=FXG y 43>=_Mp& cu~?C%x4Mܯez X-iNp=/@n]gc5ӆ87PO!z1YwxPKWqy )=WAd:!}TpV+YݟoȖbWWp,G1rru,}δ:֌?}>% &)Y^й`dC=Edۗ_3 #Yc〓>=1>Sq&lWq>ѳ3a4N>- غIӗw _/Q|ھ!l |uE ˀq:WS>LV%ܔ}C Ez?yA4;s  {E3-HtJ+ ]ݧցft=@'-!Ν9(>Q0ő>=8.u~80sg09:Aqu~WJM sq=:]q}8Fqṥ\fÈS']+Nn5ITh'+M֊ցivrKMz^Ok,(|ڇrmya̋T'(\6GEYиlЕ>DzǝQvxéw^&HqӇd;))J!wRy;1I&I;&ŅOr'WG'pיBu^߹'wJp΋Ia$>Lvr\\qA^L-οV*(Q<9݇!~,iX%:_Ջqz"- }+Ӓm߮7qNJ=}EP?x>j A"٭G.x}eEF܇}zvcMszI}d_?ֺŀ_Ana7-LozyɻV&ϖrȭ<hb,t@4ec}d9va:bX?Pks'IENDB`X$$If!vh5M 5K#vM #vK:V l65L4DdER  C .Alinegraph2bl>Dhz;? n l>Dhz;?PNG  IHDR|i,tEXtCreation TimeThu 24 Oct 2002 11:23:06 -0800.tIME  mp pHYsodgAMA a IDATxv8PzV30ȶ.@Ua^N;$߿/gs:@WBJ] +t%tЕ:@WBJ] +t%tЕ:@WBJ] +t%tN/>:r&t%Яy Y~=>_tG/^>C+Lxx7E7/~<@y o/Iwt3bnLE&=ʥhSyq.3Lpߵ|~2x=X-F4x2{8S[h0@){ 4=t6_qc$lytE4pBvu.w;r'*simWRuUBw9EɣD\07-wԜÞL;);IϠ߹7o9s:W_ :p@tfIJQv`4Wb4:jJ!ءc _I971Ah{yC@C@%FOCg5eh*NıPBC(QCgU6t5thJ!_s=ݡt9F9tw3);_Kj=Ϟ ݜC:zf g-FOk3Vy{B:Ǽyli,5zmkx Q%*.5tfXL\8 t8D㨳Wn˥ۤ6ŵs7^vpOg|YmxS(;4%tY9r+,{M 8SCNE^L7sAdYa#˫+)P}f@ЌB2Hn TvxK6%uלE\ę  {͙@`rB6?\$0Wx 6˼Ca ys؝fn,V(qj"t`FCaiͲp['TYN' TB5,j:l%GSp+<;tk"ts¥+Xv8WPS̵#hxž] C,BnVB#5D9፦[`6tEk"t΄]Ya]*~YNoQ;c1(F@ojN)D[Vg9+^ĕmNa?+H} lTb4:aJݜHmb$B6 %VXFs'YYg}|qT6^ǯcv؇Y1}!5'؆|yZ/殏FT=6^4E 5$ ?#xfBNڎoCg9ïqNY_?6/;Fs{:/XYsŹ )FHE՜SF@%FsC,3vsVBOQ8Qv~]sO!>f4 | );,+^;{B'՜EYʲc yG@\j"t[)XGs%tb+i4%k"toβS5qC6N1B' +f+;kN)DC1<٫egSx7g٫HL/%+;J$S\!ej%t&S5w&N:G+;,VBgVyCrT)t+0S՜EW3[,BgR8odMAdM|4'9 .Gpj>xUmjN:QYam;B Ws欄N`=NIZtr|N!3wСee⤝?NlVX;Ν'3s.asQeJ_2Bg"BNC٫ Lɝ3hzjÆN *ę{4ύ' ɝKn,1B'Ǔ=g5X5~ a͵K*C2ʥK5Ѷ&ήѬ8ЉpIu!8SJ/]ԺCǀ6NzO)yB'?8<_{Y<:[ɳ=ʝ[<:M/?CCf7~|7Ou߯kOJ9~j̝vakyr>n>ֿp'ֿrj+7ՄgOz>霌yO]'BGj'5dmM<IN7Ƽy'!|F—BE;{=|}IkhCU xH}E{}bj FyHK7Җ UfЉ)BM'ҍhG  @MA~Z¼Jú:*^<3ʭ9J^( J] +t%tЕ:@WBJ] +t%tHLIENDB`ADd BJ  C A? "2mUL]1hV`!wmUL]1h4H    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~3jiRoot Entry FP&vC@Data Mb>WordDocument"ObjectPool`kvCP&vC_1113633190  F`kvC`kvC1TableCompObjhObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font:-: Macro Text$a$ @OJQJ*B* Body Textx  @Vl,b$ ΕS#" @n(  6   AB S  ?;t@?@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New"hn*u&n*u&$p?0z2Q Joe Chuma Joe Chuma   FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89qOh+'0 (ObjectPool `kvC`kvCWordDocument/SummaryInformation( DocumentSummaryInformation87 bjbjUU /7|7|lDDDDD P Dbhhhhh$X xN"hhM hhh\ %DD20b$6 jCJUmHnHsH u 1hN N!p"p#?$?%n# ΕSPNG  IHDRX|{gAMA|Q pHYsPVq?#SIDATx^]b:Igw^^/7?Nb nZ,Nt Bu%|v^ِh\ȬGUR (ꐐ l6H6\-V1Up8mC[_b|2W=)fͲ.RR8Vf6#Bqx=u:V4<.ZEkwq?&!|iɨUzOy<_`(ԑ$`輪iaI=__,nejT(ο2&"멮(ƪҪilndTxMGcV¡C`]J,kEHeC}UV/|iXGU/VedH)}U<\|& c; 0`"_Hebt{;O7<"*~av=⁝G8-L}oEEpXt;'9x%V|J![urxmJnG} 74)E VSO3DZX\p^ia<1r׼܉ĹYHk&n %%Ck4|Ժ=%U/@$qJ&߽-miC _! SXoW jҍWnU]Z\\(3ohX&~9y4_kTG/w_B*YWloeQD}Q?>֟ 4H`^iKZK^P3|ħsXȉ9@#+B&4Xijip?R>Ь*B# E:/t~8%YXEH8g]dgӢ2r@J'qkZ-򳒎 lƵw Dznn7]~H9%y>,~;ʜ9ۉ, X5#]I|$GS=EؕpX${,*@ם^^f!sbuy7EyAǀ.mz GAkͪ },%y t>B-T4ѥwKGr.,x_>[`{bxcd>>Uh8`ގPVe71_ޗ%iz7?1'ٛ[ 5piLH(kqBZՏ/=իѬtz5R߈T,T8)i/xpO{@x5^#uDv!}goF쥘,s$uh^~=~s~<igՊC`9>RuC+ܦyj#x@' E]}yiA263hw껙ڗOIT eλE4ß&*ܐ&V@CI9etasl4cUyU^^{7;}e_4z1l 2~Ձ>-NCCbTv=}tKRdsqyCA DCHˈIG׮-n]J{=`G, [G.#*6P3&oAHKe2?6IRȺ .瞕dMj ]LRB*Y$<˽]8}+AB 3E4ѡ& wˏdzcIrf_n̾| Iv\ :6㍿ҤkhCO;Mb&}]C{;:5}ffKtgԫcVfWfÌև[_K_'ڧaT[ĀbM7{eC{ZMVwCfgF`8 " rRfi(N6&QzVxGG0Pk;54h~w=x~?HѮSOCa6i2RQg˯:}\]h=-zU!YifF6_̵~0k5wsQ0v٪GOCڃяeoDfvske|؏*C}wʁ6PjG{{eʞDI V_ ſSf(z=uWYGl0W=e[HЫ13~/퓿Ƀqy518“ vdkUO+wzNq[ԷC,1Zc8>{ɕof8L?X,  B{J 0L֑Ų*cd hzm[Ꞔp!ކjQH)$nO6($Qt-vb GKg Cʷz[$5%s+:rq0o:<r-ݮm2-ib@س>&>/g w %^|Cv#~:ГW$ef)c Ųq#o˼&@}wbq zT}(iZ4o3R n =d$;8'&#W?z(d }[ez;fL. GPXA^GasP(ܵpKηWfLW8>diY0 ~DKW~-)_/tٮUY/Է]ّX^" vc1sl*p[tnUbcC݈[rzĿQMb[ۂ*q]sڍXN_}|~'f%vkȧS_d%N;Tn^V2xYzґ +l):h-_=$xK>_ $H O?/S^L;8hbksn/ z@ <|/!vbM]שύ$v}o -BBI__-kbNmba\$qv{C.2dԘ>H/ZxLSIQJ"j/xZv8;(\4w<(PU,V,}_iSΚ_]꽿{֘-ۇVr( !,⸏2X b%MdAhoLiEZhUrf^KT3.< !ܰTX1ZY;zۮv'0nX)+6JuדvPxk©špnhC4طh1+0,7-V3T Z,G뾊p{-F!3XNhXqkT,A+iu+rQ%cՀtyYu+N H,P~FR *SBDUב I,}BNu=#Z LBPL6X0e0, Uo„] APCP}j\ huo`*'6U:{`\pgr=Gh`j6kQ6@ݝqa&ĂTd ql&ĺ`ggALbY [ WG 1F~MHebeC!PGzPi}Gz4t& Ztýجwy $#_lr(ڥ&(@칢 )`?IbY 坔8BZ՜}HtyA o&kNPg+=6z*S&4cE,?1 oIBbE,l$tVXʽTkt5C-_Y&F^k'bgt(#2!%롧. &}M9J҄ROB=Kgr{T6gt#M1$VG&c[,3ZXH"J53ђ2!GtaP?H~~J]F2gg$y*tLKԟ1ꏋ!:۞+%!(^ZΐPz NŊR\{M~TGź^?$ &`!1Y#+^5Dž șt𪘬[ęzY/Cghu^s26Qr$qSX"`;XCʦ+R׋{bXKՕx  : O֝5Q !M+69yw@M$HGߓݰJ-U-K;AiPGbuK,災]qR0XKN)+e39>(Z6WB.Z,+뱣LdmXKۣõV \X1:.l#6Heb9k1d!I5zw60ʦڦ+:27I8Kn `$!Mu&*2}5i Ċga:Lbape[<>V^LJ@<>֋q";Q<$ְğZ2&_?#1qt=ZMX Y7KXhKeԿ bh,V6JYOIMq+9.K.3q=D;=stܿ%&z)Ȳ CmQ/tkZkxK~ ߲$Xy\P_geI֢jg>˧hX+p/Բy=X Cc7>KHչg0ҿ=~Q<Қ--4f&ӖhEUoE3>B^gw!#EgZG ۯ [q>z>?>>0)-d3yWKɑmIbƞ|ϧY_{ۇU5@|Hri}CvKkI璖+X)<ƄMRq{vF{wSHPWDqs߅J(_ޭvqMZ # +|hO{G.P#yY֮&OtifqAYm_C}ʥA`;Z1m]c&g&c:h7h.R'Qaj߉]x-âUV)+}U1YK>O)[qKXfUn$OWOix΃Fuvlwm4˜km 2§{B7Gk}4ωiZvb(qJ՟4>-a(=K؜c07ONvڍ:w?{ڔ^z$Yi*㪵MegD F,3 Oz :j)PՆ GCeZ5*F3jJ d\HG#0>t豾_gZ.1cˇ_$V8 ?ߥ26zJWѹ At>9Z'3^'-v 'AF> ڏuDv+ͣ*I'X/N#%^͂_XA\0nZ2Xӷ^^k ƸQhm׳r: OSKb0hn ],\{_ jkNC)uo*UY̟%-{@2Tt]8ʨҚDF]^SqCaiz50y™et8 8 [YƷk#WX4"nUN< ^=sqr=Y.cFu?} `'M='QHFC`.E¬[û4N%ԶkXoakkۏ12W]= +2a ,z2" ^l5U"6 ;ǖ=,㏢y[po^Y,yfB|F{!J Hw!oK4s|F]e@/utv)QOȾ)1:?(c0b 3֖R ~GEȻ[V5BM +W]g֣TP{qr5e0 X%>POeG 56/^!WS5,HL} tV "8bmo?0X[ "D"1R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V ?{<U9mIENDB`Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@T%@T%՜.+,0 hp  TRIUMFl  Title_1113633267 F`kvC`kvC1TableCompObj hObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font:-: Macro Text$a$ @OJQJ*B* Body Textx  @Vl,b$Z3j&)"G" @n(  6   AB S  ?4t@Dq?@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New"ho*u&o*u&$wF0|2Q Joe Chuma Joe ChumaObjectPool`kvC`kvCWordDocument?SSummaryInformation(#DocumentSummaryInformation8+      !"$%&'()*,-./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghknopqrstuvwxyz{|}~7 bjbjUU ?S7|7|lDDDDD P Dbhhhhh$X xN"hhM hhh\ 1%DD20b$6 jCJUmHnHsH u 1hN N!w"w#F$F%nGZ3j&)"PNG  IHDRXnjsRGBPLTE!Rs{cks{RZ9JRZcks{JZcks{k9BJRZcks{19BJRZcks{!RZks{JRcks{19BJRZcks{19JRZcks{!c!k!s!{!9!J!R!Z!c!k!s!{ pHYsPVq?CIDATx^}j$nsM3,f1 g1ͪaMS/fH3vk]!/LRYU̔Qm Bv@UV **P+ YkXY(P ,BZiV@ T`e!kb *VZU1XYZ+B ,dV`U d@VJ+*P+ YkXY(P ,BZiV@ T`e!kb *VZU1XYZ+B ,dV`U d@VJ+*P+ YkXY(P ,BZiV@ T`e!kb *VZU1XYZ+B ,dV`U d@VJ+*P+ YkXY(P ,BZiV@ T`e!kb *VZU1XYZ+B ,dV`U d@VJ+*P+ YkXY(P ,BZiV@ T`e!kb *VZU1XYZ+B ,df^ xED[n]=s+)A}Zo$jo?mZ֍-X`AI=Z) 7Qy"jn-` KdQ`%z,owoU7k@tm)ވ,WCK Qjx#bp_!(Ǡ!J *VX(#Eק^EA~ح-$m5E؊6$W.{"rw.{Mmڶk"Ld!Sci)r][y~u!!+*Ǻ(6v]?J,I{5g'WQ^ml>+Mh-$j X)뢍"7@1o{F]#|/뢍9 uCXu^@'Z:hu qy<ᛧ&CO -)ɫ w}ojR)Qb5h2`+:h ޹*48ahw 9hcólTV>ЏşF4hJ(PEqDPD`q3w()fÙcgڔ_ {nXNPy\ф/Wdma4`.+3u$6{mH/9rMF sLJ6%1wqEwڍN 4֏H࿇aQuj4"oXLрO %|Uy ,C|.8sd#+od+P^mz{|Mdлoyܫ, YL6X_3(Dlvϐ[NʴH9$u0Y:vyOXEU6kObrv: @@Dڌr 4{9Y0΢#P3`LNޘEf;BJ ulm 86/뢍96)q(p5@~G.ƘE( B7s8UrQ^xgcEt $ &0,&h^ ,ME0ce8.e@dYˑ/[j(VX"oiD&p)/2e6);ٱKlXH.6t!q{ d@U;q#Y+1p8eR2?;@(oRv+_]G#HXc%YDtOȖ38N[&Kb.Sѣm[dH.!-k4V,4Yw?%ւD` zH] b^ Ylf]H/Z^`cּ6[ZWPBfGSv  Ugϝ7{_ J,=[!8 H .~>y=*9VpˊnExHi)ҋ`cn6[,r|fǺ ("Y;LU!Lxˁ]%+(3z9%Ȧўe]lOW3v󇃹R @tCsnh9W0)Tz?ȇf/8'{=L yk}UR?S}b do"~(a[ܼAjN HATc`T?TW4 x.PO,8;:F5,_NG)9`(HԬފv4 ,D,1bҲb(d&u%n| ݷ7Y=,fN +ۧiۻ2>(x^ze̟m#nJ)iͯ7Hp;nOg9+C-?%[bXYΗQW,ud410=I Wb.EbE\(rҵy*h$kߴ*xx}$jCzSTt%yJG7!Jh ,G$5 ${mbղhzŃqr`c< pZ]c1ObVrtuV:FWd۸9tF#qSXi v#0qjë"W&8e쟀mH::G^< Cv!]Z*|GA\t.PK R"Іس:Xq"om%[!ɾ]W,0'E$JvX'Z{Hťl<$T]lj^U*riŀU0 ,9Nvm)x|!ŘG59)b(5<): :1Q nvGգ+ۡ, `r ([F "3< bX0Ŧ:&gb2JQ}x5aBI ONkFѤzj%j])Z$lPW|1d IYΑ?l%#;2-  &dl 5|^wX JnwRˍt&sxi1@ Q6Fbv>"Gc$'qj1L; 꿗Ei@Ҳ&S j5g-(]7_$f~٣4DҀY76w6w܋?ƽB )BIJ0i[ek~8>f 7b_@^սEd #iƒRZYG5:Ğ0Ceֆ&-YklK f3~g),r񾴿%;<<3ӵkԟ952RSǵ1mʣgs7xŜ㶳^{*3ӷxݢ] ciڧKp(Rd?6dVb({W$\:~.x>NډzjK3'zUvbjB;kTyX[<1y6˜kl82cP-^cOnq8n 7beq. ecyP}`Kgޤ̍D;\r?]PWő܋B1N$|tC8 Y}J DG(8^R(]cqP'(_43K,&`<D%kgb7:r@Jcy+u0mv]7Rol\EziN!0lb4/|:ٞ& 9Ge= . -453åKcsV:;X9Hr{GZJeH3zf8{fvNS5&o^twr!;lCe>D%39j#H91/̵zvSsT "@|[ě1y(ܵڭfNa-/7΃Gy96cA)(r4(Bq%+2nnֆn> BoXOo+d5A6RjyI93W9\y5KtlΤkfi-./W iǚU]|,t>ٹG%9y%p@6H"Wb~1 ufCRnA`dKG q_!2iB߄a 8?g!!%ft^SΎ]kuowl)Hw5nD5Q<=Cvq/X݌0'V[LCPZlYwKp]M e ]|FWݍ"Rn_\ ; \ޔD,EZ}JCE@xΫ(pV`K1E~}/X2S3k }nu< ; BU<*_/?m]7NKMnM$D4z#J? 1 JZ"o;!*Ż3+p%n2'lFc"Uxw;CŢ_,="`OMIMh4\]x+t{UvY@Z?L\kc۪u.XB:nvR8;0t-t:^(֐q \2RJFCM"f#Y4WH ug1D8YK= bsA\1K3fSnBLJWعO46D/_EcG?l:l2ԝnw\g.gu`ncŦb֐_2bW"T4}Ls'SwuN"'H4]v$|zV<*q s$rx@ V_{o16r`-yC4)[qDrSpN_(Npt1`=e:MӔ4}+"$j 6D{AGiIc/YLqf=ݢr'&ǻ"dg0(f6_ _q"하e2)f]҈ɽ|"[qUsĢ,g -)|X}ӝ%0Su?/h}ϑ"͖(TRWp9zh"?QH1"ji1hR*g_8Ah,[;󼎺 `5s= 1 km ز'n& Qn4@'`I"pGd R,sj53&z .-EY  :" MhOS'A ]}L0C}Ygdypę( <7^XCф֦|@j?g9x/e`al8LȤ|tux]QOZ; eznwyyuAZxC w&v˹? &ƦE<"rMQ͡sf#VY_?jv6gR%(F:11Jcac'fk~a"zdRqʕ9瀕*}X^ȿۮ+3#x=sԳ؞%R&pf_H X^IO`K'^G} = ~"zaYՒNO,tŽm\΁AVj??~6<^0qJ6m9:{͸C !s/km NF"f]_> quUƻ) MRA(ݹZ9ԊsXa~+.:'Wipۉ<|Om}JcKEoܙ2x .I]BU6L!д~7Q9HIv~I#"K 7G6ݧf}-Ϧ45ED$}&L%-I{7v%pY‰В-wɢPYDx{&BݮO( ,>LaHe"Z)S'![ƿguQ$afwzc%ؖcmz(==^7b3\Ý1`8/~'"y6HV\x N/Vn9|gZc2H2ν3*rXB҉SV4LtBMabz\X$5u@ƄP4{+ HZK)4|1#F>"\Tlp6eP&4|"TVtAE#;-VLa21*VE^Yb} Ch.cqY#:rN23.G(nh% Ta%'ICbD$vZ ’.~ٶHoL=r22,nb16ȚߚHH?>8/٩=,k ןjtY 啛SlgQf.wy+6GN3guD-Vx8 i{'+[ Q~O w.M=Đ E}Td1_,jK<)1HL Ar`θx\G̻nIo' q[p(>] 7JDX*< cXC :E|^ LW[wN8mAaDHi /B˶c # n+=8E},$NiL(bv]Ō]4,ŨڎD}3mwFH<e! ]6U#Xqހ8zbAM㕔֡녞t\=9>/A[˓an݉2݀\Q+KM4Y-޲:=_>`\?5髦yat6jп< ZFӢw, gau uzKQJO50>y .#+c*2K]UaF9|7s$#@3QN8NX?8G4mPjOǏ/' 4?Av9BYg,ù){}ز]?8 |b0R?,3 _ٶɂCfcn*'k4!rTqt~<s#ZDA&i%{ xw@KR<UlkcRM(gc4 R&Gx YrHw[w%Vdi$"fx# fzPl#;1xȗwX_V#2E%S>`W_|zx׫o R5yw`m7aB/(8S1i9$a0q^HAbr0G߷wcdB]+m.wS מic.fq&Q:h(&BԈx(QX+V* ,>|;YjqٓXR%*8RL/|$bXJ?G<:1c|1},{xu:K y+0OBh4%)xp0ΑveȚČ|R KcnJZZ8wZr2-X8H#XĐl2QViy55eөHް18u9Adn_dciz8F(c j=1n"ŀŮ1O*nY{za%0q@[la\%7h{U2}:*,AJhQC{a뮒Qh$/L\J/6bzDڗ &$~-y|eO Ԭ~ zEs~q_ւl4SI<נhi`%bbC ɣc[&+`Vѥ6'v+z>N@ƋVMV/(6v-~@ijpWD}~.+kHm/S4^iTAΒ-jM3 Č;-r7L!w| f 'mla_3G+2pl5ōD7O(\xj)xuFfn82fh$xr(]8浠ΔuX2A +q-w3 '2c*m C\  E vWnp65˶9Fg-ؠp>29z-U"ݻC /;0-aOY`,.,'/Ea_Z^vVf^yVo-S{5/Kb66g /K123ALPbag|A Z)˓fb+rI)(xQ .&+qm-wx)'˅$8b;\ bW^!ŭsx:z65Nrnq(@yԘ *E4kX*Ifh)* \%'Bγ6AID!K#%s4]7=݅L<һ?f3PƜ/(IG~Yi:YkKDIR0ݟE8!B޼[ Gc]8~JiW6:r:X ןu)Yc x?1`8*q&^#XzrGlO,1کm,w.~5+ wβՠlϒi^u&B3B $;>FcK7L)\exR*C=>̒*εo~,1LFо&, rZIIrJ 9UuzpjͤRI;4J8nM "*Yj?oTJ,2v~VUvf0?Оe!8i C-Z}i_NbPfo.b^Me8Auڵ8 f *|vŪޏ7qJT >E<. c lH`Sr[KE 0d+<1ǥ1D tOB?VBrkw֜:3v$V ?1@c~sWjBOмb ȿuӴ"K?m,=cy1xwY`g~FCL==cC]8 =V[ߋhc$XPeS`O%dº()y&W8(ŋhcIs Hv;׻DEz2墼.4:L(MVstca簵< 8`wJg)N-뢍P-¦RcAtݣ0`dYa!t~TrhcS)]^wEleW6[ lWMhcisr#QeyL N\+7(t5@va0K t^YLک'@&CJ8Gૈ3y+EL("[} Cql37>2I,5?:G#^\{O&42|4-L}*8cLDC%N_ZTOˉD4 vPaC#A%&2;{<y8ŜGJBO`<|7Ic % ,'h ա{ɐ=U؝NJǝh`Eߡ JOj3 ۋ.Lf:d+4"r'p5©w,7A%v;0y]#iwXQ^mlq0S Fe=K2b*_ϖbK3Mqfz(6Y2{qu ^Ll}GwV XBʁET2hub3VqսsWQ9Ņ߶w&WdM.œBehc4r{`]ȣ+:~?'`n1;TV)u;Ush^VlEy]lv\Y#ToP~?=?@tbW&ӂ*'?W`4v<dg_?13NhDj🿯ݨu.4Ux!X \ ǏwLc}DV %s<ƫ)Jmk,voNm@\ <{?2RK/[e8;CkNEhAq9C$#4-l7t? -L$fH`׹e'ݹg`|_Yuf~{.q%Ң.0opj2Hpմw7pEy]N Hܫ3O K("i_B H]Xs\`O1LV0(6v  *2+d=V_Q^mlo17-b_)뢍p;.h*FB<5gyg& Tl\a"Ex+Kܧ,x6a!4-2haUXl('YXnFcB{)AUQ[t;z.fOa Qu;AxAPQg **D69 qLUHLW8Hb8r{rRse"e [#Kbt<_qܭW˾(j+NN"\e?|/,S#OcS_>rkxJn1Л tX%{vbJ~Ww]!.s44E߳W^~50!~& 1!K }H'5Hq7/1^Q9QIăBm sMLPXZS g#vt۴mΆ6V ZR Q+1)1.&![K|Cw"(pu/3)S+I2]ʼm$#VL'BX#..}xO'2p;y[95 ũԇud9L~7\SS'IYMUD!lH{~ӞBWF`UPTm.{*L鴼a.#+#wǘKьD7?ȚXNG_&ł}0oy!T!S3Є리lJyG&nq=Z"z\".+b5*Q\K}.n+73%"Mݭ?`Tkrd)8\zJH,7!s ,jG8(uX:)=b*z!B:h= n_MX m&\DRn$,g2ggxzҫ=FW`R%9> ur@ =`W=Z~voNbpԷ<@Ɠ2 }iJ`%ocUa@˄^)$4:jw `M椝:]*Oz%6RNm D51j]iTq\6Fͩ,c{} DȟWF!u?٫k>>~+,z~x+sK} !/\#kG^43ϩ+$搇=r 9yغ`\T`8o sQV`'m4Xu|.> $+nGYU`m(+6 >eVqFX⣬*Nh6\|XI~ V`8o sQV`'m4Xu|.> $+nGYUuՏ(IENDB`Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@%@%՜.+,0 hp  TRIUMFl  Title(O,<ExUnK;J;+Zݝ@P݃I'ݤsyffdčvop n}q[>|mTy=FcU (w@Wv}F1tXU? Ʊ*/瑧F.Qy+|ZNE%0:; :bjCGZk-w]O<5A?3^IՒƬ|~gsI]|m=3z,_oL;\ sGulP=-տza|SI5ů7޿ʗuvvW^ݻ7c }8s1ѯ_?5X{ѿ380`q7|L0p 1Da'$LI'M6&|rL1r)1TSaꩧƠA04`itM駟30g34fyf2,uY1laȐ!}1s`9\sͅ3w^7| `B -^,]tQ,b_K,\rI,RXz饱2`er-_+V\qEJXy啱*`UWjW_k\sMZX{:`uz뭇_l6pClFx㍱&`M7fm7[lrKlVz뭱6`Сvmva;w;vyg 6 ]wv}w1{sO^9r${o>w}~a<t>`r!8CqaG#<Gu>hs18cqq 'O<'tN>dr)8SqiOg3<gu>ls98sqy\ /]t.b\r%Kqe/W\+W]uj\s5kqu 7܀o7tnfr-[qmow܁;wuns={q}<|=~a<#xGcO<'|O=~i5 < }YS|g_/W_}| [|w?T*O? ~Wo!"?⯿/ᅧT=B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B T<QSSx~*O+Ղ2?QyT*Ji*Q$foDvOXX ( XNDm|KtrԳaԻ~|4fu4̱F-[eRcTWDYR$seå^aB7VT^W.|%f+X4Up~*˫ ޗծj)^Y*WwpWӕ5UU5j|t,%<05+A-N]_IlʊC٩4E |ipSM^TDV! 6(A8ɚ N5qЮݳW\Eye@glj"(fKǦl;2jhaX C!T |\RDEYw`N>&qUT\Uı=QuXYuvJ$!Z=nÐ% ETDJH0FwzQcX~#n&$;SD-ЮP7*nTeV} }ST~%*~v:5I@jAw&H>O[0Ih渓[7|*)?!Fڋ<뚻'8HͷD8F)n8R%<$_ty4zΣ+INFlބ> $EkI-sbȥ2!I)>Im7rܮC[9Mvb:wH+ N:d!6ڨ͎7m:vo #Q$o\6`q}*+j>[d~EUê_ͯӫJA_%8QZ$J]٪,D-}WDepKWEB-n)ueYޮ-e? 4+nW7DZή\6v_Tl.fAi>~ijK(.*w] W (ѳL3,*aHZS,RW&V$c-DTJYI#pp2 tP-WS9UTǂNUy_WEwm%Ju{8HLNpƌ49/!IDj,iia՝Q%w]Jee)"lUV ivj1Y"WCKEc G Wf$S S~4]ݨwC2 I4J(^x_MTӴYWqE \W~5[ru%+K(NVǁ=Ubc_ѰTvE0hąk};w8h:L p_^r$aaA{AOQmE"Z,U(v=- `]I].SC ǺL ڞT! ։*Z~Yږ),kL J4gWeƧ,gaݝ^ʲuѿ[v i-+)Țb_PӑV9<'ΦqмcJ XdXz Zv-xfܴBkiFq\+,6v p1r,O6Z]sY㗗Cj.I /z_Ba|,ȠڿGHhjqR8F /cnX⠄{++cڅ _I.~bc+r]yte 5 \Ynf +L)RH?øLDU/JePY712USwdIfݖds 2d7ɸ[2fdb`~UZ}0 oRD#As= F wͮ+ yC$L1$Dkb#ʣnPâD5XW];0NChTh#Ꞻ32ҩS]zCOY4/X1E+ P$Uѯ2h z!tsRaJP5"U๗8A ț$[ebsգ)Uj-UjMDSV #h j/EpŔSIOeJ$Wz@}DŰ+!j_K.)bȗ_1oo-g?NBO`;!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BicQ)g.R~*a3Dd 4J  C A? "213OE1ڥ\~ 3`!3OE1ڥ\~R3B  hN<2x}O$ɕ_vv6rƘ[L/`' x綆ah W \d"x'aQ냵1§=U9vDȪ̬OVVf/߿xU_UgUV7?Y?~vkq_ܳwQ v?A?s}RW^߽G{}L{Q_7Uwǯ?/x/U+=wÿxZUo?xV™~ ?_hq}}rS;;}vUgh8r_}j;v<vʎ_;~k~U_ ;~iǯv|bs;#ڎ܎/ժ#;޳ڎ܎/Ҏ_K;~eǯc_s;{=scŎȎOxmgv|nv;ww߳};>{jo{v<};>;^;vwvڎx󻯪7_+׍xS믪ڎ7̎~cxc?{c?_Yƽ2LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL$=dkvsOΟ̿+{ivXڼ2al?;ao> l_Un_wəN@n׵iQ V+7*7(Zwu)yt7ssiTU鯤W_@M|G;qo.c]˶Mq2+*T˶i#dW 32p_;Ҵ>@h[_6T.ئjce9I)sq{m\u>c9 \U[t[aYաu-+e#_%"ۍ+ԥM޵Cm\f[\fRy%"SY[ iYaӡ=X6Zހ]~- l$!+/W齭ͷevE[_!•ܷY]ux1YUeom_9vOɽc <W JܟeԢU =xٕbP1 ;5;9U.SQT!0bcvB`'Wiȑ?V52ƕorQNae\͝_s 0옎_-3Ky .GOŸ,ʮH?Sm`v@*xUȯ!X/lAg?~@8~tabbN Cw08` CLtFSmf0-, D֧uq*A]倪ztn0+cB?»Ta-%Ry5ȲOTh`$vŸvej:w$jn̳uK]yB* Q+AɊ?YJZXYįd7㪶.#fzE}H=|Kى"V:˞)GF9(;>[h[϶R :̸yAe2/\*Dp7߲[+7!?i"Pk1eU9eg39!m$ն# :˭GҘ:7S~~#I~FC-9h6W[3ސ&WuzW/WTdQuH&@h7NBeeꠢeBn OWFƫUaFST;=%Wz:­ۿoj$[Pv܏4A5x\xX;NuaG{?lĆUCoM{JAܯpr[YK{s%^:*s< u~g9H 3︉-ܖ1Z/ ݂rܻ\nbvՇWflٖbWNhmaz7Kĕ$AIJ*麜xUgQFAL *2o3.ʐ >ƠcXz(PZʕ^~^rrh5%%4g̯z-Qp(ۃթfi)Vfza(251J^`\ x0U?,AeEj|v qk7ͲWgZfa6 vmy_B6 3^L4Y˭#~޾v׭ub]6ǖUogĢ(Ձ Mx ; \f˝10W\5)2H°)igܸ224 ;4 tM%j~RK7Fc`MܼPDte~5XBKbYʭ @\x(~FEm-een0yzbBhgi79puC@Iecj'z#$*Ԩ^KXN,~"jݻo=|^߉P ca+HZ^r ʪWX8%f(f 4MoĽXz=|9`dgzU(:=Nr*TArZPp!0و`Z 7 ,_EI43_s:-k4ul8U*]I\]E bURf, .x4Cr{~ǥ8Ҩr8+HBp.2+(Pi!eUn^!441Y8׵.<0 `RB+k^YrN,dETiM +ozT 'n_v,FEn ꑏT ]E1 r@pS( =1J#Jgۺ4!rݛTN_E_\,~9_J˲9ZF'3YavQ^@r&D͖mLdA@'u=́ p3y^۝}G'K0d@?䛰Zl)j렷a=D{x^vvm}ev.+.T녮,K,=RNy.@q1ѬtƮv] y͖R* vUl O+Zį8gLk0jy`$G]/S .W21iR(j oǨXKL9L% /ZRgeF:EԄ$!ꏄ6=J-JkX,b@J{aPN$! iHs/[XԾZ|KE&/gPWm"q(3W>İsFCG{c֖: 4,Jaq)(faXv x:Z \vnR\~%EzWp2 iRy+xF]yZVTL 1C@@A\v]\J7'HB0Œ'X.T_SeP r[H*ځkt(*Drtܯڋ#Yz=4˟2yxXᗄx +a`Z^ 'j#OeYW+}N}s:DgXHQ8zMЩS簤@)BF2νjϺ 9~SįLxTnÕ:(V^7kQɯ["aN#/fOߡدݮu1c*NQ4gHn&%Nn:Нй, 7di1o0(}b,K.SA [FB侯Co2Ukd-EZg6GKrϪړLd`ba|+xq>%:^04 SW>E[޾~׼)fMpN*1/#S efT'cBc[$"0wH&@sQa)QcTqJywhr_ovV&aW1/H3_jZӯ0%XΈ _k (DH 9\Qhr! "X/~*+ Ė׭ rP4yaHVkoBՉ^2FɒӨC38kk"a3cW-mVc.cr7K۞6:@QU=Xް-8w , j9!bRz#MV7%||+ŠRX$n>4~ms_U}LEC+Q`qx.QmKYϔ*[ABտf:n! ա$Qs^my@w`ҔQnfί \hw]궽Dݟ|P,_ҁE{d6C欷D,:/ u{0yx,(S{F,cz3,dI!r."6D1_>ǵ9guW; &rnMA7J¹#gQMޞ??ޞ B \n2S2BT鋜Bjj& ߐ[Jj+君u[ 'I dhXi&T Ätu<!}S;FZ ѳФ"R1e_ךfH'FFe5*iplpsj]oku.2r78[`ꉰ&$7KZeuE^<¶} b:+Һ$i`^dr5e% F"46֥նE/έ";wjl#^C2EܧXB?f /hvW@H:@Q%\ՁywY`8KL:I/ zdM”m6k;;@SnNHDV^[yJ疸G,)_ {` qBOpy.fەDk:Zā2Ux']NГu¬#R.IUq1_ڰLnK]A&7`6rPn6$Cf7WS[є#X@> Ƭ])B&P_bM{+~ȅM~%dV ~\D[dOgW_pu}s0TE9\0Pz$}7wK] gB)NY濨\Z 8xo&AF*1m=} ic$PU{Vhܩ3 nZ* IvVTrP^7Hm 6PIzX:p9bk$MY '@tpק#VXHNw5=:uzKF?U"3Sp{.\V]N^c>q }?z)!Ļəbe5/]b꘍l}m,7'U b$د/V&[T"{`;8yDiۗKZGyr'$Gӿ[\lD2Es>:PEN1 ՘G34'WJ>:F% :W|~EתSﵳeW!"7S{WB\#Y \eFMRX/)dJNݱp3g**PFWUeF﹓C,\%nl5 rB%֙F}l~nł&G@ NlX7owx7~܄ʌ% w+ut^h&>6^_wB2hМV)YupES 9Јnj}É5>Bԙ+ [ҋ]M~=5կ?NPtYp5w6qqH,J@'s J[ ó-YgR}D%mڇ^W@Σ :5*+rdAk@ _GBv:""x{'%" 4&}i7k_@'W?j"cj=u6_xJyWVMCw3PՌb,PֱV)6˷3,tw9JPϺɩ}wk75eϙU(Bnjw:JN>ܢH?ӯ^ QǡMyuvP?Q.ŐTEg r$`鴒:<@PZh^~IzfmDe'8S޵&V6E;f UC]A?k HMQ  2{IOO> oR?λAuu }~oQy?VtN7B?~2GOQJm<\z@iV9U{l` FչcЖg#dǯ|5훣eԢLjS$ &tMii{ŷε~Ou{@Ҡ}vwA3ax="+(tDp+b͞aiʹkwO['NPwﺜ~t!/@iAȳ+V v-I ]n :++ =C7MOE~w41<o PB}q@ݕViaxOQuJ^i*WZ]faZita;ԦACm0 =j^Не""t=6ew9_Z3̢ pp|R0t?uX, (+P-91aW98žk0>B}H}$x{ݡ ESKwDϨdCXiNTRt,g*BxjWѢc ` )k5ƚ<8 <twj kʔLՐÍ yMggy~a!j[M;IX ϶t !VExW6}Y$UݹNUy43n*ptyƱ֣׶-:Pᘒe -jzTi_xtP#g1uнZ!P<2?aӱar^Al|BȌXW:R4>Ws2Y񕬓.9z7WQ(& {M+K#:e Sé8HI&k1 WyX:]JҦJz }Sl14~tYR`̑xd׺xpWLŋ07wΆ\t䧒i=G (]ow:&jŋʱb4*J,츽5eR:yXt+Be6oaD+cj65"٤8 ºY1:XMcm<~vīCWB{Q%/{pt隼bS)B/Ma,upK_?!XDW[^n@7y<V'*i1#K#P^,Jۧ#|p9/{C:T7N91FDļ}w!Ȍ1p <*3b)V_i.XOmW'.u+M YvR^n}j c.HMa>ס2~^WnJUb,FU>{g^LPf=:)T R@IgbE ~ ``p P=$8y7rU!Cy zWqI%8}vD"0\ vx<]]^_J,g`\WTz|1Ug ,_emUJ.t?`\2oˬ.uzP&ү̻q)aU7ګ[Ъ8U^?WԐQZ.U`i>k㦞uuw6FWLor4/4;iUtŶC)Huzc/*'8mNGCш q2F-5ڈJE#*|(U}qAV5| b4f-fD5j%cnawP9Bݦp),JW/КD7>%qt01Kn<7ƑW=Jq&adw M)Llm lz3c膬FU\oCh`n(LR/LeF!15)fJYfEA\sbKcy/>ŸUfۖ5VmYp_AYZ `Iƾ0%J.ZNҒjy.o+x^YhR\vYFBvWϞ +2}3,ToJxm[M$mHZx{لiYƬf{p`م.;%&؋H[yEg>lBd-ajxPz6$Bt-;]v9+9Kڐ'MghQbw~Tc2W@s=!`b6k' Ao|#oVRJ/Ӂ5QݏLYPd۵bJV0Y&Us8/\r5}~&2ۄ;գĵx\lY1fCø ҥJ6 >"Z{Bm;3_ It^W5. 5uH zRiZxvOeP*\.\Ժ,nL 2O:? F1G֎ eoC5RJ/O 鷕޵ M9P\\~5*ZZ".t1MW+ɸn ˜s ۃE5.BqˇVZ.k1.`RmlHաj`B% >mۄBq @Z{Q.A\]쌫 ೓}w-§ę<£3T-+ǯ\8YE*J%_AN-ZӺ2kP0sWr5|s*v.\^3q4rW+-U?' Fiia`k'bO;t/_XIY~ƩUՍ+ˁKƯ/n~KJ*30]R>˽7ī5 TWU{ʎoUzc^ue_~{m $$If!vh55#v#v:V l  0    6554p Dd$T  C 0AprintButton"??)<!@=??)<<i`Y x dKy}q; 67# ;HT 67l+3uuG  YQAđ#xV}RIUyoJ//T].cWlϧv 68n@/V\7̿P+Wa'W.^~x?C |܏x Wkz1C JLI'2*:l %XX5X 3QeXUXu0+`V``6J + kfc$XX5X , Æ, Fxel*:l'2*:l.2*:l;EeXUXu0w˰aL aVa a, Æ"H + kH-W? a|q$XX5X `V``6UeXUXu0_p aVa a<$XX5X @`V``6̃HeXUXu`:_Jxulg˰ax, ÆyPJ + k+2*:l˰a, Æ&`V``66zW,ҳ .7/yR`r0deWD9`0qnad0 d0 d0 d0 d0 d0 $7  7  7  7  7  7  7M`0M`0M`0ҁ `0M`0Mv˗㑻 7 W̜9slAA]7iС' F*豵I7gs^ʍMn`h \֦}~FsÍ7l F*N ]Ye"}*ETnlRbٲeӦM{_[mӦg~3K.9q"=d0R͏^K;7ocyEZrSN<2Q]tU$_@mow ( x QܼxYln 7nҦqiiOg4hЪm͚5jڴS׮=TϞ 1b ~O>s4 @I2MUU' )H0ܠy :k(7&V 7tUpz]\WfYС~vvΝLeK*9wn=v옰pW_񡳸6֭Q֍VrrhܢEnys0qnnVn{{~|ܸ[_|qΜ9?f x#钿Sh:&74ˣ-InFS̉M< v#VIS^CIm;ɓ SYED)GJ9xӕUۙi=Y'Bt8Ok^7~Ylv#,YfzYlTT̙soaƀi MLxYgcKWZ>AnVU4.9qB QGmvjԨNFF׷{|g;wnQQG r3.n:Uk'r Jx3M܌k37/paúYYMtP!&\Xu)S~֩Sfz;sl?͘i}Aos3i0LV%.Y/J}y7m5+ĈN@YQ\\k͚5kɾ瞼r[hڌ99Pwٳh3#ႂy7w悤۷}jYf_xQVկ6ojF9O֌gki}MdR]PZoF޿Yyn:^տ#&`g&MW995haԩa% xa:r ڨe;  zJ-Zdeg3fٲe51{~dG<7Jr!ܴMXmٲNff~ E O&ϲڢ#G{.lܪU^ǎS{nݺuiM#ɍ߭ KnkҼO 9fn{Ouee)ɓ63`ҥKu3Ґ C%~hR'W;wUۭbQo:?1nٱco>}:{oFZq!:4$fvrcS)իW`Vݛ x'( rr^68#M}`0bFIIIq9M?>7`u kب u2MQbƌm:t5thsWvn3 ؼys&M/p|gU`2"9o(*3&a9~=7nT*&dR|kg5Mr2wyc(*.u{R< ֭_bTDnRUy޿79ҰI/EnRU3d@`QIQTR;6mdExs&h'l.]&v}}6xWtL'Ν-7$M*.nn޸]n݅ JIg>@}#) $8RpWNtdՑIK&JUԚ#] 8δH)#%s|4vNnѿ wXV.^Xbd!%^D6`gbEW[\ nÓ;yةO]Bĉ!&qL<~LL髯Q!b5Zk5^XٛY.GJw-Np鵺$qPi%}*Xj~GL_*mj[{׭ZT/P\!d!׵D'MHk`g%E r-D|pA!;71FD/9O e}XYF?YmFk-Dlr͏w:zQTefuͪ&v2vu?w,):,VԪl2ٷ_rpeGDyM p؏G;!hNt hv ‰!1>2>o=4d}i$2 xM[kU5I^I:@J nbW?k7Wv 5TKBr*qM\jVAO`}#ʁA|umTȚx"qx.Mn}p΃wڽ+r٥KĠ0:e>#!+˵ѫQjp]c8r#k?U[:ku5HvMŋ 7o/^Tް hߋWBnd%^Y h8xA!;:M # K͏v:z`ǶK 1%\.Cwl ;D/uO ^m-rkɚTکOo$={TxkG31{0dGMeP7A:kݹs BnNt=g _XwS8qSH6mM]{ tLC腭+N$*|KMQjcѼtTipsŻV 2Jwܶ-^!+t9PD%^YV%6oGfeG'KQY04cgw\=1NtÉ1QswKyM"VǜLfG6*}j{58KsOZ^=u"T ;y6 xϞCv+d!7AF,RQj7=:taj(/YZHRp;u;;u ݼ%t M$ZJ"%BŔuԐĶEQ\laZ*rsѫc@DU{^F[7WBnd%Q }Æ1%HӚ@yd!wgK[l.YmmkVż4t_J"FYU"}{qKe`{Ģxe*jEVUO|M** U|%Fv2:Zm ݳ'^! ⸱Q8ƈGG=>zQcۡvt)(, [6mZ6l)Yʃ.:AlYǕ++ =I131٫JJIl[V&S?jP:q':qŴ*FV⇛JVu|xC343,;:B @ \ܼO+(G:T1[Bk%1/ȵotħN+OE((,Z[d%{΢((>W W z淿wϝ{a|vVљYo>t JAYYߎ7v֭(CQEQD`p"JR iA?:~N(REQe+@4J1شpiiY8 C0pt@B'4gc)SEQ, >zU,((ʕ? u, ÆPeXUXu0%XX5X R aVa a\˰a6FeXUXu0*2*:l!2*:l7P& Æq, Æ, ÆS$XX5X sI + kΔ`V``6-2*:l/˰~Tlr`6GeXUXu0_8 aVa a|Q%XX5X `V``6̃AeXUXu0 aVa a<$XX5Xc+ZypI + k'2*:l˰a, Æy0K + k.2*:lo aVa a:E1TablemiSummaryInformation(DocumentSummaryInformation88CompObjj4 P \ h tUsing Colormaps and Gradientssin Joe Chumarmoe oe  Normal.dotm Joe Chumam12 Microsoft Word 10.0@hgC@.:@@fCo A՜.+,0 hp  TRIUMFQM: Using Colormaps and Gradients Title  FMicrosoft Word Document MSWordDocWord.Document.89qr@@@ NormalCJ_HaJmH sH tH Z@"Z Heading 1$x@&@B*CJ(KHOJQJphN@"N Heading 2$d@&@CJKHOJQJD@"D Heading 3$@&@CJOJQJF@"F Heading 4$$@&a$;@^@"^ Heading 5"$(&#$@&@CJOJQJF@"F Heading 6$&#$@&@" Heading 7t<&#$$d %d &d 'd -D/@&M N O P Q 6@CJ@" Heading 8L$$d<D&#$$d&d@&NPa$;@<CJOJQJF @"F Heading 9 $P<@& 56KHDA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k(No List >'> Comment ReferenceCJVV  Comment Text$ Ed$x^`EO" Block Quotationq$XX$d %d &d 'd -D M N O P Q ]X^Xa$@CJ@B@"@ Body Text $a$@CJO Block Quotation Firsta$<$d%d'd-D M NOQ]^`<@CJOJQJO" Block Quotation Lastp$$$d%d&d'd-DM NOPQ]^a$6@CJOJQJDC@!RD Body Text Indent h`h<O!"< Body Text Keep$2""2 Caption@fO"f Chapter Label$&dP;@FCJKHOJQJdO"d Chapter Subtitle$$dh]6@CJKHpOp Chapter Title$$pdh]p@B*CJ,KHOJQJphNON Company Named< ;CJ&KH$FL@!F Date$a$5@CJOJQJPOP Document Label $h 5CJ$KH8X@8 EmphasisCJOJQJkHB*B Endnote ReferenceCJH*Z+Z  Endnote Text$ Ed$x^`ECJV @V Footer'!$$ !$dNa$OJQJ2O"2 Footer Even"PO2P Footer First# !$dN@8OB8 Footer Odd $ >OR> Footnote Base%CJD&D Footnote ReferenceCJH*:Qr:  Footnote Text'xJ@J Header($ !;@<CJOJQJ@O@ Header Base)$ !2O2 Header Even*HOH Header First + ! 5OJQJ>O> Header Odd,$ a$TO"T Heading Base -$x5CJ$KHOJQJxOx Icon 15.$d`<&`#$-D /M a$5@B*CJOJQJphT T Index 1 / x 0d^`0 CJOJQJL L Index 20 x d^ CJOJQJD D Index 31 x d^CJD "D Index 42 xd^CJD2D Index 53 xd^CJBB Index 64  `^``BB Index 75  ``^```BB Index 86  `^``BOrB Index Base7 xdCJT!T  Index Heading 8$d ;B*CJ$KHph@O@ Lead-in Emphasis;CJ>(@> Line NumberCJOJQJkH4/@!4 List; h^h:2@: List 2< 88^8:3@: List 3= ^:4@: List 4> ^:5@: List 5? pp^pJ0@J List Bullet@ & F hh]h>6@> List Bullet 2 A8^8>7@"> List Bullet 3 B^>8@2> List Bullet 4 C^|9@B| List Bullet 5CD & FdD&#$&d(dPRCJdOd List Bullet FirstE$P]a$@CJOJQJZO"Z List Bullet LastF$]a$@CJOJQJD@r List ContinueqG & F >Th.TfBE@qB List Continue 2 H8^8BF@qB List Continue 3 I^BG@qB List Continue 4 J^BH@qB List Continue 5 Kp^p^O^ List First L$PP^`a$@CJOJQJTO"T List LastM$^`a$@CJOJQJ1@ List NumberN & F h>T h.Tf]h^`>:@> List Number 2 O8^8>;@> List Number 3 P^><@> List Number 4 Q^>=@"> List Number 5 Rp^pO List Number FirstuS$P>Th.Tf]a$@CJOJQJO" List Number LastmT$>Th.Tf]a$@CJOJQJ<-@!R<  Macro TextUxOJQJ2)@2 Page Number5O Part Label=W$d@&P#$-D./M a$B*CJOJQJph\O"\ Part SubtitleX$$hxa$6CJ KHOJQJ~Or~ Part Title?Y$$$d &P#$-D./M a$@CJ$OJQJ.O!r. PictureZ$FOF Return Address[$a$@CJTO"T Section Heading\d;@<CJOJQJ^O^ Section Label]dh@B*CJ0OJQJphPJ@"P Subtitle^d5;@CJOJQJh>@h Title'_$dd&dPa$5@B*CJ0OJQJphbOb Subtitle Cover `$d $dN @CJ,KH6O6 SuperscriptEHH*T,"T Table of Authoritiesb !JCJT#2T Table of Figuresc !J0^`0O Title Cover~d$$XXd`$d%d&d'd-D M NOPQ]X^Xa$5@CJOJQJ.  TOA Heading@e$ d<<$d(dNRa$5@CJOJQJ@@b@ TOC 1f Bd@ CJOJQJ&@ar& TOC 2g@@ TOC 3h d@ CJOJQJZZ TOC 42i dh&d(dPRCJZZ TOC 52j dh&d(dPRCJ66 TOC 6k   ^ 66 TOC 7l  ^66 TOC 8m  `^`66 TOC 9n  ^,Oq, TOC Baseo\^@\ Normal (Web)pdd[$\$B*OJPJQJ^JphBb@B HTML CodeCJOJPJQJ^JaJ'O'O!#0VO=\(q  _ DXG(<CHP'R}[{GwCI}Ln%`jW 7!9Q9^9q999999999 ::3:E:R:h::::::::;; <=====2><>B>k>?????????????@@ @ @`@@PA~AAAAApBzBBBPCZClCsCCD0DeD+E7EREnEFFFFFFF GG%G5G7GBGFGWGkG|GGGGGGGGHH-HHHHJJKKMM O!O(O00Z000#0#0#0#;0#;0#0#0000000000 00 0 $ O0 $ O0 $ O0 $ O0 $ O0 $ O0 $ O0 00000 00 0 00 A0 A00 A0 A0 A0 A000(0000000000000000000000(000000000(0000000 0 0 0000(00000000000(00U0U00 @0 @0 @00(00U00U0U0U0(00000000000000000U00 0 0 Z0000(0000U0U0U0U0Z00 0 0 0U00 0 0 (00U0U0Z00U0Z000U0U0Z000U0U0U0U0U00 0 0 0Z00U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U000(000 0 0 (00Z0Z0(000U0U0U0U0U0U0U0U0U0U0U0U00 0 0 0(00U0U0U0U0Z00U0U0U00U0U0U0(00U0U00U0U0Z00U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0Z00 0 0 00Z000(00(00(00H\>0 \>0!#0VO=\(q  _ DXG(<CHP'R}[{GwCI}Ln%`jW 7!9Q9^9q999999999 ::3:E:R:h::::::::;; <=====2><>B>k>?????????????@@ @ @`@@PA~AAAAApBzBBBPCZClCsCCD0DeD+E7EREnEFFFFFFF GG%G5G7GBGFGWGkG|GGGGGGGGHH-HHHHJJKKMM!O"O#O$O%O(O\>00\>00^>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00(8:u\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0\>0 0,,1,,\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00^>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>000\>00\>00\>00\>000OC!%)0_6a>6FINR'W,/14579;?DFHJ%)137:b<?@BE HKOS'W-02368:<=>@ABCEGIK&W.REjElEGGG'O::?b$aq9U0WDSɀ2$!;(+2$Q")v CM@0(  B S  ?'O _Toc24275100 _Hlt16144269 _Toc24275101 _Toc24275104 _Toc24275105 _Toc24275106 _Toc24275107 _Toc24275108 _Toc24275110 _Toc24275111 _Toc24275112 _Toc24275117_Two-dimensional_graphs _Toc24275118 _Toc24275119 _Toc24275121 _Toc24275128 _Toc24275115 _Toc24275116 _Hlt16419679 _Hlt16424760 _Toc24275129 _Hlt16419658 _Hlt16419665 _Toc24275130 _Hlt23827052 _Hlt23827059 _Toc24275131 _1113633169 _1113633251 _1113634690 `"h#&'*.v0v0+17:;=B>B>B>`@`@`@sCsCsCjEGG(O@ @@@@@@@@@ i'"r#&'*.v0061!7; <=B>B>j>`@`@@sCsCCjEGG(O^ LK_ \0` Ia %b LLc _d 3Iy7!99L::(OM}7%99P::(O8*urn:schemas-microsoft-com:office:smarttagstime 101319208HourMinuten | , X%]%`%e%& &()(\1_14)4*46444[6_6jAnAoAsAtAxAyA}AB BKKKK!O(OZf[]{}GIwyCEV[IKTYLNUXnpwz%'36",. 0 W Y e h !!!!!!!!!!!"!""""" $$#%'%V%W%j%n%&&&&()(;(=(K(Q(x({(((?+@+m,o,,,-"---]1_1112222224477eAiAAABBBBBBDDEDGDFFFF!O(O3333333333333333333333333333333333333333333333333333333333333333333333333333333333333!"&<  B !!7!!,,,,,,,,,,------T-T-j-j-}-}-------..+.+.=.=.I.I.Q.Q.b.b.s.s.........`6a6BBHO!O!O"O$O%O(O!O(O||}d~v2 udJ*p.̧6qs` !8  V%xwָd6v)pE|Z0QL8GDD{aO9I WxwָrZaC_fq@ Tbxwָ.+cM{Pp 8ހrt:v^`.^`.88^8`.^`. ^`OJQJo( ^`OJQJo( 88^8`OJQJo( ^`OJQJo(hh^h`. hh^h`OJQJo(*@h@h8^8`CJOJ QJ o(.@h ^`CJOJQJ. hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJQJo( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJQJo( ^`OJQJo( ^`OJQJo(o PP^P`OJQJo(@h hh^h`OJQJo(@h^`.@h ^`CJOJQJ.@h^`CJOJ QJ o(. hh^h`OJQJo(@h ^`CJOJQJ.@h@h@h%~}|OGPGdPGPG,QG%I W TbQGaC_QGQL`RGRG.+c` rt{Pp)pE{aO{aO0SG{aOSG{aOSG{aO8TGrZ8  d6OG`@h h^h`CJOJQJ1 PG`u@h h^h`CJOJQJ!pPG`@h h^h`CJOJQJ:PG @h h^h`CJOJQJ&8QG@h ^`CJOJQJQG@h^`CJOJ QJ o(RG@hh^h`CJOJ QJ o(1lRG@ ^`CJOJ QJ o(RG@h8^8`CJOJ QJ o(> endobj xref 2510 26 0000000016 00000 n 0000002736 00000 n 0000000836 00000 n 0000003067 00000 n 0000003111 00000 n 0000003253 00000 n 0000003575 00000 n 0000003832 00000 n 0000003935 00000 n 0000004196 00000 n 0000004445 00000 n 0000004495 00000 n 0000004967 00000 n 0000005524 00000 n 0000006032 00000 n 0000007344 00000 n 0000007480 00000 n 0000007799 00000 n 0000037490 00000 n 0000053578 00000 n 0000087773 00000 n 0000096125 00000 n 0000096358 00000 n 0000096577 00000 n 0000096677 00000 n 0000002514 00000 n trailer <]>> startxref 0 %%EOF 2512 0 obj<>stream xVOg>wqEЊZh_RsGV'jhl7d&Zނslb,M6a"Q,۲WZ_K>|y<@h- kKȩDDHA hkED+M 5IVx2ARĬ<o FR-_<'2#B.gpQp0N5R!D?}ZMw z ._GnW1ε(3ݧݡbEc]H6l=.5B4[CST7a7ihv)K 0Wת1_Le.Dez>s&q{hQWEyפ9]V-qVzf8!D m#X5Fa΄ޥt?u>/^LCiƫ? bzŏ'CrZNG8ᵍY!Ù֮R,DjT\ ' UU<3,{.I'{[ƆQ=d=hXM-?L Tኰs\(w|U_s. Voķl8y1!ʨ]C]mi5|~FٳL{ϗc`/ riN6Cn1joUid e5pFm geys'kKHW͠Q ^)RQ<#99ojWv:wuxnA KWc)ƵyGUy"MRJ*Lzޑ7sa4nCB',z/mԊ\D<[+ѿbxlIӪYNⓤ.oTjT[k8Er =QFiPO*\.[8#&IRCI$EbR61dG`0d[$)־ H3DF{gg{dVl27F31)Y,#'cQ.D[mJ20D4i2 d(ڢŨx :X;U^4#˗\FK(CR3ŏU pxHcū"m$L)fx ۔DaIm ئn> `~ɡŠ\9a Ʌ~ c ߃(MqG>yi. 2h!8P*;EMR4ײ2mWFƠC\!'t " .,Κ10H e@fX ?7" 8|b$~?7Ę_E,He, 0vjn endstream endobj 2535 0 obj<>/W[1 2 1]/Type/XRef/Index[568 1942]>>stream xA0 ð4\cW}n{$Esx9<sx9<{? 0" endstream endobj 2511 0 obj<>/OCGs[2514 0 R]>>/PieceInfo<>>>/LastModified(D:20050831114118)/MarkInfo<>>> endobj 2513 0 obj<> endobj 2514 0 obj<>/PageElement<>>>>> endobj 2515 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>>/StructParents 0>> endobj 2516 0 obj<> endobj 2517 0 obj<> endobj 2518 0 obj<> endobj 2519 0 obj<> endobj 2520 0 obj[/Indexed/DeviceRGB 15 2533 0 R] endobj 2521 0 obj<> endobj 2522 0 obj<> endobj 2523 0 obj<> endobj 2524 0 obj<>stream HWMo7H"g20 # |06RP]%QkKd7i~}?ppvY>^Ź2Lut7퐵ߍ/Β#)I}}.n:_w?u.'6f2cgR=1ݬTU֤FYpjY>{-Okgl]O hц!Jz7ƧjgcyyZ:Xd5 !rSWC49Pɼ,P ~~ZDKh˕׫CR )F3lmJ1s8|"J(_h糢^ģ|ϰO 2gM3!E/ dOㄶ08ɠHq Y$>8!A0NH.lj(q\5&It.!T4v)T8flO0f-CO0$&Ym>':!$BumE㪁v $8ެ&h (JQd8H94i7 DQڍ!pyn y@v:bSb>PsmNq1 8+DH.g]Yb9QȘ:0kS)yF{2|/Tí1>.*omM9 ::&Ȥ m)Cv-g~Yl}&h/٬hi_U4x PstIA6rPb/7q5_]W.;Z#swAnUb }(>ZUr-O&LC:J$KaVrcr{4G4[*^`i$uٕClA>e.m~FAGz7P4J2YMݮU0|^U% ⥪^lD> endobj 2526 0 obj<>stream HTMo 9vĐ4H0Z _@cCyVsmF٠Npg'nk9(Y9 4e8Ԧ, ɻ;N>xN;x;h>stream HVyXSWYwPMYdS a 1@4 ;$UA6 ,Պ ZP`iժdQ)be`[YYYA^oQZ cj1(/ajGxL"&݉ "EsS6;R# |:yxy.[Q{V1(CRu6W8t&h>E0yrsZTgpXOEZw@hqB4tJEx|yԿ,`ohEwu~imb0IgT卲< E%X)Lj|?qHeK3HH \ %"+u\>ܿFO#Kꗡ+ t\tr`'¯qbh8ceP ˪- bxO_0ˏ,95 d+iN!Cyo' dpxh$Od3Y?+ymS_ۋYGw[KF6> 6p ߯ p%@k*U6 J~1GH#c1d3s,\%Y뙔 [913+#v7me/!ʂ۟i 42$?c"",^ŽvuBեzuï *ڮ{d[V:CM˘ݭC $ph\@EǴ\*{LÆ%+>Q!_th{fߞ|Ѻw~+JxALv,|lLaK euU[2ٝuF)ƙ.ExQodL x%p9Jˬ Qa2b\\)bS9yK3?k1Y*u ĥ2Ay*n `! !#IIIaz؜Xy IBY %qjK8{(}c1F |YM]/UڦZG4tJ84Ty8YUՆwY,i9s}cӵ!f&5;x}YK`q"e}䡶vxhOzœޖ댐*~}oe"%N QعݶUw%46Aa$EMHfRnG qUW]0մJ'=J[}xXoN2?&Ll}+]Й(NtA ' ?e ) Z.S(@& Z5 \+yDPRg,OL֔5 MX"UI#8i('a*8,_L 3y'%:uw^7-jm] HsAnnϜo jkUb֟78q2h KZ (v4Fo<-SvBt _秀Vrd;:F(A9BA;҇s(!)K!i^Yc ]l14K&&A峅) & B녮B Ւ@"&^6*9U725[}21}CeԸ.)j_"edF݈Kձ*ln4*.Y^tǖ(>d5AYՅ*#e*5o dԈӏG%yo+#Q Kj8fGX%:Tcojm tۓh;B==SjuzU)wQҧEA_ۅ/%O^=Q0{cGoc'`qg[BVBI(*Cѡ ;Q6|>O'IjX0$״檗1%LlH8;v@w|,8|ԣ5rtvvUVtǩ!~e^lì*M4}ǵO%=L^jjmhvu\u:n[ƄM+UjFxY6 W^\lEfN=Opa8Ck+W?z\Ntn|iMOLK,wbu[}FrUvU?nP>$ e߽Gwr =PݕPR]N6¿A\ 9i58^sS7 8mHDx4VIwd@)~CX\6IP)$#ڏd1> hmEPkaqB-M4$o޵U7H!+֎E3cwy=g# T{r;h/w"ԓD4Iw/呩eNAZH̜ljjt9xNݬzcbZ(u mE'Hކ\[\}[J:(mI,rq}Ŏ*NRe1]bd˪ޠ.%@=A3螌q ,oRTϤ%U3E)Jƽ%l7"|ÃW}X9P9?һvb=1B;MVuJzsL#,+JܞO⴪8k4 *Us6bP J LMo)!5wEFUb&yRBR3{X~@O?"hH4ACC~0 r9F쿦Q'ҫi6q0[XO~R$smkH׶CZҪC-OҪ75{i#ɒƴk{P"cƼiePS y$.;"|5귬J p~-[cl*S/!mdeGvmY:9uͭ!Jx/=J{z#/-.[?#6r-rH;SԵ"?/ެ^U&KF׿F̦Q\9|"&Rl!]~aJTGJZr.ٵ^|EjMSķМ\]䲏?xma_ Zf99c?t![u#z!,F/;T.|o=E6|$ehS#Ee& KnOoVtm/L/\v5ȥ*-ml>~~2~bYڤx6Q.*LiMWLKMyL6/o/\A^XځSE٬a5zǻaE8Umq%vTPǴ<onѩcU΋͘JYGa"䤕u}=DbkîMu:ڰA<ZOٞwL<R(0;Bu) #+\NO[+<{HVs8瘹 ૆#۟DC4/-Hkê< I%O-r6[ 59`.`PV, `??{T}@0W=F#""6;29'?ENF =5D<5k5r:]yU-DOfѯj® U(m kIϊ7/|J2A:FDlZ fEVQiUj=W"CG7q'JReL;0`%qf=-Ѣd%.rrn󜘼>Q2E:\͗[B\1e(Pu 9HEDXBJRU@h:A5k |a'@dgGk;9:ZX:vz@#|aۡ6A` Q^0B6BEodX G'k *Ҫ 9Eh!.0l˥SO= ȟ!46C5\]Qa9IN3m S 2 FVvK] ((8G1/3e $ j54a&8`.ߐ${0 MU CSi}V*X0&QHx-%X?2.ՆZ?NX_Vv9t;h [yaZnq@1^t" ^12Uq._w,MceIݔTx1 i, W[4^e#D,k%bXR֘zϼ@ VPaevZ `0V/,u'H^Ne7&a@`bʢ 46=64x4<2o 8/ hE]p\(NPq b;~k4&@x!;X ϲ:^}Y8S( { P\/a1s0Z?)VV3E%t*(+` Ĉ4*@auM|iv90g%:g$5[iNRiFD3` Nzs` r̒!A X}fts8%*2y9˶t>_v ÏuIQ ra\+~&l5L1=e3y͛!; >rP"1+6i&H}aC H?%>ؘ>ZUxHKDxXu58(0٤DxRX.bѣ&KWYFW]>1$?I{$ɐ:4UoI&$|]}xÃZIAu:Tp4-?! LfcX V/-ZCҍtpYNGz՚cZ6]-Uj@ύnJ>7j Q=kB`X:w>omx4gգHqR?f;Zo^ ]dTı*ycyN+ɥjdbdՑ_0(EKJ<3]t49 ԬH-ϝU<9މ9 !: [>(R|66aeшH{BW UĩQNIƧ8 yj6g9ΔbL'/hb6;DYT[wްT~85MvN}yceppB'8}WU]<\BI O!`xJ @RАw%Bt:9U痕ꂒSg/.m˺T hE)BոSzPOi T %ohՠtA_aCBNtua?9c JGdi\e@`a*dpdS;CT _6"XoYE(vLo61a`Fwۥ/&E(OXG̶mҗclqoEYp Ձ{#,7o=)e6GڰfꎐK(׳2@ ȄM$[ f[7RCw\I"/&vk:֓QwXro,*GTy`݋g$aD@TgPʘTذ:Cڦb]n{c_$֔O/[k{^oQYnR7>֛a1 SLX仜{y''VNsMg'Oav귚e59XYM܇vu@`5lr޵:y\r"Эe>S$n NjZk!Do1 cys@}7jt~URĮ@2i̥_@@'o^1K>r{15l3^𶇏G?9.7^˱<{Lӊ~Ҏ=|3NH9'r\8seyy}<Ŏcg;19n`wݩ%NwNRW{ԚyvT7-R Obu3P[ I+r q#G5r/ȝh짟.A: w&bi9*,: v7fdnm18BVFƫW}ϷėcXUbP}v!s.9SW((u_̯jMls)r/{ikNا)㲟1a\$ƹܓנ,c%wڵֺ~力]p. 2 |D>a+03Q('k4ÏX<<sr XB_<pqPlb N+wb@K[GI ?*w kD~ :[jt%qh_|+cb>ύ,gIWBk9q-7]s1y ^_ϥJ"!nTWy|2 ϡkD fy(u_%? \tf wH~ z |8H#,|\cnյ"M>S$b{wq79Nޖ qg?ly}/i8>s?{a:W$hy_}lN;qy1%K@8 Ԫ evN04xet$1AlVO6sBdڴ@2Bi??XJ5ڡy;?@{;ﹻG -92-џ<~~gg~~'7GiC7^[\ފ[lz<&ԛ8k#6 "~)=s/Ӳk}k${=s <=X\xwŅn ok;,.M- R_VNkR%hc0J0J0Je}q#vBͨAFUT;EN>-Z&QM5jgB FWq%TiũZ*5<s zi]>z0Lk! -<IJy&n˓r6G7*A6zH\d=B ` F]|Ytot{lW9.ev/7HM(hAgCG5tOV?Lx"6cEK<" i n%3A:/ߒ"$̿Jg?*)3M@KE?eEkTDꀴP>=*R!p"!_(oD3XUVy9 Ie5:zi$5/A|!F+ܢ§kRt:r4YXEY\iVnj}̚oZsf+T#ڹ/mg\BuZy_0EXduHd"EW9 TwDHA_苤,Uz/[H :nhyX 8c1RY_R+\DÐ;{2xduT,.EVڢq84@op'UT")F@f guU~Urq9eEخ&+e݇tdIϲUDƟ"j|ҔJ1PJ0&4ClBRLI ICqlvha`&aC34"2${ڻ~wO08 D(\Bc#t䆖=ջuX7u-ˋ =b e VK,4UFԻT:Rt* GPH&ioV/ X6jꔖ?^;CUaj˦z.WVe'[ʊpw<-Z$ۚOh2Bod[7>1ج͜޽rgO{z~gvv!'oeN-Y'~̼:sU͜e?*h޿xϬO֡;=$Tm6uxj2?<MR1u$Ch,]Z2I˯ʴ|wFpw]}G3gD"z_Of31BcH&ja<Ԁ֠--P jJMa--)(sxareeSdZ't M9Co-YːZ\ .Cp]+zצJKP '&?g$KhO"wƩOAA $I:T7/V#SI*A,SKOݜ}|ЧcwzIPhs ~dqKfsݳ},ԗ4 RTFK~Wk5?V*/adSmĶ+OkE FȄ2.n%5I [PU^Wtukk;v쥶q2Y>Ȍ}d.;f^n?Aq; `'f1B,}a!ъ^kB8dt[f[BMk ̙D ' ~S%y'V; QZ#! 2Mox=#my'jk! 6_%*^]J%M:MBpqh60Y#`3L#7dДS5ByPW&QqFZCũC$CȄMɩ:Eܽ05-I"uҴQ>Sԛ̬|{+a\//7+웜ל:oo3:Ɂ׫\P ȟ C+g &Yj`OWt80a6:$/ Rq)k5![K8@HLMA^kRI3+ju*@|bCh6·U${o?RgzKol~YrۗSd=4”8d!n#P )ׇ3R0E^.,_Ԁ%3^LN(3-60 <ϪM畍e뵜#7Y_La1a؋ +dza#%a*ֆ z)[ְMaj@3LxW7{}xW# Sx Pukt-8P T+n׫4@@6+KU;1e*o8d8Qb$C1aXFADVX$( /M,\D6AV8+'PߘmkT T.lͯv9QI0Liz'V0M%T-Tӱ1-JvNP2m=+c: 9WM,E677F0%RT:?*\(jm=<2W2 7/]T#og3 ģ{>;EsaXBvpN*ebH~a=Xʨ*<^ʠQ贴a9;rk,?gl%\&3jWB=t[k Cf!)!PlL03 4@H1`(:6$)iPچ'٘Lj[};x^UTPB,e)jhjQGTCY&.Ok˴I$AJZ v$bD[ )Y2'=GF:\ 1H1ͣq@7m+<8=yjsw7n:I 7\\[sQ~ꛉg'n|pvS_ѵr>м0ɧ)Ti&%8' qr ؀9fWY`\ ^3)PQKaAGA ZjGBc?N%M0Ĕ1=CUR)ì(1AE E^ NyhCk<~~ w0~+/'LT=gHO~F%t=o_p3A׉YJ  YXQ!x#)g)BORWq(ͧ<)(ƺ~D tcfR4!X /J!nЙD׸!Q~ŵ- wVg =Jc"D`D`DHG1.t5|7Нe\22VYSI&$jqT<(O=^p)"9"v/DL.Ln O͏}иmec'N19_d0Z@ :Occ寋l",Kzעz6 ;ծ ?g2ܿlsRa:_PO++i4:xPu;=o/['kڐq|Ʀ'WYf-Ӻb|zދsw}zqW :K(=4qeլwZ_[bߞZcU|+3R@? (fNA,qrѠ Y3PL\K*(e6ҥAUA1dSŋ14T oTq/wZ,y,Ϭ4<ߊ?5R?, -5C+ 3ҿ̻`)FRI6*܎Ku%3'.BzT:k񢫻{Յ?iۻdtǏ-NNO.Rm{ķ/:qf\ݽC)]]S$n\GF4'RQ#B].кd+4ٝ 8&Sl%Ή?xvwt%]_ZB#|9s%p_xΎӫdg؎C'Fs֣mXg+dǯ)Q"&8dA48B ΕN19?pxF~~^pn{0*ʘfDV RSt#-EO^㿋 kыq N3r|NƸSr lҘ8Njи@N6Dl|c%ӓF_qٗɮzRt^ZT+ѳzb YCF#PE~a{+NCuͪSjNl#1+v&>>Hh?=2t%>ޱ>|sZӛ~1}տ; S%ꃣ8{G.w.IIBHzeGZF@XJ23QZT#Bdd iUhc0JZ"@Hݻ?8^w ~];wbJצο:;~&W{ TϢnwQpًKmΗxSyQ[CR4iw]/ލBnrUkL=T"=űxxT@&cO4 UWqoe^}dTR^2: FZ>pɻQP^›hŲDIDFEQ4M+tYELKZ(Y)8%*tv8GkY\q\ި^QO|="Qs# uai:l=?܎ozL:W_"[~_Th 6l۹ѱp PQ(JrZ!DJaMYwʷ10| kDuR/86FU[3b\{1zif=C$|eH#曳Ɂ ZȂ=fHPïjJ:a{-pɔ{xQcJ/I{$U kQڋĩFtIA<˅\ 4Y:kj_Y?+r0AF ƺr66'=ϐoy6h/^[?۪{iEi 7Cp6{bGXԜf5ZCb>/@? E()s}H>5rnD=~Q%H=es0:bߟjpuSeX$SBme Q[Dovܳ.\vmm$Ab B?xb;(T:յ)(3 ǒ'x&ԫzzx| n|$7 0ay GO d8_ɠ+xRw?E~Jl˘Ezc6 ?,aJKg*??$˕–eod! BZ~y _0eh* >n097ȚIk0IPYߋcJ0Q&닄Y;zDYV_@ 6mо+[fy3vʞ zD’DO*% &= (**LN nIqi֨X u'$_a`,|ÔZ @t0+5Aqv||4%ƴ L;} z 3\a&g o@ݾgeVV.Wqx:%림 4j4AH[ rR)`鰳pHuˍoOܚ.ņq+lRejacИ/jiYD)SȂ@"!^HFN;9gTVuڡJ*^דx%Hc`9>f׋BBso5Ԅ:A/gg!}Ԯv<8DL_1ծɞqV˲wLf"fW_(46%l}G  ;P(Vǭ@Xz(ۍq?p"H!ըwE?B4K3iD"iQPstIlaO/8%-J@_پ`E +eAX XzIY =c\ٖ+ w:j2U-2WU@ 醖 zw3} '?''r :~uns9kpV\pU8ݭoO^z5[R0(sY{0M75؛4n1Ǵ߫EǮ1<9,1%R.R `eU_d⦆75]vl{s[n^ Ώ=32[?]EŒ@bh`mIsT|sSg9$,՛_ƫ6 ϛkwvv]ӻ;,&bc771 @cZs QT EJ `\B,5i T)uQAEč TUz=yy{!  U6WVɵG~={Ws-7"&7CK6v9Gg9*P-Ej)M)V^HTʹAsy=P&Ed=nE]~hsvm."73ho5'Ej_-<#nD0rkfK"+_ð/P9iX̆VY6, ECm _Z-r#)47i.UaN-V$|>4)ѺhrrkҒ¿c.~Dw7c;'Pߙ)w25=:MbSf4⫙l7ecj&*_m/aK Hh =_E,Es =_7@(eJUdn#Fiα#v+{ԝXsH<(R^VE_}W:urN$ u'^;[QSkJz ҅1M* c(ipqf\D4p^ L6BA`Jf?FI,*K"f24b"|%^`w]*`UQv A<FA C'nt*@L&$ p˞]u +3M#$1`>PhU~F4 oalrH]Q9&@Wfףq]1e1NKc]8tDҳzrIK[mX?:,=][ֻя~=kOjKtϭ_qL_Wk6|W~镽+++7%jy{g2 0+<w[:χ] 0E"scp'f_l<}q^Mף;?YtG?*b+AVK$ݤ{Cxp1\1Ja=8R|Kd%[Clաf :-. ?  "4PA*ǿHW Fn9` ̫Tlݤ+d[rlNހ tV/hzV2de3sDov3ה}ھǭ̣Z~YiW{J{0.pE+Ӓ:-gJ%v!DZed5Ԡg-)Yh1Lsظ[sמʌ#7yM{n⹌wOΟ> 9%*O8 58VR|JlWj.HM%pgöw~qeۂe\\{{硕&צ03!e՛uYV;.4.ז˼ ;fiBFxOt]j~]-5}oH5M?uaBcoh^42o娱@oļ`^\b#JX&+GxKtĻBea9pԥK>**\5)?_rJjnR/N4GĶ2r޶Ui~@"99,j-.NB4ƩYT֬fQYLFF.gdSpAQT.>q sEQbV-S RmSX|C![n]~pgtm!MɲL+c K5LF 2R$vmؼ3Njۺ?'՟wwthC+fu?|]XCߦ߳>I?} _w ^&]+!~̪0P{*lKY=6/䉊N29.ⴈMcL ҭ)a!p"vb  H F؊u&h%+4]f9nr&cD)Faʹ8@';Ԏ84c+he AP,j9wgE6kdzbC Vg LN+D.O.V܄KDmEjKd\iN ;zJ[۳q]~Rj2{vgiZU%Rj`NQ4f\yjnVWN>pm)Sjqiy=Q>u"pRi&XY8y yRA P,dC(xA/vFEK"$kP2A@Kb9E8 P#JN&S%cHjq~\^ip ny-ǀ* _"94CLUh_9 |ud|콁%۽uoً7_`pŸΜ?gtQ-ipL*t,DCSň?I7zC*oĻD[e]-iźAl Prr`=zf1U1f lnǡണ0*/eWa@. CNeC@1qR|A"x Ub-A ,C 9ƀ1 j H/ 01vRbFpjv̼9ӆPD0b>b:R<86)/Mcs lZηw;l>'ěǿ~צtܟ1 7# !]JǕtM<)N RRKjAjО՚]+\7,+p*K=,q1H7WOO]'v ar0l= 6{A$xTSD=:%v` b!2$Ӱ$Ӱ`lwd}aѠug]`3߶p6մ9{Bj⟦w.0yLpn7~Hz&-R3>5i +ikKi!-m-oZ`t0E>uȯEוtD:. g➒3_c%ǣgrIމE$_\w)/"B5\FkX䙢P#)uF=^R-5>LP}MS#@`$ ۝I~ ~ i2 C3r!XtՐd>NUr-{D ;KRe2OҫX=nr8[qLOL^MΓiX4VNJΞcċțytnGSWUٷV-<]{gw^ 6l^_=/'wn+ .<|Nxbt/>%7EyG#$.P@Dɐ+uht Sa`s`p5M&e 9}1vf-,Xܰ&ŗX\/qgf3Ͼl8sĭW!8Jqҗ#Z!DqB UZ)1}(m"cVH(-J%*&v^ݝ/fг9~l6FȗP^?E*u0 /dٚg~ -b{+0"Iӓ ɶXvP`"[O|E#1̑n\6pٸo=d(zpyR{z>LzEs4dЯEe$[aUPke(fԈʂP)#dsFJ[5JUbnk5ͣvt,RQʐF$&ư)mMQ an1=H 8hF1͐;7/4*MRUK2ՐF{vcy =˫d H>ч^T͉D3?مUwN=k#)Dtz,:΢Pf}L%TfƸRV\۶e 9}Ģ[v{=cdx{6L>Nwr~ ApķUJTqT2JUoGVPq9j{6~8>*{mcyuZyۀq3䕙qiǑ?si0W:N6C3X-m8ռ>:gefWCX]VAg g[]:mOzaνx䄳"HIE4BjĻa/jjRM#&TXgϚ@@b󠩙dMgl^WjirV,@+ɉKԊRǂ Hn[tNBn+b-:NmѭO5t]1*HtA椔VL0LJ5˲oN?umlHOvŝͷݩ ]%8W&g#,⚣TtD2VkTu ; %~^<5\̴؋!܊B ˥aW6:n]DŽ su]aWb{=bWU|;,GOGJpND7;TA4S`Q &!Jer9TGD6dL duX8,i{ 1ǀ!?1)&0iC(!˂v6TTUhMJ$LP5ˇe*MO*%UnLSE}$ԭ_w~{=srTh ^;.Ha :a7?~ lă>lҵ&giwI7H7c'13\$#"rѫ-*n ,{EW>XBDׯ&#~mmހ3w}'ޕ=_v8XTY4< 0d>jd.{! ]U?Q)-/X>q]zDgU܁*ߤ뾼 ']eSK+]  Yt+зv"RZxuިYvJ=eQU#c3,?~fJ~E=}Ey Glg   Da)(<|_CJr)(?-1pKmJ ceΗN0k閖 #+E[1nPffֵ{lV[M[[[GZ-y_P1ŕympaly;av̀Um z .3:JPx?ie7 ܿX mx+`S~ά4MB'>v;|t]4Ws@~ y؟!]GG &L0a„ &L0a„ &L0ab-A&,b+L=LuiEX).)* M5u hl܂ֶm~wއHЁG:|xeE/SCy94ڪ =aYQˑl xCb-w?T/K5צ]}lN;c?ή*4<#m%zؠm6'tƠ*,6hA[A"ȠD74'Q4#P)pqCS!%E2BIPQ:?_xweԒɻ2iR2: oA5Nꑠr2z/MHaQJQZJF)L/Ič4kFW*.e2ƨCCA+KkQH^Өrr@t|,6Dx\%bdj:e&Sb:1ݱLl F9L&NJNZNQ-`SeљH㙴达=]D,]h*6?KMتD:OGĔȐРeDX@ĦFE<:NbscGڋ"wϴh ORMj_+Az[ӔuJmQ5: 9+w1r^? }=YY?_?נ8!_1 ͨ endstream endobj 2528 0 obj<>stream HV TWyEBXB$ GDL EjiD,>Q|gAbEVW֭|XEm=g={v~ JdƨUq됦G:0(7*7{KәpKt_Z˧aS4dk%t+xcanyN@r_OY: z.."-u-.H;'ZQ>«W"#͸舏q``!)]3h}t5vұo v))f'?pdٱkmnfdN X&_gqYql6K$/h7݅5\C}gVseN{>&-b֦WoFxmO[5syr܊YM {N5asPR+u'rw[a/wyd1>O$ Yfֶn*x߉UCu )y}o 6;"V~5.'/p-kK"]p6:r2^gٿuce/]WSM_P[QsSd1#9g;vg#b̄^e _bLJ77/::p^Pˎ=(*|5dt?) ح wэS2y!I%m}Na3-mn*REOJoF>n3^ٸh}{,ί$)gջ *kG);GG9}[ynM뢎Lryn9[9|?$n؎i< j[sQq:MqzҶΈynT%6@294\alj{YokQBrꯏP0&P&ap#Ttn%`rh􄕂 yJB1yJ2bPpHXHXfcb1F|dH!C4LR*"BBdK%L^K51L.&br 4ZPF`0 Aiѐ dB́ةjse{`*NQѤY9 ] e"Y+Gټ5Udc9gX,Tur欿_wkyj*' ~mߨB/vҧzF-G߻wbZ}~[fjTpwVW6~˥sr|uEn0wnx~ ;foJͶ3#mE7B蛣u=%[|~r3[[LۋEvy8Q_rǹdޠVSpaal)3ݝԝ{' Ϻ(Z7xvm0ltl `BՙyXY#eؼR꿝PW49GmPH6 }b .;c̗;mW PDcJP6,0DUb\8LRT&ŢWߝ*VkjMJS'+IbLimTSGv&$ h  E(@JM<'@vZxs~mV-+vԣG=׮nzJ5{Kv73c;wܙ?^k !2i)@Ao)FcGdr `kѻBi=6f6U)]2ByԻњ9q Y> ltYB_d~Z/0Ӽt4/@"0^K|I#5Ve YyYٴ10Ҵ['w_p:4TZز򱱸҂ª^ft&8%+@evqP[D؉:`JltY5gF}TmVxlǬ{uKT+[pt(v~!H4<_')KG ac+xϼĩg+GnBTWJ&8 Ͼ._2LlߘwR۪XYtiq[wVkV޳woNX}x`KCV\cQAf Zg=G]l<ƞ?o{˅p^C>'>,]B=gfյIKÃVR*LKW.? w;E -'^}1ITcA*X(kNTrѨ*SB P5"|hmp9C.|Z}~My'{-'Xz􌼣n ,Ş6MJ㢫G/ۛu]_lY,xeM]ܼ;?%9%&p)@\ys͝~x[4}纛kwՊn`dW|U$zpkAo^ʇ4WymSP또(#FGdjRɪS?5}g{qƒQg|=6Zwf{71xcco^URtc׊9] ;s#| B|]6y9Px_Y0D 7u~1Ħ' ǃ(dRrWSŽ '|oB"DofBku EX  ֡Q% e"bH G1V@hKWԋ"Q"C !-s[Vr>t]9wrAUԟ*8ox62HD\]!*p D?h%j%OCǍ ݀wpFj[mlBqZ}3t/`-Ef\oBԆvPqXw 8SB`O7 z 2Sg̚R&%HPL?5.6"'&?%11<,4$8H:a|`DBY I9N BX"nSy*d#2$Ԥ`5x[<1ERvKcX3@C;?pF`4W6+4'dkB Bf})֏d3m,j# }L{Xedm16:O,]aIsZABP72t; +~qyOCOA 6Fd)aJCf-4ʹbD MBPFW͇D$Hp2k7g"6;ok;o?6&S.#2[|i;dZdS[<$yUmk0SmM-s02 -(`RE3 CӸƞ4>~ R)V+% b{YC>B!5Vѐ2n$$ei+̪7TMj-Z\h /'8aq+ G`7M,7lφPf2+e'*W0 HV`EO6BH pg$s  0dO"xiӦ@?"ԃ9(-@(F&z6X{LE$h៣\2F\z/) l;of'9'^e\cH`)kN4)f7x qpUܯ#4kڮ]UHL8& V͹Fz0-Uɇg.h7 ߊJ'/40tpN A:k5(~11[NsPε⸚&+VӒ>ΨEku^iXs2wlժ/1ցq˱1q1bH,yf_ٹuˢZLaƲm9-9n,~Zhͷ~]I?pYRj ]Kj82Zv唽̻/+;ЛiL0ׅ{^x>l~ڥ &{d1bz+7tA ~7S|YNWZ d)F -q>JpNzbO{e=EK9Q6gi \q0uƵwI]"M =4 ùׯ?Rwn6a3y{3{ :9ȶ\Qeƽ͘Bs6pJJQn'3OR5?&/}|cWCc>tzl1:hB5?6Sslmk5j/AZ6AW` tx fsNti$a\nj_"L3Vnvm|&$2!:D:*Ey9N%3m>TGCED2}O2PhG@P\[f(R~XUj )_'Y!*uT|9_v{gpo%u*(r{tvy]N+>w F}wkNnthߝ֑-Vw-z-~TMu tY{pC'8AWo WYƛ1qAL8 \c\hq\8 ~8x+ڢxApc c D-#[Ms;.l0AS*ΆlY܆FPu[[r]++(ui\rEK]s^ g~}^QN\)˟r{r3YY9Y324%+j?fҾiW6&y&{WݐúA+u.$Z_% ^kq8Ami\sզс!%n>_5^3[ɏ'4D}qJ[SIzl I䥵zy R-n^?B"1Q<1WU* ;X{_-2zW"bD^V lD^|XNOޭZB™*YX - ʷm6 Q-?\;@K3v|[Nt8f'RLt 5Gj~̲D8ܪ4&K$WɒPaa\xWu1{fSeuCW6ɏ#;aGOXT*!2dƪ~\=%r:ιyȲXʮHJ̊ *ib`m&68Q43Q3F2ĩNdюZ,{>.&Ӏ4g%F=ft͋JbH;5er )f$e5s Ⱗ"˗#^3OB,~7+RS</7+_onH>Pޱg];k5g>s7훸w+; (05''Z" )ܢq*q\AzSmiy4W@PgצҹS7J>d416N;k|G @qj'[Tvjo ƨtgma/D"r!k \,9o93z;vYoi^Uݜ9W/-!߅'/oڸߵnTxUSSf!)N{p$,){OG ]qGܿrO;aANgjs_$ RqqNQasψz<μH)AȈJRHT$u. : si2%Ia/'u~*1o)YTȖ3yT3' śrq !`-pU݃0܃=]_pơ\8TO7=eil-+'/mzeiJZܳhes<k`|O0jzh<@*Qܴ@ P7tD"228!LF@!ٓK .3!9ˆ4 |yw2ɞd uhW_U{it:~E*#ˑ-Y\T)q>J6 ; Ytc l6GN@:b&VfyZN aZdcZP'eZ=Ykr?H6Զw5tCXh_wX=vu>0~x_bS\XchQA $$! K4`"?ާ߈ӵBRhE>w@NZM8 R^D.5:^?9Й'ˆe3cf=+E$"9?}[s^)$RkacV˵)GAl{>k;/KJ{*R:lmDlxܳIaZjm?>p-uugoXs]scEʳ}^>Ql/B~bjk_*h -f0SF <qi_~Ȅ5=1`DJg/UUuFw}d$lذ#B,? XMP#"L1Xv6 $P-T@B k)vZaH}Apݗd޻=|OtyJC, GD;Ej}XW:CX߃0;|A@vOxʥ+Ԇ/fêϪ [7ecm?oњco\ un'.<7v~4g>-ۈM30/,U+fjTVhi B:+Fz;>{L&%&^ٱF-ev{hE1i*t2)?USPԠ[Mp 7O6Ya?(.E_ugt]U#_ pCp8YNy6&DK(6@(P\ Ku4'f6)&5f( Z:B &!Kg;ყoE%l`5UԆAɦs~ >̙>#SgۯА5)=2}PSJRs) )DaG סG&(rLJHB:8&)&$9^3gZ1o4.GjhP k#7o߽ \ME?Ġ_.~0c_=~BdD@wrPMF-2Բ7`ZRJ px_< mu˞_"$ۥoOȬ3y$ηLk[y61s$ 6ۃ,$ |V5}vB1%Hfh, %"Ȕb~!,3v x Iu] a.l\)mN>wR w@᠇W>M>ɵ/Z C|*L#=' ?QXyCSa<5,<9<,64 39ҳAs~:@+H,[4ac&F^9A.odc Թ96 bı{+Mb.TŢX z- ꣾH}z䩬oo V@π x؛YYm /оҬj~cL 4&@AxN9g.!yPnz,MQu|SdAH*E@V5r8H[!bS4PUX_V%  7[?=l|,G\X_Fs`82:>O^(KGn -ʌ-3XΘ(h"Do00G[5k-Ӻ*,$2œ@T;zK Q apKe/r`;Ir\#ES,NginlW P]noݽ=NN~ފ( DAD3&Imm:ZLdHN6NI3NT::i䖾N3r~ >71H4ȏrKQP&0ABRbSMN<^D(1MD&~{gj I`ᚸ>`N9)aĄH8, ,D4B #Tv:Z񔮃*W{5boY!3^۽ՕAl.ȣd{~+ HiXVՕkj[ Pq+W޸sj]sQu㖣̥Kuvz32sV֮v:O;i\NW^QEU_=/'ƻQM\db‚h%g5<A`덲Mr/s\;("eHIKzI ~AZ A{.4+Q1o{nZZ`[}uˎ`UiOh-un`^ X; ji)؍""rJTu*=*ȴZLԎ¼oA ZE<5aGɤ|5vw3/^G qi[udg/^Л1pɲO%ˌCEjg0&HdN"%GA2AǓpbI6$FP 0F1KcP^(HE!~#f\ 7T6u߉}m޳f.*@5DJQU41]Gn#XU {։o@r0[U V#MVJE#cav0ܳ "OUY! zVa!ezUH#*'-VsyVmm@ۈv&5xͣ+;[>"-׾$zuuX?%P e լE]"j4Q3†AęY a8L76kK'h~B0d!yuɅ+A)!çdŸf `:6O|21O%Z*Ir(D5lWMm.T6 +AلJI*PrRMdBGΟ!&J\@IrhjA%PtLy.!l '&g/8frc#WglQZ+N35m,/oi8p :ꂌgB.K|yiƿBL̓5U.^ؒU]=/;):q I1A(`{5>Οq 15S;ԁ8bچ3wT%NkTUIhRBii4RۄJREP$YJШj?}3wv\UUR>ۙ{ohpp+i#ޢXgaxVh*y㬍QXJ\FrȊY9L[ZCf4t1aE-c[L p6HiDXrh[K[yIE+9O^zq8T5lX| vO: >[`iYWTf˞lYu/\Kmr#{ːp cy!B0]1w`NҀ4\i<9b5 :L^Gc6 ;{˷,>>: L/xC8o6?%^#TEx Vb~0dV?w,j9מB"!JN{-gs\ O$ o.j/##RCjUQ[X}-BFќj**JaM7PM(=lASBr\hkD'TT W@ .eDЉRh8Scz>:Z33s K~n$K*zA'[6{ !|$9u;뗜n o_O?-CM%EM}*+:}YiAYUqk\>QCc"_nq4u{Y$>B!Ř0ڹD8yNQ"X2Qfwffr8{>pۨ+%rWg{SKՎ3V`ŸG~$kG~jDhxԍ*]"UAEz0RxUP( ɦ |ntd* `VHhpu})÷;e~~6G@zY(å+$iL:=dK~J~G(TUW;o hs6J#i\ptK'NY7d^/|oe||)`D x]Kv"*0,[;^j@AahEdF-CeU5Pb}u>S:;ްsM[h}`Kۃ[|۶?y},35ai4 l80ek`-m>J9/K..E/HN[?&_ tM".'s< =)/z=NjD9^F> 47ؽv>z♸՝Nٽ}kk_ڔܝ %P2Vu]]u9>j+N[D:ڗΔ#ꐪYl!nys[6YI&fs9]vaKH!f1Ө5_u{?度Q6;،ڴ@#=y6"l8rX%_yTQEJX}$h#wx s[Nzky#)|5f#? endstream endobj 2529 0 obj<>stream HV TSWYD6`PT^@P@!eH݆$\_pe%Z0.+xipQe̳@`*N!nb%R1ܿ?`i4PEiV%p[Q #~tHjLVJP&+Պ1 E qEJñQMFb4acԹ3 ѫ,Tԯ \geOJmӳ,.KHxSɫt͞8"nY_ ʅ9Fۂ(\uQ~IbĊ".;4Ɠ[LJxbYip0{/Jzio5X\TusTWŕ>$2Y{;6̚|q^vo~-]b6׉ٜȴVuZq|;mu4)=LgVbh꛾_9ky?mBRaJ}LW ڜdo?7=Sb $;E(coO^ҵ+j-~y|K.>mfuhߧ~ũIgGk4޺%nN*lZKc=^, uvL51T<slD{`2=sk,vg 66/3fJߜLڟ!'fܦ7jMPEREZ t&#im$Jr46Ra/J#"#'cƴ8 i"oWTT$)D$2 si[q<]EAج+xDL׵$Y@rt,6Od1H PnҒ$0Ũ$0C5sp)sfJ*Vs͓{wc³f23 oeբ8?v<wc[>"!3 EK޴<ƍ \n=kkΏI͊sv34+6J럴/{yL)(gwXJb<ښ>cY$}ۍ;P`ӍOݳ^ ?oŕsy['v|{ʧ?f?mwL?2'{sB\|98Ƨ_lS+hasMtLrb\#*wv#$3Lu߽{뻷xRWDh4F!N0YAO(j ~hbшŲ ^19JxY65*ZV=^aTR&8KqOEK822PĨ[GITDQHLdHBU1e )e&iJ-A R&*E"MH*LLxLfiӸ_R1ud\LM:#RҒԝ ̘ d\&rk9ZNN*46&&ewf`>;Ô3 j S/MwzԴqc%ْbq1gP&'e/eČxpXU~p~ xv&NJSxX!Cu sLMىk ŧb.SUXs1{'u 47r+ݚwO/XekaC'h|~ȗS˳Xߪ8jd>h=&+;EzWly=m~=͌HSB߂-*,- +(0Re8aК3 `[)cw, gOmG<ǐcm8H5[8lx5\BK'VMT< &= xdHbo/O'Fzps8?6iA?֦'[,L׍HcGrOXE GQ:u|I_3 5Shujuk|xx.yw0K5N m&%8$$<pB֠R6 J7dZWvn,2M׆u4珪զLJZu `|B6};|7FFlBV3R$uL6 /hX"nC{x#K-`6ίP@hzBHEi N))UVF6RK]=VGg4 bUhcv[dr 5c,W:a*kGRb|ƢlҪʌ֨5!#hk,؉Ts1I5L~Uc 6psTچbJ}@Ε^3=5\gMJm>H%l$F̀gƺ#CF#U)Eyp;3&595X("o{ X5-zk)/&>0OzW3z4Wl^rwOWUEr   w. =!ۏVUZ~a2bQlJPȄ +͵ )28d$qzoQ)_]rOxjK,7ýq$FHizi#Z֕<+'c&$Y2dMx+c'Mk&Spq)c~g5 ,o|Vu랆Sb9MZۣވ s]}sΥ;xISgS^q9Z"K_SCBkZI}ԩDU%bO}T`V%A!kD,mT@ vM!Z+qhA҉*IڤM۟#T=?vW! CA 8l>Iu7zӊi67T(. ?~<9@ 4Kij>E;fzPe S'O#1;Se[~ώOl?/BLڷgYil1HأA W܇I1W#']qL/Jg[g(8zP Q%?X|qmZ`O &Z0VчW|;Aqm|6`}zvwI$\wbŀq zO9 <x]̗2"Lw8 Mb.YOAl;1q ;T\%?X9qv8q$8p."菳_32bߐrZAj`9c?I6WNڷfpx1/vN"sloAs0.pnΖ3OJ2gK8/JmԪy2Wrm;G::k?Kp\o|FR-prڝ{\|چx`<5Ww=k}!{\iOcx1̱̻|տwԗ);B*p=BOzWxCG_pϫ@}9귩C!jnZӠr:9ԪԬLA#=?F{Vi Kx&d?>YgN1w63z \1_v}iT>jrWG^/y}ž6OnK2w 0:j/@qɥh[r-C,mcŽ=hM#Y~ֺ a\{ |vDwX_l- ubztb܅Znm:~7b(]Wpo=ڎ׏hG}o.=)Y"|{&ڤ/} ͍d_(of"Cyv07*p$y$ k8߆7gۯ5QJqNG߰f`<3rFyjЗ{YW J +,WVH"}=,N=>?Sx?}mZc=BOw=>z|Soxa^+B*Έt?]5z5@#/~|J/Pcص1!k˜n NuL]6gDq`a+^_$C^ߕlu~a6Ӱwxphc8>좼ҏq舣ͣ1xBށU* d`|@VpZ *Wsg^@;x8 xPɏШȎ^6Q5}6=-ڿ_Oeꃛ8Kuwt'KX'YXl ,+6P1(.c[B$q8I(t8!?2 NN=ЙhCv\2СI}3mi淿޽}owoOڌ2sK̀s\EI1ph6PRpO7\Ǧ6͕VBC!CDәlf!s=C dfeC&yL͍֤i@SeL{-Jlj!u=u+ez 6 H H00K `l7`4 ` ܜ. ]xOG7iy]VaW(sA#իO$F]A6X"\{ NIIҩP'Q'N&h j' _df/f/〃1`$~Gu: T]'NNF(H | p[wDNқb`Η|WU&k&& ~IcCLI0kRͺ5ke YfȲ,XEŲ C(6BvR(PlWԎEduFM1l:i89Ѯ Ywf N\Y4qE/&Rw/8*̹/3'(X'Қ( ΋xn (AqKۤu3 J\`Q4/&#zIF%=g dNfhj7nT`4ly @,B 7.v%{r}ѕ[3].>Аȍ&rU </ dڊ̻Y=E  gjC ݖIz-En҅,{0fk6z'钓ķ ?l>߿Oc|<␭bY(CsܽЁ;06Iv_@VEEUqW?p/n\/ |>>sbǎqH|q@_BHI 4f "D(e@DPPG2Bk5QMS5 4u*;i|>>/NuxWpz#U;j7VhWW}m+@{oہ5o,=ֿuzCp1AWvŜE!; H:B\:&A5 O5ޑ5$@(-lWj@L9+Ju+0,h˜bCO1c-< #V{\$+t̳>ُY*ru . /ʹ[c(X-ō %{ٴoOew+1:J?UwCOm;HD?Fbu:uVN0Wp~QY=E8-~',8&R=493m) +%N/җWF6Fk 5kJC\&ads3)(hwyw#gR6қ)Y7=1b5X8r'wj_U #Dh̀=Rgc[Q8ݷG+4, C($!H$%̬wn!3= )x}Ut@-hJjIRIijP_LqSw lZm(cq&K˦ VU,xJ*:1V8*oSebr&Jӣmȋv\W}[(5f"6w;J%Ң jj4h`ꄺ(׽YwoR60{x: QQc_',u~?_-+c$yLȌK;f ,䷐( f WrN1sK#xMtrK8Dw&|Ys}=]mX], ~qe=Eȡg]:ӏ И4ͷeN++lLX7#o't&t|4o\!gΜ9L<3dVf_ W )`%#˹ Z\Pd9/@iB;|V0W+E'57ƩuQlGZxD(oUᩨ*I Sa]<xkfcy܇_؎$v0vJ'7uBhN&0MBB4]RMUijAѩMhidZWjY4 9UW>+ݣ} ݬM>pޟ!1<3_\C5aj,NZ?Ǧjܰ%C <i*~S\@U_:1aĸ}r;bxQ񸈀ަX4DMDZ=25djj3>DXmw]<\!Pb*0:_2ӊj~%{G;l6M%:ۊyu }񈤱'◣- ZV[ fsz_ ?"XJ+I+&O2 DP5%:w]{H[Gu cI'^g̩88aӹ:JNFnQߢR[DP,Eab3{wQjrԽHnCïQ*BZWW2Yޱ DEuo~p:#}RRWYRn6VgՆҪO'<]7쉬zϿކHD$qg5/#{4x`pjgRlwG! X A`rb<fu"Jҽ:mDO=C=Hg:,sgzut,wřLq42RU&!(,~8ңi3*B!ІV E[~j(]&C-59oFVoܺ%pvAo!5~]7O* oJp.fȊ b^AlR󠤇@/z HwGzM4aZ7BU-%6Z*Nw*PL7" +,gV҉ ]^tЍ?(6M/$G"JCUC RSIjm T0ؘ lmN&Ipsݛ&e (Y$U6t:̵ ZN3_1C  3-Il!Rڲn> 6+dӸ.28kogG\V,A8ɛ3|޲3ڤ6m87o\ޔ^% Es-UŊ+5y{>sypպ]Y׏]71=>?Ύ?رI H zIh @UuF vc -J: ֍mEVJivh&ipC}}^S5DN6buq`b@ԭ鬪A]! 7(.:Hu)D,`(a݄`N4NβTJ5xѡz=rk]وik4嗓ǟ9*(0J-;J~rV%mߩUT\B=(7qF6-8#L5lD܆?ès_`/7MB˂2BcYa*X=p1^",# c@)ϰL8SWVbwxOq/IjH { d*Jl~wݨ5h~#KUh[~rjJ!.ARsߺA,d,F jzP=^]RY.mLHs0㝌GP<` n12aClDVW](O]`QQtZXX!5XT/v[}c:2GfՠO|0X9+!TF?ޜ>B7:c; hY N=im>)QbXԦF.mDdW՝xlzn}QPGT[9`sߺ6i_1>C"06S"񯢼zVG9`t;#VV?a|?%ƪZu0^3SC"iML7D fڒ >&]}Mj+%K$[^Cե6`] KıbՍɞS}<۞K]TeSJndS_8tp.M᱗,fS53fK+h>Lܼum'zX~Q>3//]2fwe2dWNWF>]}wv'<Ғ@-Rhgps>'Gsr8;p$+ ]k6 "cYtlp6@~dh^äuC:-,V(|2.b<|6?jyq=$4'&@`6jN{LyL8T$ *S1XMDqb%\޲ԫ G>ezG煋6dxKa 喝c/Kn73`Y"hW4=ӹhsR xS;89NшvMiȹuN|?.U>/HÀ2 _Ìa6oچ&н!?CCZ_ItT}P0ohn 3k]Ǵ)fSO&O>>˯W%X\~Nއŵ #D2ŅeKU,aua*`%r rHp Ǒ ƬG{]~HaDqLHG;WFRiB@b Z#3g7n{KSv#1 jaC-|JF-U fs,b̈8\ɚok:E#Y2>hoCXqzNf&C}U7s@q"/2h4K1`Z le1eX`ĚJƤ3-H F8%#$ŖώP*8S嶕;(D#hl/M3&ØRs直]m==zz螞BIMwK0ƈ~V;Dn [[flx5ޚmJW~np!k6Lg9tLvƕE/[NN @i_W N,** R=r ˂dtP@ c-{6;>pg͑^3c%ih *\FWd4¼z7>-Se<x&PQ"D H/_rr$ * )mmggpONYz=w߽| g;! NfPڵA# BZ1K7R6V:Jh)lI@[MT:iHC*jZ-~æy%[T;8 t6d;h Eu֛f$2xuurܿPA2{3S6:@F:uKU{};m߫-}7@ΖVc̮C&fLX~d13+"袏ŬFFVupltb/ݨ(*X +n e;^Ggˑ'0C o~oGoG_^/T;Y*_oH^ Єđ'd׾ gW9)}lnް5׎w[0h ~ a:9*j/{ HuT(N$>u {]zcܭDh*kWd$)0,B:ӣa.Y"~X,K,kEW)ۚxӁ@M}aVBBlsI{|"#1/=Zx!ӕ\28͕ ai\Y{*TD$9DíTEnK)(ep\ҜVx#v"R$!Ԏz)GA8X@^>r$EU_y"S'vCx?{B|o*"3b7yDI9.,yI"@Z,fl&8¬7[2ӃGΧxC]dy1_yR`AR$w xvu"5MY!ZD4GܠKkp醸) T7\<ęHL;P7QLؘ[U7Yt$QYPry~N?+B9%K6цrnoQWD2@:>^LKӵD0P@S%:9pPL*h)8ڬVP#-ҭpfU)!->1u O .xT-*Gyƒ^I@g{y4$HT`0ډp ¾b3GѮhy|* !vDJ8߸XW\X` \z;Cܡ3ȧے 2`ַ}DJyb+}@NX2Kdt]vڝbxP吔,~*ѓUSDJ%CW#`!h Tbbܚ[%5LY[cq@ K< _$jҨs۶~%i1{[v5L‰†oP)'mv+xTѽN7bRqV !aV r.ڿY#y=w={܇G;x߬gg3b(UQ=S&Ie2LL<9+•w96Tuډߘ ؎)Ljcb{1aiDѡ.fEˊS#Ӭ81Xi$*pw%(n-cށd_9Oo}d匞!2˴N6#aQm[Qcܘ1 0])*KMH=u7S(1&dfD2%XVkSV^d'ZGSѶ+;u )Z[׽y:Z;/=VOwwG3> ?$C:K|~W2"^sKOdĺfI 9N@ԔH EH Zٷz+Ƿ+pAIUoo} L8]am/O]5[ۜڱݍ="kKZߎ8<=/tE3Y|z}` \ d1δxa9#Υedo<# ='VkCTjv ]hpB7Ց:8G$ /0m1KfE"Oƒ$p&;0eV )5w ؈LǑ]Fw8[=YXCWχU(fXhxXTd=OTgT.l/Yֽ$5_B(V+As[}|ո |crh.wO*GД]SNV@Sߒ@ĜّeIF\gy#&{'RRH4X**O, my<-1pyC2T.ߧ]Hc'1dB $)P5[܁mma[9\)ql Alw}$Wjdit[b9p0fyWN&Q/@ 13O4Sq&1AAɊȲ$B]DK]ERT!ETUBJİc3$QazAyTcEuqQלr@Ęŧ0%{͡]Baf?c]'y2]X&9}PN{Ey/{֨dVY5h܀!y'VU Cx@5ܲP(X*ASR0j$_M57x0`  hTKp-⨼Y@6`%mテ@IZ+1[9p}gl8GKO_"$ih/:.}ZGՉEiLZZhXwE-oEr&#:SO&3rΌZЭX4ũ9ι(;J I?9z#kx'Sռvc5^z+zo#AZJ)839ٽ&Nm?lN0u7KZkjm?˟S?bl]kz*|]y5@%: ǣ؀n|щv|j`܄vM{m njqlӦت1BԋIxA*9 ֆY)v6DB%HgŸ8 غEimH>/q|!!6I;c@peY[BE yQZ*% QUL" EKTӦ*Z&?6M*ҦNdcj+w>?Ⱥ~?Ơj$I<#q1Rl_u(ø8ghH[EVe=p2 iJя[u%aM#=숈.osֈkS`L*{#i豝 :9Ӷ8*3cb-LYxC?xIEg/faUdZ#xdً :Fˏ[BUU!=Ejm̊2EQ.(+2ݷC]&"xZF8cL^! q8ڢPqx5ڒOqi!j|+CH QUOcL&y/ nVAp VT,L]<)z:/*b,B@K }lhf_"u"'׾?Ep#r+Z εӿbpII2,+m^=Dv+ )T?b<: ן>Խ{yli~νZ,Ņc9UssJgR| p!]RRv{ 5F&- QxM{]{ߗ }p9Tb%P*^W/?Lj":=b8:yNeЛD8NI'.&fN5ޙso>fscRz +)VF;]yyQ&аP̯&E\SؿtG7*6 k5M#<3lV[J@`MBf,rT2 aX^~ި'iIA)Npi#S9аB-&ݱMr&` Q YLY|)ʬѵoWr#c 8F^nw)@=,K&vۼf!HQwe4~}붝aW97eJ)(Z4]U%֔{0U[+$@( G7?x ,F=I,-2xC Xkm_? Ss@_<* ja)6g'ƺo ʁ۷maVu2JH:~+#rU7 ̒G!XU)B(0&rD.-3Nei*h0F,tԤv {0f44iv|} sԇ3;gf(&c<L] EUޯ>iZJۣvU'jj(L0Idx25y{$=lYχ@W1TTE|K=D=M1pXvw:U:Gd:ï:{V (Z+)^QGp2sK {0 ZUX1[ǻ ja*RFb(˲xҒ.MjGJusHìnxf;(`:(籅ӗG^•_H\Jv헚v&G<'u:Y@QFfZ ]5( P-˹D1 0+lG`qAq "0Y9N4{I\ɜ@@B Eo[bn˚h8## POSUC+ m'Nl eg;5@1ݿSXF:=.c0rX9B<:Jgg=sﵯ;~ƹ׎!I%^ LBk݀n]WJnFW1E4u5cҲlĠx4U*GEC:$;:+Ǿ"Sӟ%,beא/o_bBg7Xhݖo 3qbT eOd.doeg5sY,n;O}=}M &ࡃ%WGK=>MŌNR}U~5Gf0RL)B/dH/T/r9LV\qPZD-߈$ۜ\"סt8r. Fq> ;MY㬞ߟքkrj 6w kt߱›F,j G~^C  3 "'֊ f 4,d,W#}{Sxt]+,zB[vN@z/k`)Lέr80 lS|^ 뽯-MJTҿ$ͤoeARrK^VVtMWສ߆Dz&%ql',D|Ƴ"ê4 68O[{ ZA-Ewe ҇Q˹ө[M /Z0 xoI1qmٳ{,șy@#Fՠ@Fyre?堮..w\k}؁ζyρ:N%QjԾԱ؅K--ۯwfnCKOM|BI {)0 B\7\.drAi穠"yH O˧eJ{Dک{]22 oTf>RꄝD(&_!oe+XV6䶐Q,mI0E"pJAtc&i6)ճjSW*m58Sk'7SқϟsP u-s};C-y,j9 d+$+5lI-lꃑc5}n_պsGEI@cO97E2v/V<~ ]f@ ȃʦFhʅQe\xG|(GdX\HL jG{+Q Ȇp< v77\iqV{Wf̬ QT,$ H&"Ԇ$ q_fM8QTh)T9*^3ƍh—Ϝt|hkD3Wv{>X Gt.|g οEe'JR\g( ~[Z!X?9t ]pP/U6Vv.JZ pJ)@¤@  WTp9= _mPT{p/M=)VI+FX^5ΌO^oپI++7r륹;z Y M}م4OCdA+Rzn3H5!oH/I3s+%)JPG~]qρ޺Yh9Qa_AF7{FdrBS#Y#?m+՗}ž`4[-%J߱(Dٮ4.6de M)2HɄ-ϪA G`)Z1ztqWgMpY[N X៽P7c{^^.u{tioMѼNo ֝kֺ",,j4Cy|~LE4l7釕]PՀ >V2m6xGxێ ENB/(@'Ѵ+"`f̘ Ëhb"_U63ļ'(nQbPl2v3RbXcǴGa|!g`D͘Oaw*J+ZjW>{2*+b7h8jVp UˮP xR ~֦XF>ԕo;zƪ}ͅտ'ҫZK#j(>^?ey{g/gy9clcc 67> !pbbRd,T}#˺tifZ/bݺD{2M!&eZV&II&+#e=4՝}g/>߽@huX4nԵ饖#JU8؇?S*A uQdg$ӶZTWtL1?+}tpj:=J";GNR XĎL:~C{̫Pȵ[ D`& 0T .ܓCPkwѤ,nl6fj|)[XPAM&N($46Ujl"_JMX_6/I4ą}3A ڢ F->`dǫ9FNk昄g@:{, rվsI;T7~H`o+`RZ =YN P@AcR!,TġD/fmr)-̶Dm*|H#Dٰ}W2[7*XVA|w +r 0zmh׾ǜq[Muvמ3 C`ê} hά>w~=xNY;m8?uF[]>ݧi9x{UcJ[-"ƺ~mv` _I6-zS]/W_|R4`l q}>/P'k[[Cu_?{t$4NG8vҦlt657r5[ -?.OU~ A$ADwB< .!'9?Dm%TtMz߫"P"٦($TkdhEÄudU.~#]ɛF9/2($LnbI ;v&"%5mpv0t.ާGZ!3ZDws]mCof {; ixJ;ZDuƑ_㬠Jв@ѯnjip9k_O̶Kǟ;Z:NT1F1 Ꮈݔ j&YhX5TSZ*Nݐo朷( t0 `](wl8FߐU?YV>7& q]Wp[69fDU풱Qqvu]WѺ(4O^ JHPz]o£0Ly*T<_it<4{y!"X ΂Q Y%T}~%bO( z{F0'C}Vi:9ί/ NQv\u hC͝uOYfJȠAh~y Y(N]ZFoDF=pqflȑ@= X!!(X% (в†)XJ!^4ϘߥYlSߠa>C>h븟LTx:fކk;nj[GJ;鼖z4!0_[s~&''9N:}45Al*C!R g^BTAGTe͹s\_yao 0 x$uڬ/2Y]- 7%%7h%,$aZ旝ey9Z^pW1]Ed"X!й[]#,P̳r_ cAy3b$&@ eTIdz**2ltujÄIbh]o&ެ[K~f4L}maa= ;_؎mC8&v& 5C&)54DpPJMIEemAkizъB2V@NRueh99E>UAVXJĆAMF˛7Je+GoJޭ ,G`fu.bRX&zxl^^r+-mm2,tcɴ^, v3Ф0> R)e,ҳDo ȔuP{N*-}|&t6D(JzNyfdXYe&d]C 3hg5.uj}W88P ~4-TM{h97wZ-qr!DG%+$JWbg#΋08FJ!hhIwH%8r^ A5Y?ݴKZ^CYNћ ޗ%?_V$xw6_uuc~j7Ĕ^Љ@<-q 1ʷog3itBpNO;r70>uXԑpSyQf<<e\9L)_*|T:>. J`CKޝ]' ohz!h6ڢ-g# R.e@HM] ųZxJmEF^dr#~v+hgňMRi9yCeӁOCsVl~]B7;tĢwUUBº{e_}¢8? &c4_ f78?gWٖ̲ۑuѴ܆˙%#aGڞw ؝*)FKM~!(r@geD4Fǣh(g3A4RA]XypT Q`tXI0oY!mJW  [_c!c򂦏\eF 7{ -w`PCNuHdB%U7X\G]<%M{R/Y%$}>Gqql'nΎĉ}&i.ӺiIܴMV4[4 ¨P;M  3R5$XP!2Tg<'Gˈ5q#ZTUx<3qHzM}$.8l[q,ہ́1).;*| 0iltw&̳"1'}&Om8 hwm]dMfӨcf͸}NA]h7EZww"wcw,w; (޵]E-NQ%L@5bX'=dN:[Ab6$Cxg'ιSJ*ڝS <棵(9-GQ2z#4G@e9:Qx<8Bd6mw;<xfvfq]7, 1U zTrܮ@j9lԩ^ov(vf"ƿچ^I充"V!;ZgHO2}͝Ѯ\vv˝<GvB'7xbB=,Q :YThCmű ?mӑ] +ulm6b޸^JƉ/ m?ՐHDsL.4 q &\ÉSI#ǜ5lG|_/r.Oxh@L )'󀦀"6~glS2>X7lCiY$(6;ZPukUSF{Z[lӆ6 '5nj5Y)ZT|jdB7)c]=<.w+46 {;XOOЉYYaDŘz4 (&WG?Rv |i\yw=x"vpD9cXK,Z=e2[,9t"۠x2TŤ S2I2ro8Z9(l~ɀ+r5'_3 A%{'Lry̋n铻M(Io۪[ D@!߀Ê 0!ƅnmi;\3&}Ma P{PG07lH'ki-rv fu)ueُVgR{'r! Z3dAVXYJȉ\R!#ϚPuJ*TGղ2U.\#}Z((B"3uUX>Cj\6[D{qE܋TH vxwVam}I@&KC>XYhG=唂R*oyq,%4Y`Ibs2;X͖XiI(D Ŷoz}_jaNPuD)ՉէV^aߛYs9:iSEr[pf:\6{bQWNUwON.fgft(8!ehG+ gf/ +EP,N +3`F-, BK! 8?wYzUռwfZPѻƥ~п ^ќd/?_3z~=Oߝ\'vĎc;_ή$n4IiW/I6mv ScQ 2!U AՕRMEChD%Ɨi hMIϟ9ɝ7=SU+jwUeZ+4՟-f~rfVNjcF[ҋ9<N獁a!b"B!7IϫDUg E]\k,ӛٙ99a!C2U $'\%@',BECy%0;3KvqPq EʨhU R˫lO\ӓUqႵ\npᲟV.!I:DP^w`W~}P}*{7>KDldS#aӘ " Act,MzD~p7wrOz{2*u`ќ)r "y㢨ĸOhO^نEQ4 ]}޽!㝼F -zĘGG?rQô}4.H o'1z#/G`k7J@Bx!E-fjk.FL~w෈ZhdGĸ 'ZLյ>ѝ.1_h$%2y!^9;yeB"kMw2uèpROZEo 8i޴Cś"m#vKPv36Ow(ZʱµIA )RbZF&wȨܙ tdЈsD't̵:\ztĕ9MtVky]O PU7B9򁛁:>PӰ3?e}l'e!(1Ff2]䢕w(ĦXK4OڥPATJpGZؑC;XgmIw1hhˑmNQڻJβt[4wlzYFa,߆qW9W|.5q fiǓ V 7K摰+HWdG: CMY_)ìN|bڤ4b,*UngӚ?ѓ,=rN$qps]|q!6[c(y||x*B.#-c{z/|WX/xt͹bVlRCpRHK}I2^.K7*RrR^!N2Tjf ;pu+gOIQA_>: #/r{P;v= @?6X^ V `!) oP*  @ ^w|G hj@w_H y Kez?Ж> Oc샧 <*^\ogu)\Wi$fٟ pWNObZT7Nc]~s ws ׷-la [_Dƿ>!HPATPՠJ].`gOj\`x?0DL ' `71n3eEq,qYѓG9*ZT$Pb]Ukjkh`sK+ >BGz NGΜ=_8xC׮^'/Y'Q=QzH$N4D4CͲrVjX F:Aa8 8rVبkGٹ&r=b0 k/8t !x]:T]v|E.788|zzy|FS Kcdfq=ێAГbU?A`m1S4sJS #q)6UK+8G>K+4-[3ϰf I[*O\Xx4 7 ps^┄ؐHǨ!x9dJV ZFq2z%0aeP 1puE6LhloK4)M##bJO^dm9̴Co> GR›~DZL2-]Q75\Ѥ\&-2>dŊHO+Q&Q)ߘ'vWw2CH`'*6v]_bVU/ t-魲 ] ~ endstream endobj 2530 0 obj<>stream HW TSWyYDtơz!,ZC6Z$=}@%~;wn!es\ R]8G=, 84)ڧ,@$x @b$xHD`%e&љm%I{e jedCnthZ:L! D  2CL!a5cQ| HED!osXνs8I)c. :vv֊x;no;#޿^ܭO˟3M?<*Q07ƌ,/zʴo|;e= ˚T {g9 ?}̇?;%S\UbjSYØeS7Dp ;Y 㢤~#%W9'`KQc鈼MC.},&+Kr>R][`>=ǵ+ꕇ}q.p+NwGqq]2e=F-kXsg[2Cp5Qʍs #. XP1Y렇'mB#x<ߞ512$"u;iܩ;(<d'\Į!?K( sٔݪߺ2|$꼰D_)55(4 )[MpiAWdZ]vupfMzIBeI/vU՗ ^˷s|']dcֆ3Տ릭a3:wa/$yr}N}un =`O{OR蓋wU]_6h]Ƚy%}tླྀUW8*Vsr|gisIk̚KCdώܺzܖ&;6Y8USee7KuC=כ1Z El&JgjkS0#_oh#iBޕh3wr>%F# ȐFR:(\fװmR/*2G*aZIds9Z6HR ZH a$ nZ1 "d"܍LL{X8NGQ1V > mZep?Vq@./EoG ߬"' +p@}6fby5$Y+˧$i S}=l_0!n4-;/gZMOUlnQcԫ9 cg8~~|b.EA< FN^t/5uz`Mp`#Qkܽ'^chh Ct a٪9H Y!0F0Ҍ20"!BX%1^e%î30lCD!ͤC`!IG(NobgP ߶82̌ D+ɼ|fQv!S Daԡ)/ "՚oat" %(0f(>4R#NIbbpd*A"d2[ JFN U*yPa"VȉTe"%)D*ڰTȢӈXj%LOBD(%DZ"P0F@M:k"*Uc O \!Jd*46;Uő_Uuࠢ `PxDSFPD]nDQ]@LE<`hYAW\]1!j"*07 ಻߷gUU;E.^>hHe͊%> RC$x::jg땡 l\yj՝m6:޾>^JŔE ^d.] ^JB_4} x.r{c<JKAPȴ8vGrW"*t*,FDaY bT1ڰ Uv'] $(N IpUltWRvZ=I(U2"2\~B[I.\-WKt7M/DJvKtמm-Qn nB iA F'Ѯq 4{ؤq]]PeHZ ^mɘ{)hnN6/ T U9]A^J f8-SVa_>8mH iJOa%w ՌiӗKq@V~`[JW+RGDϰOI5 75Ո^qRoϐS l Z%V&}l'⡥6_95}XBfsԬ7E9n|&׷/Y?+s˯g|ig떲8mQ#<_Oæi/T yBTBy)_x! "B(|@V+ DմzJ=Tw~+:q0] ! 5v؅%֟P:XbK\#aN7l0cS? d;45Do1 $ȹ =82Xq!EGPʑjo6CicG22 EbCėD8$U@S:Zԋ|ZN+h5OA+0c2V.묙nEr rxK>y@ '6bUGyA4 xWCpG@Tk`-J2r}ȝP_c֢4#/gHƑ;8,E?%T&y (-DA~ԟ4nzM I#3scY[.1cŬgup\,p'zy>}dD)Jtut4CT}E 1i]Bui3\|.?t&YBR/Fl41DɼI((+ 9sFI^2X tugOG0b`.XpFDgs) l6!vT6*|xfb'$78S;&}e;nfj.NRТU궸ȫEeHP,YCNUJ!~J}®VٮXs'N,b=9޹3{k{ _1%4t+, CKgҟJK /?݆%܅_`>5F of?&IT$(TAU>TIݔ=z{V{ϫDT~V90CRX+tAх\.P"BIBоH"eMƐ755!G+YRMttf9K0+Z#J ($`,v\qШ Bz*Q&E%O3C*cC1',EøaZ"n ί:t>01>wck.8rDCU+;QrC*N]-߸aDH:Mah5[]߅ꈒ.Pl9V7k,6[eWm:wg\the+* fSY3vWED̟fUI ԅ$ mZC O566%"pN1n]qAYAm2ٌw_ =3[H9f!Ь)`K>f9bYuOPAeV?<S"DёuҲ}VhY(;9x݊jg&Ċƿ/걜$5DĮ6ntO\c楓n4i^Z'K8c‚Hkm&ucO2n ʮ_3p [Aqv? hAבϣ~7c1P)D D\D_?g1~P*GtcbGe86}' +x\9t!:$g{BAߗ vF^h~A=,6H'O?jh߉ b'pi3{#!?+H O|-فQ9Q$[~x"DqWV( ?Y8AWpPc, XuȐqOk֪_eH"ˀ#]t#„awC0 9}0[hۂy(俧N1fkp_ V^X"o,wN9\ ~[xkmʽLAE:E_r6+y޾=zZyqM2❭i@9`Wl:uL tmpޝrC|PouE4#N487fYZ@<-# tHHRkRfL|YIRIhR-e6KU6˥rleYA.4E3#ZAkF'Gdhý]mӢT82G-.r$TԞB.9 4'Q:? єB 9bA%Hl'{=nKG_Mj/L'9>kW%6k3Lѵz9:35qʘ|M\ ^b 52HЋ''LJQO"5:hr^W4l ̧9p*2˞ g`DMsORu᾿nIG̑E~AifgYi?ЯGL@,+Co^LFﵙw岿)yLx{] |A_p0S){+w7Wd3sgfV-A'+IFQgFy0Q窋$a@n͋K~^zK~-.6Go G-ߨ5M&hI еYh-R\%r\R,,.,= ElX{P^0~AEa}MR嶭;ڶZپq:=*smm׵݃ޮ]ۭc-u=AeF" qc L jńHh$E#1#$w(د绿gw*S.@5?]-!!bZy鎣'hlꮫ.m oh=g^=t]d. ^s]4oT1әL,D5Z&֠'uR=QzQ&51hue`TLf C !g%1̥4jcJyFNZtJE3XErd/.bkOEP >+,Vf6g'dLs=YtZJqNpߺRDx17%~G.^^\֋OYQ5`k aOņnp2/_oǗD9XTGEݵ}J{dWu|}aiFG8Hm4Rr&P,4hPr e#ATQ}>k֋"xLXpŽ80ud1sZcјd THbF뵠̴E@V J>XV1bMއ3F6Z vAZ-P]{r .!ZRB ҇`Jt[%Wa?w oۻoۗ^I|R;|)}0.#M><1&}_2zdkwCg֣h[V>|pjZΉ6: :,SH'-~=V 1T,$H A$U@ $es֓VT4&eXhF`TfpI^hN:#$*<ų(ɦȞGhʹL 4 o4('6&;bnTWZ!N #[?Sb?%3/%DP| >i&jѾ;7͉;X!gK͏+D#e#'_ѮE<;Fr1BmS'sXx Z5 a&$ؿa l"5>ܜOrǹ$OG53LbtKzNhd\g:5&[F!WT@\C*ul:#̎x[Kc9}c:*Bh%f@q(]hPqFCPFs8 `Y'E%{ g :%[+<׫F*ˡbm)xvè2A;@oB6Ԃa73jqX_=`G}< kJ4En'^A}^cTZ&??yssrͯ-T ؔ endstream endobj 2531 0 obj<> endobj 2532 0 obj<>/FontDescriptor 2531 0 R/DW 1000>> endobj 2533 0 obj<>stream x((x((PTxx| endstream endobj 2534 0 obj<>stream HKn09B#N,˂dETe*of_6ya?f44\ozsjQ5|u((^W^8pZpaπR^tpAZ|PkB]b6ߕ!o,I0dm?5$!Nf=O6&A!Nl[ ?i&^D1ƕ }>ń EZxZ3Ԡ}EϸpGHj~#ƹ%} 7 @πntNXp+ßT9 endstream endobj 1 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 1>> endobj 2 0 obj[3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R] endobj 3 0 obj<>/Subtype/Link/A 102 0 R>> endobj 4 0 obj<>/Subtype/Link/A 103 0 R>> endobj 5 0 obj<>/Subtype/Link/A 104 0 R>> endobj 6 0 obj<>/Subtype/Link/A 105 0 R>> endobj 7 0 obj<>/Subtype/Link/A 106 0 R>> endobj 8 0 obj<>/Subtype/Link/A 107 0 R>> endobj 9 0 obj<>/Subtype/Link/A 108 0 R>> endobj 10 0 obj<>/Subtype/Link/A 109 0 R>> endobj 11 0 obj<>/Subtype/Link/A 110 0 R>> endobj 12 0 obj<>/Subtype/Link/A 111 0 R>> endobj 13 0 obj<>/Subtype/Link/A 112 0 R>> endobj 14 0 obj<>/Subtype/Link/A 113 0 R>> endobj 15 0 obj<>/Subtype/Link/A 114 0 R>> endobj 16 0 obj<>/Subtype/Link/A 115 0 R>> endobj 17 0 obj<>/Subtype/Link/A 116 0 R>> endobj 18 0 obj<>/Subtype/Link/A 117 0 R>> endobj 19 0 obj<>/Subtype/Link/A 118 0 R>> endobj 20 0 obj<>/Subtype/Link/A 119 0 R>> endobj 21 0 obj<>/Subtype/Link/A 120 0 R>> endobj 22 0 obj<>/Subtype/Link/A 121 0 R>> endobj 23 0 obj<>/Subtype/Link/A 122 0 R>> endobj 24 0 obj<>/Subtype/Link/A 123 0 R>> endobj 25 0 obj<>/Subtype/Link/A 124 0 R>> endobj 26 0 obj<>/Subtype/Link/A 125 0 R>> endobj 27 0 obj<>/Subtype/Link/A 126 0 R>> endobj 28 0 obj<>/Subtype/Link/A 127 0 R>> endobj 29 0 obj<>/Subtype/Link/A 128 0 R>> endobj 30 0 obj<>/Subtype/Link/A 129 0 R>> endobj 31 0 obj<>/Subtype/Link/A 130 0 R>> endobj 32 0 obj<>/Subtype/Link/A 131 0 R>> endobj 33 0 obj<>/Subtype/Link/A 132 0 R>> endobj 34 0 obj<>/Subtype/Link/A 133 0 R>> endobj 35 0 obj<>/Subtype/Link/A 134 0 R>> endobj 36 0 obj<>/Subtype/Link/A 135 0 R>> endobj 37 0 obj<>/Subtype/Link/A 136 0 R>> endobj 38 0 obj<>/Subtype/Link/A 137 0 R>> endobj 39 0 obj<>/Subtype/Link/A 138 0 R>> endobj 40 0 obj<>/Subtype/Link/A 139 0 R>> endobj 41 0 obj<>/Subtype/Link/A 140 0 R>> endobj 42 0 obj<>/Subtype/Link/A 141 0 R>> endobj 43 0 obj<>/Subtype/Link/A 142 0 R>> endobj 44 0 obj<>/Subtype/Link/A 143 0 R>> endobj 45 0 obj<>/Subtype/Link/A 144 0 R>> endobj 46 0 obj<>/Subtype/Link/A 145 0 R>> endobj 47 0 obj<>/Subtype/Link/A 146 0 R>> endobj 48 0 obj<>/Subtype/Link/A 147 0 R>> endobj 49 0 obj<>/Subtype/Link/A 148 0 R>> endobj 50 0 obj<>/Subtype/Link/A 149 0 R>> endobj 51 0 obj<>/Subtype/Link/A 150 0 R>> endobj 52 0 obj<>/Subtype/Link/A 151 0 R>> endobj 53 0 obj<>/Subtype/Link/A 152 0 R>> endobj 54 0 obj<>/Subtype/Link/A 153 0 R>> endobj 55 0 obj<>/Subtype/Link/A 154 0 R>> endobj 56 0 obj<>/Subtype/Link/A 155 0 R>> endobj 57 0 obj<>/Subtype/Link/A 156 0 R>> endobj 58 0 obj<>/Subtype/Link/A 157 0 R>> endobj 59 0 obj<>/Subtype/Link/A 158 0 R>> endobj 60 0 obj<>/Subtype/Link/A 159 0 R>> endobj 61 0 obj<>/Subtype/Link/A 160 0 R>> endobj 62 0 obj<>/Subtype/Link/A 161 0 R>> endobj 63 0 obj<>/Subtype/Link/A 162 0 R>> endobj 64 0 obj<>/Subtype/Link/A 163 0 R>> endobj 65 0 obj<>/Subtype/Link/A 164 0 R>> endobj 66 0 obj<>/Subtype/Link/A 165 0 R>> endobj 67 0 obj<>/Subtype/Link/A 166 0 R>> endobj 68 0 obj<>/Subtype/Link/A 167 0 R>> endobj 69 0 obj<>/Subtype/Link/A 168 0 R>> endobj 70 0 obj<>/Subtype/Link/A 169 0 R>> endobj 71 0 obj<>/Subtype/Link/A 170 0 R>> endobj 72 0 obj<>/Subtype/Link/A 171 0 R>> endobj 73 0 obj<>/Subtype/Link/A 172 0 R>> endobj 74 0 obj<>/Subtype/Link/A 173 0 R>> endobj 75 0 obj<>/Subtype/Link/A 174 0 R>> endobj 76 0 obj<>/Subtype/Link/A 175 0 R>> endobj 77 0 obj<>/Subtype/Link/A 176 0 R>> endobj 78 0 obj<>/Subtype/Link/A 177 0 R>> endobj 79 0 obj<>/Subtype/Link/A 178 0 R>> endobj 80 0 obj<>/Subtype/Link/A 179 0 R>> endobj 81 0 obj<>/Subtype/Link/A 180 0 R>> endobj 82 0 obj<>/Subtype/Link/A 181 0 R>> endobj 83 0 obj<>/Subtype/Link/A 182 0 R>> endobj 84 0 obj<>/Subtype/Link/A 183 0 R>> endobj 85 0 obj<>/Subtype/Link/A 184 0 R>> endobj 86 0 obj<>/Subtype/Link/A 185 0 R>> endobj 87 0 obj<>/Subtype/Link/A 186 0 R>> endobj 88 0 obj<>/Subtype/Link/A 187 0 R>> endobj 89 0 obj<>/Subtype/Link/A 188 0 R>> endobj 90 0 obj<>/Subtype/Link/A 189 0 R>> endobj 91 0 obj<>/Subtype/Link/A 190 0 R>> endobj 92 0 obj<>/Subtype/Link/A 191 0 R>> endobj 93 0 obj<>/Subtype/Link/A 192 0 R>> endobj 94 0 obj<>/Subtype/Link/A 193 0 R>> endobj 95 0 obj<>/Subtype/Link/A 194 0 R>> endobj 96 0 obj<>/Subtype/Link/A 195 0 R>> endobj 97 0 obj<>/Subtype/Link/A 196 0 R>> endobj 98 0 obj<>/Subtype/Link/A 197 0 R>> endobj 99 0 obj<>/Subtype/Link/A 198 0 R>> endobj 100 0 obj<>/Subtype/Link/A 199 0 R>> endobj 101 0 obj<>stream HW]OH}ϯGgwS].K@ӌiv[`:@[oU " 1.{N{/|zrq׏'hF$4hY<( Ax! (-&!(C摐/No%W\ &EPH$Vf߃xNu6di^nĿWHs96gRȰz>BĉIdI*L}GD%őFJ1,5!$?g=dΜť=0vfLjWuy1ƱV7]^N%ƸĂGQ4:/Ss+ ֐\F '^QE`3_(P[> jZ3"ݠ'QR,IYͮDcEl: g`h[-LE 6?̏[qS6 rnh(mrPV@#eC69%.}UqrqjpB5.ۀ~>t>&`vH'%*4$ .ao/T`m=%.~]Ivf'$f_<Ͼ |Ҟ; NSF?M]E\ CVx贶>#]M=+Ej,ժH*y5 $E5&)< N|JE>%cΠ@piAטvX I^zNk9gTx] }Zs T64 M>Xq|F8N|3GRj4Y2ZX=/8}-ѽ{A Ŵ+]Å|dFvY?txG>6xp񜬫 [#F!âp<-A9d=v{zuܷX?]5%o67oѽ|ThҲ|wd܍}ZLCG+mf!fYʴxެͮ/tN-gH7 1TFczϋ.ϫ'4-8Lz!^^}q2WεWs/7XFjeyi?3-6^ [7S*)A8CB;‡RbUxyi=hÃrD40k۵ s }&W,dJ-ֵE).fTnARޔnևB> x$xP6{ 1cԙEl[nΟ(W6)cRږRi)F$`/xP'=L`WI ~,R#Ts쵰㚥G#:4%fUM # TzHڱBװr tUG_Ӄg3 |L+/Wxx xV@j|r-QOGGl. nv}rD8H˥t{M~슿7rd&.c ܊گ3ŒXuk?,@_]0RyP]Ei_l>՘cA1ħnhF$#R ͋ Ok*)H0ǔ6vajVHYr^P>@й"KEw#QK. gL ̎cGG#6 Hn>q޻bd\0!fx׋_\Waώ Ϟ7G'CHc^^}vJ8Uxʢ띺>9ŷKW ilFTDau3VŞa*5zS8 |zH-l&(`‹1'7eS4>@R`ש,xn@7}eEȰA6K+d2M )vv1Ag4-[0._>3z.u7IA#KuNq^%m@ޯQ9অGIi.Т'cl(*EI&rN)|Nn$YD A3, 1P)Tp Ns7;X7CaDf=.rm~3 hJ%( N-<ߊ4nvknd ] ]o d|^oh:Rh:?o=hmnkGjWj͕twXǝMfhs Mõ/gStFuVw}kH"Bx~CPɟ=sgSY)Rlb.U-B? T6EO9=1NJ!oD0ۭ`*ڙՇ?[ꄠfQU*b>T&XzV nw' 4z/tvLp<{ x/[fL -Ѡ(d;iq%fIѮ_|_K4㤨.sڸ 1yH L\ΡV]ٔum}oo𣷌0iF|%م؃!\* $5P$oŽKJxzתa#I j:h2` ,@\C{y۲9 2gɔ,9Ľ /Fp}\_jE"n4s˜9 wˌ|h"~r4޷ݴ}NIBE3.m^,Oβ&QQR0RM#qq@a'.{*RzBr# ŤO>Xth4r/eDC6ҏˏ1Edf;`KO<%Ҭ^2 -ik? z endstream endobj 102 0 obj<> endobj 103 0 obj<> endobj 104 0 obj<> endobj 105 0 obj<> endobj 106 0 obj<> endobj 107 0 obj<> endobj 108 0 obj<> endobj 109 0 obj<> endobj 110 0 obj<> endobj 111 0 obj<> endobj 112 0 obj<> endobj 113 0 obj<> endobj 114 0 obj<> endobj 115 0 obj<> endobj 116 0 obj<> endobj 117 0 obj<> endobj 118 0 obj<> endobj 119 0 obj<> endobj 120 0 obj<> endobj 121 0 obj<> endobj 122 0 obj<> endobj 123 0 obj<> endobj 124 0 obj<> endobj 125 0 obj<> endobj 126 0 obj<> endobj 127 0 obj<> endobj 128 0 obj<> endobj 129 0 obj<> endobj 130 0 obj<> endobj 131 0 obj<> endobj 132 0 obj<> endobj 133 0 obj<> endobj 134 0 obj<> endobj 135 0 obj<> endobj 136 0 obj<> endobj 137 0 obj<> endobj 138 0 obj<> endobj 139 0 obj<> endobj 140 0 obj<> endobj 141 0 obj<> endobj 142 0 obj<> endobj 143 0 obj<> endobj 144 0 obj<> endobj 145 0 obj<> endobj 146 0 obj<> endobj 147 0 obj<> endobj 148 0 obj<> endobj 149 0 obj<> endobj 150 0 obj<> endobj 151 0 obj<> endobj 152 0 obj<> endobj 153 0 obj<> endobj 154 0 obj<> endobj 155 0 obj<> endobj 156 0 obj<> endobj 157 0 obj<> endobj 158 0 obj<> endobj 159 0 obj<> endobj 160 0 obj<> endobj 161 0 obj<> endobj 162 0 obj<> endobj 163 0 obj<> endobj 164 0 obj<> endobj 165 0 obj<> endobj 166 0 obj<> endobj 167 0 obj<> endobj 168 0 obj<> endobj 169 0 obj<> endobj 170 0 obj<> endobj 171 0 obj<> endobj 172 0 obj<> endobj 173 0 obj<> endobj 174 0 obj<> endobj 175 0 obj<> endobj 176 0 obj<> endobj 177 0 obj<> endobj 178 0 obj<> endobj 179 0 obj<> endobj 180 0 obj<> endobj 181 0 obj<> endobj 182 0 obj<> endobj 183 0 obj<> endobj 184 0 obj<> endobj 185 0 obj<> endobj 186 0 obj<> endobj 187 0 obj<> endobj 188 0 obj<> endobj 189 0 obj<> endobj 190 0 obj<> endobj 191 0 obj<> endobj 192 0 obj<> endobj 193 0 obj<> endobj 194 0 obj<> endobj 195 0 obj<> endobj 196 0 obj<> endobj 197 0 obj<> endobj 198 0 obj<> endobj 199 0 obj<> endobj 200 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 2>> endobj 201 0 obj[202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R] endobj 202 0 obj<>/Subtype/Link/A 225 0 R>> endobj 203 0 obj<>/Subtype/Link/A 226 0 R>> endobj 204 0 obj<>/Subtype/Link/A 227 0 R>> endobj 205 0 obj<>/Subtype/Link/A 228 0 R>> endobj 206 0 obj<>/Subtype/Link/A 229 0 R>> endobj 207 0 obj<>/Subtype/Link/A 230 0 R>> endobj 208 0 obj<>/Subtype/Link/A 231 0 R>> endobj 209 0 obj<>/Subtype/Link/A 232 0 R>> endobj 210 0 obj<>/Subtype/Link/A 233 0 R>> endobj 211 0 obj<>/Subtype/Link/A 234 0 R>> endobj 212 0 obj<>/Subtype/Link/A 235 0 R>> endobj 213 0 obj<>/Subtype/Link/A 236 0 R>> endobj 214 0 obj<>/Subtype/Link/A 237 0 R>> endobj 215 0 obj<>/Subtype/Link/A 238 0 R>> endobj 216 0 obj<>/Subtype/Link/A 239 0 R>> endobj 217 0 obj<>/Subtype/Link/A 240 0 R>> endobj 218 0 obj<>/Subtype/Link/A 241 0 R>> endobj 219 0 obj<>/Subtype/Link/A 242 0 R>> endobj 220 0 obj<>/Subtype/Link/A 243 0 R>> endobj 221 0 obj<>/Subtype/Link/A 244 0 R>> endobj 222 0 obj<>/Subtype/Link/A 245 0 R>> endobj 223 0 obj<>/Subtype/Link/A 246 0 R>> endobj 224 0 obj<>stream HWMoLW}`o{( 62V]`;&)e ^<<3Y>Mg9`f>yW!Iib ~0ǐnZ_ C*O-"D)2IV.eűgxDgbLjliByt˶9۹ {S9`~_^Ý7` Q QF H!Q\ CzEicw,Pg=g"26iH,LPsąReU  כ*?X.0& Mzv`i ܛ|EۢZ}Y@·Ŵp/6ki#!1 7}EEN1Gَ{(d };L*S7`_g?̳cuձe1Ru9hZ}5(íi ?bxj$M&Bj%Vf-" T$ RFC"!!r.$'2PLr% > endobj 226 0 obj<> endobj 227 0 obj<> endobj 228 0 obj<> endobj 229 0 obj<> endobj 230 0 obj<> endobj 231 0 obj<> endobj 232 0 obj<> endobj 233 0 obj<> endobj 234 0 obj<> endobj 235 0 obj<> endobj 236 0 obj<> endobj 237 0 obj<> endobj 238 0 obj<> endobj 239 0 obj<> endobj 240 0 obj<> endobj 241 0 obj<> endobj 242 0 obj<> endobj 243 0 obj<> endobj 244 0 obj<> endobj 245 0 obj<> endobj 246 0 obj<> endobj 247 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 3>> endobj 248 0 obj<>stream HWێ}HZ}6,DiՐ"e{9Mݒ#b]Ob]8l3#nB{Z'i*T&Vly3ppK޾}wGf?(-f`b5 \z|]a=% oCYF E5R,^_*2X!Ű!\a Yx*$VI0:rT-/}!|G #gT #!C AxKC !/}=(|6{U UZ K>7w?`o!6#uP)O珼)s*t\zyLn?ZٱѨfk^rP_4J+_}ݬWN(T[gbQo"tz }S c;n p4n!3Ir@C^ml$)JI'bIҷeOУ>~z.eJ?7ܞ~nDcI1I tODl]&@@[=]8Y=:3! t`#KԐ\b$XY2 *t2204 ?7ѳe ELdCٴq !CϘ)cRIL9 N OLLsb&Ʀ:Pq̧FKr&t $9X< p'rtGR +$c.dq'!3CCXO>`+M {Lj3 B| -YfQN$%)rځ ʬR ʤO$_ < X38@$>{y`0 bO@D y3A14g{.b-ˤKerq¬A.e\CL,欃Hdsf03O`& *[kpId>睎mIicU3l"T$ 뙝pN"ٕބ/7k: )fXœ_UeVݟ#pHCqZ0%L\D3Wf w'9jUN2gcQ}K g ]t' 0 J,a&l b{`ULaw|VBL,s6b"Y2>аpS2v*,}GV[-T9KLF"e0:Mm2O'9+ax XLr"'+@WUy{+S[$okNUI^r%'7 ԰\[O2xd0ȠF hA ?1vYLT]*CQTV%giO|.Sl>&*}DlBJ9Na=敼TU4k `D6I/ԯ1|a92#j8cFab w7ҘΑLΐaHbyQ>mAH&gH{93 wd=`A;DŽOez~p ;gCPr7!q/TQDO>Vw–T$uzt䜊Ѹ4ɹ7poba Y)Vڝ+>GP:Wn [6W>Wǁ+Sb*08 ݣDO}LPcLؒ33I #Ş%6&\C)Φi2&0Ly,˫\&e6eM.JgQд xiVa ciK6W-YR}ÌfQ-GS]Q 4gHn$ wz~.wnҷǣs?ˎx%O%ΥU+:8s_?ܑKِ7oaNoob6/ 8Ey(s<21qaGSR \I`=6 S©?Yet`/4'/)uRԋp}׮:R 9z-Rvـр7r,(7(('7sg[ ~9j=6lc'wl{b;E>}&X |\\Y<0:a'b7@. ޭ^eۊpo>*a2 47QkpE29Z41.z߽]˽H̀y`icH Zo im}>)6G39̈́#-(1R-8kPLcWe8^ˆt@`U Z4ldv/?D]; RA1ŭvZ,`  v9@n0FluxCY1"Ŀ _Ϋem# w^F8 8pr3|j) E e{>Ei7>twuuUDӟ"m23s# tHi#s 5F(XGW6,_;$ZkHʱO^Yd(>V89?%xt%Wh w|9/*pqz, K W@e³xYEWգ8#3PޣU, :{=V _X;_C;EB"hRPY:7peQO4މ|4QǚeW{E@4B8rCPK(Qau,;um^ݶaE uqy뗼}~aUZ2fm7x"[|,}scsQ `ԮTLhf,z70q sk륃Yb2ֵ,`\\Ө}T$&4;'3G~aIAdO֬Y|bC-ڢТwMAeU3-$ɂ8ަ-;pyi qH鄆M :AXyؔW< +7ӆ=]3! "LF,4F6.,9b_p.LLqqO}*?, i/M/W &I 3P$q^e4*`v(eeTULB;Zk "Ky|`!TIwt+1sX?-C\%pJA+7L|2^^@JB|fݹ|( B#x \i۷A6xpul!)'՝j{, n2rE߲د5$N(mx}[[Mpn,)֙[8HgT'*e$)K kh8W)b6w*<8CB@`*q_ 7h@q2s9izQ&L-^^y}~d\u$`NAЇ4 9){ƥA:ϥ鴮kOYiAqblr #Gc!we롻Wcݫ( 67`+)e=UuA|fkbAZ}g|;oM|$8z9 Ro ᇁ,} aȍsy[;/ _#cPq'P mB endstream endobj 249 0 obj<>stream HW TSWY!l `zRBx9l&S[$Z~xX\GuoAm3ͳN\"`"9iBG"hRxIP JO4$3b7 w:8U|Axh[] Gmـ{"axs\N)~Vxra9WŒc3l`0>rcuj,T{ ` ƻ̍q=+ד _sv+Y8d7W5}u_W2Es{ΕE? sBo6A5<Ԓ NN |H (Iމ>KZoumyPCf#v;-E3`*HSqPT2$ b _\4-f&Eb0tEb,2J98йWq)m* m 6挦PT s`@o++6 >MIMMO~znwKWגd.ao轋67v+.`K+-MRLj\}K~1f ^^+?{ZYgMwx]7 9?WLT=b}2vkCw^6ՠڿ3R^d8aSoi߹_i=ʗT:u UQr D. 8{=F4|gnfUKreu-I Ƃz4Tʝ[Wy0.bWF_YLJo6nWR}kP͗i}Z  {[L{QQGd~Z].8=mD{'N\6a%0C$8zk%*a?Κs6:8RP̜3> [8A+R>?:&{G߉ l]q/#R~l^nzM{8Tsۮe)S :f{flkzVHgF Su0YoCgnѬ@=.ғ,0X̔ )Tpl,Þ$#FFc1c1'k,K5J(**"C JvkvLeYN:P DT4Ur],׏<ɜgтxTZ`8L3I;([9zlH0|1;K#c^*S&Tz&{EMX ̏p}+G;ټUdwe;Y,X}읍9Z>J_׬pWy7Z{M!uэ_l ŖG49(oYŢyyEa4Z5q6:V[ĺ7c>2 |K]PZs*>],%g45%v/: ٸ9$9K~ps p{r?w+CY`_ڀDyS*jn(:}`Z؜ ؚ5Z'[b.yr9l^V^H,ny6̳QeimqBr؍gpY܁7|}r.eEA\>G`Nnt?1urzp]HYTlDĿ(NΞr'Qk2SH9l4 lT I$a3@3M (HѤH[Taa!m@DCxLRoZMX  &!BDb2))ԛ-za򢷾 @=+|F֪p+rpNES#^I!>S D0QTHf/z*LIPaPlh0K@8G1i3LDB B?DD*UjOQՊt-$\LUi$HOׇS4aA)P;R4*^qM;<W**DV+CMV(R 0[~x<#fJ-T!; ME%|5usoT)+'^!E#,&&! "AeDWamձbU\vgt:\[mwiu[e]ub]wnnxvN/u;O2Br!?H?!ZrYeEg!b&hƌlbn: A̴|[cf|'K323qvN<勔l3Wge$; c`6džEY,+'y0iJ=+`Kh~nJ()SSu_^ybL}¶}׶@ܮ|itq:C͏6$47&'-8F&Q=x?s |E%v`E11ZAm䐡8>TmC^䒦჋.o&{#RBDejyFf0V/6YS)W}7RHkfq iwv5~s^@Ӎߧ>k^N8m]SzUtn^ M,W϶_߿~bAoTC:B߾Q}dRc@+@ĔiϽQD]TBJ{.NYxjw;wD~;9q#uvC#"oN8j ?b]FKӦ?7n=6jZgk`#:(ďIϙ3kάeߙ]!S^?#k=YGnrY8{nkIi]ZhR?}9esڶd3ؿל~ޠ?fy++77eulK.Qt֎=urmWYC:uytuͿOy}P[!'OI#)I4@F=pb HOI.T?<ORFbD{%\t0JA EЋT$Qz1Ub!@Y7 u zὍlS?GuT/]B9<T6ڊ@*QWMiX>=MpysSibժi Cƍ SH2Fm81bI>a0#u8lHMhGi|AM*Cb՘e0Բ< Л s``2ef o"q V\k qafH|1yh@_{VaPfENnlQ(9ge,.+%&|6JۯL2a YhI.IF4}P W^ B QDD"b7)VBL(N6W0c|$̺ T"(x8iR c4E(X "9-20t5_(rN@^8d੼pF<İB,@%24D@p m!: u}Kpg׏@t3fCILD | "0'&]WlQjA [K:~~>ݾ/:n?lRo$ϻ *8>r Ƅ<| m6`CyjЗCz??뎿ww/N܅1w$v6qK;NL$"C ?*TҬVSi5SґMc]uR`[LƲӍJR鴀}hJ|}߻9 <ȫ v&x/ q'o> hSx,{/{IۡC3|@tQ7e^T9򼂪B&9$*6*/+{* Q|uѯAy`'edD՜]h_VM֯,dDyj֡_ )kFdrt'UQ2%QKv$Cz{ȶn]6g5l8 dxO 3'3MgSphrpz(b8ea`p[h7_߬2[Z4z 壆qH)G(/3 */V}q [\ŋ|ȋGi:ߑݪ3O`>ӨQ:hC%e*è,ԴjYQ1jM Q~{͚eEzCmQΘ[ʊRW MCPU58 ԍb/w,.8y{pn,,pNn񚢃n'krbH--"dǢps9=JkQUHf .VANWFI>s3;%isiKp2i^_67S3L$ O~.%./9.#IYQtƓ~'zž,so[n]].'eTRmWyZmБkPQl%|54I|R+zIq'Ir M^{ v/^9G4ؿa\2 3=J̋4DŽݒBH^@Ob- 727$/jxK7UeVЎc/O2ql9Jˇj1l Q\W"hb' CI|^K귯nہ+z#g?<+ܾB^_SbkBkQ zӿgU#\⹩\ӫ6Z΅rԋ ՈZgJ[hMѭ!%L ʘX7Y4ScK^G`z^ O{I=/)n|ӓpǧn)gTxKJ*Unw5`XT:K+R+ux,]<>R-XkLZj?M@K2=CWoGTKdFuq5XlЖv~Y-=mǛwLfΑ෾K~X y /mrx{or r]`hBgRlr uYN9,W?/cO #cЄ&Fb{kݻ068>8@͆p[S[u`t`d7ȸ'L %Ć%Q(z4v $ +G`C Ci+eU>Ќ ;n(WOz,7ampm#00Xn03oOz)uDbO.vNyL~`Ϝ88Cy=yȥ |wr6 ξMOCRs$?0C endstream endobj 250 0 obj<> endobj 251 0 obj<>/FontDescriptor 250 0 R/DW 1000>> endobj 252 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 4>> endobj 253 0 obj<>stream HWko_1'M`q]tѨ(8hhi$K I٫=%[ذezx{]dtوᄏ[v^}L7Y6YYge mclZDa](~{4ٯwr'~?܋܋RIA_F ORlB %kY,qfbQ %Q%@D* d$XlooyX<|G?cL#o%L)z .!ߪs:'a$xghZlʏBxWcj]λ2iJiL i}#ʋUVl|zXYFqԲq*QBsA8!\ߟ @sBno{Di*x8,'L`fb ~@ϢnlM.AV=YH+_48*?*]~M}+X35MU.5kl?M܇pk _,8ԘdOI?17xqN3{WV9}:xIGah㞛sc9*0a?XϊUL߅Eو/2hJdp .\᯹<P,Z ^IUrl7FЃ(,2&1>{!> '0kyQfxY9mZ``$cXQ=ϻ UTuyrvG.0 B3 c_i|;9fvƀ6*$|J TKKaiheҬ{N rJmi3_ C<[."PZrcǡ &ͶϠ )pqp'> F:gocGv vT!8ǎbrYDqȝ? ChaPCW頶*om,fouY#qV|AT"}kIe_͇:EƂح.F@FT}DgŪ¶tQj~<7-TVgU=,NgO׬=iِ(FkoU6 78jn9EV14wNoo }m%z3n(E Q]k%nE]G.~} Sq ɾ#c!HK\(U;}E\x Y ׋9PU$WD.q/F[%~ ќD>\f\V7Eu#g1GIcv: zOEhyf.1N+V,h{i͘F=yY"$aNZ$%YtlC. Wgw3Y]lMԷFXzd"^(iw sS]" =An10Duر+0It=[r3Ǣ 4q/^Y7ehTXuݍb;Ů*_yCw $&Iҳ Ty˴n{̀f">Wx~SM4@bnMďE1'zİU`Uqlhgl#t5pq:s"%::9Z4&nH7n,ϬҘo:ϖRa5Y޶a/loNΰ©&y*X,x^uBqf=Nì c.0>Kf|;~|l ,XƿꀭZRo-_Oy2Ӊdl|Ac>|A[Ⱥ$ EXQR6 !@xeU_ .qQE̜ȰENqZ썩&vRN`dwzyOM;BU?ګmWR"t.%9(NhWINFq$;C {8o޼,DJR~:.Q0DFc xhŹNkk~h5ք WP)Վ؊y):FBB8[ūĶ/مCmh/D dk:oN1b~:< eY &d@[x0|#'@^{"M(Qaqvc6LFpN8eܤ1IL82ZCFmN X*ᩤ| 6cBVh[ v4uȏ0 ZZR389\I(jc>8ͦ 7>GiyL&xohF?ϫnѸh]qan#hBRΐ[ d*Š~t܂R+]~>H\:bh}h|"3O=nA6ܼC֧GYEp ţ=@]FYjݚ&spEҾE뎥`~`v ˲LAKdZ> cP 8zK1\>R*;=^p Q佴ΚgOܢ,Fh!^M.肇و,ca㛭Gwy& qK61˲Ɗn.Xm56(x1eOsY ^ԚBx]6]@bg)a^:NF>4ҘԀoh]]v]~_C܎P]}(_)&jCc#" ?uP4bh[-QNuhQN?@'c_>"gx!a V{V$$X3D 0DD55msDG _ 0- endstream endobj 254 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 5>> endobj 255 0 obj<>stream HWMoFW̭)v$ l7R HЪ'ZZl)m-EKJ гơ..6ۤ޽[,ŗti-'QaHFka0!BkdB-$b]\mwkY,ˊnkX|ŧkI$?BQ}]ҶZ^,KI,WY>-RU2!Wژ7ˋpYct|:ܧ$J>T") zx%<>#__I4գ{eܳRGRP,?ʚpu:ZmJmIe7!Wc#Xr7PWrx(U8C~>gM7G֯;9{HsfoaTuu55*a3òq 03 Cc }]TMFvNO !xv*fF$|d0"33<c8KLyiyiҌҋ%`3ŜZI0yϟ}ѝ[;GtYZc ׄegh˲{?#=,嫼8Uo"Ў80Ӗ3V1lf֗ڭf2Ü3A ~bdX ꤉]wVliչ n 5 3W,ErY[oLYѺ0oJ<϶[DC 8779^^ON]Ћ>#K͐6 eڃ4aqة}ݭh}r\=`lMJRF"a|ρ0b{$}9 Yta* _5>&5:O O %*ʷ| oXjneǎ֚dێ7)>ءèܢTxA'q>q+F 3nA׸5VC8!3F@E`Xu؇PĮ^}h%faY\]Otu(KDOvkEtltu7v@ 43Feҳ/ra"xDZM у %x3 ؀p0OxJ7Iĺ~_$ u'|­Oׂ D  endstream endobj 256 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 6>> endobj 257 0 obj<>stream HWn}WCd@j0 X#!$b1FPJ~}N2^VWWW:uQGoswIENf#wRjb0 g  Ed|8v%9a$l>g9\z|]3C-\?jwI|(xX̗'cW6'_'_ AQ^Q&ֻ@p[o878%QMW.9w(_OUTi*clۼ ZR;`"||jπT gxUoEY&\OfU0 f6k1ë(8ˇ&{2.\ .LØQGxtgP,xe:|4|ظKR,K,ȾX)S^I<L1ɑeQȑY5.ɲCѕ7t3 Dvq?Q5GGvx2Qj*=g/'eXpʴDc`Ɗs[]6v)\؃ȶ[иCrPR3k@|Knՠxk˃wA4 >=9T4Uq=P;qIQbN#nQEo|f&QrE&oAޖMY/gAKxKgHhQGq_nb8U5% E2P>bݭ|wh.7"HjElBϓm,,MvMC8PtQTo)qavK5znś&{#5Ɔa_\AxSz DA+K')"(l󑇫cG,'g!W‘*E.dTqZ`6pJdxyиa2z6b2 Ʊ7N*m^`4 Y7@Je:gJ`j䄼E M&@?7!muW\Jts?HᤌW;a䥘G)9iD~NW"3$7XG$wu?6d*49Fn 0+'-  j&T):,8zf\. ݒn|h$Ajͱٮ]>F;Ё* t.*ytѢwϾE>*(mQb_cǒaQR]ܬxkҥMH0 ÷ȸJ͠Əڔ`> ^bUOMbʾ)si{\\AwWd#T41L7Vu| уIva`L-&nXL%Ƚ~)f{IPx޶Ct4.)ܻͧCH(F2s _XgPʜ8$zj$m|&u, v= b7MSl2IwO5?dUܮqʵ7"9qaa|].! ɦ,HQbXq}NWbS1t# 4xd13Ň YwZ3YI{295نA!4u>ЀuBa+O,שMpabM #3pTy{{ǔʌ*BLicO"Ոzώ R-*Wu;a9 EGK2$"tnd|~S-!sYVBzzשY`tᲙ+33T;:,@/[P!I|,T{^M(aL y{qWE..V/L9LMT*(+eSX}ǒ `[7Z)$?W! 1P@*1bhk`1"P@d >/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 7>> endobj 259 0 obj<>stream HW[o~`_vJ[o.\?Wt`x U~5*z|X梇8Qc4.@%[4uLDH ?!2<@ #iށDRP'<[g>HAI,4e{M#[ܥpzJ:tX!>,BW큂+%RXP4|]%&)tL)6hmmYй)G7yAXAqNFQAlMe0E׷ʳu?{q3eŒ*:wP10U7,#fȚ{lCw qQ we:zl8G|S)'CFL3Y*ܢfPü5H8"CSmņ`*!c1ӞC'ΐ2t/##:#!UsfB&>mo{&ula"H-_`oSol`,1$%U! 6nTJVHLH*3M5P" 1HJxg)pH/gԀܠW+(뉇R*Z *a ZOe҃BS>)f)Dܸږѓ axTLZz8߯H,"5g -ֵb礨w=ܩ'Sdq]/(C>>i(>a=p8} 1RL=9ŅiDz zM㕘M 6W;T=]/nj\e]h^KR3b~ 4۰s/[Pf Z ȯ bK޼02y5|(Vgu~vT 6TJۅԅD S* >=hf77X:P.-ّ諸%eԦuh[nFr,ZM1(!o,FSm"}cwQ1f= ЎuFKKYEl.7h]di&(`D!bF^{ϛX98 ȧ Qgc)Xι {E;Լ&zk `}QU`p$I; Bg֎>:=c[?F?n~~LѝB״$4<0p9&zAY*3 _%4sH~b{;'H*גLGTDC埡X򖆦pS8hXs HAÄcS N٧IMԊdYguhu`L[Q-j=0aC:TޘcJϰ ,Cc(Cv[!`+3J:M|pe2MU7Q,{:S;5 Ն_Y%ȡ0x4#;uƿrԋ=WIh{!|ᦿAϨj352gD̮aAGw&GR=up9Ydyr.mU!Nv#ϗTw.(j5t%>]grO$$ys&ǚ?@jlΩqC4we8 x]} FI-Mnjw#㑜A(ɒ~ZĞ Jץ,}: %-`;h9~٭Ȗ5YUƇs bGnX\5UYmJ,Tb !EH)a.F{QDLB8ꞵ89`:<Op-t\%2;RPeZC pЍ"tW(01V#m)w3g2;_&){Fk6,r8?Mc4%q[.78eF!kl%õ5Z+,-?JK>T*Jho C(O%aXvdq!Iݦ(WL]EivmB.L@Pԅf&!VI|}9qNp `(NPl1 OGa2pmY3(˲ (f p~8L0əl+!m@QyZq)24Ci\`&@%øс!j m"BB$[]huv%&of]wonߛeAo\|}C7eЉNGA:g!yt$5>t;Bk*сAөnNn s-z F_ jz\4R%pꃠ8 ]r9Ӭ#aBz9Jsp垷dzZuTW) HY_}4QPu`Pli* * `E-.6 )۷=,] (VD3jPcU3mϵ'2`d@VGuEz:v(2 . Sa0^sl X*'X"DBläQ*1=YR'YUW5ql/Sh68'͘[s*E X0jl旯.Ǡ8,zb?O9z0;C~ 9qDX"Hro MDӹ~jrDE$"zA_zI"!cN/ t2v%q1VoNϡ_'hD2M1@Pɺ1y22PZdCSБ>{*.$ubGH7FZ~pƷ*q{2aE^2Q@, Ԯ1d;[w4\+) [KIWwi_wM H-!N,@M9L̤Qs;!3c7ߖM/MC>ᇟ@)y 4,͎ۮCk:Ѥ?6aqKck{?>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 8>> endobj 261 0 obj<>stream HWnH}W1/Ii&`0 ۻ`$DjHʗn^DIE JR]]]uԩ_*yrKCUgp:,*RH$:YE#w>|]qM.?_3ƈU{ޙ ooOឿ=Y|%6)%y7$yA]q}R;jsOĤ\ƛE$q%IwɲJVtCEPΕ/U.6$.u0LS. <! :k2D"Iv RncpN6iY1<(J .i tZ[UBʿ _G41Һf2)GPSA5`8=\>{WE@.. _.L@b+M\/IU zJ5zo4Ҫ3 L*^?=%~!=tl^[x5SqXO8u#"߂)U|C{Hjӑy1 82 ]@ƳglfVX վBǻ ZA=L6!C)!6K–Ɛ.rc8'7qd3 U.ޗig y)H0z A)h뇠 ̯مgS3:U|"JOR;4}|g~l mAﺠ.1u.#L0LH/1,J HwѬ? d0}_ Aԝs OP7?W?MM^V Gt&`z9(9Fey@\g쵹gtvbS`[>t|AejE5UM\VDeo #\e$5lv& &)+L" u|.ތH#]l Mt|-l ~ď*oGO`<߃V=в MB z =ؔS ?ؔQ+Q)K4z^KW_o_N@}hOQ#~2`%eiFcL ›ZD{pؙ\0!1R̭/v /_O?"})S㽯 PM7g92a0`} |XOop;;;Argyv0 rV EX U[0tڰg#z>eeĝ&g wXWn0+x륐7yLZhE[mKZYJeCZIJIyH3ʏΣB64Du6`&W`3gm|rKkkFGnb*X[Hc}'~On/r۸KqS9uJu6ޘ. }ȾDŽql{nږ+(G7:Hˤ01H'L!ϧ ijZط˂eVn\u '!QH Ҍ %,ڦۿ%n.3x&Q,W\Ƹ}TE-ވ'ދF{qk_uU0Is9K͙ª$jpcE̸ )YmWX*z/|?@M<:\U|)EZVذ?OM(iOm &ބ3$ n˓[8nFgȅ]\U[ߵmoB_Rh|a"P &tniD+r`):EaOo6uUwqCՍ^ TR$l1ӵ;]7Q\]ʤ//3(irM?lIhcގ tW6*\{eܸL>zID`/ԥ n#,a? h8d݉N2ɬ06ی^F+΅tu}%w3G&kx_]GHū $05/BZCч"84ऍfdO~ƽ`I/|l ,>:D ÄQM!^~"( k Bß %Q} endstream endobj 262 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 9>> endobj 263 0 obj<>stream HWnH}Wt2@ l6A23k]$A@mԒenJ"[ ĥSNM.붸g-{v2ݮ,eU&W쫌"h3LF1:K"T}\m>[u2Vw?\WlJ0/O}!Y}쾹x?LI6t?شaR,B9*"ɲM/o^|^|`Ozח.AD"]X.R[0Ӕ#F SزbaA^$9${κH)v)x !Hym|׵o}y޲vf{L~ EaldyM]-}y}3e޾byyC#OW6tq.,/ٍe%UmӦh,gM\-,k4~Ӱ֮߫aW+J8R³>DML E)$DJ)"NTTl_;O"}-kVfnm0Pn%ca>&ofQUWȮ| љ'v/D n|cj]~cyuhQpe&AVWsV-@x:TQ]3,աYggFťQI b1aҍ678Sq J]2Kl3GP 19N=(Uw.6 }K{CU6ih{|z2 z M#_(BgQ_y0g!=mRմbTf%;,0զdv{3MšRQ*h1aY^ k|Lz:A4p@兯 f * nLhLgHɱ~%1xj2v$73%0<ƆBHqz"ɱM9غf7},µy,Xv)M:J$0pN=qS\[m3T 2L09=|pj fϜRUM :3ŰuO4㍴/'(zFk:޺9]LET(h锂/?Xn.]ZCa7$]ߑJpeׅ;(~l l03DELC JƐZ$4 ̰EFw ra9+4dL-oCXNWk?I#h|u.%x HdP EE9ay|~͋2?gT6/N 8f; FɣVeqskQ9Q sϘRlg\y'_4:8NU7v9_ꋮ: \Ie>dzE=޿YyJLN}rdZŽdK[;pv4 PIKi@5Re{w ڈgIiiD|bQ_7C}ۣ*ʎ(BB  +*[8dDJ_3HEElwS1ȴCY:̝el"qS(8t, m$ΰFϝ$k`'Ux1kAE#%f՜W`ަlS?;TMS!*u!ÎtwoݵhK"Ѷ98|ecak!gV4m~?o'Ze45W3-}vr!{{lg}o bβ^FӺMQQt*)B!vm(1JQm˨E)1- =^f܇"0j^Wbơ!',Ì_Gg/`PO<TV1f Q>%RD%#?"'Agy`.{ endstream endobj 264 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 10>> endobj 265 0 obj<>stream HWnH}We wL @6F/ R@"5$e[=ER"aV˩uYgtQwfγ1:+r6)^؝КJEN m#b+YUdi,]uX%͋-}eϷ58J f~59l|3l^1}U8Ѽilz~}q~35Wl"}Nh%Vu"sAq 9p.6A o8LԀՊ(],϶-{J7{mӗǪ;Ve?ˁⲃ8ŰK!ni?Is/)mŤ:"[h9t!eW" &ȓTeCɪ>e>l:TQZ$$f,JLk$:&;lL={^g5O<0[הzMvN+pQT.>gb2̬C#jmYɺ0a)9*lMOj8L%nR#(t~ x;UX"ms?ildsmͿ}^ц\] - ~d_QFc6EPiSӢK^ƶ𫸈D3kƂP){(>{d;؇ nZCv!T2g}FڊOQӊZ³ɭ-ME9`..ln6`6 h=5$Gk,6p5)Ԯ@X|) TM5D@,%lLnbĥ?YtU͈=UliUk",ؒ>>_N`{ B[\\vC/y[W2{|ݟ$ak d} m8;&]}5Ž~VSbgm :O7 K*~ü"/85mƵ}]*]Tγ1>)^؝Xc Sb8Y gu.ֈ즨b>}e]1vya?\ C^ LPl3d O.z)XL`_{Ζ}X30H[L:I-%#1aD?D endstream endobj 266 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 11>> endobj 267 0 obj<>stream HWˎ ?p60 x1` phK-o$jY9֣IQ]0XuXuȨ#,FTd4~b7RQM,8LS›P)GyftpM޾{'#FMFɄN&kFxdg!u+PX-BQ G_۶l&'ǧ]AZ8eos'7qo}ߔqTq78&ܔwM[͋ilK2T,MV WX) A8 :~׶tYȗޒG Ba' o~CChɍ=ΧK5^M96Px t.ZP۝sp  NS晔 8Tyx'RECjInvl 8-Eo+nm,5J!.h~7T^Ϲo[v9џ4;YuBņl#GNh U^ȇz jVe!eEiڋĦ >^WL& a)Ծz{*Br )X4vIZT.HBr2Z*C"%SRAR}*;t_>t0:POP1,+߼ ʼ.oN!| ѺE/_;]F\Jie6\B&5|Ӗ='x#L\pHihn\[Ar4?Ffu=fu<8%'LA]&0.f)L223PnbE6u_]\(h)ZH zMg8Q Ƞ{>uoput8U,;dSvYMqg{}6:4t>'K7gb:3gXReWn^1~IA1~{;5jS1wkxȻY968I^)39PBޟ>=N4<Ցf-ugl%w+Rr(^zV}f=3cR{LbG}ݷd[,JRm`)mYWEƝݫ*8P=V!tIyA V $aw^Cbh]f)L@zíKt'dn3[$HtKd^-'̣JLӁErw]ք[ x,`)u K.#6F+sm4Ho){(yG<&"mh Gl]2rvLNfveKyW!/"5> t_ E,_|%5Rl2> />s]m[md@*x8߯V(n(vbP:Ћa+16umym)wpt5 Yջ*=[1ڛؘ6$ܧ_%SS~FN{c;M+\SV8X}&+qNrkX)ApB'(T0 )y$9>ХDpO?O>0nmn_u9Y7Ui*uYۮ^ȷrw 6+,9)))ƏolV89Θޣ" kU>]c> >ܝ#O| c<'f%w= IUrH(\U&gCCHnagC܋˲ } ~Pve[P An|e٦m)v-f)"Hs'1sQE ]nnz S6Y̖YntX`cC81MS<P9nԓI+\\([ c)/[;J.6"kQ] T]n&1j!ML)ORV=6!`m;I.l#6g؜6_;1IfqCUXȑ9vGϰa m XƬe؜oGC ڸЎ|Z~UK"bkpSQrnh0>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 269 0 obj<> endobj 270 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 271 0 obj<> endobj 272 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 273 0 obj<> endobj 274 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 12>> endobj 275 0 obj<>stream HW[o6~8+м"YrC]`Pm%Q!K4~>R-r絈-S;ӪeM/染H,h~vV>Ӎ"2J1'#K"R&d"b+uLӺNnrC?|vqNs<~q >\sbI"%dOŖ 2@Fq\L'z6\.?1*HX ?_]`kZrN*]\7̜3< ukfI%#_ӊfR:&$iy=SQĸr|J]&"wr[Ůy54BbYǖE6d:2\V#:EbW>N!`4id.BJڜ,vyHA22ыe̬ o$f+ P2Xfs_.Du,D 鎺MKEI8<ҟ0ܗ: .Dċpd!Q `d8Рl }ľc>5CVm ۔eD>ڵ|RnuP`kn'vsRW{kN_͏=Q4QBFl/;pL)FcJ1‘ZkcQ 5 qC+FW<r!hh;;LRC̸:S 'glt1p};9O3Ó =g0pnsDxȚ lƆX<$.HOVuq*ޫ2 }q|Ub:GOĔiQa{k|oQ> Siu*'UJ* {$q@ҡڤDyWkJhyJN{ˊ"臄pƌA0*(kTlRR{fD;!K`0*v{bnR|~O, %IVly!&rTjO.*j("5]4g5A)6]~&A\1=eyN[!m#KYi FFm뻺CD ,x/MlN3{@C4bs=D $Y/?e,eo`b5vʱq?^M9pf|wY>FU}kpykqYJAM.5Pђʻ$3~EKs~K Է"/oPn_ endstream endobj 276 0 obj<>/Width 383/Height 292/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f DQ"%8^"?Al_^xK^K/Az^. z^xK\4A/Az^{"G A~pt;#E8d_K m / z  z 𗠽/ z 𗠸ip𗠽/K^/ z %/K^%/K\4%/K^%{"ނȎK_ 4#@k  k b#/K^ z 𗠽/ z  z 𗠽/ z 𗠸ip𗠽/K^/ z %/K^.a-dq(//_<G)~>ȷ>H },Dp/ z / z %/K𗠸ip^𗠼%/K^ K^/ z %.\$%/K𗠈@<8>Aȗ#9E !G A  q9 A ܐ5Ek>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 278 0 obj<> endobj 279 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 280 0 obj<> endobj 281 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 13>> endobj 282 0 obj<>stream HWnF}WLߜYi ZI|haZZIl%R!w\Iyxfv̙(/0ޮ, o,IMd) /.'cRB(\Fd@$ a8*K3 l_|/)T(|6`~0+`S4hou?O9 PGj@x3:^7\/>SML(ʴ"tXz?9AȉdZGع>0S0*o! )m7dia0;$\>BGZNux昱R3^͋^;if4ŮI4dU wf&)oƹ*M]Ĩ`}$9J$yA[U266bsBY^@6rnE)2H"$Ka=<ϡg-YYb8:eM̼SL%X70 m̖ orqΘAEGF5Bk] WW-ء+5j)>u~,췵MK?sA"v2I%G |{AahT8QšP+K0MRA:;PɩБHDSXcFm!&VLEKYX-dvrao49G:U ۓgӹ:RDc5~2`[5_)R15{9GT ;T oˁYHԁ&@: d{t Wtu(C\8hEuzmpMtD\PBsT2O]U@.YSl`i;ܗRaCy>\M![]WI/kUg'veӉӈ&OºZE_;Jr}&rQ M",}2ֶ/ԻyasnS̩8@5 zP yT&T\6\gLåHŋ[dUQ$gHYR])}<zdʳ:x{Ń|frH)ӯpG׫-a}iiy!;NQ`._^qV޿:76½}WqްvLUUvnjۑ fH pTD;4ck wheDVXx_ASM-$x-)|y[99uKnH #8!nDTW5|rk&fNt mar\zp!JRlMzLpU@ȃm":gu9Q!F r\}9!<ԛC\ SFsߍ*h{5[99,xRALyf3rRƘx;;J-Y+ Bn&ɺZO\mJ%%JOJ'741byOv( gؾ\P~ȝ4+rk oe25x\[TፙA^"{;SSFD04w#wD{pTxCowË,%<4 ^_&mu᪳U:rnnm. X\hf7ߦn endstream endobj 283 0 obj<>/Width 384/Height 291/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &h bGdp3 /p3Gdq^?_ _;#! 'C Dd y2Ld.@4g 12F fC -,<@Z x,_0 @/ / @ ^. \ @ ^^^^^\0C0}Eu%A~ %AxK^z\0 z^p~z_\4Id _x^ii~ \/ dp3 |H6'H4#l lp`>\  ^ ˃=^ek#H:  G He8$C#?G\ #l#J8#.#7#&#7#dp[ dp[ pV a a a l `G }l#:GO8-. a<0*28- eGl7^ˆH3|2k2Aapp$  !xe$8e$6dp\2CU|) ZR8, h_\2C,,{K dXf$ K\2A.! d\0f 0 8 006 . xjY d[< x)g< 8@fW  2̂8D242k!9 mClrc EG"E>E9r1(QȣG"F9|9QȣQ"E#9r($ ZXy fel ֲCmGZ#8k5DvG >(CI,qK,6A WA VK!>Chr~[#kGN@75@ endstream endobj 284 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 14>> endobj 285 0 obj<>stream HWn8}70 ҼBE&-]4lEFmJJR %moq,Y"Ϝo궘WvcazgEiڢ*az}]/" V%2 )G@H07mk4670~ Ջ߽h&dsf8&}/HУbƥp78I"Hד LMޥwh}MȯۛoqVϩ':{/8Bǂ̊\tQ"ϪaA2yik%K UնEf~ KP3ƒ>朏(U+]dKSٺh"s޻9b䪆\}`ȸLI >~Jq{ɞL%$%,4±{pD!s(/nY]fd!ˢ㪽A8# 80Fk*(+h66+ 0ڼ!Cю$ff*"[ݖXl.-'Th}hAj]!j\4]g5C$2gŌ"vͩB쒍8PIodAS93rlf>s#;^Y 8$ВA bf<|.7< t3i6USؕ7CIYʛ)tmUsXfmU_)sr eS0(I$NPP.p{>W[M/\Eg]jw->jU6Ov%B:ۙbдY:Kᰟ qf091ϙUi™}csJ `3u-2.*( 1k;O~Xq=+Tb$p@8لU5Ysx[M:E{H&Dq36<>Q{5Kyp؆&h3慬}óEbٺ&5\7@u¬pkoPd6ĉGQȃuBi%]eDe_y^'v=e =vQΫz5^zAz7{ F`]2]tcO0|yna/qx' =1l;|H 0D;5z5TWǏ3',`?^Z"m@>z)$ "L>|AE_rȽUILew3x ۹ S_m\#t&!x]M9`5)\ endstream endobj 286 0 obj<>/Width 384/Height 292/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &h KE _׏_>^C%Gdqd2_G?TO@ix08d@?xkr?G<|/\?#_~G?_?C0~=qEynxH? Os~<>o#( ?GdqOsR8KK7s~<>(H2!Ac 9s/9ρ@#>"?G φ#@?" b*q;#" :#G~2 #˿cG d#G?E9s?C2>G? xjO|c|G|/c6!9 m_Pr(QȣQȣG#"E9r(cGȣE>Er(Q1ȣG"r@եqy 6a 6Y 9 k!9pU;#^ Gdp"A?~p?ᬰI/k qd ik6!>)^< x4 s_@ endstream endobj 287 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 15>> endobj 288 0 obj<>stream HUKo@+JO(RDiZqc.U1&5bRqZYe{YV$Wp~E0yTEnWƒR,=$XK{YUx/.zW}pܻ>>ʩ# w7#ӥ 7 9'1&\%N?4Ue\Q1n0s>ٹ6y2E WUQ3aD4 Z A+Ys 2WEn1pyllƖhtG =TwA1ܯSD=ZJ7M3v⥄8"HPqR&DyLo`Uc?f$!["-1L:LIA{dZ EZK&-y%;y>stream Hb``eddgcccbbbaadggaffcee544466QUURRRRWW033SQQа111 tss sppprr򪬬,///))/,,LIIIJJjjjkmm8q)SΝ;k֬ӧZj[vŋw޽e˖˗/X̙3ׯ_?z/_|С .>/Width 381/Height 290/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f _ E E_׏_>^C%Gdqd2_r% Bg ^C ȘXr?p2dFώ@'.# L"( ? x?~G8 z|,"%@C G0z C?^C,}W넇A>Z^A[_iAi~(~/2?n:\2 4H@? `q A?G8/K?𴿈rGdqi?q)z\G8oHE_0\? G(? l h ɎO$ ߑG>#G3|_@7#G?A>_4,l@?.G@`PR>h瀞@(:#B" |2FGEQ@#GD{Adva;쏭'8F`ar93_?E09 pBkdp[2Gl8A_CE #/7] .쏂8*(-a#}|B>g$)w> pB!쎁ya ULY/#,ޗ;#S _2:>!G~#8@ds^@KxC.!E8-RߣÆOGx7 <-C 50e9PoQEGa#G8@J8B+d/H'pFg@aOqg39'l9O"|~}>抧#G?/R&<ds#Ldqxrc&?>1>#> mClrc6f(|9r(Q(QȣG"E|9r1ȣQ"E"F9r(QȣG iKqy k 6Y 9 k!9pU;#^ Gdpk"A?~p?ᬰI/k qd ik6!>)^< x h@ endstream endobj 291 0 obj<>stream H}w/@xmS?mCzK%RӞPlxwg%H΋4z1G'?f޽w:; [^ӍڰK?1vD]5ywp&;K.ΚLMkTF}ݳ+}SqtiN-"d̯ZFQiN->O_N-DmBG\&⦹,4 hNە50I{X,,@ CQm,`1mLXƞ*w b!J_v,.peN3y⫴ؿ8uО12 Te.kxD/e㜇оłߏMs5F~Y ڼ_0 [4@S0tq0oYFϋBԛƞvqلr~U \ׯP)1ʏҢL$foO:! ؊ӏ_{mCPq,ÝVՌ?x mA\ ʢq ״aa1<uejލXԗy7`Q_E}w#efwV0fqK$1FYbujNX+NXIhcؓ:-bjS`(o&R,-YECbOBâHo-2b ;XEU,XEQ9j1P=S zC/,,Zm*g,2H|%a XLXL^X]%.JR. Fv.p=I{ŕm"5ДkXTѰZ;vhyI,v9ڸYFE4p5gFM_ҴIhsqY`k$`5;ꆌn,aI$by"EKbX zjQb b gE{"жD`o+,,,@7 ,#`n "v"h ,@P n TaYĂ)X\fb:[N#X\#mВpg5.;zF{GW޳ pثxjCZ5/w8GצED"[l3`{u:Z-Bq nup1$Ow ~q۱24,eNMuhXˎ=G5ÎCW_hBC?횔p } o8U6lX^7b `DMXN#j|>qtM\Bi@܈T`#*wIʓ>oqu-C&}!i_aa\$:A;TYԦ]KD].fqk Xa1Zx,'{^5/vnq ORK/äo*J[̇-98[v8{1za$]b"7CUAZ$Q/bpٵG{FЃ8EU[TNE7kw-c[E!.p-*/r*BI!q~tVz{FyI<[XY̶N-[LsZ8o_MبYf9*]_PΖhc\\>%• wDɏ[ň*U38\YXqKXzټߙE͠+Lw?;]E!4g( }7ۜiBM!rMqqVN brS/L,, Ec"(bA2ECcqV yُ[b-rl4b,2bkzF{Bcq $\l =ۡ-Cp b}K/6Z]/sI1FtZnFS*-<ְx _Cwbstc-~ܡC7}vn G-J[\kvY.kpNUdQ\zæW;޹KguC^^9/CK".5BQ[CW_ ڢƏu^Z35ysI.6cD7h(i[ \j>\?ΖY/Xc=tr\,i1O$bQuc5-2`FwX%EۀŖ,*;Z7 Eu,?Ҿ[,T6,GopYZ?IX)(4Pn. <~ ]jE-iktGu^zXeQQbZ٢A¢TdQ bb:w*6lH,؈(FP{:l_^,* fY8=n)K E8Xc' Ő: C bAVvVmQU}UsE%X ڶ^gYcDULհ^)>XC,:YzZ[XTm/U?c.H͢C1ռX/8,] >xh֕w ;8.1t2/4,Faq Vor'h{ ,Wj]-Ӌ+X$\ Z;.C/9v;D|9ڸ`ǜdo41!9hhv`^LX 2^7\lyXye=l:޶yJK]Ws݇eE޳mWѯh4}\ϚzM,-^cE]zq|P0j|BBbCŀxX&7>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 16>> endobj 293 0 obj<>stream HWmo8 _۰zadzVwCn$8k_XuݡP$RIYtRÛ7QYg]|yh8,I Zb4dL1- W1\G'uN-\EIwG0> :Q(r6`K j0LQP`LQ$LrH*`W%hBWT1$h_ =j15XcEUTz)%iXa&6(JH6|.W3(^6˛bQ*<$JeVAxǝ{-@$pFt]g%0btNt=5kfĠ:]Yj||1c&Utbq kX 4;J!.@XM) Ċ@ }Q+B1CɮXN։ e g |tՕ+ M (41V1&:C<*3!T@G8nk(e{G0MY.+?I?jz+ƒAk(!5RۼmUtkCj70衐ܖ n6pWyeڶX塝ڗXTgӯ'O햾RpI gi'*LyߐُtOs& 1α=XG7ztq( nj0ǹNe% z:JRP\k] .GZUwKM7+lE70Jk1nz0ڠpkZU?.(&W32D܆q1Ɔz6Q$ý "E" %*ܹ[Փ}Rln Gѣ۩yr>(CGTvU۫,.BէzW V>H{[6_30h-c,Fn O7p6$ _9nE/ʎ|#P|;_`.y 9qN}}q<[-Uvpm 8&077pbS^e6P+ GHh]=q쟼ybp/;==lL w ^5 8LhjI}1x_gZ2 BrM>؇ l%3*8wlB1E]c3s<tQ?[D?b"ˠnK>,eYӽޣ#IXTHmN!+v?P䮹v}䤬i:]>$"+h8,h%KJ br4::k~W϶ۤ>ЃըCn`@n߷x 7;ˁFHۼXpg(|ʷ}=ŪB9m? ^GHq,6cCd lsG}Osx?~W endstream endobj 294 0 obj<>/Width 382/Height 291/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f DQh"%2#@0G _#  @e Np/ _8c?ȷ<4UDvG,<1 5p M?D:5ᵇ8??ȷGdrGy<7r81k`xea_ j?_{!GGE5BE?_A5_ EGdr#9?H_cDpT?_!111d[Gdr#9##$>F?cc!###$?-S?@5CR&<'d' HxGdp=dp>#>Gdp(A?C8/;#/,}/KI/}d @ endstream endobj 295 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 17>> endobj 296 0 obj<>stream HWnH}WcpJqbdLgyqA,6$QCRs"H&FP~=PƦ5{n:3b+{ưHk(3iBu*X!P6fk\G;Xvǖsi!Y>!S]-`6YY*&G%PNxr%IVůůa̽,?v!ck"|[d"I0*KJ1z+f?8K c 2O&Y`߭_z벳-ep$qiD6P:eB&(oǔevl>Q>\j D,0iCOx;+.m3.g#AՉ'eo>;ThIcOsgU-VYCR,C¨z=㶺VWkQJĵ:ZT iʰ-̗ٱ*rQN%ztQ%C#d7;lmk2?mVe̖R%}*52ΫRVyjw3uV`+޳t/ڜ)Pu!ʟ0/aڻpQRstQn=qW.4-u~xڝڛnBN:brHj ӧ2-Ymr_Ї; zL0NXo'6n\@V6nHO #7 @Tnsΐѥ6>oyu;[#8}B5ε,ҬAws^* Vj_,D᜘biG$wﲲ$ct%ĪT7U5kD}qNAh99b0XWڃ}t4 QH?a)ٶxɞ*)CEҒ37Iߛ1^ D#:UVMYǸl11BgY&hIXe[à`&/i@H+ 2a"j eKg~h G?\߰e儔%- 9Bvlwu2c 7[oXXP 3ܙﻢ%^(Zom໧a,Ԁ A= J<Ćtrf;-;Gu9J"θ>XIDObp-p:kX'|mn?Ya3d[NqrQL ɠulRuH˿{K>ɓ endstream endobj 297 0 obj<>/Width 419/Height 319/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &h Csh6ɹvLr&9ɎU x2a9k&1‡&9Vl'"; t0P@'q:EjL( D|(#_H`~=?4@"ڃ=?4@"ڃ%Gx G 8?GGGkam[MzL-Y@59 \~ =ˆ@(_Dѐc?T@ @=H _jjFFd W#!_r8G#^R8*ڂƼkU8  xiUYWr8 Z 0F8d*‘#~~7@8 G+},gאCiA?".*?K#K  W#@?!W#E] 0h@< G cz___~ߍx U G Qp}~C`!9f!9fA|G0AfLrc&91ɎL|&91c ,t&91ɏ&>LrC1ɎLrc$91ɏ̊ÅCgr\hrPC2eh 3 k˂pC,sFtà0TàF0"@:a0 _ a$#Q~(@?A" C5@4jÜsAM˲c91υLrN sh6ɹvLr&9ɎUGa";#x#Cچ###<HC P%C|{0i2>E85LDtCA5=G?)x#H8쏭=K#[_m506C$@0ܸdUA 9@> dԂ?H FF?2#!_#G_אH F02_~)Aza_?_Jp_}xej_H a<0 G|W_1xr8 GVG_CCiA?KAJKR8cp_Aqc~51 p5jG.p  F#hx?JJ //;kƿp2S_ A#CH#l@3G 9 4F,Ó,rcaɏxAeL|,rcYcF$91ɎL|&91cɎLrc&9!ɎL|dR ^dR>>?#2CʂC(sA8!3\\˂c4àFP@:F0A:a#t?A _$#%vҋEa" cji=k endstream endobj 298 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 18>> endobj 299 0 obj<>stream HV]oH}W}k0 Uj'R)MaViX$T6i;il9̄o:I5z&6m^u^f\ *b1l$j"'M᛺Nw¤׳9³9ā>m wo/9nYIA@rKI$[Tq!*bq:x/OI! /ȯ1jm[A4 b hh"ıE]Wp*퀳G'tOc%ZF OvZw'ET9#ԂIι}o0H1a8tuAjSe5&?BZ@ʾ`є*LG\$[} 2_x͋[H#1IcɇE˅(֮ ;CcP6T=~.;Fec90F sƎ 60y¹cdAJJ2o' +"N5fB"aG!^[3^:ab]Lu9HZl[pL'Q`a3Ik[s8.@OTimޗ9H +*ᘼ@ fvx#}YoF"`RxOv:-tiQ v9[N>&__b(";e!|HWom _ mIG#_S'/O u3La NȱC:% SSL$o6HXlIeu+RbZk`R0|.8CwCcJP/R̘qVuq ڛ'l&K` aUkUZgM-"R`8'kˑ^{]QJfYdwQkj kaYUxOԢ@ endstream endobj 300 0 obj<>stream H1 0 dN6PLVzvfXxj\ةࠠi!#C] endstream endobj 301 0 obj<>stream H$1\UnB.d]pWX8E),VB)H1v.L0rD-R2c!4]X)R;8R+3R0E)JJt_:&TIsi!JKi%KҺa:K2Fj̚P&ƍ ac+mwlkj~ڻư2GIIiRHq[M|nWvRNd3,~|-ܔ|>s5>>;x;yly|zvv?OϾ|/?8/{a^TϿ:gy/oncGͳOo!VA#h$JTP ZH'bRS15f tR,XBťh c#؊_\ sa FF>stream H[LYkIq^1yWe'Oƒ:7qtD3qmeap{ \C3&2@Cp=PU}9.ݴ};էw65[5[5[5[5[_fؚ 6W0f8KjnB˫')ٷ,T8▊/LΙlRg~S5(*^J˂4CM;1sWٌ mr)/^4"6>67'260SB6*wLj#LI"Z͈2>'~-Ti2Ĥ~ХG7sH[1];>0;g温KPu8 -a$ťfr]%qJI[ccz:#AvɄr,ػ"/$96hIeۚ՟}4k~;e2+q#m, !(0u 㗠ڀ-bTcPQcf߂ad&gff+ʔRf/=c2 %cִWmVjɨXJTҝf53:O"28P8fJ+q1xR-4UShc2՜4eTGHH]9U19"h̩;ҷP Sފ?G)I3c2`C4öB:<'ne脱̟Y6ٙc:B2l4aBOLn4~bSaFGbMNQ3&%by9Xk]@lT5gz''~i:NIh*A,X˯u\4*_i: 1&q%KJ$- OL&ۤa*y7_ )!8)Pj iI :k6M5̠`?zJw+8Ycn7* Iɏm+f#I r",JX6HFS~sV,EG;ruu`A v۸a#l{X/4mzq送$ḬZOhLV$dbdUaׯ^|C{{z}g~~̙N>uԩOOfƇF#]wB7;:BP(y֭7Zի  \|Q~_r++*zSX`/< G([ K.UTWUꚚ˵_~}%7\rƍ`0 ݹirjfv~O]HD *! U^z Zx8396D#mmmׯ476za]]TYYQQQ^^^/4h;~=BP"_/)/FHk`z: S5%D#33fϻ]Qjģ(3^=>NM @E0riook#8ȧ4 \ⲢRЏp:y6˧gG#R E*xJ~IjPRmݕ@=!5 D) "wc#c#9EK䙌 IM~3Pxז^>yxna8ElZ BTSV _++Cx 'yrᑷMZ.UBS\Rh0b %bR;i)Ccccc#.%}#lش7H /HʋGshD7'O3XYc#!"]*_|< T s.2TC(w&JK$T}_dRjkCg!7<<42Fedxx¥%3!qZ]÷<[ild0Fh%<sڿŪUR*)_)AHɆcAf9fMpr"Jǡ0la4Rj@G#Xo0 ǃ"8%$%F͵875% H;lC 5s]fAB)>z!J"x$ltdl&fKvD"1qJBr0QK a_ *QŢAE qBDhl)81$}8 bk lD&@> {q*ǚ`[o^+\ TTPIWWTTaD2)8%) Eh4{@E!1 ? V;5tR!>; ``G ^!|K?D`3 ,N` YR9$bBJ<'!^(b4QWN8 w=Y"=RAђ"Hho~ AMOxO򸅦  fx&ںf lXy BlR-\QIn`T o&kjLCFE`y6.D28"ԤvO!?ʫ {L`Řڏ0\>D>4;`jj5F֪~}Ϳ /FM!0 iGlO}*BlLB.#/{yRtg+s9\'J$$ ]ഭHXb$rI b!D{:hR$:7U2}]ZZ2ш'6`Ͼ|oBB⒈Rkr \HDF㲈n~& t1SlaK&flF5( "@#_@zG)hݮ4ҐӨ8hdj<2#]F\~&ZyA`ÇKm]Zv 1LTzƚj*%ZKCHRh0|?7KNLjpQOIyIIN$(]LgFޠXˠFL A죿 x=2!IC3BЛ00B a0^bcX6,(F4%)/IRRW؆lGߚ5f.:n;{[gO>9[W qL KB٬yh)$5h&ҥ2! ZZPF\>{:B[@$ɰ F$k$-k`3>~F[(¢VVۧhR[SieP%I@ALX+LI\uukԯ֨`B'=M\%9u_>h{4r5'/=[-U \+!#8cX|(#4dˑy9F% :FG]Nt.l/$4!1s ӂϾ2)*!xL6/ Cqu>#@Cά-Y'M$&& WFsa؈A, 6HþlgE I#NH v#AtćO!i׮IiJ&y:WDXq(Hx4hƯoBe$D$G v]z CiPEG3e+HYdmC4!"3lQIJio+&s~؈I}ҁHۦ]n4dԮݼ Xt8FH?k?\{ "NPN =Ե@%b2vsd %e|.Z!JiN}Th{oDJ$uJH"GLOH>(ڻ{??@U NY<оt<س۰Vt$/#f0ZF|!9X|.K(0t  aTRڊnw4("]N߹e5!Q<ʹv#,ѸW^wU.2GV$<+ERRmԷ@'ݱp ##ˌGblk(k a%,9SDO<}SK٪rs`24a1kƜF;i+<ohyRcUJ $G3:Q ^O9b>hLkҶ|t<mܬHB eJ622$ۧiP [2O!WԜR55tfajSΗȠJ'*"Y"5:l)` zmIQ1Ҙ=G_{_ =C[=Gt/C+aAuklQg,j cd,VkF1D2KH"TX$"֤l.I7&,'o#>QK3jTII< 2^uFˆ;ZȼȈDVy͔XUSCN1K*|R+Y9i'YW/9jo?b#S{r*p!.#fkz=_^侙8ٰp%!I`~/Zļs\"NgoMB07, Qh|~A]Ze+Oy&vQFb\pr,a2/}j'REE(iT1x.JN~TcצkL}ƌ%׷.ã#σum ݧ@ɟ??;tc5~˖ Ғ5H6 ~ng]|?ؘXhL -봂\u1:NV!&!T)8``rc#trN#<#qgm[' z-F}ycD^oMK#e?0V!OҁDBKs!dCoaOߋ߆|T* 6|j! (ΓS3aJ26lkkFҬh>OxX}0)uG!ծXCRX* @jҠo*=?C]Bnzi1j7Fϟ(`qŚ]'dhׄ;f>fC1IeSqAGF]%ϦTr\(dVev3[3tlK~G}h9D[JMŢj6 D>fqk $*I;t2֣|d PUEU.\6 +Rٔ e_M#M0xbߧXްk"yO=wm~{]$鏿=lBqd, M+ 4z3@6Z".SX~)׼IMÇoc$tE$ےB6:`hEﹾPHHX~Y r:0VKQ۟[-w109,V:UD4P%Bh„ݭInSf) ֪hp77]Z9~_N$M93bRP96 lNi:;t ǽۭ3KEM.d P$ElASRMz~ RY+ `O DP EN_ zf Qc|( X̾ @& |a"<"xwiNxF~<a4[!o@dV%f[fL]=ח;^? YYZ7 U'{^ Ғ4/2 $D)2i,+@'LV@t  h&ھ֖lQ_cIgG"1NfN"WA8#EAh.Su#Sap4} <[_9<\g I|B6ÜU*^}uA}IEyz.9 4vuXΤGk/CRe0C  @!}8m:8X0(*Nׯh@%+ :8!NP^@`!K_gϞ!te{A$<+dr%+c5ZeoIQ:+7Z|Y9U'NpVB#6m1NJod XtymO e}lߴ^؈+O7<&DO25Bٻ=XJY8ٓ d"HF\TV߲na  Q N^H4Pgo* Z_EƜG5& _sf&Z) :>uzAŧ, qTi1l!(_&A ŵUTLP8D^t]7"4[.zw>"D_ a mWBflC@S ۩+B2( DY!H)/L&4i xT0I%kjV;sSƦimͥZ0j}$?IṽLehղX5/?e3ۮU-Z !4>Z(eL諠bW-h;<4:!"emѾh!Ll.|UJ(c_f>JeFJDZfaED1+B Nчn+0:=CTLL20Tܪp0:Auug`R$7MߕA3i̇-Yɻ!떥] S"4C%Ә2St+:/ AhRAr4r\ޖߴ1eO %i~ o0X4Y4'l#c؁֌ QhM&{H~P5BT41/]ն+3&}j aYFt&s$I"T4`[GO6a!ūW׳/o6?}𰺳QqǂXV! dHV)ޫj^λ}6iI! &=GbeTFwF#WM!=S#c0~B -'Uf/~aEJ|0b_RwZ [F!!$(NFh5ݻSXҩya]~}8<{9E؀OĕChj&E^Gm6'/|ĺl{QP(}(l yg5ЀMP!c4AvM׊żuׅ,-8j{58)ᘣ߭,cm7;\z#]\݄ %/el~Ӵ{|uDo9ğ,ndZ$ƣG^2q}Cv.!nk-`}Lڙb:=m.Cv }/Ѩl "-$[ ]'WL(qha~'Ē0dS<۠mE2IM%qJf!AF|i5^_9yq7QGS2*z5Ymn{hKd kO? 1ZlQuU|܌{/ Gc=bjIR$xղcVn^fD2r5kd8 ݊4YJR;ϏiG rѕYQՒ&.{[\ă$IBS q{|]=D'?0084xޞ|/ؒȷŐԺпc=ZV. f3IY "y}5<d YZքţvAʵr:)""5[Ʉ)JʨutBã·F£[Py :, <9Y2m/WJ;r޶ۤݫc6k%[LZɨ3LBݝ;dF/!,")DTJm[NͪŒ;Vgh ]'4LNG"SSSc#=K;1(\\Bq)3Xs6ѫvO%{RMFA#^hbyZ (RS˲+ħ6V ÆN^2HvdKCk{gwo0?&"H4:;;Ech42=91>2<rql+KKӃq*##3' bl뫴RWB013")7hHDRWeYEnRr-Upq_5\;|w  Gџc?Y_įq^{c]5JHFkbmAqk:f 0iokuLڥw#\ZFEg|8/¡]!ݢDtrg66Rg8"@c2\F]p02xDǾ*" W%=ݽA‘֒#"QMy "ښ$ F#qJ'b&ǶJ @ao4_}H2-jhh?¤_CEo |Խ"S Q"D3  *Ybv Ok- FLZY/RM ]e >%Fti˵")L{T^D"с 2"BTI3v`Ȯ=nW#?y*:B9yw"x[D413KAC=<{CBڂqFbɑiDLaܷ!a9iOHL]Wg3$F,#6x "TKgt "1 LKzc(88<6=3[YI>! DD Qrehd,?ntzZP*DDiDXioV 0|:ߝ^tI7S^C2bmfwe| i'ܔ%U7\o&/'IDoґ=x 610xݍRQ HR?@B.hovxZ̗WʲD$^7@ܹЮ CZDnG@cDڡ(J&"e~]Dom-^ fW2GO?'O<ާkۦSL./@d1h{>G}HaFzEkH*vf!ATATΙ9@DĿ9N~XcȄ~Uȡ5yQ[ "Չح} 6W2pc##JӈP "R%u=J)ԝiE(|-ç܋^94 fQo[^Z"rDG*=8ZV#5!Q.ր(:)vA/}Ǚ"1$!UUi(]jI1Jx81˸6qjDm!~1b yÍ3Ih QQ)F8I r{hIE\yZVѼHU, CS,GH4f"kwd"-Mc&-0F\%ghK_5q KB_H*U0Ih6(CD:+E"fX&DH&VÃ~^DՑ0@V8=ر8 |\F5R<$цȯ5K4z-<үġm هk+ůQkW%5H$6l2DZ#頾ަXXh(/bc˥" H+q%B+ LRi"@Ν'3.Y?!^< ~zn ь+YO")2.$21<Ȭ!3<u$DNm42SE3v}wΘEIyYԣ=d`{WɊUΠ"bD<hC~VFuUqi5u=sch$=5]Z;zA y%{5z &'@d^Fyf+ɬHtCx4d ;VHZ Pŋ )+5΁&f_XTw,6 v Mo }s㓳,0eomHg У O _QҝՍC&ܛ5F"DgWCH@?`Zi"xX7W)t.Z љ.(lG4'wt0NԘMF74t^GhrkӧhssRͦGt*͏34bOg!s j#dk DdCd}?Cd˳ bT$Ξrb/2tFT!_\CiQmkKŅyu%>4:jOU D&8#}A=8XdU'\Ag}Q-cU=\5aFFlԱc;̍Xw`h,=rnd~h*:0=BZ{oX 3V0a}!3۵",R~R'^d\{y =n" VZHh &Y."Z FF(0J$m}-\ݤχQe33Sd DU_=Z!\X$#,'/ 2~[ ѕwXh6qY,F"OP$"_#BH\_Ex`42`-~ccc6^Αf#C}=g#~o#ye?SB'!:Z A []3Dy8qt)?XN3 zft oC]Of3 ܹ};r84 Pj>OZj#zl[0E( ҁ9D%$Wo@;'" ͪfHpv$447~0bلt a(N3TlGM@tfN w=l%Axl߳3S&&n@dz@ҭqVABīH(8qF$:3€2!jGh!r7KlD'Ӣa(nVM & R 5=7=7RϏ'HFGGRgʲz;(tC,z=H"A5tYLJY`̨|wo`W *4#E`1x0rQ%-))UB &]###C=ɨ܇PE D'$qV}$EZ$rb@"hDȢnd׿ؗPgJB!Qh:)jz+ɮ>J Rfp``ծ4Pũ2S!w._Q5_f65 u+g4/+?#4"#銦~ ^ $ٰZPKT)GjjڡX`Wޫ=]ښ: \@"=h3v1#9hdQl6IЙO} 9~Gĵ'?&?*3Q!ksS(92dw^{]zGsjnuZi9W5Z!"B©;H"])JɯվIte~{055"bs(`T))˱Scm$"ET~H.4P:4/ 32hgN?l.ZK=h,_pKJ ;l_ 0Mg)'0t Ώ]&NKlD]FR.Lqֿ8ՕUޠܛW#OZd<7oʞqi2*D1H `f }8pv36LfETijz?b{ amUcE( G# 7 "YPLv-_6Oԓ:[dL3ixmv sL8ePSiP; %%5 T*c($r BJ`^JFm5"%(#hU˘xpPPHE$fpSk'c4 *d/{ ϶s27[3gіI&`c5r=Dp4&.8xp4zzӶV>$Fl`!OH(h]*φ ^aZtNF!B2]A*9T-B9ׄf-z\ȦbL5MY6QDݣ9O;'Ņ4ёqw%ymywX,V(t<:>HjePJyM8Gm$z?F#1kw Dh΄/8:(iN I\Wtw ^>8V{gg>CH$cP'z)\aQ}kDOJqwgdH:i^.!qDE("tDMX4rflnhF0B}'#i֕@ s$JPκNP 3{Ln&@ >ZZt:$=랝dvło2BȎ5EǔˌB7 .E?¿~ e~ڼ0Вݭ`s̅%c \/-_hA֥S$q!A) L."Dh!a,)Z.iմ+]콘w9|5a_CRR|CYMkD"wnQىl^b>EF&LQTa3sːՂA]\у,$syL=ܸg=R3VFΈ2LsJ ɤ!!Lay]Zv!g!U ZY\T2hEǖeҼȐ(r:0 e\~P"C)gn)}ӡuz&ɦ8DAazNXDC5X Úxa%-1"KΠ7;|M<\IY /l~iK'? Dwu[dqjltN8#Bn1dz8#>-(yVР[`7$:BEVW0ihLfbH*Z%It˱0UdRa.LOϰQO E1! dwA' ' 9s\br怆I1wTiƪ_a/@T DǖW (alGSCn]$'플;A% !x&vpD\31ׂMϋ¬(R$,wahӒeBU"v YA#:#N}q0bH[ hPN #i: b Ǡ C:l] =ycuı!@R]Ū:9OwUDV?_kFa6mͯ3qQ#%Ƅ$ +,I! BY`Pu%81  .OggUC#;_~΃͍5aVv1i%ߩLN2bOs L&7Wo nѯm̠Qk =FͫLͭփO:-;f7DΗxѣݝ-0QN;ˌP# w4(92$)'[GDjz=z=J hݓn2k@ b Sj)h+5,Y/~tovU%icF iFHµsݺb/n€sNw~t24eϑC&w`D3бC0_mIe%Ѹkr IwuxݺZ*PpN{!uX]hVfLZ@6!9ZWx~t4j+hL I$sj[Hs^+/ML5pJEeA{kj@ҥwCVG{ONo?;8 25.l+NɐT$ϸy)*Sգݔ("F^'*+L48hDE&JHb@Dh@䊈"W dF-PHR&n7%N!rՅ)3+ckAҔtӛةUD[G{Dky~P.ϗmïXHmnqruVZrFZ<_p*!alY9gƜN32oQ쑆|e-9:_]?/&_ WKM|C>AGBjwML MaXĖe͖M-kT_`b.HFADei ̝{gRx?̙sw CݿC-Gk $*C'!@|WBKM ]`2FB<(>_.b4D/WH 4~f c1i@ຨOCTh7"ct7>Hos* !' ҁ.CҙHP "F=>_0@r78:$Mc#5!z~0 ȡ*3N8sf"cEby-nH_`&) 2⤝6qz9* (7Rmv9pq4PiB6@H4Et:ٝLD( ˖ b?g'DoH8`6D"BRM[Ԓ$FIHKj,ϷM*A61e&YT= g-g[ihW]if2֋BA F#l.n &MʢL$< 0JFyD*鋎HVjH*no\q(B +.;d R9|Sܳ?PF9>W=rj{> Q9HZ1^Cf_D C}&-9Rc:p4Ϩܐ`[I0UW`VpmxٵproDrg1+ߩB#6)1L΋n{.!]'qρ # *Tx4M_Uw7ڀRmmϷkoWPB]Lh[. 9(C d7Az Q )Bbf;vJjnooq,z8Fs1y!2q 9hCط{{z]FD!W{c1$1qP *w/0 U#:RQ$mK*K׫q:f=8@PÆP5O4QN |888Fqw9vM%$PKN%%%%%pjwҥWz $ ON?[B3HJGH8S76x"26 i1ZRA"5@\u0Z9a*L @*q P򇋫]1P !BFFF"'> ۽J$yzfb" GFu^V5HH:ڳ$)V|bY؉L-F;T\{QSsm=B@]]C8QݾCA @QLNDѩمE9K"c xi&T[T4:1 8E"T8ꗥv:ۍk׮^gH?} y8i\ݧ-Tq5*ѐV2s I91NʚԴԜ!vD5:.  \koބ. 3NHd22N=]y@C\iфF5i,k~mv3`<~4htЃͧNA;pƦMGtSpFMff>>^ν8LjѐFt4 ж˦Z`QtQ9Ӡe #$P:BlWJ_*q $aH0!ꓼbhsB!aÊA_% Snō>]9}aً2/ 񯆀 <BH"MxOgoIoH}a@RTvoк 3ap0rf4TfXĒt7c!ɕd؞bO/B଩S BT8&ZGLUe)T8IYeOE0+1}Z?y$=6k"ͤr(fnޗV[/"Wˏ|t 䇅dtIAh8[_?ЏPBn%~qVR>BE~E[U/4~vj8.+,=]b5H8"ɝ8%~AIeTjR H>~(Bd}]].Zur25 endstream endobj 303 0 obj<>stream H׉z( PMܾ f8,]⬖_h\'@: иNu4qh\'@: иNu4qh\'@: иNu4.` }wVZ P,\/YTe _,q^WM}n>Lmow3kTq`woQ$Y` %SP}ɺ7Y^d]d}=\o m;D1=& 0]t^t__t_.2'ėbĀ;NׂA)>ee$hAsav}J;Ӎj$(FYKü>ԹWay8?b'O_40t ozW~|w$ i|,+ 03Gd[Z` KQ@ P<@^Xz-o@ sD(K0Ԁo?#C0{,/q5@|e@?o++|~cl1TiA"P%T^frC >5+>幞!p>S&$K. D=F:W n WU *sXzwD`o?y+o?݇~Uc]Y4\bz2لPJ@)A&} ڹŝE H`g`ci0rB0yfPI0/$^G$l*1,nʗ0V@"@b CP: f ,@iuĦ <#%' h09 #wF/ P|Dx (o& 3D`XF}\6Na-șQz+ato> a}fCi@ۅ4z!c8 $@!F4` 8:6v]8P@1t?0 F XMHF< > eC51hJxAw _ {X@8>ujY: >mh_HГÐ7hg:SX0&odA` #' <*C}) t#u_ FZw(wHKue 6`=m%C9PNh!p36Kh#(9 X` "p7> vI CP T ZŐb~jfOb{F=6$6bG n^BNA C8AchiX`NC΁{®'@72B9 sa ~VAzl0G1|RO؆jt,dbW@أ0Ё8ՓQp" T@8Q[! XgR犗  Qln 8?Pu=Fx !Ƨx%!PY۽ѣ :m{l!Hj|B+)]/ ,_%z'R?Q}6=@CwJ@`} } m( ZR(Om x'XblEXm9 !`w4lC0^da ExX6'>.Z_h@`#CH@ `) !X/NL> Xl+a!AH shEkP`#XېL`}>CH7 y}HlA1T\|Ρۆa<;g&;9S_ALo'R@z h$BeN7J"@Wo)s'}"]C [GMj pې;<u.K ~|4h=pw`TQuoD\ʼ6!x-[ a@46]Do!} /&@0W%Y "8F}D9 A e#Pw0pF݈dZ`!H~P3-"1{ Z% @B}. <8w]Mh)33#lB҃Z @KEݥ <A"4tC.2Y =J>x1D7{ +@߻&v .,C/fHtXb:ЁOw -b:>8'S7q ,rDZ5 j='"<5,Ճ0stHYn G= 25ԉzL@D'bP p$0| `Nc7 }G{gx1 `9wmǎ[u.UCW }c0z0/DZ ,M݂?H4,V'b} @lWNlA2CXpPc!@k4x;AD|o˘=h/\9v܉bI Ai@ _ׄOiX1Xn[7tdz;Rk`j#O.\!x5fE `nEBiE7.t,0p3_QD@v?ۉ2 aƀ*o'dPj`J1T$~ \@%  @qB$0:` tXd4x~h$o-x$> P=@@ F.UHpX Fx!r 쒁Xb"(p(vQF.FM?b">p]{wsd ?/J~JD$gC-~()p$})6t`0˽UI0݇Z Ą% E / ^, `)pT}nHx H<2@x> i!?4&:lEeCjT8A'(-#A/P!@ h H J0#CuZH[@(@@0h ą`" onQ HbPz$ \ ).O :@C@d gU@4!\ Fln @dA^؀5ĒOU M f 0d9 hj Dx&v 0{4 LFFa$|q 1E2`9U? 7\y.%@ @@ǀd+N!q"@~ .-  DOq!l.#%nH"iAs1B!A nH4A AxcBLvUlA!M +oIpr{c=4+,@ u8Ao2b* D>Ya@`hAؼn HȽ dMgϓ3exzoщ" 0d*!ׇN-('kGkH;P;= #D4k Pk `Uܣ#kCԁC7yH`"t P "d{C) ޑ"UQx K]` @T2l]@Q5LchIq%^\g` TS1  P(QT(c1ʘeL2ɉtb&~ICUIͫѝ-HTGU&ba񴀬[IA%':z{DHJКq{]#@$@=\4 h :MKz .^:0ʘeL2&@ P(e(#O endstream endobj 304 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 19>> endobj 305 0 obj<>stream HWob-Ajs 5K/*CxHIEv}(rEg$ei9;f͛]dtѐ~͟vާH,|$$"J4I kNb)"mi.ټܑ?x~y w(q #%~~3)ad‘gyMu*G{M땎h$̷7/7o7o22{z5|M\Y{ kD"IdM=ppź".TL(֔2ۂKnI&!L'K\HH`waĦ iCY{KdEc]e;IJH8$7I8{$.$Q,W xp*cJ#QdmƉb\kf6h2JbXx˲J +q&qwM$]Dk]47]VyDr(N0Ru:"L7dKQq܌:80N3f/)֙V>GLOAn2b0 x,JSM*{'mgIA4cq@0E1sM¹$@涔.oqz=MTK\=gہ͸/HQ( lqlDоs( ֟<14G}Wž?멧yA t4~:,(G;Ko|8}Zo0-@sf"inkxʒ iڒ>6IaeMo쌏9N{;w ṽ{OML"FkvFxxg'6j$advt f<fSag8eT|I9B̭E{85V7m=єp@\ -ŶuqWD`]\&bjZvuPq.Nn0 7*D`ocY|y"|xwJt-()p€k_">X-P(d|ⲴE5O u$^z ,M?; 5(:NHk+UST)h$ʸ>P];VT lls~N i䳢}"Vv-ty:h;sҌi3iFS[KA+[>stream Hb` fhYymkA[/e? F{| endstream endobj 307 0 obj<>stream H엉VH D Mnm%uΌgq=hԨQF5jԨQF5jԨQF5jԨQF={տ)[~q(*"h׶/ͣ)[V1#9ڶmuoɶ٦!UX_.GնBC7L!,28*򴊌2ӳ $I~Q˲h|N jj)yw9j!ro$BԴwcU1y#͝5M5ww$GMڍ{'9#:skͱ`R!L7,2JLc/O3]vpr>CHiޡ?F Yb5Q4w0|aBڛxyO; ^Ur&l$r:15ɁgYjVkzc8RdA`e&w(c?u) K 6=X#uQo,:'42{q]E>uCf,e `)Ce<{^T:V:GG+1rˇg8w?Iq3`5P;yv%1lܐTQQy32慑>ؐµߚ&lh# ЦvqP٭5Mz]&_!_׭jtY7z7" gvc@jIuC% YOӐJ'24%ۦߜ!4$=CrP6H4ܒЇ>sO iI#3ǂw\x#IJ~\!{Csn8Ә3vot|솄;(sؔ+[GO??+x^bz2b$o䣍tvwS]!޸lPs`2D9MܔuA=wcș7I 5'+K4B>~CLAr6C옄Tt3#ǡNCtسy 7$$L;bZ\i}샏M66C2c9x7:hnu`_ZR!j@Bx: љ7i(*[FǂؐY6"{[71S(\n͑W 蟖cC]r4|v!mAl@=-eFL|А،!f_ 1ɨLoi;Ӹ.yQrJhXNJHEz;iܯ1ԟ` 91 Cy'L"}E3]8M:G֎ ;aEȈ_1z`ܑL܍!\Hi5 usmelCzCrMz HH#{t<3;$DL FOYHp:إ.'L1b҇C!!!k#} Cړaocwr]K|butQwDOP 쨕9+c>=xK!'iN荽NMv8 -O3w&䄼s42'GT? Bҁ=V= )#=5Aymf'816YUldBwe,A`禄Q&jBd#=ZH=~{*Fix~@΍2(q QC!'0y*&sc { \[zw]?n :jx^߅XcF +v_iHkƷIp G%&dӆ>>)cL"%6)][ ic] rWNșv-|nUO N5\&<$͖[&|v|&qY!#<~_]ś!GcoGزv{]4ұLӉ|WmU2F&x%cP { >q)^51va~5.M`gd6Jl@-KG)e. w)w ]êUJ'HF.Џ6#we"kIݧqcͿ=5u//ͰF"]NS2luFҎuޒEɘ #=])h>( .*DGDKa#EfL9h<0!:v*DyC+) 49R~Guň?-4#VGkRbr1e)Mk(2b3!lUYHllpE*C7;%7*ERSG45=iʗ0``= {a@rvE;q!E榌c}x`S88Kؔ>ks|lK܎ էH{ivkJ8Zcq>ΐ1hD^"{oukyc\m4bGR)QHֈ[% ""V]Hi̷$;(kx6aj[|jE'Юǁ}C l6:5vӔK5%O/h\ǂFQn=BߙSco9u=i|̢$'6M?Nʘf57:P)ΖДh>P8ɩC-x Pب奊xK)ƯhJjpr#G$H 4B3xꐷWSr7^"r}LRҸ=PiG 7'GLTqT܂S-;u!6F(>oJzVM)~"''ܐ3]|Wl9VbYLJj\mZ$D"ERY2Z52M[ ӱ8տeďs أ !;_%qg4Z5P;Cz=H`6\i>btk髗/ECa|SPjԘ͗$PsF2k׀j]eIywP$9M0A,$O/ ppbyL-G eP FFIUT!~e٣hS]"7уĪ1w$=']55Ilt5eAp7!NTe(2Q4D5r56G>^1f\ ~SCiNLwDvcUC鋴o`R9 P#ʝjuה&M5R: j0=R%phMi2lCۨA7.۟+Y +P7APU3!|Q{BiEWddd9֋Ɨ'9ס ]tAև9 cy"Ćm`B8`atS{5V-Z,^@ ?$2hPˤ-EqiKb\>C S"G>|.#XCi}Gzu&Zh#@:;SɍoDf ep+n1F$0rNyL ayA=2 ]XeG 刣a둡q(ZFpU|N*OsD yjln5M82TC&caE%Nn"9\W]׊Bqr>vH,Ot^Pj ֋RI G')!&Njt18"#Uʈ8NXa j=hOʔTp$C>rĩ=ȇ{М6\#>J'Aj/l!76;pS(3$#3GFEýXq<&L'Hhq_ʚI(sxP8n+f SLߔa *S34d㓄c&}|1m|T*JRT*JRT*JRI endstream endobj 308 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 20>> endobj 309 0 obj<>stream HWnF}Wc 8˽h4M7n" hie3I+_JLAd͙˙3jMjhyYn҇H, (I pɘ)H.:othp-ܽ{wqu %Dח_ܿa >|P/.h`A m{|e G$rF2_?/-/̿DmV/)f^_~w:&Jx%T- $ V9)\?;73;k`mH2svJbJty2SJHe O&m-eSvyPua. q2%6*1R%mZ!!VeE~4{pM*=֐.6˄uiJ$00jJ%(3_:fIɄILq…q8' Fᓵ +uuMW?|˰^l`sg#][ }3H_zǪ2&H#`13mR*0#8 aQqʹ)4Iގq((7ӣiq}z e[թȧmF&H ܗ`XB.8-.41h8UZ8N,rpا@*-m&acbs$3np=j"^tAGhhxV~INT\ďdGwpJG۪|{IU}[PƄ1'Ps%k(nʧvk%qMGB!k=tu$nsA#sPDNCjmUVO˻]U,m؝ndO׼ ·7wwb%1ԥ"\ 0oHqRL(;@*q?>}ESƍ((,Jh 6g_v*&pwsh6=~4, {m~z_2 _Sȣ,xm~g+S7;eb"٤^<,D7CV~1D32{(w1{+F<5w]MSp}L0CJЯ7񿸝nqPCpŤ|JDi|wmH>@Gk| w֧? _H9n??P76ƋUY 7¿+i endstream endobj 310 0 obj<>stream 33f33 endstream endobj 311 0 obj<>stream HWrm飐f7q EN}{f@Npŕ`OoO 븎븎븎븎븎븎븎븎븎5IOS's6 Ix8=ݞY:^F,b48+&FςnEc[$a#\w|H3TG-f5H)~_s. :µ~x>oC3nA$^{H|x\_^՗>Ie<$)Kgwb4@ }~u7ݎ sT Χz^q|+0/H|hT\o6d♂ c^ր)kS/wMJڅR6sЯowqH\Ϙ~pK&۴eS?WTAzr,LbW$0<7w:V&Ts73],3 ηxrCFggY˼IيylR^M"7|<8_ד .w6\7'lo_>şܥ/q<dIw|#&IO:)PO">lΊX1@]RuF 6</+90K\#لT8jyE8"뇥+Zg^RI>xᭅ)O^6nf,fl'M<6}*;@zײ~̝?c p׿,-y䒔A3#B۠s^p: "pjRi(ce[~k8]-7Z?W qoI^sQ92: x?"J?x{|H>{BY]ԭW-}C;vQ cC?Я{%fП\FC)󀣖Ls~.E<`|~Z>ج>|urO Ļw;mFH 1GL~nc>|Kϳ}~~ JV7@.͂Y׮cIUO^~۞,17 6>.`EPx _ o ?!рꁛ%ǬuSc}Ixoģ{+N*ʥ-N݌{WO1f'ޟ{Pz]W.u f#8'+!'EM2:zȑsMZP+j]M=v8`ޙ޹qRH× ^= Asdfv 47W}e,oЩ*|m=Y>@ˬG.! ].s-~-GO=Û_a-ZPKLJ][Ob9?RZz +s?BD]fa>_j+)[bWրWz+;R>Gv%63|rθ;4wPH+Sw/_c;X6 PZ=fcGiDB:WO؄qR5Nu7v4YZQON;Q) LѠgə|/7jMXoCdAl|XBv"3^0 pUS3:z,;ge_1o֯9+zLGؕ7<]0 5RzRvRU [A'* W{u+l焥FjD9Wᙹ2BIO{@kU)4xb2WMOP2 ,;i("$i=2d=E=ܵ!Rc v}k78WL5'Oib `7:Ox'+Wޕ޻Jwl#?fا%շ7ܒ  <[ziaZ~SZ: dI:pR~|ܩ VEZ}ԣw` S& /o{fކחIoiI!;rInO*cko,e¥ZRH"/ᤍV.$};ރ,TO ^āSERЯʵA˰N>ތ3=/O ;^>]W9I&Y|gT#V㩮M'>xk0QYAsRPMJ'7 -ҞjA=&O@V;eg>|{ jv@KM!绮,szXz|$`,|h7^ p2^)~4@DownG/}Gq ]0ozz= e #;ŇwCٌ4WBvT_$YAyy~+d/[Il* |!k loF!} V.z=w1|Fyt>Xˆ~>ǯ_6/3cceYo߬_3̓]xGe,>>~X_g\b_}rt  Z޲!U%#wW pRO8:{²3I OX`AIKVrȦˆ,0-{mGR2=wRy{,jP5{( |=ߎ+Y9ǿF'Ks]Rhާŷ8ۉ|muF ?sq&,\<)UerB U 4# 4vv򈳠mq< {mNj=Qؿ< m tҸlmx떬wdB|0ef䩺7(&#f5}}d = )FNT/U3;W~/)yQR᯹_mG-ܙ7:; xI`ЪS@CCp]_oa؝b4JWBGȷP䵥|ٰYɛ,Niu.d|)z搿I|"Y+iU!4kAsQ%Sre8_?n?ƴځUZ%B-ic&0<]ԝ/#U;xIH7&pxTGV؀YpJ+9ɟ`!Q}:v#9YxMZ[}6삜m _Γ" t GyoƐt_i?Ɯ÷*q.H>+|)b*C6PrHMN,.<RV>p/y*z uPvu7G/#3n\9nɳOԽ2{Î+u3҉[73aiK }ze#5U)0+1s؂=bg놁keC/hĥ݇piK&ﴜy9o_}L{boIT *=-^9d'WG&k+A !Y[iOՐ3Lvޥ\H2UPkjc?XGx>d\WTXʅG78*{֣+o7'Jeތu<g`5ݷnJ^rK0HT5dI B/꫱:aV"2Z?/O߲1'wc<>5cqOh>N2݈A1%4&]Ce; 24t~'Y.}w2N0j̓ڔ9/[<?*'H8gMH< "ML%ya:1_]H!99g@zdU֢b0-/Ƕ *Ҧ߸rFCNnu\@Ç"m ?ܛa52MK+B{@>K=*+,,1?Hw }HgZr{\iʜ\F^o-9RZuy 9Oݐë>#ѽ?co+u.mc8Q~=`쯍}!.gu9QmD/,]o{`}?f#`A!zkK0#}&n?-y5a!9NwDWOB/.~ÌT|#2#ӿ~,|>x"f\t51R^tGje?I/s'yA9j:c!g}dG4nm\|=|c#iVp3W.m֡K~p|_|S$-3YfOivc %~|QL=N\_:hQpc |-jrc zX+Usn2SҨҽ0|g]Sr@2ҨG_|$ǏOJ3t@kk?xbN;zҭsö( H  (`_ID촘/%(FgSF87ĺ'QE'ǎ]N; ~ `}Kπ @K?崭U &j M9L@O' ϭ)[!xBLCHes|Tp'hKKyPO]}geߪ/@>^zNK]1h D2cZF*ǯ+R)ؖ>O^<(EO,=W8RCKy+=r8(]2m7!׬î C,&+^hmϼ$)zi L@?siJGy~Vg?Tb)@+#QQ pmUCѵ0Ge=YJ8iSH`[/F!c.N`ۄM;^XΟ얫I߄//|u_Kc6Ycoh}WV`;ŃtB3$]ւv(Ο(6smk]i74 BW[C*=, `L3?[#{yUW7P MoiU-[lo0ͺZ\%Y2Eݤ 2a;ܗB!jxx80 cy M s% |̜S;DBiV2nD0/ R8oO -AZxVnFL]Z8>&$FKE=& M k؂\ߎkvTn)M?~s}gh|%eR+`Hr@J 8QDpUE8c@J̗ދX++X C4m[t|o MCS!Iҟt%%n,uM`EpId7 |jh.Cʕ Eyyl5 -qcDG.B*[< $Oiqg?<8vMOW3(9k\.e9?S(BZPCh"x)4Pj5zWT:.Pڬ&)5;7遄b#FjçҪ8K]X9To>jRX3bV26dh@Etr{FEtc+/zHm> OT+$D]kZz>I$_E *OS@u6 BRF0;W@jaHǢ8+Ǥ.o4gtϺBdp]ɧ"9LtHF0%IG\xscn@X" ~9PLǜ{ʷD%^I>A=$3W W3:GT)& $ U\]a&M+ !h8Nu8(4` ͤ^\=1i9jA'D.4*D;KWKڪeZ^ٺ-2>CucT`2/ ׉e~}Ґ I9!YjFrXQHl3OmN(Kb/e揠ҪWE âϾ;YcP*(G GN4C> L'o׷-dQ~h9@ HҐ۽^v%( 1lDGjD>TY\kY -17 bk IqO)##H).鋐dĒTpaiރB$!-Sni7ı5nJh!p;ΧXhfFO)uB$E@>jnQ V,uX͹fvH8x7̱`H XB>ēJSI8L'8t:ٻy̽4`N=9?F1;NC\G}Ts}cuKgf/-E>= u,2ZT6U 6yhF^`Byu=l}C=L\Ca`;@: e*٢%X7.ɔ7"nF%U]٪ȳ4vo'k(\]/c'+o/kWL3G/XScŻrƟZ?wou*R}[n[DzcV=W*ɱc4kٗCc8s<WF:bTR>>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 21>> endobj 313 0 obj<>stream HW]o6}}kHq( $uH.Z MXYUؒ'ɍ_KJ-n"_{!9|n^'O C^&/ _^[Ĥ-1\"BhAKAT#McE6O\ׯ/&0N`|3U#9=ztIBA2G$E? Qݽ@=hY)B1 9Hhzm̋bdq*ID1 x "CG >!8=מ_SK|RYQ*GuO f4ĦG;{I1ceX? HE):Ydݛ00(Mo#cD1L )82H-f.Kp+ 3ʄ 75dS, 9ϱ[=vO l]Rm%n=H[ mG)28FpfmvW6ܶNn/.5:>\~rq=u_9t]&Fupf EBF+kA ڮbmhO=W(@L'׷wp7:~ʩuG[>/Width 383/Height 289/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f 9VC ѬAo89( Ut/A~/A~/XKXAv*," { 8HGO\pC , , J iXK%h+At+.TY@^AhAh. (p\DŽ@ |$*A/K v PKZ ^%a.T XK -/K xKAvJ^Vz x#KpKᠶhpX!-.V%H/AizXKZ J^^AZ]%IzZ^it%C rKJOKJX<4$$B:^J%Iz -.Ҵ R^KKKKKK! 9fAr P9q4C4r h8GK""7@cxvAfe ʲ vC., !9WprPG`<!:q,OpGq㠎?h6>8m<|y0g5z#G8< pdq8Dh|G x`ˁtfXEA>V\_. - dpZZL VdpYR cLKIIi28t i28m*IOIi28)IOKr>#% i28+KJ%I28+GHezP@G6Io/t6#n-&GΕT#dpZ_ҿdp^᧤J#ҽ#I285XKIii284i+Jdp{4i28fm(#_#( &G "?##~iRL 4!/Ai287G@>#|4!JdpG KK/dp#i~}__Z^~a/@j/J?^_pD}~JzB#q _Aii|4ЎJt K-/+ . >/@w]QC@#@3G 9lAr @>(?2H:Q>xvAfe ʲ vC., !9WprPG`<!:q,OpGq㠎?h6>8m<|y0g5 endstream endobj 315 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 22>> endobj 316 0 obj<>stream HWnH}PyIodwd3Y$c- $Ƃ(K&uatEbK&zTl\6yv=_fռXx/Bk2J1'%SI%Xje𨪲,Зᨸ7oOOh0<;N/N_y=4ǻwW`8q4Bd4h"$ø *—ګq\Jseh#_|_2D??ƻ&'ΙVIK',CKڦH@ b{|Mlq:Q;8CUnimM#X.B^W٩(p6L F>լ|[mi)fgH=UvoYEYqзV|UPvWqȃhh:/WC g_VwvzwWEpfp1r- x2-ʜ&u\{\ZڊH|y\b9i"]b}T  u)A)C2V&L'wG6r Q`r˓o2Q81ڌV04d0+| ydm,ƒyc]9룰:'I!׳?^|8賛P"lkH&5iGu0@ N `ωHݻp r܂b S4ɪW{sC}7Ҥ,J W{^.۩f{dns.eZsQw<`-tgd#r$P"o?}R'ҸɖJˀ ,Fg<ѷ!S7.2qՄg| RGJIf} zk1nb~ u}_E7՘3"x90%Z`l#I$2>?i$k bI#m׸j J! ƘHtY&ecHPy5 N"9-vXĉ dDt23 o6.,iJFMZ-@\4+*Bo*̧s$Ķk2|Gs_gr4+aĩ8^wUC'p F(yڡ29(͖;'O)׹6l 7}>_G}W+O)I3֋f]jDX[NoUX]LNR-"ƞSA[Ks,ޗr~=?d7bQϗ57@)`7bnbr7ku2'=D_@ky1bGOw"^ ίzMGv]S -s ._ipTVi6'mNz̪9 4<>.:ԌQF CMHGUg *n gxvBx@كH'Dvn}Ȱf2qHb,4_ȁf>׽,B2P/ra7^/G2? ľ endstream endobj 317 0 obj<>stream H *CVP/z|D(":>_l2i:uԩSN:uԩSN:4%a. bp9fY Tq ;=@Hךm2HTAK\Gߝê~4? 2h.UnxZG}A \RZWVRV}tlgt[ݳss1\oXMCb&8Fwl(Wn9u'Ql+ ԷY+TwR^S [%XE/ fq=R(oJ1xml aOYE/zUaœ)$0.HN|ցW[Gw͟QBq-4yOSCO{R(c,+;f/5K/}j @8sSm~Vڢ?Łp7͠gnxuڥ4>Ԍ 5I333cn:B ,Rk3۪&w[(an@o?~sk 8h *?(c/4CbVXN|Mzhm^flz4[C7[}uM?^ut:=V:zޣ9آv^ЇUCjlP/Pow74hEeKR͂¬ѫ#F0+O+z"yh֚aHdjk"3VKlD{#3V)izs[FEZՏ~h4AZ՟U!"xcKh%!諵'=--aVtҋ[v bq+nfi7NCǯ@_#:@D(黎mT,Yp ?yj@hO8~ELЉjww۞_ѡv_#UgK?}C AS-ŒGNqE~P'f"acw۸r4}8}"+LJ@MH樂0h)qY()^:qweF>t(}LP^~ɇTO&вBqUn/ҊB^V}*CizOi}Ƅk0=FQvzu$/F&/Vca>) W3;@#~f'izb+(ԦIXSI/DM1&=uD m̗'鯧 1=S(aWITAg zŝMhpeGK aa<}hLO_LņO#gz3_CO8s3Sd](]bOu={hEo1sāSfh9qƍoSZWb7=IS3[9 '%0t5̒ff+ չuJzDAJ9) 3hf@WvǾYL)Q1fM(7'Mc a(ze&2~^DLd!YGB9,^$(a(fuiVJ>^5$&"v Ex]i`_IY7f "@w^=>pZiAVAvU2;L '!+7͖jmN :aE%1xQt8:x:M^;o6S \c:fn;FN{n BXQK\NRG]{/zʵ_V>}^qv)uh(!5~1{RfVO^ìYT6)+`i'ħѻ 7N m+"WN7~B ,:WfwE;۾B=q`A/= -d^zj y7ЯtZg|z'd'3ؔ8w͟޶ tZGJϤwRίS^^.hgfHkGpz:Ai&zlzK_AIнbcҬq6b֬m~, TPI[3\JMT=d-p; نFPSf=neOv n%Uز@V^]+ZԤwLpJkOǂK-Rr]IKSVVS[{EFQ ?S??~ir]sGG3e t.H)YNqm,LoktL)5- Ƃl߉iX&v{ނ1y9gNքٻSN:uԩSm/bs endstream endobj 318 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 23>> endobj 319 0 obj<>stream HWmoHtaHͲnV Krj\Tr+)8rfmfBty}gvfv<ĽNNcxN<ͦl3)!.50!€C( 4W<4O<>7>~l}jCyՆeB  R|wvKa8oF3(08$/́Q{>AH(/ U1DF?ѹDҼir;3} WjH _h L(|U+0:WJXi0ޔJ+kJנ=?eTJŬ^k~0f(.=40Ŗy=SA9S`Hc`ǣ S i2:p0^5xI &6̑kR33na9cCCt ~dH0O{4a8++Ѹ\ 1bf$+1jzMNiGg$ %Y8L%easY ݨZpCweKBF?XRe'c?O{i߾ڀUϓ^O_MK4j5hӌ-4Y2*)UQlp,r3٘V]!(y-wX& iyQ<&l0fu+%4#!*eJ-s(TU)\*e\FmK ѫą+}H JyN7Q8|r"B%fIȕ3. a0&%.LudWQHq:ݖApώ9=&G$DWn=m؇w#P;B?CXn ^ηŗCS\ 8–wKwۉ|zb nƂT (h|譆l1}zHVltsqva=U\njǻJܫc{c[FfJEүYwuOm:}:z+ B±W/;VݠZg7簀LۋvӰ2P 1HٻoW7cxY׊/x@[w_^:7oaQ~ClWN-T`%U<` `6,ϱ9czuuW%7g$R<ۚu~p@6%MK9YejrcЙ,AS@ endstream endobj 320 0 obj<>stream  endstream endobj 321 0 obj<>stream H VLK vfifQ#!:6$$XRz\AAAAAAAAAAAAAAAAAAAAAAAwKqn%O)Do 6Fa$^;/3 /Zkx&GyS #%ib%v *dIxUiLsM$՛2*ʼJRWU?GL x)uEOWC CmΔ)y^'`kE i\p\CE:p)L'.uŗi q#VT{]FYpwIwYUsF A #J+М>?PE52;Iː",>+PV!c?p 9-]cqKeZG*˶G~wEZFJk~ĺJ w#]Y'zDKSwWqܢK8>wп dNKr(#- Q:TT](wUL\A&LsUېkOWcm`ωuyR?T;=}UP˚EopG_ːƃEGWK`X9n'j2Y:k ʆulH]>ڵ#ו~i5#m[⧊2{Ӄ8Rdk2K"zBt-$U8P)¡yv:tӃ+77^p'{%c۳ zyòqXswQټfa }naӳ1E Ho-z "U 1zPg ٢]VwQ(Зha0\\k;܄ޕž+i8m 4t R5_9yplFB {9 .7JN{] l1s9=XTw;jQtEYuѷEl,Yw}W@RV B6=D~+8D]jޛrZ)n8t \6e? h s{P',w[Ė F+|w\@4㊼los^Ib[Z̮[0la~?_esWTp氱:FgZP֛اǕXÀU{uMѺ\42W5{lwNɋmp1NUګR4#@6koDRwd+aSߓj`[sG S{{hyUj0݆iv)PnP{f^ި$#'5URWrV=@r>Q` ޴f-B9<&5uUE ="@ԃsh^[q.h{-8¢  CL9g0Da5ѶGφt  w6<5uEq4fq9i P&d(NBF`- f(N wڦĖdI6|0}[mփPmϒ^HPTö&r|(hߔ+u0َA)ƺz=(l=s`y6C?v%oTXpZ4mUQ6 "ݱ¶q֡<Ö82Oq$gyS >lG$GrmCdTInliKu$C@ҦywRx"|ևco-{+?%~y봨fV~)-ͪLz(H'!y:M Jx\:&P,ܒYϋѵ0i~_/=Rgtq*u%Y_6X PgX70z7W ?W 驖8fliB QoɯR(aG(rf>C\'s])f"qh,(=!{ң!58ss Xw?8.f>g)NRi@ OBj[!FpǶҝ34 j;8CzG_tX3 } WgfV_3 =B 9(Z$,j[sz==_0DZoœ!ff~$ݍ ۃt.hTc`辌;ܯ~PS],`»IvJiX5PSMރS0eF+} 7g,.[ˆQjRc05We%c;V-09h*oc bTx{ףZ"AXaHy z Pg5iMV0m,Sa6nPk,Vd5X*G<_ 5X*18ı٭xuu<X* _7 - km$WEzqc7Q\5ZvY5_$XEL$EtD*NB Ee:"P,yi~:wu ]FlЋM@R*S#ee}-``~!v+Op{۝oQ8o s0"op7Ȉ?I;(VnXm7ۍ~eq\|1U?1GW!cX̖7%E3Q_=q(Wpw:_#IݡKh (*P#H5.jQf2ҥ&k蹜`n[[ʰwL8],pZp!u%,r|I6=*r=Y#VM[8tcB" ,N5ЕjmZ/y~}irKE=$p˱A6ϺD_"ke[Y"f;mpJB ؊d*-@9:rV\fε aI NKqcP1U1NY%V~5NNf%*g[1qZ-w(z= 7-`Q>rNME+0,t9grߦNSg3-YlrG >/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 24>> endobj 323 0 obj<>stream H[S@^qIct#=Hhs,?=2f%2"Z$YT&ypF>c-_33Z=TAYFx7n/hx<ǝ8Tw[, >;rXaaA@xS  `V7A!LvNBd^_1h"T`Qp)DPBQDMӁ` ] ΦMmÍp~c,zD|49\¯ǿ>|(+K S|hdkW~Clp:ϴm0o<<[Y?\||<;ex=&Y<}7hAq|0ux3M\8 dIh+p;?^w'usD)I`kjޞpnd;\cTɷ,(tЫ2ʶ%TE҆i 9|'{ X9Z*y.fyFEq {3ᩀ5n^hwTόVLb`%5ed0΋>/ҺXگ2^. H0AF8rKb Y_eKZ~KZ*ukc[dRo.4np ?"=Tw%:gٳ4!x}관Ȩ")[5iG}S'~qERsTֻ]WdƒR+I!YB݆_G endstream endobj 324 0 obj<>stream H썡0CE  K .-4 Kۯ t49@_܁^7flnDlwN<'⇉H&2d#r%7 ; 7CT2UJ5jV&aVq,F1Y,bM]|O%]IJ$eHUj":_h$M^ٌf6Yfܭ5YWklZZպ{g;v|{ A%)x)8}F?81GaS1~O X endstream endobj 325 0 obj<>stream HюI;0W eW@I [flGH @e!I+tuNpu[rNUu3 fn7n{bc&pgQ([ʳg},r.Bd!q|4?66gKbIEm#ƪaV/PՠՈD= Qo͋+ N^4,Z"Ըf9*oW[W'b_'+O_=[=ŵ7D3TGVbWqǯb$Z!8!oX3fiDU.nB:ȉ}tグ"6Mc9y7L\/V&MטkavW)_AUCڋ Bų[NTϽK*GybuV):W=k|dg^_6f)Š6%boƖ"Xm_sPƩ[bĮ"=2R Ef/|7CS#c? V*D:5CfK#xv~ ~QY9+tO`yࢦxmj @WB1JTDXx"+-cTt58a$E4kn ʫrG]!U~ψ>?+5cԔ]*v!IE0SVn:.` ~%u' §t!WnRXc{ıCR[֨zTNmuر誛^W>Nlr&:gS5dKs(Ό/}W%*ůү0Q 7qR gEġ?EH!/ޥ '_SոGW]V Fʡ.~ <=h?QW.([?_PcIbvtlwϯhEJiA2&I:զCFBBYot%F>}X/7)~d)^#kVw@\~^|Hng)m(:;̐ 4?O6z-)@u*Xۗ|ޤKnWOo[=/Q>'nlh.sHz(bSj5S?/wr8-;3KRĿH!IOf#"h+\$ J*H#!Dũ߉):օ_>7LIw`y^uXe ub-kW'EGzC W;,2kµo"%_/*񤻤Kh['&#;]+)QH/F\̩;7t2#'bmXNRa)$lX,ߏ`vA)_ TmWJ$H V}bc6tWLjgJ~.\F4S㏖s,2ٙY|f*4*Çu!eX`+L4uskPgC<=O Oi٤|7|]wSzt0rO#B[BwR֢.5.D_Ы>oH6*oeE(?i$$%'.{ɃT үC05WBzeٍYJ87lܺ`OYjBB:T,Ս,7JËދݺ_ZQkP*7Q) ܉Z1"N8# v/_2V^Bpm*(r' BݘnEIo8/:M^+>O*vd6!%g"<++ٝa, ' N->F.ܳ luHa+ڟD[ e@PKZζmP` X?6ezUgzYjA tV!ANovͣ[ c r")CPa]+8lp/!es^+ *ZwpBVSpS\,9smxϚ >'F;`bCA*JDRV LnU$|ix!Ļ AӨ#毮)DPĸ黗7UUn;_Y9<'" ː誅%4"^dZv[P垝/;O`cWK2#&%*+p` âP:A=6 5\YܗrM_ުW8@+ɥr7"UND~e*%0^Ղ8J-(f<~AB)~C{+_~O^+u|}E @1gxW_k V*ٰ;:m|1Sz}_P6S |"8*0^u\J(?يj<ޢȲ8xo}W6SS8I'BA G^9!|Tl^)=Mܹ.fQpN2O_5[ou@&/_!X$xHJVf׭wm sR/B/U_HU6+}TŎf^鳯UE`{E'ۖE*QhG" Wj` 5үV 4t5Gپ_Qb-f~B$" PBW[5m5ѯ-^Cs\u0aGC 1E[`HWQs@nٜ5(RL8fǸe_$$ߙB%hjs}n4kj >kVZSkʀׅ<)e}\Q2!;-\/.~nC-ʦ@XW6X]+avU*Ȃsj] MٟDZy߾?iח!)w u7EFDOZ[C*AQ7h%m/IŦ;u$0lCJXj\[,^}H/@m@:*%-r­Ĭx|[Oe0DGnnjJǭ_cCcR\_%dQl\_+XbA^ bN+__i8fYq[@t0`UoHW L]ĕ(>^:m+1%ɖЦ܄=xA7ŕLkA|>r ӈ P?-<؝r;'C#Az'J甒L5`fBoyɧFXD+y[*C+ڄrf+%FsŐ רqEvWV#nx 5E)eAtZ)+@׸74X'쑛C H䷳tj1g^܆8=t@\U4XX!h@()D XB**=Ww3'Fqv]:,A͝ ++n ʪ6wsQ ~x6+=6W,C<߉kAWs=%CL`B" T%&.T$SOľ/{{VY4_(䉔2@q]Xfve X-e}_wtQ`a';UWjh]VDF^Xe#-j,s˕~ɱ&*[t+;];dhŢ ,xi_t\eT*WuJU팚"B-Ck.օS(X{ӅV2?8I,4R.IK=x`+e:?]>=Rq&^rOfછ$bwKW43+wH8F\HgzGz2dwPC_ͳKoL)n:+j&,T'kiʤ02kV'#q~g`NJYMO<=*o.>ie$;6>k}8w7H0:tP >;eڂSZէb* DW_{%ϼI9"ڪK Jk88Ӕy~*Nquܷ,~u2K|x\7Xp\6"=~cUC]wT2Dmg%5%e^R,|S|\-B&Ri?*42 oCw!&ES%¼`"r:`%W*Lm`+}b 2^(k[p[3곒FRIb dt^^!rf!8EۀJO$jѧJXAtdp [Pf:S[@}}yFC PDZN6hD8/WJTdYON-]D-ֿwyBk~i+*L Gvg멌>W!' +'>x@+q9fAP|"_ W)Ew2_Po_.yp"TW,U wӎWXRjteLX'~%ܑ} 5g"Дn X#a.J XW<cר%|mGqѧRZJ)xˆ .ʳz/VX%,?>/V Xin~١HhƬV&OFR('2)t[ (XD-< R7TCACl&ʎ`vza +Ҿ9Y/u/袻n+l#]nnX]&@DAr[yj.~>S`2Dr83$;M {{'|)StUp#ʎ:s6* 3HJ*q{Mi4^؛ژ 2oeUW 0'g"+w޻CMʅe&4.P="c ee{_a-z+p^׹,u;)Ige٪}AgMfv/loxC]+P_٨~udd\٥iM|;e3TXcn%b;7a .YSmNksXc'7|ٶJM>"u >3cawtJQYbg6;;6?9pTSHã_@]ՍG`W(u mvkI,EXo2rY)h9A/-1nI\u :gIEذmAt 5M(2O%rJvcazF2~fsYs%ͳS8˷U@esv wl<"7щW~'JF |Dџon_gV_M#ظaeRlְj'p *}pvgR#Ps ܊*]iQ، 6=5Wr险/IeNJt n2}>O3ZvVm[-#{NgޢF%IV|@KD`a{K_W 46ֽOC:ٍ9.,2 ~J;poT()Kloη/#șW6E]H:ofegNG_y5'/hmhNM^?bq#H̘=%X%[WE,u1oBADXb5R5ֻiN/OYQ6P6j1)Vf:=3a?#%LmFJTN ;-t%m$Pxb :>*6^KRV-U{}VΎ̩rMFrtOdg @~GA. ÿͧ~b?cԮ%\cGӸQt)V$ ,#Ǎ8Џm#hm; aoN=컰X*b3]W,:jyver]{6qwT ѓ  4_Wa]=q򘳬Wuȱ ֞7 jެy[WJ{A5<Yius\LPOTjw ۮ^9yC:(au/[)[Ĥj)Lhm͗`VZw&46+̫-gε9f5M`:ê\)9U1 i,P G60n @ 4{ĕ'j>v Tgx'fL'3P2N.Oym诶W apVGd)a* $0V Kt9O M]_\_ԇOGN`ZovW%,ouJBh,Bȑ~#~K~gyBx Q[GZ+""*a@L5n@Q )LgU`,/o8Դ!1:v[iV褎wjuo]GKaS`㔱:{ .s]2Cc`NJ-V*\SčV\vlDYDwi_gM5W1=j#z1|'Jkv:E}l%~LYU°k.g.lo-޻ΥPTooOaD=!6g/8"W@W@ P$I$Dtk@@.wrU۵5ߒٵw'ѕzg4f*BLƆ5ThZnnYOH|H5T8[p16~n~n!zlٻۖjim^ ZYYҗ2s6d޺e}/ Z^h`QTE7JV]ϒ𝋁 Up1b>x1sGgoN} ȥh=O&w4]Ma>M:媊ٱs?s+~ټ,Ljջ'6]PgyQ$ﳎϟI2n" ܬWu7h欓҈ +Y1_L_tR"u~\4 3F+7d T=ߜWq#īq~Nj \/YL o:(J7>k<$Mv*u.;a^ 9_3Nfcm;geB^:̚^*$.0gqZCFW򜼭N$L+ekɭoa^1r ~\Z>(qP;OP'3Vw0d.Bb˖2n4;?e=RJi2k3k1XC-D.uWV瓶ArqLii҂zQ@, ;lT7 b1J*YE--'y:7RNV?Ct `vTzttco5G{܎u8IcD0UmQG93_Qe🈟{Fo{RFVv.Z%,C# +kVrB%S b|5*!_*{`$K sL9v-a6<*M]-i78 0PX;ӶP[mȕhxPTUڙ NbnSZttX=(4 Z|:RXoJV?`jk #Zv+b2"2&za鈮o ,vF2agLǎ "P` NRk&}IsԵF+yaM5 9^4`1r%Yh\U)@=-Gj\ 5{ȋ©Co4e`i<(y<"VX:~Ciʺ ȅdjVev:,Gd~k5K4/?@* *fwIJϩŌFi*T_/5w.7PW=I'.l1*XTclKI^z\* >= X3B ?\?hA]{yjn'=Ξ㉆,D|| Q6;![ #fFQCPGX+ossqאTKHx*LAk$9{?4W MYVSjPwEcn\#U 4o<,Vm×a?dxE;IpVd`w꽱2d|JV/m 4mQ~V$*^cQEbZXY{*I;K0Ofa.Kމ1eX.5d8~H M?8g>矸,.U<kG̕A9`jFfH5H&TeR0f@d 2ikbfOnEf W^SgfjC@8땍&,K$νRŲ\ L7'Nt0p2D`W[ʭljfѾҠ`1t`ҦIH vqugG*A^ joѣC# Xa緦Ss?KVb3Wy|ACU-Q5I? RN1=kzZ'ucIPERAEX颋/}% GY`\8!;h6}!qEQW%&)B3S. h/u:/hb:*WVp*AfLdn, M!/8+ wE f=^HJ 9d3"M,e]eT[U=/Ҵя#NC"9bO}fL*SUɊ!7.lVGZ /Ti %'lpCEsV9&I&́~X%jaygض-뜀|"w.mc2C[m2mj\znCW#/![kEc$ڠՑr|J2&»@c3 ,Q(A@~5 WF=dB?̚ޢDŽ eJ o5(8eq;RI4ܭg^\9]Ú<9g %2\ ۡ`eɲrhU^RS!GgL|p& g]+Fd&5:=L,y"ZK5vZR,H,وga\0?V5A @^s]5^scM\|,qG A̐| ਘ+h"I6*ABM?| AN6pu%'5qօi2m\U r @1FWn7d$m܍C5lMMJWUTIlZ`)I$ ! A,b|(41z%-*Q?< i'wXkc?4yN.xUն4J<مx0= 13:a{\QJeaʪ_3s"M o=Uչ~!^hg,T?N*iP̃u/dC4,CL]_FϿPh Ǡ Z'=Vhlg5+Uۉ JƵ˸eѫ/с~ Gի>~ v&坹*LmjԳ3󕽩dscq\gOo@_2W\uXeW&&_5MEf·x~r0wC ho lgfA~^5hҪ6+-dR,"y= ހGcw9Ql#W&YVlѫBVH>Q|w~Ο0W#< A}= _?FY~j$з!%Xa}đF@3E"AL0EX?R`%2(RC!]ϻ8ٔ=Jb((o`))rbU <8̹;A(r0pL2#U4+@E_Fr:)pUKjWEIWEz X󱅪25Z6t'" ,r4Y4u\0PncEuDD);XƢpEjYCs(X9 ޯHR9cWLu/rս]4GJ)x `y+ޯL*1+B ]~O?\STz/ɡlUtyb,{'zߪwfc$Jٺ׳ _%isVsNsnLGHn5ʖuPw>.@gLuype)0~ y{;?}wHEE_ᑢvS|>\ÕB*Y姪W"^trW/Y2VDZ`Z:v]pe$P+ɊEY'+1@XU+qadr$X;A*ޮĮWiWVЩLy {ܤB2kTT:$W*M*Y4V$\!s\ɓ6yaϛ,[ 9Hy׹eJ`s{*̓Γ>VPrv a_v(+굢4z*APELJJֿRK7W0;2&1N_wϯBooTXcE"۹o۳4Ug n,! s2/۠Pҹuvӧ,0 ~vXOlF2jBQh-ew^KZu9h*x*Z3e,-=҂yD+xY>oEN 5]-Ɯg-_;)wAB*f[[W6VJ䍛8O3ߎqєTy&/(Θt$bOAVˬ\6^D ٯv, !!_"[cFrpK2MV}E.߬hHwlIuHjW؃ Wp||.boLYiC&+lRYy֔Wㅿ_m_j;6feݸ?bgagkZM d%&c :V|nP$i~WiVZxle]?:v*ҢWW@W9;Sa `s%!-7Vo_ш}̯VǤ[ٌ7N^/UăttIᄹ WB"ʵ rpk_xsAާr݂K /O1^={"|HDqzý)psoD ,[S={KѤHxz8z&gԣػyI\)` A 9af@{jTAU#7n( N|0]t>ٰu儡)e~g\Ga ʯy[{_n@Z8ۧ&-b+^Ĺ\E} "=MWUHz$;xOCr4s竓_RQ ǛgN2Eҭ?o [(JeXy$`Q =-8ig)!@:Ni_ήBfxaItPy?UX-+buUbmqMigFk6MEZkcd:s._}ç1~XxWŤ[c㷍I)l"+nzaW~ѽBU8T|(hF7%(>>˧Ni@y]L3-k.o;XV?x-"B!B!80s^gỠx~.vym=чANQ^`ۑ%hI[)6c>j&}\ô; ONV\WҮglKY=uSve~PH_so *]ָAעy]};JGQǛkY.xRW_Ǫ/Gޔ+&.2bCex5)#>w*7%rA]b5b3/l14K)[dV1^3N-@[2I]DCIz5t%aRKp?(U:XT 6Z[lr_sk!-UyO5iULH]] I OkRWjkP֥JWx l5J8rtߵͮz馶fJqwPe }H BKVb3*"'4ZI@po|5%g!ȩuл,oGOXL|: ]r-8s<V v+vh-L[Z>SVxKox~$ -:'E.usZ7,2u!=BJe.9\8s$*Nr?MX/pM|a$-=ZU$ug%! k`ĚFٌCJ#WDŽ5ĂiЛɭ%v]p[U"a*dHaD9x5NUFF>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 25>> endobj 327 0 obj<>stream HWnH+8xR' 4F*LiN:2%["yE"SB6FFx$g .X~i,N!'R,7LjIjfB?H?iAj\8 ZmLxz ?O5;7ǥ#'53ni_5;yM^xZ-4̩4M'S͸-Gp;cim´Hj`=L=b[osu:m2kCA߄b mRJrZ1HcmkBߖ@ϏW8$ܣw}#}pg{0sv"5M.޼Uc$s]r?r1.,G8^9Bl.&yxsv 6I3@re[1nps6u.1aƙ Aoԕ٦qTkKs]!1XȖqYǴRpi. [pVLIɹ0)SB4N1.)i*I,.0!CG/u; fֹ_QJY.D}a:nBǚ^6zB;&Wmbn@7)K4aБ+FHETAypW*75ZAx.SX btGٞ[(g/VЊ;1nC%mEc̪+e:{oT)yEG\:aMC99mVξ ͊GJ,3 O@6Tmbv5LY#ZEgA lVw*̥mx) C ؃Ga +tR&pS6tS$C&1R&@3bQa f\W%/ +ԅ" E8zh~`\$&:딙L2]e) ɓ.Nʉ.׬vYͩ<V*JleCVg_FjIv0ӹ TyCljQ(=C hkTTF}I64QGm`]UNW0ÆNiV[V:eSgxʙ:+׹ t4b.Jx[Yuy{"NMHӞSB1&!#WMlU;91MҦ]?ϻ!‰"mjУDP)yh>L7"t2cfMQ[O3"?ǬRYA!K0];/6u:UXNnZ08XV-J 6+O򲀉>DGkYND23|GX%*cRXsv;@j+~:J3alבWJp_L;35r0czsKfpv9s{M~;@z\ ͵7銶#c@0J2;\">o5} V6D[Wuus,?M\fFȞ#˅HO>@G_۴e{ .s֎WECu'gWCK{+wp{Wm_$,Rthbw&u3Sn}3KfdpECșTވ3+r/I_wq% ya4+q!_X#єݮzG|!Ts*0Uy s&Qz>qk{YcҍaJGNsEP|K>ǾM^G'w'p-ĪWT4"DcUn -Щi%eoBc5mDu*}y߶hķCBHϏ8M{nyx9SEK ?|v/`_?A endstream endobj 328 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>/Properties<>>>/StructParents 26>> endobj 329 0 obj<>stream HWn}3 2v; ctgZyr,$NSsHJdINhYk{j~],[}oilҴyUzG%RFP)qGR&D(Ni~ݶf+z/==ͧ[Ϳᖑ73N9~Ѧ,fł&%lxECq_ՔDLx*Xe1-vşc/ PLeέ{8wyw^#Qƴ`wZ5/77 vmk>HHmE]Bۭ\pYȊ(YmҔlɾk4U^aH.䝤?: ʼm8| l4Ax!5DsT㘿Uv 3*#S]^Z*KՁ^C{=ը{+jqj;4>ȎNM徎c,b)KnC&0Lx%q`%I;Si ;)"8 7UϤHNr2e8Ua1϶^G#>۪Ab2 h.g"b1?dLRA. o94djKalkf+fw+2tO ϞĶU"Ji*裕-N=r =E#Si9Ze`}i6q݈%tZSc'b8VIBG1@-_xJtçpf,R^U(yz"nўw*q_PXh:Lo?(+@xI5zYv\}iꉷ!Vpր/E %g sl`$2JKmPx,J>Æx~e/Zc plB3a,N$BjTs%PX$0*dhȦWT*6N#}}oC\+`/֡$PaJ3ώQ"2uN9QZ`8EՐGƨWN:wFyCM[՝vyy %pde:tGpSoÕi{Y2, :3Ǝ^ ~a4ܟziBY8=5壨۳[h֏ 1ZI.gx).u:۵G>GG2ʙ௠"_u_ endstream endobj 330 0 obj<>stream HQHU[?DD""z8DH8N" !"q&B$zC>H4ˆŇdp$F3 s}:z=GSkk}k,lwκAbH;/D?4JljlE ҝ[dZ fI/DJworjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE ҝ[dZ fI/DJworjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE u_٬-׿W"Uj̖`_z>.'k/_C0gbH&ikk{oY\. &'ӧS2 ^ΝD@޽;88br _WMee0e՜:u*(NW^fnnٳ]ĥbȿ T?a Q+~:PhԦ& 6^loDD·sDgMыp,n9`Q``{#-Qʫ`b1}lM:}kK&IW[[j YUU_mNFǏo,][[;$.}QyqVWW#ݻgocF16h"Z 7ҳn5J|&خ+囃~ilT.oc0=G-~i62G:>._緛7o%sF5cN_K_lȖlԕȨcccO>3g8~PWMШmmm|C\ORF1" ]Y(h#7QZ`{촨F46>F0F˫{sM\aQ|Q/] #n&1vب׮OL EF- 'N𑈺΂rns)')cB. qLJ4n^o)y|Q{%9Fvl24-zs7fbonk ȊSSS|[[[ >oT>?>Ϸᶱqff&I\b7βSTʾ߿yÇ޽kii{ɓT2*zj\aBDDiFQ;Qэ5x·EttG}B'ǃTjۨn7?\0=44bonQ/:DFvNorjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE ҝ[dZ fI/DJworjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE ҝ[dZ fI/DJworjͦ6&]t=Bpņl6jvoT*;8_Ev4Qk崝m:YF?k 냵5g,HOOO?oyz(VΕ[$/ᝳJoSTsiiwCC{Mxl9sd*]h`-Y NB]]]\޻./>bx/omsDm޶2nn@TL=gF뫄GETXQ03%)ة2TΜ&RGutnծAh>9-*8ͧljWXz91Z^N\II!Z-@ÝEMJ"|,&s߁VdwT [ >CJJh$"utdznhCu:xl As?}};iOnWuvJT͂kcOY44i~4crX4>^_f˳*6iejBD-X70Z{~njj?ot8!G _T㧰nN?? & lc=K6lAڶoHT|3puVcK0޻?gщ :zo IjN)( T4Iylh`?MhXlg їTjcRf',GXÂl;w$AS6ۋEAeZ?黰se~!LGQ H2p Be%478Q$uu΢|t)"I-,[SÏxDS%n9BT* \LXXr7 '$0Ih֭T"Nc"K$?ѼmV)BOVg-꺚QGr"#*L" T(w̘ANt.߯kDÝQTւ:գ*ڸnso\8=(*kAQ Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(ttC]]Q?1/F$F#5u\1d.vg7mnh1];1^EOMSN}9bVoj]EG+o ^)MQssIf&D5.Ϲ^ԁ 4eZ흛7=FTU:4z]lJj>auaԯmE}#jT1y@Z:DZws5nuuׯ֎z۶K e~( CStQe2GJOL&jPHH1)\@[g êgx1; EuW՞…V]Ϗ KPSee$)ҕj`FɁz#1#!nnrS|'*e 7>:3ʺ0BlSPS>=R\dZi,#Ѷ;wX$2m]aۥ߯XT]EgFnl7..=ii1I\5ų@ks3+9ոuןKO"#UE祅z],4!?_Zdaĵ])Ix$9(D"F#5u*t%/66Lj 3* Ѡ*:%tJnt +(SEe.(t Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(t Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(t Ee.(*sAQS ݆mv \-_y{]=#[AQ Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(tu>3cDt퐺Zԟ>ƮWI?G?,fBT/_/X'GLFQV(*sq+*P9Fa"&: a깹g>9_xGQaLg?X>o7 >VNP?6эV{7҄:|ts|`^_?: SS6Õ.WE]|߲b"B18pδ5bٰWD((w IqfGH[HF|( -"E!Qp[N5|ɉ* QP E+F_CHd$>1 T83P%TQ '{f w{ϙ9擏;-qVaV /ej858QmMWU:94װA,I%._?[+8Q3F<'GaSj,jϨܡ+9y6fRiƦE}ho3EIG(:GςȾ/ Wl[*wC| `[ f: ,?茶AFv ~$qjpi ӛ7mナ_s3>s5w9qA%?˲SCu"8n#QWGGA5'wG?-9 V|~CDDxLf^ߥQ_&ytAtʅdH^ +&.D&Ph誥ʒq$jpbP7iw\ f>rlD+wjW_Q1xԔߩYԇ̟S_^MzϜ'ߘ͊χ_}6FNT}EYD xɉW hW<@L(#!2 jU R]#. M 3qj۔nkݴ~csxnDu9ktDE67}=ɏ~liyd&cf HԞ|6 Q[Zہ{Z(Hp\2͆ld`ME 8QQ'[s#D5N 6{"*l&:N2 皷 KuuᢿwQ18z.ݳQmmuڪ/~y vwvkÿU|'!^ˢ\]:M dl-8xQ!]*5 K98O|zX ꠎEQ FLP*,Ucj858QȠE5HTSȠE5 O̅De.$xDe.$*s!QS$*s!Q *"Q \HT\HTBHTB2U4xw4lfO}7 iauMwWoD?ͤR6r,`J _26 PTl4qvEWTYan#IHT㗡EY:HdVAKA>Ӛ,!_&۹+p5SJv=wAMSZ+.a]Z}PvR]6W5b;3k"v;VFpaE8?uwz~<jxڬ3ٳ'55ĉmmmڊn{Ƿ\.ݩ77֭['|Y0u{oĚK޹sO#(j ,]w;KKk]XtÕY]ݮZ4=V__0+.\V\vwjk`T0ר$ɼ833g5eeQAׁ?\QgfflFgnyAGݲʫWOzY5 ϟ55eQAׁfeQo:@'~Kk1*n|tϬw880'gٳDM^>z43ѡ]Q?|wu <|l,1w(n߾j1/Vi ̬i(.壑DeQnǻw}T@g(#ǖm5b3OǏOHHHLL<{kv2m~~[&%%f+++c7Ӎ14?'vP n-+;uxpÇ0ct_T3י1o.Nj-.,T,ȑɌ|)0F: ߂3E3F]`T#JGNY~"`TF5"t锵9Lj)F]`T#JGNY~"`TF5"t锵9Lj)F]`T#JGNY~"`TF5"t锵9Lj)F]`T#JGNY~"`TF5"t锵9Lj)F]`T# p ՞wP wuzG6zŊ 55O}ut0OI~~|8`ЫHu_lԦx.((شiSJJ͛/_̺`fpXRZ_FG|tᕎ;v|)_~;܎ϩiVQ:Sr~31;B!Ԭ@ւӨeeeIIIK.n׭[wu****t2!8َ _(45=v ihU[[[Q[\0JGMoU?NNj;w^_yqqUUn~urv3\o{go)UWnq2v7ߌOk{-//_lve˖b*t:d6jUoW'?~npT寿~0YtbIy'="zG758w71zy_)5;{`I{SiT ݨt4zC;!nǯ^e66RA'H4CQKGnT=9WGa^tRD]Ob4[T,Qz*N>m6M7Ӎ,) ੻w'>|Xof Y+Q,i?{V[!NzGܜVůF}ᦂ8ogi iڌ5jwwMFmT;w+Q/_NW\if3ZFM|vSoB0ctG3h_ *>`oN7jyÇpj;;Ob4*oaal*t:sssx"WY7L7jO?jk(zX[\KGnm::JN^t]<75t0>%ѨH8;{l*ШD:fT3*_FG===Ο_ofұ.*Kg"gQ-AHͬvBV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jD>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 27>> endobj 332 0 obj<>stream HWn8}WԾ7Ql$n lҍbӎfdɐ\Hipm&OOOU2^E>~߶f:N2Rg@s/dB< =/,œ^lmǧO/dvs ?/_P/d60__ Pb>2_xYPy%=4r~ry֜gU43A(UHm H<gvI %Np%Y>3JFiߨGhhl~mra&E/=ЉȬL[;Pš]Fj J)F ]Pwy5S Ôg]ymЂb{וA?Ev*3/'$Dޙ'"3!ÑH)".cD efY83qJqgS:%>8Ђ=qӊlD˥qb0zax| oQ :<Qd(B] ȳo,ۈ`h3&ln:Gc!šMc8i{&w p/زQ$ gkL7YH>&;=E?ъ+'ܝ.~Wx,B4Ca~!r/g֘c3g;L]9)O Cѫ.*şIFLz"F}~.aָ/ƌ $mɑ2J 6>[WXuJnƆ#oЎUZQPk3a4n2¨hSmVX6 F\Mq ns DUv2/PYIvarhuX$u1]XOz׫Y鉫>ɌMb"X4^$YD!h(2d.UR۠1J`颫Гܧ.z?݀9cwn˂^Yt Ub>j\'8LPtzoTYR,;Il*@QAlOg#[ ov[On:mplda|s#TgX(*k{zk 7՞ṿ4CQezx|nxWoSY5<#R WS;UL΁-g1PA7"֍lCb/M|y̒b%zLoE_Sm;U V*l"lt%:8.S(Docv.ҽXؤ,6fcjKgEm)R \ιJ>6;åk} ;g%4T\pgi.CČ.ӿd36uutDhTbMif~vQyJXlyHOKٱsLWwJRXЄ)C<@=4Rߙty9vџ:Um~df0=]ia\bH*վn{>HP pWjC9+ i$dx Cto".gm. |/=^2i'4ϲ#"KJ S]Lg _4(c8 *kJ+9*Z)0^GU+s6j9LHgshGi9JC7%x]7foJxB4i f8]i2d9D:Ucѯ%31a'aSUahSz:L%o `0+e2#X{O6cOꇘY49@TAE`(ۿtb,:]"K)q@9CG?1NHȘ'3Z=*%6H bBoIo+oOY ;pzH~}oZWѢ4o[ hY (_l85#2ÏYYF'av6rvs9uyj8›{HLUoq؜sH_2Vu}@3\\q1V-Sx׮?>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 28>> endobj 334 0 obj<>stream HW]oF}pRVLZ)ΦiI7M0k 86VM 9kνx'E,  xv끯)0["ܒ‡|k~d-f a壡Z<~-E).HŬjO1hm+"3'.US 4$[@]~ckܘ&[D(sx>r۳n.߯ח˫avt*Aý=gAC4Bc޵ѾWחUQDC;@tYS#DE"kcDR> 0q/Om2k c]ǰeN"e*+m`(a)"ߴyZ@Q4 x*Q4v**G(7'fE.Jc^;~{ojy{Nmѕ{A̰aG~aZЃ]7}QZ:hy-"K>stream H쎡! ++ȑȵH$T{r%Df '/3x>stream HWmWG|E4AnT MAZ " T _0Hl㍏綰h͸ܜ9/w7wo9yyn?]rݻp{cY\>bQzl&Zwh8 O#ԵJ"`1!{NBoxn|1&G~BEc'u=8 _%fgto[`@k,)L]j2--XVEK*v,;i po.`/UkJl  .Ġ鍖/7,sӡlPP.'Z[5dcۚng,-MWlhڱc([6`D%nẼ,aQ!%Jn 2.B0k%oM0lׄQZi|;Ks Jĝe%cJ "t#ۓ6%`fe 2 AK^H VIC2+бb8MQYт٘$` v fO@㸌7K$V&䖆x|9'ce1([),-D*c@ Z>TsL,+/ʘ@1[*o[ c cH]`qim#ޫmq)-\Z>_$n"vRi37{֞!'3tNQ*\#܀4U/\z}vgr0kTh>Ϸ^Y5ZVŜ޽~|b~% 'jEQu\s UׯgBS ޤaX?h8F&yz^lq_^mt6Y<>xH獘FCX sjKV'K/<]X5H#MdrDؠ & \E1(17]K9h^)'wEa,\ZJ&ž4p_ࢳVSr~ 7澋i`u6 ۞6@"ċ (Zewh1iPA^u-{{5Wo٣Q0uҮǯϨM}vZ-2H zd4K̈I6mZd%kKIx5?<;*^ahs2xL>:Sp BvgQ`Rg[_ߝU!B0u \M>]~ߞ;K֋UAwTUoBuX=_8MZ}$ I{jv=-{M6[}=ٔ~v +:Yg F_ݛ5ѠBʆjSo!`=_|2.Dsɨ q͖kg~f%uӿ~)r]uǪWO4^.-{C.ԀE;mLb8oKK"c7|=o$ɼA Z h4r%-?~[z1X ir(kpbo'3oN8 ׫- |@wdʵ\V,Fy]m8ý8kMY-r!؈@q RrE5ݗ5` &2ݩ˩!9835^[⭃R1j>.<9Wso?6Ǭ4$XK4pЃgk))KZpV`a`Heqq5DOoWgCb*} 1 ɏzN_>TCU֚sl9sA {SŐAkHeu?n{r8ݰa_В<뫎e)uVî i<MG:*5E'w ABJ΍w["%4pX_TVn(j0v#\ڀ@LԒ*-`‘2e;7e\9AZΘ!/X c|*={>.H'-jI37i&&J* ;?''U&dRe9 bX`p8$I); EۅV܄`傝K/ 44qJ%$\GI-1Ĺ%u *"@ u0j3V[!^^GV;$Ts~* $n"F!|ޭcTh* kv.kNQGR%VZh{b2]C5k5پw~Z!l@DZFG96= (//mY< ,F%|0m/i|ȝTS1|c|?ZC!4]> pѾτHpըtbĂPψR)!RaMŏ{CAxSz28JVuC{J5y㈂-7?@0{wiXܧ :oP0a߲1`yj5"]GڃEC LJWC q&Z(i. &BjyuOv嚸GV7~`%St!%ԄRΡj1 ˗22S\;Ve6&GIUMʍoJZI"j%{͓X NNsbR2V5Y۱4rgs 2S6 A|Au[rvV{_ ;iE﷞4 &}1Yǖ`e3dNem'"ϢI󈺔W5<,j:ߞ/]]ˬ*?mƧb ZWO4Gm~N߮ $3Wkʵ~]zN ҉`n7O*%+*ii/VEU4孂M+G#'滦ݴ' t~7NSժRpfiy3&5)/jU@~N۵{lQMak αz\»9k] 4AE lqWM[J` #K*F_[/xK*ϹSnV_m?|M씊d:t :iiEcMP9)\[4,$UƧL@ c޼zj>k޽kNevZfݟIx(Klx(}IZ*> 6n>oNu˄<&)$Xsۮkoޘ9mXQ'0R)tkV)ql L>vM~&%}AE5f~8Oj)XJ*-wvC\BÎa ^K#"ZCk˛w魨PEer,WA8yQb5oL\Br(%0FE1 x$|}|C*]lg@UI! F޲"s/%ȓ5o$G(EdKBաyJ=_,D*q}R#ևY*ִ Ijd!(Ta13@* $*R7lVFzv(HKb#$عK ;S+"?O2(۫"\4| }G Uhh@lQ% edTkf!e,N433ˍ+15lE%%0dk͢.,g>r1i\! x:f C1^Ss,lx[,_xB?VoT+qYnJ=PMTA!7c8`t/R$aӂN:Юލ?BP-srG$5Ez-B0^ j~x~́Upfhcy3z!<ȏڰ< V[|Д.IF;-Gc_d~wT; p&a7;$ gB}UGDb,fʐ($q#˛ϕobb4\K!BI䃴SԈLN3&@I[I8OI u*gf SђZ67X[V6`ԭƧ*PHϊJ+utu.m 2zYhMֳ?TU\aF?F%>OIdT"N-0*e]?UqD .T9NXKP+U)H )(j(p[nE!;3{Grt{ԑ-vf޼%]̀вDqܖ& + 83JWӬmhk(Be`$p/[wpZ߆X&w,`EI.u3RhybQu 5<𶯵h3s# m^DpS|'X:% Pܖ%[ۣp3suԶQ&V5J[9{AxuȢJBy>5\˿~SBm)WtGORŋŷ%4Imv%6u-{IH͌99Rj\h0"R!9fNԆ{ GH3꫖>,'A~T523]J4Փ_Uw^>W`Oß>NwM4rlB0 j贡e}?\HɍF΃1A~y䴸yvh tp9uw ~p-\Cmb`QR$H*!'11>%GTɱ7+8Y>L76Uyc[woV@,NG&/DޘV#7Rnɨ0P$Ÿ Rh[SHf)uu${xs!=3*k&1s3&p a6}1 3Ix?T$nTϩ [ <6x8 0xlhP>c.ǏQ68柈xn"x{$鎛{km GN+?rp"^.0bE _8xpݽ4 X8ybm_|3{gy[JRLJ'bPfC5nkq8yk̿^kVsfu13kC[5?ZAⰵaۭmDZBq9`\IsP·洋1GM):PVP#Pb5T. dz:bb/5]h29n/5 %ןC@gS&]/~t 6/SԮTWnԄsFD}2FZUq[d=fⱮSԺe5I!2_pź; wEN(1ok3j)@4m_XskuwՀ|c~_YVa/wyٵBsřz^K%l\A,Υ;os: 5۩ʜfg:j <:xjPqXYua^zv06\Y".$e,Sdenuk]: ec6cu]n|z idI}S҄ -R y~ЛAky3%ӭ4`<  J~4!` m6H`<֪ 'ulj] ݸQA KgLP6_NLSQ' !3A0KBA7!Gn'?ܻ"nN_RN}R5Y禑zԍmZ 6^H[~hD+`3x^weŘ)WųۅV-0URK|HbIBN`FD; CS"Prܫr[jJ&5 +:LR ʖ|]+'x waߕpx"KeV TozlyhHIn[o,u %qR$.1HbxUהXe:D5m#bVZn)}d*"51>>" uyͬ#Zb4BuښFqyEWXS8,qxx%4j'.UX.ҠDk.Ό_8WA~R9 0ⲯcp(gۄi(~*QJɭޖ,|RK6F8D'! 3OP ZRL~jL9]Eag~8QKPKRHB'E&%US.60a^|f_;dRf߽n;O~mJa(bp23w\}/,Av KQH- 1mpM&3zf6l%ؿ .R m 1 lLVq35_`ԙKz>gi1L}h`I:i_{+(7P RHH9 kЊw%;o{ o))ȭZOA-VnL28"}2K k͈1Tl7 [T]e b+]~V$\I=L](QE^ZjVR)@QPwBAl5\=(GNEa0( ++u88L}0!ߐJ{?Oۃ<4 +ܐgeLaÀJ: Dw]txQCA{PRUkZ ef L2-\A;aXC*)3jPXVHʱ=/aejW&M0%,c+~d;_)|@pHB LYˁ ˔%6Ͳ88]Za _[7b* .e/ɪ9Q tC]Vhq -yBAlR*r'i քa$vdְUTndP<4kSUށSW"r)CtNA l}4\J6Z\Gγ`8A)M-⅕O:E^l.nPwC S31e<X-P GAs)LC7匪zf "P2=xy @bwJ `ʜf"^AU<;ؼs*ǵe;}׭BiH!U>)}@jTU#v,| x?;>&O"m|YqX/B_?6 eJQ7HStS׵'߹i)v s")g.bqFXQꓦ(GY~,bn|ԾW qӓ]e޾k~୎i̊mt z?6볊܈}`(똂/3|սq=dJ'n|vͳ[tT}A*0"֭LJN,N>ry1foۋug?e%aElseJ4bͭNߝuhokKvĂ׃~u{ZU3|_ymG?:;׬7yTe_|{HE,BJ*]i!AOU҄5V-'*i4Z~Ym>o˥E%-镈~}Un ΧAϤ0gOq~^Զ_q8ÕH8%gՓs.kqˋ`y̆<$涴Zٲ]Gs$tHApZw˳w-/As{TVE\ŷ;`Uߜ/hJ_C EVU#g=[ʙ~IR?3`LFwbp$?=kF]*-_<׬V*.˖Wjk@ҝMf򐔊w8ԕ-ԥ>r|@J{ -JY3`+SLyLB/߶JS40ֆukԂ1= 4ȼ88'-:0lmn%H^ )6H,j,OjbH5d&/[HE a{F>FuLfH;s3bW75D>0vqϡYSDv}W* a`evO*X\CET6!$?-n\XkQB)AJM"*mC4#p@_ʟZ?1̍n'-X2+ 0 ګ`x?VްdtddX4jp;ơ&'0ڟ);ǻhjC@GxG{G{l/!n endstream endobj 337 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 29>> endobj 338 0 obj<>stream HVmoFίWWmHy]M/HUEg'Rͥ3 mZY6yfٝUz89/O9nu5벀y֐(ŜRI,!ъVfgMWgi~ā>c$`}XGi4KS%sI_TA¸.M*f>/Width 260/Height 226/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &9;2AV($B -B d,B -B U5b?ADvG eH%nGnFW#8%nGnGnGpJ܎܎a9 e5Aވ cpXce\c\-N -. hH)$X~ X幇,rÓɎXX幇,rܱsLr,r,r,rܱdވ *>D얤𞤰C$MuXG 7\dGdpCANFu#QFugP^9 e5 (}/AvM $dH'dJ >C$i|^Az#8d/tdb  |! Fdp_Az#8d/.KXA>? .  endstream endobj 340 0 obj<>/Width 380/Height 288/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &fUfvap3@% 8~C /<"k^ <" b<@;\ .=p2 P&ˁIK  _ 4Z\//H {#@k}(_I/AI- 5pw~  ?KK?dp0Gb8XI891\~ #>GGHGdp<\4$GGI"6H}R(H;D9|9r TKr@ه|RT AHr ;#%6 vGJ#85P(KKʏå%هKK ~C^k^_G"^Z<i[Y0,5@ endstream endobj 341 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 30>> endobj 342 0 obj<>stream HWmo. a@"`3m-1Hv~}gEDhygfUI?7)̿ˬ,`~rR>5!2&5")p;?n8Y Gn)旧08QAxEaYN<(0$J&zj`Ծa ;CJ!Zggjh,)2f)00"Bٿ?D? _z c$zus}nӖ=W)lW)~ dyqaHF`P7pg3W'qW䅃ɷW/h+)m;,*Y|O;hb:B]Uk//6K7:Km,?7-|:y9Fϻꛩኹ,u\<`D11&"{IY|%|Kg}!0.?<R1$-}8>/Width 379/Height 283/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &fr ,ODvG /`k!Z O!Gdx?/)?DkGXv@,=#8/#Av=P8 ~Gdp_叆#ATGdp[UP??#C39 0WH'#8g2- >v? endstream endobj 344 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>/Properties<>>>/StructParents 31>> endobj 345 0 obj<>stream HWnH}W 0v,qv60Дā$j)&맺yoR %:]Sy.@2_ V.*lWW3B 9LDœkŐ+äBˢul~55A/OQ~$hu]-fł KXa >(qW9Ҙ0o?&Z??n?s~vUZoՃ3F;@J.j哃Zk'C|7mp+Q%#a8e§8&65VԲ.7Ql]j`U ӑS Ui)SCo2kM0F1:}hS64Zڵspt%f\b" JE>64%HP2`k&z]'eO.Y$Vo6lhBa $ Ã0MNsXq$T&,֐OZ&>r)]}K<`)]౪ ~je, ߝjي:Gѣ9Rֆ& ւ5^% ¡mSZ7a<»F Sl9unj) ksÌQ-+NC !ݡeonhd'H$^2!l=NѮ1ʻN[fTâQ>,n/nnOCL%( =s ÇIq(3 iS7Oʫ N 돊 hXfo&Bq}3ߣnjNA}o h܅턂't^P9%U2)4dJxv۪|D8]&FN{⍵` Vk0S/^.z 0П&:"HUT?M9}>M%Q9v~Hb~ 59Zc"澙Ht(6%,p75R}*, m(ۯ.Y[S,hDjQQKsDz w&cMPMvt|\Gi=\P?`鵑\1_C{qoؖ7?ff'p&qc$X0` &D&!J@DR,R 3a:Kѕ@EFXY_dl5 Dl aYJ-NEa8lXesnSJ 6s9 B3.qk .// ,֮U (&XhjMW \_|J"JAl%kVܨjԢU0}G$)]4kK3m&a4w<]їCEdInr }gq'uccM6G0^'7>!R@9(,\0NlD1KMn/ՁJ~p|J;A[p(I8sJlpe^(.\Ab4ҝWW3 f{C8_E!󫬀zw~w 0% R㊋G4v,#KE:mg6j}ײ"? !Aşot@cw# er԰Z1[A|C0-!R) endstream endobj 346 0 obj<>stream JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?>3:/, CiVןm֥$%G?{iݿO}+E|?>3>;K񎡢j~Fimo"hvc|5UtdZ76z&L@ЬRq vWோYt2Bn T%C*% X0ր ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *%ZmAu,.]NE$NyX# ![?4|YW ,K-$ oyw|`O+.-Fڲ 31VCX#Xy['y.vNײrbh­hѷ7S>k>Ov%֑o~/щ$Fg nڻCd+0|JnNVvѦ^i'up+1Q@Q@Q@Q@x>)xO!w$vWz+_>o-qkxMMw@)πze,|A ފWOwKupf-dm{Dk?:&xK*Z7* G5#/,ޯ. .$mui2_MYIO 5սO R$dB 1D$Jp-EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^/q"|7þ-ӆ<u|KsyRRi{3 [D`+ `ji;__L|H((((((((+ʼG'Ov^^fWx!<%F[%ԡh١qېۊUM&;t(;{I!Eh!P{lQKd.fM((((((((((((((((((((((((((((((((((((+ʼG'Ov^^g:i/g5\'I+_hYI4/40c"tK AZ*e6YZ\_jBI}v,h' @Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWؙ_.Ыk¾,=įKᾙ *b.c"%Hw1{SIlt *L,6bBhUUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEqM:Ķn}iq}oo xgݍk\0H'qw%w-_liEQEQEQEQEQEQEQEQE7x\Ҵ/5=u]O-Z;YolQA# E_:BjRO|TFuOx-)VRrC , m _1xE߉tI?oῆ>g۴}CLXtmNO*.cK]t!]O2ἵg~_ ?G/Im/)FFPX9ۜIjo8֠xowcP緼.LʴKibZtoi g`_1<3Ŀ]PA்%jUE Dm&H* FBtvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uKIoۻX/gg;Ub Hː2dWϏOB6x^d?m`W3XTuZ*p׆]fG('K_--Z}W;^,֠-޳qk ]JI,(UR5¨v(Q՜Jn$K$C++QY((((((c?ѡ |7\-ڼ?{Y ˱i#UOj|4-5oO Y|HZYT.5h8'Vttt!Z˛}o>k>O\t jwă׆M^x$  P~4]O]-UdmP| qq$ӥVU5kOT^hw]+ >&|+I|7<'x%HD9Sy!7w&T -R2GוxN% =+IQҬ,.4Idhkfe7t,v\#ۢ(((((((((((((((((((((((((((((((((+ļ'eo^=-Tt:?5,9 8~/پ?o|~h´ڿ->䧙nss3:'@kaLk'LIL3id_xI~r`S7ӿwmF'JRVZ]AEWx!^fVy é*v`y6 e_!bԢnLY('3v% *yp,{3|TGoeKXS(gZA&݇.9Pl^G:BKŠʶpҠtxU!>**pe7$[_/MQj-j޶Z[5(+¾,xo5CԇH\kzD-4<;rqCy6=ּt?L/hTZLwVQwBuqinC,FHܢ ]͌tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W/㶇[];mDlrQƥq+H>V܋jĮC [1rNN#vߒ_.J;EW1AEPEPEPEPEPEPEPEPEP^7keWesXmu-ӐpCPA5uxwFP{cV&MQ͞7>+]m,"[i <*cd,vGfaК8Fw[[5vg&խ%o)KyZG쉯7xH4y{kId[dD9.ve` o ZxK__ln?S7|g99y.xZm5}Cq/kMg$bɲFa$׺hW5ΡcMo>p޼>H88e$ִ]$(WY|Q^?'7 ux'нαj:wEjsɧۋY#UMӼI|7;b/ x_Dt @2KX8$eAy\5M3z~ۿ#֞v0}md|[\E̞oC@G'Ov@Un[B̗32呙l]سI$պ((((((((((((((((((((((( gzviy ]FEZ_<1hZd" [+pvI9,Iff%I'v+jTiʥI7&նml$QEŠ((((((((+_|-3QNDŽ:j77QĪ䝱lpe!΢|6IiE]^mz|K cO7ˡ+"- 9B9(T6?G t{dհ>Wg8+ [GN' ,6=lU_oxRxj('È!Kѯt]~V6-.1FW7 J6 GKu毉ƙ_ j?w-.L[M30Kpd+yMtk|Y{__}3U/\gEy J/45X 7c8b;Z?+o?t|%Kh5yM02Q Oc@ூ~+K Dѭx+ƊJD;s=vSIլu*S/m6exC$Hee "EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^%'OnjøB'I iW6iծ8FYI'+n>o_+soך9>hz.dV&&m)jQ]ǚ^#ybgBU mG¿{3znjn^$tIl572wqm@ra#${SIQҬ,.4Idhkfe7t,v\#۠(((((((((((((((((((((((((((((((((x.jv믋Z#x^lݣHoz_|`uEb5oBYlTȅKT36b}.KiwIvվO8jEG>ϳ>mwyDư/OضN{~]qqbx׿h{=kW3WZ׈P DGTn+޼K:Laaoj42FV3!.PX3aRoijҺtc"EGӎ&6+ʼG'Ov^^fVy߉ohLJksH_)qXm V+);VU=MӴH,48R5("E UVrsߖ_{tЯmB(QEQEQEQEQEQEQEQEQEQEQEY|Kxu+kmK}>]*+ymo*o$ڳ ($VU)53zU}mu%o?#3{վx[:E;i5$S1P2pNl);C}5FO i:?g,4K[w"B$FA"1V?& ˰Weoygqեk,3eYXpAG\O7~7Ӽ;m-\3_2e] T24`1I <)/>omh{1$Q;ʬ6nebpTqUBnۗ+08jRRI+-/S(*1?{Yg}`|}?ѷ}n>Wh?[:Ffi{ NRD$?SSJjR&i[ :泳qӺ5(9t?L/hU_~WW%LtixKė1v^B D$V=֊6:eiVve [ZDCHR4E*V((((((((((((((((ŤiwӤAk "Zq+*b(՞FQK$ S^Ӯd5.B]`%*Qn텾i `Ij?]|o⏊מ&x=ÓFK8´G *ԢݵsηV9eozZj%~.k6^c>?tM=΋.-'եs"8V*JC E|UG9:iD]. (aEPEPEPEPEPEPEPEPEPEPEPEPEPEP^%[o|"L<1[;aEP( _26WP@,AĪVw]')OI𭽯n㿞kĉH*dqZJ;_KZ׹߃M{r޽kk[K]k{}C\-gmD1ItR:P68tL#$hK' 3>o.iYUZ%厍am_i!D@y6/ vqX)JĞ%~]k7юnmW̗(# >8ӼI|75;mb_ xSD/uY 1ZE+OT(8>^U?:&xK*'SZҬ t.U0`򎡔"EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs2Ƈ/o/ y;[;|~^$ Ż3lݜgc5^(gWvS<P*H pk<C?h_U6l|7mv8S[P3V9*<7YEWqxWşj>xW>iU& ]gT;KX4IqR8#y(>4E|/:|}GL|+xk^kh!ⳗU JG;,Sڻ3s=w A֟;mo#{m2 p?`WxN% :x]-ާ+1xLKciQR$p*Nh ( ( ( ( ( ( ( ( ( ( *Ymޣa7wR,qA)gwv *NO?|Q,ӼI|7;b/ x_Dt @2KX8$eA^g~_ ?G/Im/)FFPX9ۜIhڴ2JK{HR7fUP3<˻cI$U4Z_Ҭ=2QoaK[IVXg2HVR`H *QEQEQEQEQEQEQEQEQEQE'V"м9mXx; ᶟo irLh8fXA#E}6GXI$;}ZWf5h­t.Dm4: >cB"(U@0U(mɶ6 (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWؙ_.Ыk¾,N%Py|%KuMDf o46i?9P{SIִ-B.#.#Ki-Ue "ŏ/&^2ݿۺ_hٷ۽3r種Wt?L/hUSڜ:%mB.#7#Ki-UkuxUxu A~x_/:x>'?hm"9u8gLek0 }AEyW#?5BMW#xKK64:.kV"N̈X *) 2^㏄|iďojV2yLc%KA#?5U馣}witdt+Sh*s?A& L$xky=GUf-0kT$p NIg׈>4$n<+>%נ73]_%&&F#Ew~7/GƥiT/o<[Idf, g9tRVûћjWGӠOt{_|o;\? 7^/5?M˝*[O,4N[X`+ gsZ+ʿEwύP}˚Z+¼3ujv<%lju4ooU !|H 's9s?A=V|&L>$xx5=;UV-ⱖȔd@*X?EwUύP}˚4[3OyU[ٯ%PWXhŒd(PI9$kռk}a¾+sYeo9ebTRJs?A߄oxO_iPDZ+m%ldk(@ W9 s\/~%xľ$x 7_.tm< x$S;!ma`H$dW9 sG#?4Wxg7 ^,>$xKi,+emf05BvNsA(z^8M-|H<6jzvm[c-7)-n2T9 s@EyW#?57h:f#[ϩ:5ρo^J%ÅPrHxG|!VM|?rks݀oe,$L?(s 0F|<5-+LҠ| yWRK#0`Q >A h*s?A_ 0J|!H<n\WRxfHvB\H#8=(h*s?AG>7C.hh o>ּY|H<%UY xV9V,`k#8$8 ύP}˚Z+¼q[m3PxmUZ[;o"R[X#i d`8#s?A=VG>7C.k?o>nt?G淟SuVk3 o/fA]` K 1A$u+VƏ B8ΛWgM5SJXI*#ύP}˚~|a>$xjZV}AhFa A|@^U(s|aCSx4LҮ-̑OD셵 FqzP^U(|o;\^ោ|+xSy.>f^y*Dc!BI \V[q[7U++y-Λjv U0F<#?4x_᧎?i~2?eEWGv߰ ~NU((((((cWfeo鷰՝K,3Ut`C+) H5n |?߰'wlLڹ+7Kb4n-Wq"8߲Ϙ#?A4#U飈[$KaXL-־u9o%ix^w97<7Ҧs(Ub-v;v~i'ˍ$TQEQEQEQEWKQg%1wKRSp7wiБoryDDWi%VC~L:;6ʹtlCyۗ PUռ}¾/[q^fo9emPR$ & 7v[ixjnGEⷶr#䕰 _|e+k־#⧊5~ WbҋJe{EO4_Y :q&;c((((47Kb4n-Wq"8߲Ϙ#?A43?K"ӟGC_gټ}?(((((f֫>?_n p4lR_>uYPlF-x6~0Ю {K+>m`dG*r;XddA]{n?_6 tSF:wG|Xn,s$ws;FJ7R àQ:~5O5i[%e"Xb D1Ɨ$vk= iڜjWz%3;*61 p&EPEPEPEP^U++E\ +R_/N.hL5HXw.Lk|3g HP۾M/R 6Oo$r*3FA$*_}CBWƺK۞5 bAl+w.GjtGP;D7LW0$6n&IB+jrɩ]zt _^dX$*(/k@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@đ^ůbFо`@w$'0:%?i?͛q?pW wojҚ΂lyJqc9 ޭxKu6~Z<@L>sT$I\7g9+$[vtm}X+qJ{rmG+έm/O[մb9XI|牢Mᑸr1Ckou̲#9ْy%jrFS3ir;wk\Yc ׳6{e{Ey|B4pK.e4%dVNW(A'vXc db>X;ՌeIu5]Ӟ>uw]ͩ=u+}++Z\ C⏈gioK;G,U& `|1=o% H"Y6 941*#*J &nUJ?ӨڌRO⊖[E__k>7nu^8ڭz=R=f[y5RKj'dHx9s??G%z.xN4%tں]=֨ЅLu*擶^=oEr2.⌛'X(Eˈ?-n; <]_{.kR''0/%pB qrq #*Աj?jW5c,: gc|P=9 xŽs^:ۧCkou̲#9ْy6z>$OiWmI-A)X9<8F<ȥsrvܭ蝯vKUʪF K=}k[o: Oo}Pf3f>~N~\Ga+W'U`i֬'{]h<}2=Ehk{nkee=}.MYߣ[:<(kɥmMZּ6LçZa+e3U?i>2|k$> I* S$x+|'Uܔ^dwt䞗٥|x{>UpV{٭<ľρ|CI#Vv4Nxx֣O_ {mNPXpsu'^EvVT+ƮP{5.[IJnNMf\1*Sm~ftrJڦSɼ!DivSx%Ӧ}n 6COY$쎣{#Xڗח7%K>1`ϩQXꔡBi]*JNJ:V8U?wG'-uwYNWu_iyv^O/wcg8ZX&gŢG[cTɺ/IwgA:8Ԍ5I8Ԧ7?-J7jVz;YṢe%v%n . oLV( A჎>43JFYD%vN{_E}9V5yceT<͆"֞HH<أfoQr@xG?tx~][+p:`fQgWVT^1Is?ݧ;iN[E%G3(Rۊhז07m崸meĖ\3X~PTgɨLm!-Ƒax/l|@ܓ@e# +yd*I[ʥͳvnœT%_yS5{[u}5t=*Z,WZfxn5yt2)34L1+g1]5/kZ;]]`ZV*0 6vzg!u#ԜiV/;oOӚdAEokӡ|/z(/}G ?77-m>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 32>> endobj 348 0 obj<>stream HWkSHί_IV+$xx*K-)rb{[lJ%) ˓hÇ2e4MQ pä@riIM4@ WnyM;%~tG0<;PEϦ{ tw8Qdko4exi3j1XESXJ:dD!.,ZKV0uyMk[YO5ߜSu;0y2 R%<@,S?@ލ> TuJ7;ЖTҒEX^CьiM%f&:[eeR p/0Я IaBX_T&]=)PFחFasqYE-ܧYT h|9CWjWNT[`Pυa5u^p¾L&c(+Kx' kt%1앦xZ ?ްvTn#0 BTGQM&֭4`e [+q<@b7ڄ!ތ a։9Y"Lj'1Jݘ]kUR8"AC *J@ɚŠ n Z3~AGǠ#|:rq>AaQ{t$t2g;?KMJMt*z8FjE'MEீ>rw"kpND3B%N<-Uvzr>8ok8Jrw֟bs`+Y!Ql4k !d2C[jK0Dw-Z٭qq _oR{%ow= $07|O剓#/y6e fH륬dq=,:Jaj}xq=8tҾkZ$%xa tfvaQlh}qMC_*E(:p*҃ǸyNFI:rC(y;҃IEnw:PR:t(y;҃KF޾su^MBQ Hl'k5*&B$Ъ$GvRz.O/eix{8tdˇ?? ëz60G\}|!i@PkjU6ĄO5RÍ)gF:xjd]E +tmՓ}am3"$zA'$/4YDy.`xx>*9O(̧ЄaZvx!an G)Ԙ%07#^:T @Yg{;@]d-~.g_Op׀foY-A)^dN׽C57YP ֋ 0Yk endstream endobj 349 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>/Properties<>>>/StructParents 33>> endobj 350 0 obj<>stream HWr6}Wc;@dFv<;ql'0yQHʲ]@ԅ7Rr`\hƷ' =y;HG4 IM?k5 ΅٠IAZ~ottuܟMUJ 3 o/o>=#!cBK81{(mu7M, s0T V^L{@=:n jܯLQ@51cq 3,&R r[6oLd٤.zjyiQϖu:Qv<Z٨jlY7:X ÑJsdu+n?ۺKXrJ[>MeDZ#sd6rlcl;(^{ۅykLg=mtl8֏.[K)<$pJ`|P]q =U5vE~h]{fAD҇am'{U|/48.m"gz#%jдpV9*xdo[$pPVP-Kʸ2 _ .+ #7"wDx\^pKXUVJˑq!1x<VFp (8No]99zHtן3@Y߸ECto|2<$)"UaTjOBm{P޼[y endstream endobj 351 0 obj<>stream HhUi !T%HB !$0"!-?v5K:Ͳ,3eHRut6 V2G,xY=?ny=99y~P(iii}}}jdڵf͒fdS uuu=rN655VUUq[[)`vvSO=eyٮZJ{@CO>dss .={Ԝ5kȈ);6cƌޝ;woiisΩiܼyT[%4{fdd'hllcs9Q3ũhwIv9緒Vo%4*%/]tƱ9~6|ũhwIv9緒Vo%޴h[8fYƨ]WV dԫLL^|Eȑ#r,̧~g1-NM*eJ[!zC)ZΝ;>k}}|}e_]]-mmm&淒Vo%Pbڵuٳgo۶uIu<xe4\P&Mr^aTG%<.r9AǕe|/;{oEŇ_~i_iyvZ޽oڙߒzII[OϷ!ln՝2ٳ6_>6vӦ_͛wPVVL%̓rlDUKKjW}CҦؖ-~!:s揺o9ʴ%{_z૯Ff VU_ g^AN߈ ,~AcB0P|ȴի? RB6.9kW9Ϥm)DPpCPinR#ǏȈdɫ~&ܸwĂw\H]k &ȶ\퍝`L62\ /2^Zn`o\r^ l -"CP/6VW,͉6o>/s.^r~#vA {;w١Cv9'E*|ȿs>8#<ԮhUX̹sS[{RȮeo]ߢv9XSy %'ch)`My(tv9 эs~#vAP\|$쪢Trڮ`[leA[XzR90jWl9/[߂w~#v9s\a2v'EEBvZ pD .x]|EŇ{yBG;~{ߜH]]wr,#*9mW-|Sge5-,L=ch)_ .x]Q_Foۿ rNMذsQimQǏOٍ0‚6H0pҳ1/<Ԯr^֞lԑw@{eg=sG킫W$#r32^'m䤨;!#eeGnĥ55Ȉ<,>1 -C+?o#;uO7?qxpŕqg`aIQ]-JK߿xqH+[򧲲XXȓ0D#jm&}47hO?NѨ8sQQQaaakk˗W\Y\\\__o۰i 9996m-:} x!2,"fΜY[[kή)((Xn] 09x`SSmھ]H r^?ڶ?R g9]|e>3}vsPMt钬 ]g.YD$;::"/wy?o5./^l˵W^Q۷ _Wmە#޽+?Xpazz1ATm4ۣGmclԍ233#/wHXgeeJJJΟ?]^^Fm.$Dn^-WmW2lB>CΏdddAcʕ+g6]6l۷'&&9,_Q+߅v'5jv!!y]iۮ$="r0<$IMQj<θqͧm:FCI%<7hÅ1J-v*-І c?DC:B Z~(zEےz*-!І cDT^oUU۷oDM8@%pEu @^R>==mllTN.J H+håu &؃+++?VΠ.J H+hå{+,,L? .KT0SM."qpJKR9&(NO=:A\[[vhHu@]+++m6ܬJUmcL&SOO/--s<VyRVVVKK [5MMM]$fZnK @.c*ynݽx:_SS p8lZ+**RUDiyy&h7*;< qTJKኯhA\T[6Il Ш3kyyyBFT:/[p8+++uuu|'BGPi 6\cQU'H$& oooz NOOUswv{<)HqEJKBu!KnAQQQyy烏JUm؈*Ш@$sߗ;|f๣L"hÅֱBPhl6 mmm ~ն",㝝Z1nZ4:tuurQI?X3H%pu,@ * `<==t:oۣ oD0ܟIX3/((eff>~:=y5;;b,iA.%!-=4~߶;|&I$#iD8})%jOFݻwْ톥U㉉KQA.PSල*###=?ն` ӧO奢s8RT~:FCILU0'N_:Z{effF"ï̾P1.##ɻTlH"t%1%t^/Rv~{]Z_~X8o"Z~() 鴟̌鄫xB$S0883~?e~:FCIL=L:/S[[ {]Ԧ>|l2hh#իQ$%1H|馴}622}򅩽q~#~#𷬬@ h]hÕ&4U)))RYoU@o'''Y6@άi Q|~~lp,..mu)AmDsss#2 l-j[(:==U JwvvT:iD;#[xxĮ*-!І+cע3(bMP>>>rڶUQ$I*4/w*?>>...6sGEtA.]B`@?^Ankk)]ay<pZ__yO"$hÅֱ 3h(m.prr`sz&" Z~( hÅ12`eerH%m: H$놆$"pPi 6\TN."աme}\TR_WXX(].)"z#"R*-!ІKv,'qS7"ZcBm%)twwJz777=Pj`2zzz`ii,LWxrcZZZتhljjX,$1;ccc#]JK:vAEa##Ykjj@aVkEE<|P jX.//‚lh7*;< q]JKኣFď؋A\T[6Il Ш3kyyyBFT:/[p8+++uuu\aZ]GmT/S\LNsss#2 l?4iD˜F,ER$E  vɁ6iR !>mtt""$o̙~/3ߝ}Xn.w8ϗ/_mߑBׯ_#=C_ >PT߿իDh]]{bi<B]sϟ|ypFӧB6wޙ O!{{{ ??p¥K?IQӝKKDm\j'Bƍæ?mզܹc8xmyttݻw{>ɇzkM=o<|ѣG Q#SKKDm\j')s`6-oy͛gׯ_߈o߾%|1DRVxbiKIJɓ+W#9xY__?sB?)hS*NXZBjR;1$ǏRK~ڸN #f%_ci KĐ?:KFk6.CryڸN #f-wUUoggiKĐ?bߜ%6z*k?8KKfP\", %B\Ttq3 D =AVD m|)=+hlMEAW&%B\qHBUUP\"#m=Aq%B\:vD EӖ4qhڏEqͨi.1(.Tд5%%B\{Dq=i.P\"8fHgq.Bq [qn!.P\"Ʀ;6K85%B\@}S\"!.PqvD (:%B\@tl1HOٳsG'NG0T.{zzP| 5).@K,RcnǛzs}ŋ/^U*3433u-xuuP,oѱt"M>ȈS<0OGzs\7;?n3˛ul.SHAS\???<6a,..Cn3Ԋ7q5%;KRvXٳgO>m,//{\[[ fgg+;;;mZ}lLo ݒ[j}ׯ_ f0j6C>˸J^nawӕCnV_\M֗)K޷T*L]lmmWW&&&wfs_I_F6}*zK?~8zooXtppphhP,rcwMq3ԇ9ǫby|z>ּ)R?G9Wf7qF[%B\m!gUwDq=מt;q]rwߧ%Kn81K1|9!.@uɣFq  @ɧ:Q\"$Eɧ4|W%_ HOW _Gq%|".w{|34%B\Nl6(.b_Gq:Q\" C.%D\AQ\"D)RY(.!8>Y|".P|`7Wc 𗣍W_|".\ohϛU5K'rWpy:ۡD ,{W=%B\Ml8z>w e}/,*ywGqE^u%B\(J j!. %KP /(.B!uN{!."NάE!K5mgV _[D 9Z6O|~&Oq' _GqnCqO"6kq" (.BY\r]g>KcvK>|,%D\+JPyZ5KK!3o(.!BZL˞%B\@\쌠Vq-y$A\@NEJPUOqc@#!jbK8UOqbqƪN!.hd`@D Xl,%B\Ѕc|3 %B\PG2qA +K| KqA[%?P\"lҫ/tBq\9X4%B\p&*|,p^!.«/V(.W{lKHSD ^_j'+q!#nW8޿onmkk+x\.on3k\p.l4GuiyY\/_q 2=ą9Zw4TzOJqɦ-: M%oGD 6Zn4|ל|".d(T6ˀEQ\BąL]6W?eGQןĐ_$HRl)A$Yl*iDl DA+a!.U `!X !B)S︳;ܙ>,af9睹Ϝ1Cg ܐ~6Q^FޱZKq 5f>+t+`xb@\5=&zw@\`)Z0/f&2%.U4<Ke<,Npy6TP<@\B .1#C5idxKe6m:kN2C\ .#_iY{ <v/T2|̨>HlfNf2L$w(a^yR%2MyN MgmKe&] !i#DD~!.Aix?. 48oC\B .sb6<qq@ o0 Kĕo:𸸀$ .!W;4::n> o.Kĕ)gv_9%hn %]Aɛzv qu4iᓼMvsIwjZ<%yg Ƶ@\B .h2rϛB7_q !1͍ݤK8 H6zEq t G+{ |S .!2Aws=x±`q $Nsmx#@nK*VK] q=׆wxn7K%o`|&K%m>KEyq $P0÷ g%Bd\# 34ƿQ0h %M)ڗ'g}ϩg9lq T@jroxL(sKĕlJ^[҂A .!WBK7{Fd; + .!0 L$mB6d %RAb.'3KZzy6U @\B0}"j)3g^a_D+ jp<) ,yʆ,NqGr`(4p+\V[~ϫѻmq+%Lre޷vTOG^& >q-<9ҁ1W&0#:Y=7~3%u` #qe4PqZno:4z<䁡WzӼO#h-IGy`"FK>&c5ҋʼmLb LBLgzC[{gjKpk[6˖Ӡ1.ێ>g5&x˩,w;[Y|{qZ7W]y#y50Z֯Ͳ4芫n#|(Ğ[՟2~m-277Ci lllD}Me\QCo]ߐ}աp{9cI6en,[2??O9NOOJMqEz>hoG֧щߎ2~m-I~||_ojO6{<;[YBrWJRT,jo~G{̭_e>vww)weuuVjND677)weccV5VByVwKyR_Q2㮔J%<I IȈzd 4Ez_Tt Kh'.4д?00looR]]]ϟ?D].Doߦ~Ţrstt4::J4L{˗],Nm+ ygeerJEwQ5844txx_(>}([58x~gg:}uM6\wQÇtI.&޻wOw]R ݻge}p||_ H:^!Ν;<`yjѣGDZ[niG6}FwŹUUUe]bVK=Qb[[[JT%InyyqHcI KjsmmMw!Aٳg?kNȈ2)ݯIVr<7%cww2988pWVWW͛>~ϟhS8xW*jsssstt흙]t... ݻ4.J^37XLh;P&'''3kJ ӯ_.D"4薖04Q}}}?~@_~. MG-}Z~dTUUIe{{<::rW/..4V%y,Barr8<<<228Otc#>]\ݏSSS]]]ʑP:+++ =PWWW6?%caaB[^^܊"T*Lիtgw.D:tG#ˑ~zffFwQry שe2eEyVK)~Tt#+ٜ>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 34>> endobj 353 0 obj<>stream HW]O}Wc"nGQ$Ed%`<\)Vf N,קUcaIJ:T>[OO99%[eVے~}!2)"IIa4'FD[4C".O~~>'QGuuaqtXPLKY|dQFP]_tBMjx<|bqtq _ܽ?}SmNM<; eiꢺ_)ө Κ8SC\gs!Lcӗ&M4Fa"UhƩHe21XlmrMjY+pneN,H "\66Vې!F|0i+Am-=?|þd ^ȣLR>>w2;dꇠPﰮw5M^1 =}˗Ǣt?OaqHOl*bKB5=YT6F T, Db4H܅M4~)?a;f ˌ'Lx bW1VИ*2'X H4(04=x|ڼF4[Q\ÓX XlFklF`]V*}#H@1<隄3֗18D{(|-WP"|ROJ -`dϏwl&ۭ!A*1Ή]]'_=& d{u-t@fEr]bX/CT0<ܮwa *hjm`ojX_jm @VP/o;|&e^`e3'y} Cl9)ey* m7^]`,I>6'/ ɩkЋ aɡ] SV03Ϫ6}/>~(=UyZH=~R.Ҕ6X[ ,f7!xp@ߑr[2G$3PKRD'; O;mв fsq̸$sUPgW zE6:q@ +#` `1Q~~l$"6v2U!1`8A*(>.Y(9F%?AnڅB4ha, q'>Tg">= hU>/~YAޅ6`#`q޻.'D7$ ̍?dh[yBDI|p$)UXU[*7x!q;<1/ЃpkD| nD]uQaϥKR INf8%"ȶ]G"g7WS߳QE4<[7y4`O@Zұne|@z|8:Hnq88ŚDh`2X$lr0xLOr/Π`N0 6ctB\}9Sy]A8wG ᯻|Wxݺ%TI իUQ=m| I#?P&5s{: S<$Qa) u"ئE~S }V%T4n@eB8}S*8S PHΡB"ZօE#sd<«1<QSje4pu_ xE #%Y"SƇ[e drBf"`ryL@9*D N"sv79f0]]\.~=zh)% "ǻ\ g'ݦR$?!![ N#T`kQ.IUVb| s0sz4<[ 6қɜޤ(/m]?= >S]llHѷ1Oqmex''27zE ѴJTC^}4Em]Yڋg쐦b+.xZ-rq$K5Jq*^'a~ࡑLRWV`pN9.e 厌\bFu\dP4峙iGdJG&*␚:Fwc6\VꅀN†~WqޛwOC1=d 9`΂Fa&f8q:ſ{r|Ϥםl52cexzz֓J q7P[z=ЈDKVg0F"@9 gPf412HƾWu"W2K@Ai̫>G罊!bۣ(L6TGX_9LF+{/ _c ~ܣ/?n0 } AF{,;T4mvCVTk;U9lo&n"Dz?L>nW09lYWo%{'c:|G˂{oAP?kxJ5]A7շNKsh  Ŕ[9=DĴ@/|~s{LyЪUy~hڂpaemCWT iN> -Wƿnf!+O8JU[Ic㠣M,W+]֠ *u /aF%_W.l endstream endobj 354 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 35>> endobj 355 0 obj<>stream HW[O$7~WqWwh$`avhNn]0{l>uf6dc|_S?/bf#痗7!2eNԙFsbtΕ&_TU\+rr劜%ꄑ |du<\/0xb,Q/Ob2} GJgX䟋?N'ןqOaUSB3 lF)U6 eX(-}OPd.Kq(˪<rv[t鸆ó4zi3c(}[pp"6pr"ʌ;TVw<.DBɽ޵soʆp&3KtBLi#ъuy +RmIU x  lЬU.Sw(ZqNu)[ѓ,]x(^wXZ Lmrb@K9p&k12YnQ jHJ 8\Kvf"tf451sr(O!L1wI%Ti60P-\p`D$DC9pY%/_?}q+Κ8"Y1#5d}x&۵-G@ aʠkrR>t$ɸP|n1N֓1wD4=(k=i*$M94eXT=wzjݫj\]&-CFmYOprq`l͘2]QP6uaZӅěZӵ=,Ne-i onjNÆPbK1(s!$L-Lؠ.ʒ =@@Y.օETk]X 73ـvPv՘g`-L2AȻ}'fS)z(C!$zDqs|Pϱ &NHR SaZ܃q#`8Bҙ!ř&u>BuE:'!?jsT[hfj8 p4F&L%2|yh!֮ƌQI Q1PVe6PT`҅bZqA| "PaQҦ=T@g(0/˚W` ^aCHim]QQw. ;$oq̄% &pΫw`r_7+onat^Cb"m dm,H8E8q0Q))2ӕ!dۣ((D$/i zD ~:&+4i|WݨkWdB=htGN3SJ8xE,KWh&w6B%4m*m`ҵX3n?L*,ޓh}Mis Wg\+}lt9:a͔jVEQG`%hJL* MEa]$!تY#r%t˨0ckU[ma6;Xeyf=oc)r8S8~#]v/|inưQ 03x3(ˀ_ gюmJ3)`ӸڂDQpbH J>]#9x'-slvteD/rE*ܽl5 # +CL\_u`*A$ρ `?w|)(3(48j,C.4H t$Q3y2\Z :HJ,p޸OPP->( %A ke_]c.VH> #S8Ǹu(hDXuİ_lb: & &iӘ1aN1j\9VnYFIOKʊ܎G~:쟇33;@uZ\T Nx#!q!:N2 o(Hsi܁Qq}inP)W#ç­vݻ\tLv#2DwE@I%Z0JIz;2cP ciyaAl?nD3\AԹ {5 $O:kMsSaI=mÞ iA3Wޓ5P%s&r>P ~U6&x+.\A8t6PL ԕYɪ6v\|b(QLl'AYzF71i|=~[V_81+ B߷_n./ɮIOS] o@u]ʟM ˤX+GPL5?<1* Oetl$Ho t {WEmͱ- -=& ,pe OvKKC8)C K"b]_rR*!XN6}Aͽ6s>v; '%E=%۲|R.7Ŗ,d&Gfhےi Kòd($BB(K۸lvv lKzƫf4ߘY HS+i_6c`pnm^2*!XEs!6~ZY3N,>Dr,&ւR-H531@HUa㵮iT Nc뉖Hq p^چ34Rׯ7+\boKN֖4LeM!ShV+n1hjܟ+2-ulχTn,dkD{Oʛe4M&.#sr"5H-1"QK0˚au ת42ٌWN2( p3mOрVExB5!Vʍ 6M@ ĆEf|Zdu3#A3 -*i2Q(kfDsвIUM>;tY'R}[b]ŹOG>XAQ|(H۞{U[Bh[ f]Y¢Vga祈K6}9\o?uEKO:M_:dKCwX,6WK_a@w:鏸U5e-ͧtIg>Lnsulwvs}\NO.tӍ0 WsA!+W=}FX:pOp`÷} /_I:/G,q{'C$p5E,RS^ˠ# l*CBPxz `i endstream endobj 356 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 36>> endobj 357 0 obj<>stream HWioG_w8I F,FH t,ꞳkzFtl"g|jq}8UD޼Y,_%YR&ּ.#;1`Q>SpKyb5KRl] Z0fo?Xmh S*%7ؾS-9q œNBd7LI_6w*ZrHH-|(̄Hk~(zx,;k MP2ZkʬȦ8?B%1u\]#F3* > Pzjj4 i-ǩqU;: ʹ `)Y@9$$( 4x\afr&"/` pB#Rb1K~- PkuR?F>BR֝kpLtΣ4n)f--0%'|ЖYQ<'=:XgǪ_ru՛8bJP,R%r,k—;4~\ Ґ րYٚKR~I>kA z`Z} P ȉsׂ)CBxŨűL]  îlM,5V-USzMJR9sqcC]5/+c+USXȾ8nr{XIɩS-5<]^>xn)0M+ gg,Fj-]e@K/WHeq,H 9L|n̓DMM,ɟ1l n&@FL Lo)ʇ4@~`Փ+u@,"Z T`d!K6@.LVC9Uvb&.@F\cٍ,}HC+IKΪi_iEx xwj1 'rarE=".6'G'|2'\ޤ'`ͧC }j6C*MnA-ˏ r!AV"Xª~r1KP(}VOYE'OHn; 'dKlP}ƊF&[iҹo&/l1j5!LP>S2@ďPiD[L,U,2ie5u!+0'5<ύ"%1G&U<L.pYj5 5.?4cnr9,SS Pg,pb¸Qer ]F~ oPM '\!"X6% ,xKNQs 9AS@R1_6wመ.5&j$G⏑Ʃ?<; L[h%-؊l7pJ.k|f@ᄂ&?m0P@DJxj?%rUAUw_⥼\UXvMq33H(0hHnP ]:,#ʉvf' IL 2砖 l$Q> Yv& 4| l|ގNיҷPb\TRR%; mN4k턐TG[ ʵ0IR,č1^0Z%'\m0&҇Ęno  vBfê0r6Hob/03[2`6'|T84̅TͺFuQs\`)G}T˾\z)V>@O nlA l^Ƿ*hbͯ~ CMd6|]:gcX 5l2Qp]K('ziqhN b\m8>0^;~Ĥ!\p=,wiScdh.oHi(,Tɱ(>stream endstream endobj 359 0 obj<>stream H r EiOSsCA:U`/ 8d2L&IHq L\F7!WL!mhms 4ؠ%n̛7rrfw'ιnEK9J;ą-V\^! mX*}MJ+3DvQC+4rPsq [‰ "qvWr[܊!eΫAV-rHvoSc g%E'Iqt 5@D @l(!)#D2Bg Q()B_>)go79-CM? ^N[zo47dc&&.H9Ey9,ʣ z = :stBs[et\1]OMΘG\>пWп>^}tFj0?洘_SRG;{#v|)#,b!=:gH!۽5ن<1~mmB"Zg_e^*c-69B!:ea>k2/ k< "@3>$H>d)q~}~BBua_6m_v.uwqƟ|!k6b]ݗ-juױ؍͓B?MH*B:͡ZB':NC[*CPS<P'!8 ,{ 8$(Ysz (;3H!.,D AB! MHYdB搅'$p0Z ҄eh s(=P)  1BhDY}QB Y!R?2$mO &0e uR5| zb}Z>#G0R4Rzpv͈EBjL'RKh} Y)J:[ȹXgܱ*L`<2 endstream endobj 360 0 obj<>stream H PN?n(l=,x#D"H$[7@px Ռ3`, =L̸?5'QT)51#ڃmU7`YZ)3SaƇA],({8Uplu1 T򽊭&FjJTd'e@߇Ξ˯cqFW(aPenAΖlPՔ̈&( 2k!=o8@NA}o^3U9\2,aAp#X F@w(7.=eL:#(@<h+ۡ1 ,1 H=E@ tCj"X P,E@(lP4E@(=4F!PXJ{# }>7H2 Q"Xˀ )3{!pޕ7N lV'C%pQ `̡* |!Pŵ0:7DoDl8@YFz`pbI$D L3 endstream endobj 361 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>/Properties<>>>/StructParents 37>> endobj 362 0 obj<>stream HW[oF~ׯ8/ZpEYl֢- ?0Hf*Z͐U-H"};e,oM,6YS^]_1i)##xDRDeB%t?l,s-kL?^5#N-e=M#NHf9hfYMW /hJ"Ih|K>O&>@8>\ &';+ZżUA&[-Ցii:?77~@]OkbGMs1@O_ZGfɖتF:j6/O-qڏ$#4}9)TF9&Ex@5 j`d>$iN仐DL*1*G*{,6KǼ|)T{ hXăx]1$ jYJV=>`,roj^ܕsx{< `.im:1IWOCbu)U[m`lg%J$ T wCU[*7UKDL 5m dQ !"@>1tfu.8yʺh)lZoHuмk =IjDϲB& !";d< Ҿϥcb}Q $4.A`>K:\nѺ9e*rO .M*>fb|iqhhC(@c)G:ȣ.S6"ҀƲ΅\ a% $PNoűN\ P"#<4ҝ>YRTQ*WTnƀE_} endstream endobj 363 0 obj<>/Width 288/Height 380/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream & _#OY{I#!2AB !E[/ O~E^# dEaAx ^C 6.////C 4^C3 .m< bxAt φC bp/ F' ^aPA  ^^\Ap@z \ ^^ӂ/*>.br8.@ m\T A%4/. %z^5K]-tKK ťִ.!/Y4 ,t/K. . /KfdKZR8֖ii~Z4X|G#N Y{/|*NSφH+2@2 A{jXK 5"8K^\^. xK^@%a-4Z19{t ]lWφ@k2P-t [KAlTpa-X. %/Az^\^4C=$Z/9{t]_ρX8d%OմAaXpa. /Az\KAz^A -SZMhOKpKK?Y Ph/%a/K\ K%. % / z Y0ApH-o cZ_#`Z_ i~m--CKڂK^^𗠽/ pa %/K\6!9 m ^M"#9|r(QȣQȣG#"Er(r(cG_Kk6 ,%G%3lX@Ñ,M5M4OM>^/Qybren&&n&¤M?E?OW?z_z_OKщ_m"Mij[i64{[[Aki5  endstream endobj 364 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 38>> endobj 365 0 obj<>stream HWnH}W,{wrLfl6L\H@R؏Ӥn,O2qu*3&63Jv6`1B2),W&~S5{rի7޲3({3=LI69\ꀯ3ri &%>?>ϼ2ºcٳw+|ӳEsp6[ $x;<72nd7g$nڑMW.ڜ>, 6ߖUޕu&ok4yyP&Okbh2ec]q~L%c[P{$"zci;rz|&.Bg*o&3>_v XxG$䙳u9{]V(Oڲ# Bq8uX΋v\N7(r `>1gh8tMޯh*-GHohm&O0p獠7i3s,]';^EuI^lDԤՀg{T*$1PU*9bD+aLp FiaD8w.=t,{u+*f7DZVAӇ{,()N)i7llqPB9EѥD&^тR0J,nERD4d`QAә4S4V4BpɣFYA9EjK_=}"s E=7Lt9/E*F`6tP zaR-^^(kъuM XTa>>ư{g\g3R/ݓ3h$V&v_+˦hۘ>TngP eW*)NY 3lwd̯yٕE;NG,yX,8,c1߲qwΏSAsQ2)+R.0R`_gCj*<&qaӨ yWR P(yJdtt{^ wG8gT0"z&1m28ieX1߾?M>;h}+.oUQTlQ_7%%+e|:UpET)SlھW#ɜ0\k!9XCOE״& %br@4,$RHJZyC^De"b:h#] jyqΰkˢ;)fx}{a`tU.s >d-"n]>[_> TlbTD9E#!j~b4pҸ<wwQ bÞ E jD d+"ةy0lREbuH[i7G~wGmeTΫ* ן~ek^Qn:VUgvoYNCnOG2Rl.P":vyյ;2=PI"6pU/4p;`҅DVY*+6+”o&/g}RF "~5ցfU}_d+5Ve,}}af."iYs>"} *lqˈl\I'{Pp{*_SFogæ(@PAnmˆ1)Eѡ&${,,ӿv!.`wփ|@[cl qG%sv\ogȽ?|?c0UO*v 3Oxj~COvf4`Hɽۦ^-q]ۚ̕bVsr\ +mPm1ޱvsȻ\z^ĕ=Jr&`k4^W)S'Ǻ.Xp,z5 O񫣅D1}C̉^,cȖ%^Fr>;Z*zQZVsF;Nb :w..1؋o㳭omKwM^˺-Re6Fy0Uf~#ee*#oyH_P@mp}F?V-<$F}17\y}/%N禬wm'8ІLPRd<3B "gmsM] \e8-@D YLŚtwћ'aN %Ej6|ΐpgQ|*(Ͻn& yӇe&۲ }' hC`ostljj l%'XRUE;嗔*Bc@Y+ Haޚ0a ԰0*KD:S \ wCa,Tf 8D endstream endobj 366 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 39>> endobj 367 0 obj<>stream HW[oF~.8m vAb12w%RKRU )#J7 `r\}>o۷n_o$|aR#u\Z¤B͉j˕&޷‚|ͫ ݻo[2tӯY6W7|F 2AfyCX?Tt^i4J6ՇՇO`2tjSTaffՎQa;FGpjTtvPe \=|،fN8sTI}Q眊 TXRfLdj$#Nˋd ;@챼y:th&b6eBGS ν2"BSuR$_𔯶MHU'qSc!2CJH\Кa5t/g> ÙF*pM}B$䱐X "~1^H0`~1愋 ϲ,U{_rIܷrqZPiLv~x66`K ?["-nP.D 3YEbN=##)o+ÌOdA3aKFS s i6H(u61asMumI˩$+SV 21 #NdMo)Q5361Р_P܌尌xNd_^#U@~½Dvv#It00ΰ&ӝFbM0wM3B9ꬋ8 ({\1/Ph@f: c *?95CaW.&rޜA|`z8R)"ĀDקdŤ}bx1)PFBЃ/E?NJAd@J <8e9ڼ '4m4;Z"W,4aH,.UYړ:^jRX|pA@j}XëچrW֦*| ujR R](j[.rٹx=ˢ] }+J5M\4{xe$3Y*n4-XXU&v~{:qthySЅqyUU'o.,R u4Wؓ 0'< @1mUGZ چrw* i(Q^$26c0b \Gðc"QstժքQy6mMؓpZ:XjM/%R+T=Uy{*% ^٣𐋘evD@ie#wUjG , `ݗ0T6%Pa$9 dIvC"Z҄r#̿8wr% Oy cNa%иuDpI q}j`agQHn:j*Oجp+dpR1jNv#ps1nMn`3qNU݋cd6tn x()g+u ,rL#y~r>uHESAzösVu co 3:`j;iRӝkJCp/=$Mݛ]Ez7Fv<qپG8כs8%<}lo ӾƋ=Fy|#:iOqgEkq.š[RZ&ЍQ?XP1]ʎfblgSľTkU霸m$,5 >~^`]Dt$Dѐ Q3\r-]wjl)'' iisUh=/[+q+ƒe_ծ)J{4*pXqWhpZKsԃ҉.C)ˆ{9]CȦeT'62:N_臭 bT(p.Lw_L>9$:k`5gRTiA l c<]8m*<pk}z mj}nt>X,siUxCz!:ME(@%?_8z*Q+Uqgymۉ )ʍZHE15.CZa}c( oMu[a%~Yqs+z"_Ȯaz+zU у("?whi@^_$mRdSL67ȬIJz{"f7:RpdV?A4Fe !r\ %Ѭʰ"N{.Z}pw^|Qg/%$1M 3_ ^ms~H.~[ x#  endstream endobj 368 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 40>> endobj 369 0 obj<>stream HW[o~ط6+w $Ms>З$DYl%R%);?"C9Ab[so]uJ5y]I9]__'i sZXϤ.R#lľ̮:Y%4;_߼flvZ7¿B {Qz~1l|yŤ? JPCUąͷ?W./Xmvy |I@luVs=8n4E򇑉v9.EĥA w**6){J{*\),yAT]5|黫]Mg Y^W.֠D`cI5M(l/S2e  {脣AűW,$WUɆmz],",q^U[\v˱rmѷ:(o\.Y^g V6YVl/Ӓi^a2VqmboօCG 8no^cFhN I iҦ+ሖ7zM4jIBXk,!A+8&Kb ]ICJ]L#`A.w8vF狚hnL bZHkgW_QL3^R1 ñ8K̽E?f?Y/$lmtpXL%2Q+vwI1Mwm;6vTUS`LW|0 \ܪG.ƀ+Ga(j`oN> Fܸ h4/‰~ ZY- 2}*VM~-brɀu+rN.I>,Y,]͞}ɖb؄c%-XR,,BK. Z'ϦN[b_RO}K {l6<`HkϽ 56ԯO:ǚH縉pX -8"Dg =5ەŮ̒:e3"6nJG XۘzHA:}GTLסn uzo{,3YS6* zD#l!i.\7F~Z@>gUMOy& 1!JjbC@ɝZw2RFR?L>Ϫό6BZ>e[ʝBG[\P15'bug``kYNf z yn48tГ*#I?sp.c1Uhy l"lAs|ʀ# s/դ'OЄ x *VgO!ck/<L?'Hmc.6`btQ&b1Q1h-塖@E۬T<>QP`X\&-~0TUF%U,i qHDc>6(8XzIx.yORgaR cHo{鴈tW$hM(+a"H/PGRYhpA`5V÷#>pж4k<06ؑ)V rY4M-,Ŗq4]?Y=ٕ4>s){'I\4tVrFPgZmJb@I}#أeP%#RJ z|9DjeA ^p bTQpEQ9ڰг#1l>ݟ<#Gl0~꺡iۄG7F-)z2rFlx ^ONI:Ȓj@z8`tlr'IAut2 ,Y>&"eO;d8P: U`@v_cCxL d0L\YQ~$~ݕiU!'J,hj(Ql\7n(SQ|: $ЖdȜЪ%eMANSk ˨+rYZ$5ӺE~>&@MrNJ5nTCLXc74 wV8]ǖ%Rcp dmٮ PL J6$Vlԋu~{ލ窬NAg!˓gWIABdg(ckٗU]'5Z캨b˾t@6}̀mMUZol>rՐl0r p:bYͶfbO:Uxw! $V< _aN"۪^|+'w|4{;W?(1A?!\i|W endstream endobj 370 0 obj<>stream endstream endobj 371 0 obj<>stream H (F\sO@m(HK&WNt:Nt:Nf0.˻ hq[hZ-lBm-)m3$%=m#vAmAmAmAmAm6NC-`6-`6-`6-`6-`6-`61 ԡ 8~D) (dWؒZxo3ء`-8<("Cjp0p5J8蜬Xy!:G *.Dg w9Ǐs!Kit' y  <:V]]ΕBt% t% :V RC9~r LP !r^nyA}_*Aɬk Q99%IԊи' 5(y+Q!q[ B֠{.l;Viu!+l3tT+HEh-}|B(4|иs8Cczv9RjHmix$BBԹ.bH8%Nc5iLy pm7 ;fm)қIHP6 $lNHQ6 $I,6\d6 $e6 $lMH#$2j %es0@jCCB )qX:(QF$HlG ֌mOwS֬9!`f Ay-4֌r:]|r!%_hUZH(RAeR5+5Pu2.+OٖC!0K<.؜w`_y30r =oO5 GM!G$gBtpWs gi&({8tekl-,\7'D|dD莢QFkQFp,28:::"4.WuBqM`\ǐ"- MDTWJShN"NB)|BaӔ BRH%֐bڣ1KebMHYɁJȊվv6w=\_x qr02:ʢ@]f}2^|fbV]WBSX1Up0SX1Up0Sa b 0C`30C`#)0愨8-ԞqhAz@u PTAG(-h` Z;bڣ5ղ^*TҗW {)f}j!Zs>듚ƄSz?{>v%h9?}E55v^4bjDU5v}޳x5c_-`6pqyzU^2v]eUO F.KlFơ53=Cw~Z io& s5|N<z ߪ^&oW yp2Fw1ܞJr{&O,) E$!|3y At:Nt:+En endstream endobj 372 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 41>> endobj 373 0 obj<>stream HWQs۸~Z@؎/M'SGi&-Q$RGR}@J"W˔]~jE:k?LϛMާy6yYU> XǑ2Llj,QqdԆ}\6M:[fsi2-7ˏ?^fgk6ywYxǙ=gWӳtʙ`D3L¦5T$2W&sMg߱刺LnXxzwNu>DkO<&›rѪ6Nvey8)'%W.8 (h3)ox`y҂mYV5i^MUβf,oj5 f$o%6<ұ!*eVeZQmZEeY K6JTBDLHrmianZFb**O-=φ&el#8%a(u$DpK bX*7gD fi*#.J9VqhIAwE򆒊H\"YQ19k#L̇G)" x"cvdB+l!Q=y܄{̳zVYoiFVB>PlGE ,*daCR+baPrF$ :kZRJοXDd*UkRVUZ)~]im2l[%kz9+wψux{.we":%Jc R3MWϵ&BG?r7lh0c %"+\$ y=Y&!l/ @}L>,-궢R~ .b$z-ǹ_);ek:xƜbm4u4Mw_e&{ 0;68S+,ӞJ). C 9'"_o W_(r *AWuMJhI7̻+jz-iSaBݟlr*#aL"?L]ݾ}{{n^Kԉ!OJ$#G=8BesǬD*ABEB<#ҴcߡIX&DTι4HБH"b}w@9{2JN,J9?9z"tvkw"Rv2}|{yOo] j9ݒb~`&I^ xS|CH@mߒc:u$+hwD_<>+$7oƧ>@_/xZ%!q&1o` u2 բ; kzy"蟪^yiCCt!]ScV$5ޑ;1◛Ŷ햫[Չ %KGOh\ b̞'u6?ߜZ&o#1vNbp>1(鑠J Ȏ>7¡*!/׿v| Z·azSx<~Xl0 ogR`ZiB/w ׍DJ֜*yYUD*/f=sLi1r-i$8nxu DF,pav5ǖDN\U;&dͦ*7UN6*DCӒ `ġ]"hxb)VBKp CU_6@K/qV!G0birlM|YeXyꬾYMWXnDx<kkV PRge7 uQ뙕Xy"K#yg\SQգ՗a ji##x==9K"iQ4TKiGh eNH<y1 UʪlsKCs u!:j\Zlk}!\A%/B4(Ce(t/p; W'C"D/67t{gSDh(pٮㄛs"+be5\}lNKn9Ryo hջ&vݗ6P(/+!? "2 endstream endobj 374 0 obj<>stream endstream endobj 375 0 obj<>stream H &E%eW cـAM* hԕi `0 `0 3VL`>_G'.uG[09mǫ/+fIS_l>\mh @[>|-m>vC|-mh @[>|-r%ދVcxYm$lN|-mh @[Ga |-mh @[>|-mh @[>_@oԉF6ԉ665ZB19VB1wD<&/>B?j/D?FBƘ+OWLzB?y.ׯ/E{BppGC%!w=4OBS@~QuqQ JIĀ Q8:ؤLRB&9VB<b65MvCI2B&'&B326Yq  Mf@B96 Qnl ;$p;$+D5`v) HTJ`SU, A!*+Ma@rBTXFҀĄ|6'$J9ؔ$$DrHF*j`S* !bx>'T7/Ǖ-|UN[6 KFsvcבm٭ *U\[k˞,"7dt A{~J2{T'`Xf,<1 4- >!zʀiE:VBw|;ueـP~%T[^_ hsl30_2{yY;m,PU}AqB~ U'dt A[cUT=j'ݠvwp@e=w@BP  ԕ_Z!pp@U5@BJ#Pб >7(ۿ?"7(; v6F7(-4_F(jkJ uReeb *"V T&D( H_"Pq;8 B6!bwp@np@B(;!pp@q[px@KIL֘|@K mxPcLA@yEnl ('ImPI98 yd2HJؤn?]HiÚ*DH.D!up@ʠ ƴ (I{HӀRH?G4 ho B$-s`kht!יKZQG,=!j`3eZ͔.lN]h/:coI41yNha>B`lNZٮ#ғ1;4U.Bt+sp u!tC4rLJe;>Gk㣋Kv ]kPGBt.",/ֵH[4 <!mh @[>7yyfagƩxfacuՇYyMhtV w>0u7bN+"fSͱU?U,Pd,(4$T&nkS"-7O( kd_`0 a endstream endobj 376 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 42>> endobj 377 0 obj<>stream HWiSJίYU=$Jx=Gx& lʶ\f~HWRT]=CQfdXo}MYRf}/O5JE^jDŽ#l,*41u,C:b?z}Uܟ~~qqpr6p&` 2'|c<_SleePGGz{9rprΪog_û\\UL?Q{aJkĽGɹ|4eHi 6Lf.ete2+#ƮgÔ)geRU۲u$`2'~Z :xk-ZlM&!0DEbc dExVJN&WĺȮfW8ֶT9pLm匌c$ȅ[-KIUFlsy=t"Bud$e 9˵WmK v&ɢV'UuDB_8XjB"hsH/\Y\D( yc5KjUtZGzg:eZHppod\HGL+Fy"-Y~V>T>'bRlYB4<j*c[(YļIb7mF4{BB1B9"ZQ -vBvU+EkIK΋i]c{10dP`Ja'ғr[^J`[1a`@6C)1+erXQB6u!% =U_[SvV&BƲS‚(qzzƾ؄blYEՂԢ6">_YavRw5:}Sb>alTTDӁ`WTE{aݯXE heuD¶ܤtkq%#f ok()#FL"uda K_+lLXI"(v6v $u1t`w,Lx5])R2{pXDNb<,qX/ B8ê4 l^;׊}(~ E*Dž"Ls`ɈγtxZ,2~A;F/M$tS"Y2FvUCF(9`/ w";`G+P\UUospu)պk5Dc )vMqd)#6K]o& ( ['c2nRLiL6Z\ryDy-1l)ޞK; LpIe鈡8MG0bXq8F-;' N؁)qR5%ϐ2`D BæFrMaI尪`92.)oզz@نzdق9aDTE^[K3Fٸ]"a I;&L2\Pٰ쟞%^T-!rs5I䂦aܣ =94hdO>m\K&AsNQZa(),2ukbIF @#al".0tz0IdP6ĺ>>ܬ<E2< <]&SSx@z(LJb0T>DZPǶ+I$P9u^U9HFp)XN"3Fbw)/*=ɴQ ɱxKZ{6?❤KdPM:DV%NYZ bݗ!뎬`fzނktl0![?h6^d WnGpW-FG\П7iT;Obms2n9#Lⷕpz2n"O/ڐrkWY=j8*Zi5l+>a0H[2>7=w5#-Q.젮=>%Vʎp– @Nc--- Z {*|_:^Ѥj4|am}7|; ~a̬Ԣ. q_>^fh 3rqt8" /d;--;ta\|f cC6:>v +]h]ffcJ:ٟ%jywsźߏumۗo_ _pGbwɋwK^ڏxmd?ⵅ_߽ZFzӆ9Ob)hY٫^5"#_V:jm vY||G2Fk~@-ڗt{|3u[Jbo ojgdz8k-JlG{:{Kw|<P!t ;rKP-]!㙆dj\?E߆Vr[ +ҝKUO5$-Z-?e6 {b=P%)G )R$.04.eHb8K]L]ޅf^W{>9''N?M=,'e͏zوR6BR6b(~4zcUj'1QsN NhNL&(C-n)jduQ"G RSyv}c¥(Fxߥ(ƨӄ*x/JbR=h(Piz L CJQ᷾mP*X1˦t`t C z $YM' M'ŕ M'`)@SGHrWR*e#`)@[ϛtf{wzqSFLb,ф,p.aӯ|>_ryxx ˥=8N.YQYtv7ЪY 7@?aosѿ Oqǥb`rҪ 6 `Y#Y?=>\aZ7  78odH;%Cr4eZm&杆/c endstream endobj 378 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>/Properties<>>>/StructParents 43>> endobj 379 0 obj<>stream HWn8}Wp@7-"). 2N- -ۚlIvR]NUu|:>dzmWYnx!7,'Ŋ ':T%\*r7=k;_ r3۷s28'ӫ" #~gDVl6fadl3^Ȭ",ru_Dӈ{C㕢6FvrB>6vcezo< ^_^ֻL*ijYQ?R*$#-m#rQLic&G&D{Un4NSDeČ$;%Br1a|rHfh\YY:f\wIL(6>= )]Q:{I(>-lm 8UJi'k[)Sx ĥL 4'4wE>d6CDO2}&uMa)d^O)Z1ė~A1AS+_@q^fbH񍇋dy]9A1*bG/lΨL FnOuFy?l׆}+*B.tEAhC,4jMjۭ>07 @$;Y&LӁ_sCQh¡r/ _5zU>nzMQ(a@1ՀUx?<<֟}۠1+RSaCm,B!69(GM=Q!6,:T2 eέl>ё6ˇ b1xFKJ@V):OQJ%H!bB }_bXfU(1)#eZ=nꡰ+,< TJKTr2DQb3 (BPG!wPQ}J5/3Eȿ\OdV2fVSm]FB; 8u*r?@U(bRpqJ8:| Lں^^:M?m_y}%M {MwUKv0u 3~ ueQ>rA 9͑C ӞbrY F`,PypƸ|#%B*9q_3><*7tѱN7 fP5.Ė~,-_~cstu/gU3 yAi iHHXMMPxk&ŗ&-AKhٿ=٦DbG$r!fOjyeV; 4>Y\EL($'̢_BY w~3(=@ nb* Z,: NI1 J|큛[̣3tqcα3թ<M,YC5-Fm :"XƏ?mXRwc/l 1AIM̺miZoU|8D>ĊwTG'w{FLl kXP+EJ&1LY(fC<09_ׁvuC-٣#D@[ޤX˴$E 6eS01.cXn@IcAptQ U Pnu;2>stream H v0P/cZ@BRI;^A܈#F1bĈ#F=.9j/|| ko>smm\}};\ DU1XuJwTl$wq- OӾ><;mI.8}rVH20omܫ̓E7칀 <.8?\.Pq7qTyHS:6Nkr6tj՞{1s gȫ{jrS2O[/ hi<]fGۘf=TSz]2{pCЭ#VΠkIw{:L?\tPL'(T~?; :pK^D<{,6 5H|QO(Cyw%ۧ{_V-VKMvn6X>ڭZ~׼؁>U\ q]\pw!o*UP]ڣyqG9 rOЁ7̝!0e7@muݐ8Vu;!50كCJWm]rc ~C$fa1bĈ#F1bħQ P) endstream endobj 381 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 44>> endobj 382 0 obj<>stream HW[oJ~ϯMd2ˢ8@fݢomPI][2$mί_nв\'!9|$?^![6&Oc^dM^'•"VJr+CF$5NhC]ilɗE!krvkrᚑ'F/F볷łN X|EM8UKhM_: e{Csj߳xp}z{?;{s* c<{͘IpK{*6|)\2pYÊ1Hdj *ԡhd )}dֈa5lmʼhj:t$s9)>lUؠ NbV"s%2 E XD,-R dYu^.UY/m٥`LM.';7NDTyIDvN;t~{چK4p,D }s%9LzsجKjUN0(2v6`2o B*vբJqp7ļ_7񅢬րgr_=uȊz_k'Ʊ Qg"9:yͦOɩ V')_>AmU~m{X6PKlEOЦ{͡Q7#^'~ڴOMT| KM0 I?ғuhX1*S&D@@+| I4)*8rk7KS6L>SIxʋh4T8.0<_ &C|)0)" 7P@uX=@a#r>4M'W_΀U0m969?llyIip (`h'0򋠞ݼ7HכU]-H81z/$X$V@oU ִ]zj&*[?߼#E/$tyA"C*hQ\ CrB#Ԅ&R=Vx.Ai ,,r#FJp[{$  "lY\< !bŨT Ty_G]P0׫ԃSnΫo=.%R̎uN$D750'YYjjzXGDMh NŲcE݄r }#II ur6Mi_VMU^:RF&6zbtb4c;[عvR7,R=vvLSUy l?=7Z *k3Ei"a*PŴww+: *f@sr"坾C2".jٛ5UW5Ew{ja|Lj~|1gl=~yN8kjZp@eДSiN~}8:\eY=F" 0Y/e@$p ]:^)CC;dh0qzzhp{Eq9Sbjۇ[:G\C%#'] փ~72} ~xG!2k n?45`H8T?ú819 cMckcwe:c Io,,ZdʗndpWZ!-*D,t'jydxFlK389t*0͞kLxoF`emOENjhFPv}4!e "~o #)*3w8&%A jg9t --̰SŐW51n, j_B8l3͡ iɃbjO89z}2Ipi}j[ə0*dǔ{!Hd,~*֢!Y~yLFl 2Kdk֜.}on}hMzoݝ s%q3^'L @\D~āZ*rp!@8oɹo,$p!߳t4gvF`VX`I{P?HT@>] `4!m- ,׏7̐.Tmǎqh"8 C/2}k*%_(}cF='r/ ;Zm hp<<,կx:\=VWDr+JÌJ(jC7e6QK w ?ҘuW"C~&':&Tz)ABj, f݋ K!Y FK=M? 1x4T(  endstream endobj 383 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>/Properties<>>>/StructParents 45>> endobj 384 0 obj<>stream HWnF}W {咹4pQ'i7-XYHJQܯ /"#DSgΜw^C<-{/z^%}iiwqoVh V)J>SV;/x֋ܟ]|K__1H7E4񢈃DS\ 8}G zY0!ZN8g)|FcՇw-,y3#o;e>+X%Co t@K/=!u.j\_1]*%*{~Zte XK$joe "m09PZT ԋ) )4 g UV&d`(@1[␅:.r<8 C..KY .QWmـ{<2Y&%L7SB34S`W!D) kVI!ZwWUjW{ +}%zH2LVgY1ItWTyt7@\iz䂢u"_2Q㬊)j~#KPGu- *(:e/09i\-#>m93'olJ"NԪ Tc|,IKGd$Mz+9K6ٴ)KX&c>{iY3%Td \(JS2-b E*uTAe>M/fp3:`>F4t66 33R2jS`-,/,Ƌ3ٔzzsw\QBZx'"tqfE 9mb"wtn"kՇ" @uLf +rSd-:*  ئuR KHpy!:&5zfC*jă\;(\Q9g ijYJ̑g\ wQI|#oZ%grF6jS6us9cq"xK%b7)Aoα6X@g󄸽\e8:lVѿy[aBW$ۘ !fts1YَSg`V2mUV1SYW#ãgg-y#1P$)%hd8l 6qiWK& M;i4LcZjc%Mgզ*E"Ճs):l<;~=v}6ri:q5U^tJ5daj(w^Ff,5CQՁ^z4f8 cX{>stream JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+_]o.]cZ0YMyZKs4mF8iUX V)=VOέfS  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??ZO<7` ֤P]ƧDG+v+kA Ib ( ( ( ( ( ( >!x_\%7E浥Kw2]ۤmTJe]|* t^]oVOjsjidPJU!R/[Amav%?m~>VDo,md/C ofX2^_:к?hxMuzҡmΊ^LwI2,FEjvf64xr9ᙃ[#I4Dk]74{*iym}[ϳ]g[vÿjZۧ>w%rk{!kEy[ $B.Vi /ggO,# !DڌO[kwVn.㲶M|'8K|t˱Co)5=>m2oo&@_z#&_gh/oݾwyZVFu]em$&OpB*b R$,i|:?b?b1,AHQ651vb.>mKo<϶E6q!V$ri6b7_ص>G9\r}ȭs#S5=OOG>?3f?ŜNyx&eIEjۿ>wq{!?dFx -8>J|H6WfO7?|?>g3[w[<֭պxNmorY\W=ҾiK"e Oiym}[ϳ]g[vÿjZۧ>w%rk{!kEy[ $B.Vi /ggO,# !DڌO[kwVn.㲶M|'8K|t˱Co)>X]:u[¾Nk 3ZJVUhePҵ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H7W o5̇Kԯl('6qm[t+wfy(DUhBEqOo,MhfZ/7 #7VvK9"w;umkn*nD=ܖVɭ})o7|u>&@+gk]W⇕ak~oyR_]@o[gWGU^8}>e^gkbBXApVwsq9hˀzVi /ggO,# !DڌOS4E/!>ۧg<ć#E[oDϚ럳g+X53F4zdwuy!-fXiv>i Wa c|T7X?˿Z:ey~xO3ɸ̾w=/9oÍWIyii ;BK4 6 *E.Ta{#G%H_>gߴwngf o Mj j[}GD?-4$*Y?4GrUI1Aў i ψq\ [?dFx 6~h7Tz]Քvy~Gl{y7ygc$ ~e/u]~߲[&yMe|ZH[jV'A֤NzDW7Ip.V0ehXE`:'xVS}jW0m=pM,QlڹeFRNwIA.j_O3ɸ̾w/v/mth-jȖ)_!(n&&TG B stq#f2A#;̖m5]SSRi4ǼR mC+,Δ %$*8zy/?hR%߭YKlw,Hl?(ʱ i'_l^a ƥ }Kg}_h7ߍgϝUC)s쿿CʶM<~"H|`~e/|yVɷ|gq|tN:ƧԮa{ŹXi8rʍ4T#5-|qYY薖-4=PE'4 (1!1v^ʴ ^;|!ZA{g.,V&E夾P6e8l|v2j(^&h˶HGt)̛ռ7^8ԯlKX%LVꘗ0Ƒ"@[w&m9?g>m ^5χ E#FFWhb,М7G?7|>{Ig|:i  \{?.r)dҼG%>ˉŝ3[(P^r3f[3 z᳨xE֭%tM}&{ij[DѲ)r_:жZƏGk6x.%/):/\ RaTR=I/ov2 pd4~Z,{ee2bTs;v~G/6g7m?wmUt(k2qaou) o繏{Č_aew)FG#0}k?jO7ngj#onjAp fyKI#GUQVŋ*z:qi]ͷV(,[s3`79Fg਍oUح3c[qo|Mei ? 7~ǜ~~V[y{}θz[|pʊ[DʕBL6U,c[rI|5[x㷷m5k$cC+)R}?dc߼/qn[1/mmZ?cN\^_>vϗ;|>Ӯgo/{_eF7sV;gͿq|u[䷷]5a[3<bM?G?`D~o;Nիm?Jo}~^+w+jZ~ya|L(us%v-;.r|f.b̈́U~K+LO ٿw?<3.O#$f|w<ُo3oCχ~ iC3ִxN8g-J1UAKڍf% O*/߈7#-t8|qy$SKju) -+l3kpR[W̻PK 6tMc)؞+I0;6lS̨mYMzV z᳨xE֭%tM}&{ij[DѲ)rO3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w︯!A.(n,;tJO;Ww;Q@ӴQIEVe8KZ:?oHo`<&2߾;J&kZmk}uy.[V{vQJ1\oKiW*E42)I%Ţ%%C抚wA4xe/qoc$chms}2}<o_> X[jE}vdpi?}eif:;lE\,~7#!7cU?0j84{qݧtHl,Gki ڽEtcacuIVH7O[7j dIPO*i_'xὕafV@F`7\2DX l)t3fbxZ"W %e.GkotP7&eo.Y7)g~)>Y?AxsGO'eg,gڛ3gʾ|)] [ [.5+X4tżBe226"3Rߴw NԬ@%ߎ, Rz SW)w޹\zō{MHtTkVv$EibkwF73G$sIw,[?c_/3Ɵ6-m|{{}Ÿ.7Bjs_d/?!7_ٖ?ev??X_|~X |haRyy q",G}||hq-j>7xH_ w_j^1ծeg"#Q $N"%\N_g>Z"W2Kˆ>\,~7#!7c}:4Ykk[,qdWܿgk,~43öD_*DzᏗ#ߺ}MXH<,ڞéKkLҵ I՞'oDKLkI&w@?kW/yWX_|~͚u9vh\x̖= |X>oFBoǖDd&y`u 3~|xmZV }Ÿ.7jjs_GcC^oڿOW<\u6-m|}K&>\ou,~/76َu:4xi|A5ώXdgx+EEL&U7$Ҵ3fbxZ"W %e.GkotP7&eo.Y7)g~)>Y?iαwشO7<3 3e7f>ճ~^>Ѩ~6N}=Ǜ}~w?{GcC^oڿOVVlӬWCD_*dcmms}2}<_|Ww|=T :ץ$J MwA$h7p9 |z-G1ho"ڶ~{]CLߧ_/#0uUht^ K[OhQG%dc p  @O|M:`ʸc$cMX>oFBoǖ C ueo"9dpˍdWܿgk, u -G7}l<ݘVxsF u -o?7}~<ݙ.ygq@ IC?7g5;g}=发?x? ue/q"Icpˑ|}hu,{WM#_/ٿټxG;VV u -G7}l<ݘVxs@?sί f↣h%LֶOk "0U2ffi,W mOdP$b"o?=_g_/wIU?#ξ0ŭ_g|ϴ/<'?e/?l+W&?}w}]#OqSA|Xx=SQ{HњٜFmwZGca}D~ho>O7f>ճ~^>ѨG}a}[h_y{O7f~˿~^~P&_4McQou4խ5O'@KU!HD9Y>x-gğ- n/uƵo&l,sNNKn˷" X~u .@RkvVmp V5I&Gu ?ϚbG8h[Fv,+pMϗ,\=[[4掀: ~|7"odҴ__F $j·tHvrVW<'Cxu?dU<4[Gii hQ3Cb ##C7n#}3XݜOt ڍ踞IЙmEDc2𧉦WG qcycO %x|_5fܢO0((((((+sߴc.-'7Vݧ)M慱5t.JB@ 2#+_>7 2Q, =m6Uj0nV] mtՆUݭux PQB6>ͮgl3_eF+~ng[vj]yf& Q)mkn*nD=ܖVɭ})o7|u>&@Zfã&( -?ȳbT$j3[?`f"5ndzQ⻛wT;T/`ghrS#[;ź =[-&UD.2l!OLm ІnYHg@mLpqG:6:O]eszOy*R9R# }\gWg?|y{sVjIqnkCn&ICI;IVSUJ9,N3Os'k>E3CoMݻ-wVoFBoǖ CLߧ_/#0uUG23fbxZ"W %e.GkotP7&eo.Y7)g~)>Y43fbxZ"W %e.Gkot?/]jn|AK-qm폈ow];Xye2F"U~ yjEv?O{#y?\Wa_^55#^/ Vy@I'Umnbw]15a_ 6i|KSΗ%cK<^n9֖Y,|2㋻/ ^xW֥\4eK׏pe_.#;쵻cj7^.j>sm֙]e62ήgkq3Ld[fx%cX9麏xJM# K֞۝s5ӣ)Hk@f4(_u}_NE]]4;</`UXQefW1,mu"w+]&O۴;o'?d7g,~_f|(´:\cv6g'贗ҳIJmG&.4W^yllVӖc[$yjK"K-ZflElLVͽWٯi!7cWu"oO/\n6yqM6y?uܟ÷w:v?n6r~9};mN?Z<]3NViD.G!Ve-E5đ|yshQ\?I[|ͽ[8Q佈FGm{0>Εo|B>p-KDRJZ8eugUK`jWE9io h*Ew'7Ak'xͣAŴy>T݈5!iisM ^[)V?4.p.YY:Gj:n7?I5%*k+yZWq1Jmn!Q˱]>>Z^¶~<__cv~&mWd5ƫ wBP sj k;Aby |A.l~1{amۻR6yqg;{{oQ񆵢d_xr)R iMmq V_]KfPHNw[<Z[xK_@E&. 5"#[.'yVL6]ߌ~8/?G{nOՎosq7A>W;WL Mxt>-YFk#h[0mTM #v֣j0k]JK+ƶ閯q2bChc}s/Ox\GD$kj7:D ͨM4,RHm%~fWu]b}7ϟ#i>.7>wcy ú.>4 ݏ?V;<hW|au|1'_3,վٛ|~|g4 .|?Ŗݿ3ϕ}^oϟi9gtX4!ҢLΜUٮ4$ZyYỶ,,m٨|]qd xzO3w#.h-PU>0?/Zv>V~qy>>xsW U)]5"?mJm>әR[fUi|M'M|@71Ok5;gĎD $о!EO&X֮R{@%[晣hWҵowi~"jWz5 hznG{lkHH.r |S:/m|ItM3ğlU#VEK}߾Gi$a4nHmM#z9xtۓ|IHGet'ֳ׉4 2P𾭦Og/ B] Le$*4@+N'?6uZIVgO,ҫDVFKڋ4;UHHxWJͥlawI+]U RZg;CҴ[_4w"D{sCtB\ZMk4Y#qUw:GPn@VMm |-4SC#GZ9P>Z0HPQEQEQEQEQEQEQEW|O[oH~Iz 镢XEd~`FE{]|:O#'MnٵhbKEU \[vw%̑kExm+$&QቌW 7?>_~/[o;V?iVaK&#o'_C +gvyq>Ӯgo/{_eF7sV;gͿUۮ쭤D "3h_4y]2P DOOGLxB/Zf#͜9H>VFA|u[䷷]5a[3<bMK[qFӴWi-90D3TFZãY|m Cϳb'ۨycY痌mF['Qθz#\i|WsmՊ+t " Q*#b\K=m>[weE-]J!& ]ś1sun*ӭ[=ܖW2Go}q|șF>&2_z#&_gh/oݾwy]_ V8Mhei(hXe,ԩD_y)S:v?m_m|'>oyl~-ZhI4M#<.6GU.پ@H[մ >5?mZm/V_uy9aEģ%$l9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ ʼmמ O/u n gSڤֿg\Mqve%KFh =')s*6n?s/?L?=X~h s}$L.yW!2XNAH,ۘ xJGĭ S!|r$Dl{C$ySng=*wIA.j_N֕%ݫ h PJ"")ZKZ:?oHo`<&2߾/,lğ֬Ϋ_O3ɸ̾wWն|Nkk>3ZM޽e&0ѴOw[>ih,"E2K2{U]Քvy~Gl{y7++VZ4W\)n,[[&ԒKg$ͤ<:GcC^oڿOVVlӬWCD_*dcmms}2}<k G|DѼA}B[RNlp6ΨmM2Gⲵ 3~|xmZV }Ÿ.7jjs_GcC^oڿOP|hmoßFk\C>ss,fv@Yn$#hA߁v_ P;}ӵeigXyb<ߴcyg~fϓُlߗ4gi}O&E.<3gv|mǗ#HӣtM+GDM3V;hbfKem9mPAG}a}[h_y{O7f~˿~^~VM#_/ٿټxG;Wt.hx${:z*Jٕdl4/ͨCT?4çyw"o^vy>O@k5_Yӵ[tFq-2g1&.BͿd"MƼ_hxg7'MzVAeӭ" n2MM< 𖁭BI<;*E՝ńXۻ.'O$6lWzF4="M+G' nfm&JӅѻVٺS(qb+Yƕ;8s4ψ>+y}yZ6eY]cI-qpmoZ&Il[;?h_>nᲳ濏O^K!˓JC1f[BO jw@!?ų.G#Ryo_ge߻w??jh?~9Upfѥ4oM{,)3M?'WT3ncwG5ow?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hhxZw?+LP\kDzvmJ]RxKh7ay >Nj~A/>'xzͿ'~=uQo`3^x9#c-*eYf,q;8֖? f^ZO}GIK|9ӿ|oe/|+3s\}i~>ӿ|oe/|+3s\}o?A@~>ӿ|oe/|+3s\}i~>ӿ|oe/|+3s\}o?A@sjFm[cuK▛i4QDN?In:(v}_|;4O[X[LZA#2ƯVRT܉ sGdUPLXC-u*h䵿6l"M-%ϏeFsoKR@ʬJϧxwvm?wݺͤZi iRU]6ɢgLn3ğ^ěO,Oj {uG̲H^Iyc2K>#zdm⵽X<9x qseDyhu>.G#Ryo_ge߻w??j|? "֧TҦ4!*&SFxr1<; H>fH-/>MyUkuxY|Z}2kw#QÍ ͬ^H RHVIs紸պ>"z~ϙ'|??AofG9vo~ˮ8q$1,nd4cee1PTϼkm%-;e.r3f({MVNK +S ٿy_?</c_2n~ VCb򼿴}Ǜ/g;w][kgw6ewKOܨ_=ωSF$wU;uVV{vc3Z?-M*C)F,]dCs(sfmG_ifZcQ[yg>~ϙ'|>ͮgl3_eF+~ngyŻ_?lؿ巙ejkg-ƣwYbtKܰo! 8aE.dzQ⻛wT;T/`ghrS#?cN\^_>vϗ;|G#0}k?jO7ngj$Gqnj*nfyKGɼUQ(e(ŋ zf?hoow~7~3^m?Jo}~^+wG$foڿ|oߟo/wZOXROA0)ԝmS#+<2Hv 1Br ~/tI+ oWVzlC|f/'V+:tG?H>/hyUbfys?Joϕ~^<7o<{+eK-Z~B&|LƇ(ʜ25#:[ʳ۵RnoUTJJ1bC&uo| wm-/RR.{``g<~S5[=C棦GfN.<][tMhYgN[pd|{{Wٵ:y`+hy~v|߳߷痷5n8q$1,nd4cee1PTϼ,lğ֬Ϋ_O3ɸ̾w=')s*6n?s/?O4+֟p}[[FG{F&I;@5$IqZIm4jZӤ4MJ鬯"'\B/UEZ^b93uW{?O wVRU/IUm'~_;U3>^j:'ӡ+NfUE->(, b,qFdygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|q^g~$xgS嗊5x,Bbiw@$\ٓQ כ__lǷ</|E{}}s/[M-|Y ^ޢ*bX ,iD0V& ?M"E }jڥ]^(R~\{-BJ& vw?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh}<7/f3L2k5<#7'ey]Mw}[&|]F<3w#0˿w?T3ncwG5ow?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGM~u풯υ|yCao]kmi`&d{VŨί扞vYf`-~_?i |NP+okR-4TL-%%QqWw5o7ĭ?|mF]Ve7M∥l#`-2ut<$M࣠;U_kM]c+[xʫH(a9#5d[+]~/?>-di*噘rXnH̃ [R? £T?0U#2*?nH̃ [R? ¯&~z ռAqiqdk&-'m(! 2-aQ sGdU5,?xǎ>(}/xſaOR{߳ۿ]ؙ3sPW-aQ sGdUWE~?A_ubO#zdm⵽X<9x qseDyhu U#2*~&,^!O4rZ[ &ْDzA9% teVP|#7'ey]Mw}[&>Z7kt$ B? .auq B˨iz^&e2.ui3r#M$=__g㷁fǃ5_h}|%'Ѿ֍ڮ>(((((((7߽[ |C<{O De[#eI>R7x{/$[ g\nZ!匾dVAdP:ꚮxVRLmZm0H%JtO^"mIg-?4G?/Zf?Ŝ8I &fF2Ej][uwh?dFy\m 8]|HVh /hCyP$y)G܊??9:S4E/!>ۧg<ć#E[oDέͭNmq\Dgh7Tejzie|6~gu>98Ms$] չOiK+#7>֊W>IdLiP ?#od뿴| g7v;y߻[k[tVp'䲶Mod#h9K}wèA26F?gGжնj6;+i$7~ȌqWL?f!` 3L^ φYG1g*Bь3wih6_hCy}O,$y G܊&?88#L!Ũyg<㔌#EkaD z|:?m<1,sQ6-HvNb(VU\6c[ "3^qo4yQP*DaB5siXiFZi>>-xg ddr7V:ݵes$z&G^J,`?8bc+|A[}VMqo[-g3@9+<#xK–յ-sNK\w,ֲKauq!ggBcEbŸ@NkVt7 o{kjr-G"J*UKPOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C(y/Qk6!{xi=bWHTȱ[,1w ͭNmq\Dgh7T3okzPqI l,D'A|͹yÿ ?|ooOI kspuo ,8Iܯi< q<p9"w;umkn*nD=ܖVɭ})o7|u>&@A'>&x>K ÷+.fP>X.y-GAX$ vO-;P/E~ؾk9<#\MK_w6Z7`Jec FQyQǠ5=>m2oo98Ms$] ]gS|1⭕ƒ.;;6&(H"g4(ILRLqI{,!=')s*6n?s/[tVn䲹=|#h{|D0A11_Vs%lbּҺ[rXm im{9w귖{?O wVRU/IUm'~_;ܯ W]Лi$ԡ+淂 o{dkyK,C|/⶗y⫏CFM=]pQ'$_f"_ CixfwH{?O wVRU/IUm'~_;UHc/{כ|Oqu/Aq,}̑\"2wq CLߧ_/#0uU8Q?7]ӼA[_i_o]b=w[ Jö85Z`H4])JL*GU%XhoNbfrL]xO kPZ5=wd:nɅdWv"g,n^\9HLoi&:j;ux ^ά^+.eY+j, 3mU_WӣuW}WGDM3' V;YYUKae~m9xczw]39xS>K4FFхizV&Uc$`%-5C~g6y? MCw&v7v6ڛhM4脽2ٚ"Xb&3[ᅶ[> 4[.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh){?Zg_f^쥕<2)xH[ndto.F{S֕xvAЮ!ż+jvvmwMp'Ҵ}3S-7RN_ J-H8 ?5T?0U#2*5m ^}xKZƫ-F|S}qsq/O_.4ieY&8綑[R?  T?0U#2*?nH̃ [R?  lj#cǍId6vsHYu}Sn!%⠏>__ڽ<+Q_wm$PIsicHw|HOQEQEQEM3m͟> ]&o) 4oŚb3)aTz[R? ¯e_n4}VҦhD^ KN| eXK;Qq-aPn7/ >8cLj%Űݽϛ$G>0'o(7on߿qV_үtOǖ{ ]YexJnVRAR kb#Lz$zETx.qhayd$Ly& P((((((+_^6ռ!Q,4}S]|?m6[4eeJ|K #Ȫ@?>EW|bU_-ŭMY2͜Ahmݕs"ɂRHч*(۝r_쯷}djfyuEaO:#+yl6Gguo+hN|߳ٷߙ|*xJ}~+OpZ՝& 2[l,QVSOjn13NW93#hyv9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ ض%Z>?/|_n|_6>gV#~7_>y˷g?o巗]j\gw쨥tKܩ_=$سa_5$U;{vZZ{a2J?-=2K1u*QWJsG?H>/hyUbfys?Joϕ~^<7o<{oyl~UK{uV c3ZO1=*v,]T (sfmG_ifZcQ[yg>~ϙ'|-nudzN⻛oQ_XgoXrQW:Ymoiû*)o*Wq 0fbv,EW䱍r}ٿj]o?y~~-߾?mAoi}G8}6̠I/ov2 pd4~Z,{ee2bT2_Kρ[*L!kb',Ȅ3FpB2pҮ~ VCb򼿴}Ǜ/g;w^?&7i?3o>+~/y_@VBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wGhV; C˟//-Ȏb{XJ&6YFkQԼ=qh&d,Bj-u ;G׼'q -v2"xbP6 Y$U;{vZZ{a2J?-=2K1u*QWJTN;O|#}|3ϛy[66ǎ<ͬO6ZZilX-4Ovdkyb;Ɩ',~+^ zִcG$\}ݵe ` 4[z_ygc$ ~e/u]~߲[&yMe}W~M3Sޱik՜7WtFmA[Q0~oӯM[_*\oSm]_r0S}|?kW/yWX_|~[w:6(`}-4)WZdPPQ*Vs 7MCWg߈]cT+Պgpjp@ Kȗ'kp@U_uLu_j%Ɲ541jRJ \\_BgYQ_<1Ľ]Ẅ́1xLMwκ"Y+426*Zʯ%gKi`lӬWCD_*dcmms}2}<|I;ῈqY/5N^u_\][#2E.^#*=R=zM#_/ٿټxG;VV u -G7}l<ݘVxs^6 QY_o>4<1Σ7KʳMik;NnH ݼ R6cφ^+'oiJś\[x$pIn~\O6q@~#N2kg&t-{/U4=ZGlA, X0ùoQ~*|/oOsx6SRb.2<(f㘵חduZIVgO,ҫDVFKڋ4;UH>O;: 7)q<ϵgnP6< " ׾|/rCφY\iq@좎٭%X-nB =H%h.w?g_y˅G%-G,uC<73/\+ʾᇉUmVI'}+w^K1|[~Vҧxw@!?ų.G#Ryo_ge߻w??k5o7ŗ B[DtmtU2]oqq湑E̖Y;+>.G#Ryo_ge߻w??k|+io[u+>FI<5:95 }NBIР/4˯Z@GyW-aW~.#ھN'_ao袊((((((+¾,xo5CԇH\kzD-4<;rqCy6=ּt?L/hTWKgᯈRxO.ei~%>Bb֒Y&wghGR̞ms;g/7y^_7w?yU|CԏT 6[YY"sGpS i#]*8O0VOv gDZ]s2,;{;e7V2G|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHxQ]rY[G&WiK; OXifO|6~_ش"99PpMmd]պ[[}GOmR`Pz s2LnHo$w리2ng~[UURXɰ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H0ms;g/7y^_7w?y[;I%Żi K۰% '&YLAT"(9?#od뿴| g7v;y߻[k[tVp'䲶Mod#h9K}wèA2-mijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ3OGLQx'>?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* @: #:[ʳ۵RnoUTJJ1bC&ʿh?oyqo>-L.--"|'!Hdo-r8>S\ۿ>wq{!?dFx -8>J|H6m_E 3=*KٓU[ -Y^Z?&V,l ,ةT+s)([:eި!s\}D[ a0P|3ne,POMHoWrV^en9+;yf7Ae{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/| NJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f%ɪ-Ė,| +F6ÖpTOY^usim0)h)̏c <8FJsOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C( >a~t-A.~m%-%iz[CެWgqg݇.um=ۿ-?r|>&cCeN OH< \Zj]헝3bI}V9^6(Bn᷂uCY5֠i616kttH 7lx`dU7Ğ]?Y^Gi.{kx΅eI˟1&m򬱆[/:[m~&q×BFVG"c 1_&I-sm3:yDK; AOEommUKI)".bb2O Zqe3L[7M+]tN 8-.gT[6i[X o%W̷*gWW+it746YÚvG$wzN&˝g5K p1Fִ?xB]gv 6ye⤕.whfV6~̈?=U]Քvy~Gl{y7F=G:ΓeZ~R77!^fhȚ;-K"I }*?7~ >GS7^i=:=\o,~/7:cߵj;g}=发?x+H4])ULue&YYs*XoQ`aj4j:"i(vy> ^ޢ*bX ,iD0V&?ٻ7[_ xM[WFNOM/< N?1$ W^ע[]xWǾ(]tU_IN)#[Qksj YQ#E$]Bd8U_x+V#*šuq] Dh'vg%kn>$hׄ)[-B./1 ]gT{2{rЫ?52_,lUfKh(S#!IX1"[.m>|UAj:}5[65:w1_[j2ʁU ڨ\5YMowK}:k>":Ez}̂hfktᦼD\3M%A_i查^MWR;Q:'AeѲ#cLuHLksY_Y!_[w"aX8 sGdUWU6//FQMbԮ^V\gdXrd-+| T?07QË@xO{ukCq,1WmX{C|WEPEPEP_U~.Wo?3W0f7}|_j~>9cfk ojY~ OfSn1[n>U#2*_~_RCx3XW}ëyL7mw_?A^ڞ*OH|k0j;u/;o>((((((>!x\ݞ; ^;2$S41mXD‡ܠ]xWş?αkoIpkwTŅ憠m%p,T2@c;gIѼCLiZ^ykovO"nh <3Ŀ]PkhzITRXbr .d M++2"Mn#! \iuմ溲mZh,QU0<(%OMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C(UG9\r}ȭs#S? |e +{ YC)W%OLڍ+-hLZ?Zg5Ɲw6XwKOܱo! ω ް6=>ol϶}sq9(Q$I'1Asun*ӭ[=ܖW2Go}q|șF>&2θz[|pʊ[DʕBL6U,c[rI|5[x㷷m5k$cC+)R}?9mo>wm;mun*m[EvVIo q/<⮙v(~"Buo+hN|߳ٷߙn9/q리14 pgb4{UU`XOOGLxB/Zf#͜9H>VFAКãY|m Cϳb'qh&d,BcF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB;ź =[-&UD.2l!xKS_x[MI[} ;+MnRdq3 ϫrXVzѲ6nd/c*L~n%`+CAER԰<[y+x?>)'C 2Oͷs[h9?|G|u[y#]5agkv3oxEŌ2uXnhCAv$1=hL"v>tꚶuK^Tu%=Y-sA %>vKmphV>fe8k!GD3#eq^-!cxD<B}xq@ {8Vxn)e%'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJ<i_Lof(~5 FH%#sx/~"j.-!wJb2I=GuN&]"PgQׅ.Fۚ"X3 O-Bs)fA2o;{6{}I̗ѭɊ(926b h /hCyP$y)G܊??9:W^>zu}7;xe/΅`΍\G kFEψmMf5 )MIwk8KH\e%-~\ǣ.t ()$!a˺10H2XƠUwu_蚵$Ԧ]VOIZ%6py[K RIu*#6~ m<#qk7 QT˽5-HLf"ٛdjonkC+Op &ICGǰVS)f.J N+_ $i3״׎W{Ye4Y-Y〉fLVwIA.j_{{NQ{KZ$򉶽 %ym$.gZ~ҬO|1+bFnhmllL,ۼ)C#xg5˽"oYړhC%\%Ьi |M0Y&Dſ|Du#E' jvwO$k5_'+[DfH!2"\KZ:?oHo`<&2߾򫿉~ӭa> xḵ:Zƫn{ǾἛhg[i. R$Iv4IxgOQk0RrI; 4wyKfܦ#uo,lğ֬Ϋ_O3ɸ̾w_!NJW]kZ>.=, MqeG,A, 2<WA!7_ڿ_iocy'^+U_4 ψ5+6H}QҜ\n& ze%RoV0$(rOj7֠g#巊Di |[C 4^u L|@ؚ}|Z˨0-g{XE-тY^XL!@2Zt%YkpKӼEfp]B.(^ ]:%𷋴WYBun|Dȅo$U H?ϰl~j66am۹qʇn>Me\n_, |9 K<'Cf<]h ״FHq{\"$Qp,Oqt?kM<1⫿;DZϩϢ4*dp4[3D(֍jw_&˿<[vOaۻwoڷ@9_I0yfF?a~]hh|ltoP|W+}k@K$qq{-! y>"y$DW@|~Z'yfMK}{ͼ DF4 <7y-V5cky?4p]w?`<.h-PnH̃ |YxWYn%,:|$Q7cȎ+A}rጱzo%Ѯڼܛx_;H3koo7y 4-aP]>?A~l.ѫ> ofy$8Mf{1WF$7PEPEP_z~/-O[zk!b,s HGtˎ5m"%Q>č𮓦MjZ}qw2[w1BFTryw`2I_ QoLJ<;om?Hi5Rg#t̂wJŒ-vT?0cUSI cf_'uSo0ݷZߕzwJj{/?!<a]((((((A[`i-捣n%o5.8S E=_߃o< :t? f~k ڼy0\mOw<9?|++ox:?ؼ%K!IE憢@+]g Gs^^g~_ ?G/Im/)FFPX9ۜIh7Ÿ8oFt;x/692p*H'`o@dmKyaWVɅ 8v*U 'Jѯow~wPܶejXLo,賒,{d HmY#:[ʳ۵RnoUTJJ1bC&+\|}k 4Mi$,frdM'I`ޘr7| ƛ;_ZIȒyma#hy y"~GHnO2y;乿ky`i F)#a#yF .}Vf}F֗H@{HV13FӢ*mq)-j6 7?ǜ[V}[y}V*ӷh}W>W{<ݿs?y_:-Wth揦xJHӥb%Bn IG* C5@;ź =[-&UD.2l!993#hyv[oUح3c[qo|Mf?hoow~7~3^ոĒ\[İ[ Pyo!B)RK>??AofG9vo~ˣS ٿy_?</c_2mmijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ Uoخ|/cyq~oueģ>Q}G}ӵtG|u[y#]5agkv3?/|_n|_6>gוY}ᗎ) 7BxFBm_-NYg4eCWGn$ݴֆ%mLvy JrYWχğZ]{O[&YKsɼnd#/0rke{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/|>'cⷱi-aVfҮ?gbnZ+nEDu Hc略4+QZO}l[͵ypţޢ@[ U-{2jaq%++Gхp;*qe%V{5_ลKo x(+tG؅ #nҥYVHo$w리2ng~[UURXɰqj%C2y.bKtԮV&fy/j2X Jrf( ( kxG.<9+HD6aUetKy@I>h4/֊O}«d➙o41Cm%h,Oqs<Me$H`V:Go5ܻz&oh[ ~L,XYñRW>RP=g/5mC\4>񉴩GkUـ=*kKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%Cy2*|M=>f c{9WMcCu ,B2$GЖD&q3vZEōŶO7MDI>q8 9G{2jaq%++Gхp;*qe%W>X>(^iVFb֞XIn&P <K59FVHo$w리2ng~[UURXɰ,K f۴m ^Z1v7$m ȻIRoxg+R_ikdGJ+bC/;>,79\ C+-xgPn>^ܙWS($Bdkar#=uIm 't֓l[md7\>qh&d,Bn+ſ<%K:,IsWK g<2 hz7*vh}Vo{߸soy>_&}ٿj]o?y~~-߾늲G_ \߶;G k/qbekc}c,1FK)?7`SRO YڦlޯYl ,3myP%򢷻&5Y?v|I{Wcx7*"o ’_3OB/k!5 %sZhϋi渰T70YDVIc.9b[<%\h>0*FpczOxqaS7sG|u[y#]5agkv3X(Ј䍡1)ZKZ:?oHo`<&2߾?XJ&oXմCS]AZګ#\A(f}o 4 57:~ ,?.vfpmVfV2Mg4ExcT6:Y[ 6&v s0?Z?&sq > ]n~fH}7 FmR md*{_x7Z^(Qtj退+b%VI%xGDnwIA.j_>0k-5Kq ۬7ͫ?(SC~^jא SF-}le^)f;xK"6%$xW[xHӼMj-:K{Fr-MLu!hS7][6SxD6_N^N;4JX唼jR[)i[Y$*Mʹo|H]U_ x6V0:o m~M(-$M8#ܽDw&Y,|AZM?}SF$hmn;iu&Yg2r%e$}\~ֳx_S4 iP6Wwa" E$/Img*}JG/oJ}.-BW]նS@ӴۤCLMu 1E,6eVeoZm׮/7JxPg5{-FƳGrvR{3~sdI7+<-aW^c̚N G-ψ!״HG+';C-`2?A@~5> V-?S%\+ݖR̠m%, 0~OS :։O nNG5?|OL:vk~U sGdU}OKJ.54K]!F eB|<h((((((+ʼG'Ov^^gڏi/zg?IXG4jo42d& FH'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| Pkv>*k-f.[ՎWm.A1kU27٤`);_kfjj+$g3[w[<֭xQ]rY[G&WiK; OXiym}[ϳ]g[vÿj][uwh?dFy\m 8]|HVi /ggO,# !DڌOS4E/!>ۧg<ć#E[oDɦjz|?eyb<3 lqF"0NF"=>ol϶}sq9(Q$I'1@skn*ӮDEvW1ǭ/owm;mkn*nD=ܖVɭ})o7|u>&@Zfã&( -?ȳbT$j3[?`f"5mZhI4M#<.6GU.پ@H[+L!Ũyg<㔌#EkaDo m.46k\4qr‘jĮXb#yڙ-ޒ?4 #m_[yy<0[;}/>un| 1.]ŝLV#oO)wǗꩬ>a~t-A.~m%-0 ]|.5~dȋab &< m̥$5[{EXeaehrB2e?Kaqecaۻ{-Q-Wndu+}6h?/lQEQEQEQExW>%O?X>x@ӝ[Km# "dudF :(ijeq{Xe>8xX]ؑ_[\2y h#,9er7᷎41u0i=Ė2,iH8b.pZEYvQ@`@=;;Uܕיags ! rXVzѲ6nd/c*L~n%`Vx;U>^[.\ m"iXb kIȑFB%߃5~3Rxb+]CI"YM{{1Fs gn֬hϥ ]B5'<$Ef Z6R͕>$_%oX~¿3mo0HCtW]\-Ś[L"i2JcG#BvFiRY} Z]KZyaG \y~a*xw^cu/mΉwrZ&h佡m(- dmbyV)|#6"~!Xæ]IG'8lexP #>%ɪ-Ė,| +F6ÖpTOY^usim0)h)̏c <8FJxRhڿ\/4Q8:ovO"iJͳMf+ j wso7Ki-i+K$33r>DmlxJojL`Gq>∣Xlt!."2+x@E$3Go"Z4>1EliEsr$(Q1q/oŚ?WU%;8+9Ĩܪ96D槂$xLL1SAdȓ1U٠VK'~P7&eo.Y7)g~)>YռKZ:?oHo`<&2߾ u-g|P}3R> Ԭ5xbYB\h;sY;xfHy5|N ~"Zx .M^u;.ImuhakI$xj$ʷ$j&:j;ux ^ά^+.eY+j, 3mU[Ö:톧cQou7.O'LNn5)0sre0yooPv{/!S[ Ɨ"C!3{mkr<<15q$<:"zcS֐΍iFh sU{,bF\5u'_//Q'+4>m*gqqԱ až(vdGj[Xk2I8EҍR.'e\r6I >"xNd|mkIqvݦ[N\ Eho"vMO~8p4^'MKšb_}2G,Rxu.gfY,)2 k u/`NZ_,4~do-!P>Bhۘib\G<λZ\w?`<.h-PnH̃ [R? ®V~Ӽ / }0lwd:Ym,^f1Iq6饷~5Y_%.K]iw~ShkkG*+WFd*H[R? £T?0U#2*?nH̃ <d5hwg9n|A^\Gr=]9yh{_wIX4 xOҭl DkcQywE?A@-aQ sGdTTվ7âW[-!{\ʪX? 6Y(վ7âW[-!{\ʪX? 6Y+?`}/\~Mm)|EKwqxN[ko6io.ۮ. :21_|Ro|{ڝ<%}kQ%(((((((*?2ogOOxgw6ڴ6i="oۂ4 r,Rm 't֓l[md7\>qh&d,BkrG|u[y#]5agkv3,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0xOs~x.?Tҵm<I{ !ݪxA/n[UK{uV c3ZO1=*v,]T ^"G$foڿ|oߟo/wZ5?y}_e-`yf>-Ϳ(Ki =\0% YL(+%*}\_o?<|}E*ӷh}W>W{<ݿs?y_:Qcھۿڀ::r[ۮ\-RyUTDUb ^θz#\i|WsmՊ+t " Q*#bj;?>+o7G~Vy7/YZgG?|H>ߵh.߷U?m^yt~_iӼO5WźFeEpҋm>IԮR%[+M\u!oFa:{kIo^-y.8{H2?YKyJ+h0{?Aԛ jWV:Zw<%Dsa$r˅GC76PrSķriQ_jCI4QxgxtR,$wU;uVV{vc3Z?-M*C)F,]dCxP(nloKnK,3^@kW/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RxĞ"Γைa xYx2ҩ3 {Uwh5ibgECş q -!9PPZßk:燼A<;4p_}Z8/b0_[]`oL1`As_$Q@Q@Q@Q@Q@s5~"Qi#mKx&V(+5«*\[ʤ<v4L!9V(*/cwr^d< M} mtOi)>ku\X[n`dtKO>4 |\cGdt:O V[=F~7א2OU]l tG|u[y#]5agkv3,iYsr$ l^HA&][kB=7/żY ǗZ=$ ,ХZܑVH-MXeY݌)hY7% t!a?4 #m_[yy<0[ڷ/i-+maO:y0Y61|¤ V xpjWٚOLZ'!-ҙquFL++][> z%j ^PH^[s2C4;]ua˵QC$g" aPfYxC^=GXOKM hmcмYη̂Q.'s7Qŕ=I/ov2 pd4~Z,{ee2bT|y+>ImN -5[ߤ׉#[3ƱEp!x&.i)e 5 xO 躾նD۬[c,k݇jZ|]xI֬P+>!Ya/*K9L;.E\O!>>0k-5Kq ۬7ͫ?(SCr,[K5?LדE Z怾 %a~w$K%cr'i~'ntR֬fQĶ 6C~5F;N浆ox3]ntK~*|eaxUӼLuMgc8y $|~аoҵh4m_ѵ6;=֛wi {we14D9M>g@5Ve/yCgm= oHjc)# `쫍>&C/U bSӵ]RSRӮ.<<` v ܿGWԲ%xOu+-'Q.>"cZnfᴽjK؋ϞaWu>:MJž,G~=cśFC,k"ϛlPy\_Δ}<7/f3L2k5Ӽ;㫟]o ֋ubܧXZT^'f(Z[%wi'Ӽ;x5δӉe3{4k- zm~]m[ͦ:15u,纒=y_J@tl+ȓ;_I0yfF?a~]hh}<7/f3L2k5> j? 7<Ck)>7on߿pxGho*O?71S }GGMOojn7ZJO}\}UEPEPEPEPEPEPEP^U?:&xK*Z>|UI|7DmnW⏅M~Fݯ|WPc[6v"2!#1,|-\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ pW-񷇴彶-֊>Ig|:i  \3L^ φYG1g*Bь3wVko]ͻ*Yl*A03`v49FTੑ~$J+ ѥxlKlV[K˽IתYqh&d,BkrG|u[y#]5agkv3ߥ^[go}uI3'p˕ WOTXZ+ʿ~dEOTXZ+ʿ~dEZO7{_l3⿁JdO+Td%I ( ( ( O?WZ'4m?-ߴiڥ\͵l2 V>W K0ֿ>& [6@ GGCX#dx}KٓU[ -Y^Z?&V,l ,ةT+s)(h&R=]iWMe[].&mF]6A,($4j! |m=Aỻ&$_;~gM &+ge{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/|G|7wqo=!h$b$o0HۀAvޢ[kB=7/żY ǗZ=$ ,ХXm3AԴO]RRl>D6FՑ2m@I@ýK\|awrOҮu{+BiDd΃SI[E,1%#:[ʳ۵RnoUTJJ1bC&4h>*}v=?Wtֱ+a\S-cgt cHmR4#`;I%Żi K۰% '&YLAT"(<+DЮ> x?jCPt_VAx8$oc"۽I"n\UxQ]rY[G&WiK; OX^(m.qZMgwiM+h+@!a!.i t{?O wVRU/IUm'~_;U{?S*].YC+X5_"LzVDh2yvG)>Ķ(Ek2hZ9EG^$5? jvY˨+C}[UwDkT5%\ w2|Mkxg[u?WozN}mHix>k7\-lĨtesֿ]A^w&vڮ-"$rU'1fGx2-aOº-ɷգlͭo,votrMc4q\EkRXQj7OB`O MpE1'$kMKcP)Q'ttԕUYl@<*4 [Úle!/]Q*y"=Lݎ2Eig8kiwŸz^&xBa<+/><^]xkwtD;iɍ:iUMTH?ϰl~j66am۹qʇn>Me\ng k:Uo iPOg/[a"HDcpD"*p?}<7/f3L2k5<#7'ey]Mw}[&:wc&*58gӮ vxJ?[{)"w{4(P.|:c=4MV6}ߔi=[lL4u$ p"`w?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh}<7/f3L2k5<#7'ey]Mw}[&|]F<3w#0˿w?ן߇uxNcᤛFVc̢8䙤؂fuy<#7'ey]Mw}[&_g㷁fǃ5_h}|%'Ѿ֍ڮ<~,x~a~t-A.~m%-6lƓ ݽ/wp[Lt"XpHat@eI`iym}[ϳ]g[vÿq^;g x? xaxZ5WBF)gFUK8TWuo+hN|߳ٷߙ[][uwh?dFy\m 8]|HVh /hCyP$y)G܊??9:9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ +StK/>ۨycY痌mF['QWſEӛ+=j[*l2wj^KbIrͰ8풫LuWW:Ymoiû*)o*Wq 0fbv,EW䱍m%mݴֆVLEa R]J@Wo wM♬<;i"ԢT5k7e,?U>,/v5~dAL2yj7ۙK7I}Zu {}?gᮗOCoe2#EuH.[lf[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P?_ >'AOxs)֬Na,ve[ dJoU B=GKoa4V閗%Y-`ۤ;ڨq *.$2mY/fMVl.$e{hYZ0.bP"}̤rkKiQM3FVLhd{P6*U hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDMf+ j wso7Ki-i+K$33r>Dmkr^̚\Io,20ac`\9gJ\DI@4gQׅ.Fۚ"X3 O-Bs)fVMԭ_cmޮé#ĶѽHM3D]\ J?$`UW7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Jsୟ #Y\_˫]y_߹Q:ݗK/|_ƃoc0NWIuH/'R@PSk#FgY/fMVl.$e{hYZ0.bP"}̤rkKiQM3FVLhd{P6*UşM [Mg][cV6%&u%X0bh_46[[}+~R[Wp- m4m,q/,qmt}DGI>a~t-A.~m%- 񿉵j—Zh% Ҽ' G4siwAxUb9',JR5xG<[}&XRMcNo;HD{n"ܯEJN?-9Oux <CS[K+_.M[[n[6>;ҵ۫] אxGJ[[6onƒ%eKId.cGnuijN廇wTRߺ%T`Yc M:-uZhwZ啻yiEf4Z6+P <jz>/ x{{k+;mem[[{Xn 5)V;^#Քw"O[\i-Zit0[=xGW{G].Ѥh-XJMcVu OOӵho+hwjt*do;M?,Cs5[֣;"Y ݯRB>c`E"C,xoK6/ig#k~&V6֖N+i|[{yrOVs>ŧ@!-?Vukݭ emdK<" ƺ -cxetO(nN>JK]..bakycWb0:!eĺEn^F-źD5y$V5I|3c{7$yŬ-;eG&--.]:D؞^wgWQ߻ nl;wcVo?>P;}ӵy Q_Guۘt{WC- -7_k7~"Wm0TЭBD؞^wgWQ߻ nl;wcVo?./\gP}K(aFīFLk(K7Č,n|a*x'xZ5%#h~)g(gKXcK[X}yoo~gO_Pq;M1>,)D׶mm'?nT *B6op%{Wޡ_i> oϋu i-ֳ, nmF~n}C#l{gߙ.iķ?g# <+/pO|Nmx; o9eA[i~nX&y/ ̭+W=OßL>)~.jJ ̨e/l#cY]JUOU?.o?`˯GyW_?F wK~ ]|=P3 <;byz O]F~-w'yηݏ[_ =GW}cdӼWq̹prZ-p=H%h.w?g_y˅r$i3]$}|w&>(((((((*?$_%oX~¿3mo0HCjz'$ez}-5 ._@$+gF!^t}+55{'zI}}u{[=Uy ?/|_n|_6>gV#~7_>y˷g?o巗]e| s¶%}>g[.~S͞6 x%h#U2#ez[mq,Etn,Vw !31Gl"rXHZG?H>/hyUbfys?Joϕ~^<7o<{+eK-Z~B&|LƇ(ʜ25#:[ʳ۵RnoUTJJ1bC&մ k5;-cQ/u7Y'w*025JH*A6ă\ũk:WeN?`y.nYJ8bٵ:y`+hy~v|߳߷痷5徭↱ Ծx4'J5+M^4"/,Ko6Elch (W@=)-XD}헋`mˇ-̏RhRnHo$w리2ng~[UURXɰ>hV-ů_fXgHFX-Д4aeo&S]{Uе rLLKML7L ɔ[`eQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!: #:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KKNJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ ~~ 0| ImnJk̰3q9~go?`չ},xNIoh\k2yΗɱ &?7he` vQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!: #:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KKNJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ ~~ 0| ImnJk̰3q9~go?`չ},xNIoh\k2yΗɱ &?7he` vQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!9 ѼK#[<) WÓa}yt%ᢔCv"HnO1%KY*|95~gU1C;_s,jV"+U_K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥u?[NH`čG-46B}eX 숶c,KL.%Qdq)> |C5 _e֟x/]H^sD7[&i7Zmi6j hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDݔws~wۼv@RF.FYi*]%4+QZO}l[͵ypţޢ@[ Uua˵QC$g" aPfY6گ<sWvͭ `Ho$w리2ng~[UURXɰ,K f۴m ^Z1v7$m ȻIRR9%erm>@:_ &0/TݡJua˵QC$g" aPfYa:{kIo^-y.8{H2?YKyJzd?>6tlIr2COx H&:`6گ<sWvͭ c^nj 5뻛)N]JXIc$S0dQ@7G?H>/hyUbfys?Joϕ~^<7o<{ 7Pd9S@.7Y#:[ʳ۵RnoUTJJ1bC&¼ !x~ ҼI7tXXK EDe|2s"Ȭ$+K߅|co Դ]n KhuH$,H*KWS/|^mHt=[GޗǬՔm A ILHy@b)GZмQK]Mc.gfۭK#\KZpWM(Mç -Wiu. A fC$FK䍤i)m|[_ojqkiW7w߭DmyDSyʊR"=)#|9Zk #zvk>jZnOȴ^w٥ta|X^0l=kñx7ZmK ~؟zg8ةnʊUg|@uO[ZmN]55q1}a{mHb)/ۀ]\[M3̫V#NEґ44 `UX]U1,m&i+Z5i߈Y:Ʃo亡XMhmxH"U.O^k:60|7-5wl+{mY[tK%|GJ'g> phz{ɥojmퟃ58/4صKim%;j ae@u*Cx~]ZӴm#xW#eo9TR?EC`C%ҵ}_NE]]4;</`UXQefW1,mu"w+Z6ڛhM4脽2ٚ"Xb&3+ú'~-`*m6m۷so|}ʸxw@!?ųUln*6qC~g6y? MCw&v7r|Pl{-/ פxηqΰm-qBW+ifwgxnnHw^Ja4Kf[۫8KJ]@O=Vٖ8\2zWt "O/C[>Uln*6q]>h Y -- Ϡy~6H嶙^pbebyCs ;xK|cVhT!H@DJ ?$jVv&JO|;4'7a9l<=0س"im-e(#d2yrfZ( ( ( ( ( ( ( >8ӼI|75;mb_ xSD/uY 1ZE+OT(8>^U?:&xK*'SZҬ t.U0`򎡔"EQEQE4 jneqZ>=YD6yq* w ,lIi3EtPOfe8k!GD3#e[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY#:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KᏊiYZXxDK%64x t ZMf!hUVlPoGF[3+ hIjzf6hO7gt"G8}ȫmcS9չi };+B~Ȍ[qT|"?fʑo*qgž}\EK际c@maG9\r}ȭs#S5=OOG>?3f?ŜNyx&eIEqR~[{{/ӝd״}k QSŲx ,w^9'⇝߲VhӟMVwzպxNmorY\W=ҾiK"e Oiym}[ϳ]g[vÿqQ}VѮ~$Go1J']ffiFj% E,YTCk ×z$ i5 iV_L-![ #䴿;Mξmun*m[EvVIo q/<⮙v(~"BZfͣ&Xm -Cϳ?War+\b @<-2ioĭd>VAYChtbp]GYsDۨycY痌mF['Q?o-`oh5!^H^Z\LRz&oh[ ~L,XYñRW>RP?+x7>~1En^c[ᑡCx"6}ЉD{Ѕ Z2|4W5šVwzi7^0 5Hd%2j)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PܯO뚎_ xW{ Ւ -,[^f6*1R;-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&4>ռ=&Y8v,2 ft*JD|i/ i1oiCL}+֐[HA4aSs;v{)ciSlK f۴m ^Z1v7$m ȻIR7>ho&Ӯլ;knO3ɸ̾w9x7Z^(Qtj退+b%VI%xGDkz~N_G&ž񕖧nG= " ui%ILһAfWK}Ndf%uYxAD49'VO*xf #%"@ hf6zlquH4Vf<0I#[k$8g%)YPNsYjze\ZK˧bhdIR`LrFN_GO7f>ճ~^>ѨG}a}[h_y{O7f~˿~^~W)!k~x~J|)5͇.XIn.%NO)daV}#NEQ#$gVY/QV[2hv@M#_/ٿټxG;VV u -G7}l<ݘVxsG}&wt;o;R?yk7gy~_ά^JeY , j,U"l!"y^*K6$qvUWL(UH~ HEQEQEQEQEQEQEW|Y6_Kޙ=c7/D:$Q 6`9l‘=ּt?L/hTZMڎewqaqO K%F[3(&71e'1&PEPEPEP^?H'{NCp ̐7Z9Ee'K,2K#f[?`2n_K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥> ~@kᵿ/['Q?y\`b#2*e 񭏏uM.+0\\*g*~wG/Nʒ*  6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%C/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf]rwt iCgmc? 7Lc6ԭ%k+Y Lw>Zxžm |ckiڼ1Dѫ^I2[{\zRk7X_ PKy[IoO5_"_(!ˑ#o/%C[dmKyaWVɅ 8v*U 'J]vm2ᾟK2SM7JIkakC0F7 ,FgAt?5Iwq*1EskD:aiee{5R\Y(+t42=(ghtnv*Q忉{\k\GY K!vܕY~a*G%n#tՆ&nF` "pU6-nudzN⻛oQ_XgoXrQyW*/^o.켖>#R'}^yJʛ#x?Y4Cz6߳x]vPg-F *)ӎ2w_+tY(nuijN廇wTRߺ%T`YcےKi =\0% YL(+%9O#$f|w<ُo3oչ%Zv?/|gn|g6_Ps;v~G/6g7m?wm[KG% M1-'UDEX;.l93#hyv[oUح3c[qo|M:qi]ͷV(,[s3`79Fg਍q,Ӵnw+縄31t;l"XƹZgG?|H>ߵh.߷U?m^ytj6 7?ǜ[V}[y}PA$U;{vZZ{a2J?-=2K1u*QWJTN;O|#}|3ϛy[66Uoخ|/cyq~oueģ>Q}G}ӵU񯂯W}c-i4O4,iڂKGXC/->=%Ӭv< +HZvix Ԥ(u(gV`$j;?>+o7G~Vy7/\Woi:Ʃ4WZ# EoluyX"yq5,1f;[NJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f['HWBDcECoRP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%C/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%Cyé/ӭRN:} 6~,kM?mu{H"C|u[䷷]5a[3<bMp=yៈBPuBEь֯yK`rKؐ.JIcQ[yg>~ϙ'|?q Ot]>hS0 [9$!Cթi "Fng^^Kn!cfnoce"hь>ceX >[~N_G\o,~/7<>Wqmxgm\~c̷O16dI_aHtQEQEQEQEQEQEQU5mZ@үu=NNl{˹V(`UPIb@hxWśX~_ 뚑K}oWMbfGmpKn6NO:_|+xDnYCXm$ V \ؙ_.ШҴ/Ҭ'ᧆ)J2!u %W8袀 ( ( ( ( &nu_ k|Sq.-ϰ*>T4~Uю.#Q (o"ѭ?IG'.泵WE΁\#XI TR@5H$cG|u[y#]5agkv3,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0«?_ Ο Yb[S\ķ6E{YK[m"Eszj״KE Emz< [K[DϖPOMHoWrV^en9+;yf7? I5>|wqov:~ 5̪$h][[!n$Y;_k?tW~ѻgߛo/ojq VI.-MhbX-݄(i(ĭ7N_Z\%y±[2 > Q-hIƞ s 6V)Y]DI! tə]\̂-<Yq÷VX,C10fb7Ed䰑Kmqt,i 砘0w;*pT+~ҟ46i ƶYʋ*[^4L"U/h$i,|??ym3 lC"IN";ź =[-&UD.2l!}\gWg?|y{sEͭNmq\Dgh7Tefiym}'ȳ]hm<黷yųt|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHxQ]rY[G&WiK; OXifO|6~_ش"99PpMmd]պ[[}GOmR`Pz s2LnHo$w리2ng~[UURXɰ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H0_ZwSͽ"@"J:`iv_)fF*=_$&I|j7yahbhP-g U9"w;umkn*nD=ܖVɭ})o7|u>&@W1íx]vMvc '[d _$WObCF Ta:{kIo^-y.8{H2?YKyJ+x~.O-OGM5R˥R,8n 2/?_x'J~XHO/\k!񄰬$󃬑](ŌQ{TVH-MXeY݌)hY7% t!aYG|7wqo=!h$b$o0HۀAvޥcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹ m 't֓l[md7\>qh&d,BkrG|u[y#]5agkv3$_%oX~¿3mo0HCjܾfe8k!GD3#e3okzPqI l,D'A|͹eA?4 #m_[yy<0[VH-MXeY݌)hY7% t!auzԻ>2x~k->i)6n:V tw8핽V9%erm>@:_ &0/TݡJ}-fX_|3B5'ȋab &< m̥mmijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ3OGLQx'>?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* @5u2=>wvW{e}ؠ_gWmb > [܃AmZѼAmE5515!R4 +4r3[wVp'.㲹=od'{}żG)Coռ3^.<qwZ5#_:I#o0J.jwIA.j_?}eif:;lE\,~7#!7c6Oo5[}vz m|K{kx[[{H-$Iiy)+۷fmm KHaS'tb",ͭHؖpP7&eo.Y7)g~)>Y.k 7 o3>#o6Ίey1"J2NWPu >ZؚF"GVbs4q[y HpYOxW/G[:տt&cEZK(D\)E1b#I& $*((((((jzMlM sȫ,R,H$YT [҇ohZQums,V|Y!-"Z"h?wOxIQ󵥲LQ$Qs"< 1`$lf[ 4E4enƏG؅ #nҥYkEҢGL.^PVk;VTHx'@hdBr5¸ǁD{B}OT.Xn~۳ryqG8~VBn[dW>Hfg| P余5[{EXeaehrB2}>3z/izmίYT"$DH2_R&bcٽWMԿ WOݓN[/3h&ugeC[)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)(ʬfs૏#78hG̞#2;ƢnFY(W$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wSEh?Aa+xÚM[4A|Z| Lv ';Gы߶?O`q%-a|ǹVG3%R\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ p+!_Yh.󵥲I&~tGmXwyt#3 D Ijz|?eyb<3 lqF"0NF"O/Շtn;ռ҂47k!hKv):!vⴟdq!E4 gPt&U ,mgg72.dV8H=>ol϶}sq9(Q$I'1Asun*ӭ[=ܖW2Go}q|șF>&2?5qe3YXmuNeȱC5dd)Bah]PKi =\0% YL(+%9=??ooky뿴|_ n;w߼[kwVn.㲶M|'8K|t˱Co)>Ӯgo/{_eF7sV;gͿq|u[䷷]5a[3<bM?jz|?eyb<3 lqF"0NF"SA|%XU3jv2C1#u&([9-ߵDk;OmڱE~bCAAa3?Dl]\gw쨥tKܩ_=$سa_5Y>VMy-՗TU88xddXaqJg];4X}*o [5 ƶt&*=I/ov2 pd4~Z,{ee2bTs;v~G/6g7m?wmyUx V๼׉y4=kuđǕxʌ dW0ʑ]vUdmKyaWVɅ 8v*U 'Jijn`x[_,GmdxlI*5_4#0Zlо6p̴>l`)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| Pke៍ v7t9iEORGd-fZ+)BF;,MDCЬ,$f{K*O(K q*G&2LC@%ɪ-Ė,| +F6ÖpTO_oOB>]|xzt]ʾt/W8ihm He݄dg'ho6 Mibaj}KR!uK`,mfEu}_&y-c~$n<}mOLѥXyv֑BYZT$l$9;]3S,^6ІٟHg+R0фr1t&6_gg}P#/Dڌ?"O9 [[qFӴWi-90D3TFθz[|pʊ[DʕBL6U,cPO3ɸ̾w︯ |L|c ցx=Nzoj/C($m<'kygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|{?O wVRU/IUm'~_;]Քvy~Gl{y7ygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|y>Wqmxgm\~c̷O16dI_aI{?O wVRU/IUm'~_;u\xiǨ[yy~tW-&!6ǙWw{]Q@Q@Q@Q@Q@Q@Q@xWş?αkoIpkwTŅ憠m%p,T2u ¿ i/MWM^$[hl##(,Up4ZNYiq%)os3*P^YF݋1$M[NcVZ{o鷰ͭ夫,3$GRC+)0$An ( ( ( ( ( ( ( (?K{xOӵ#LnuK:o&/"n*/@Y>|-~kk> wF :@)3fkI:F +j3xmCwě%\_&$ZA_E/s HQfo:Vb*ʞ/t]xNMN9Mim>6M463hB'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PWîj}U|wsO:GZӣ`%>r,or;YîXgo2ĝ"x;PlJGiެ7eRXo,fYe)06;(sfmG_ifZcQ[yg>~ϙ'|/cBޭb}_zcMnՓQn$ ^J35#T[kC[/bmy[B{,GjHd)kdc'߻Wr[mFo?~K>yŻ_?lؿ巙ey7 =|M}?q|5o|0!a'Qh1k\yhB72oCGCt{}Nsj0ڵŲDbMtMn d` W?cN\^_>vϗ;|G#0}k?jO7ngj$Gqnj*nfyKGɼUQ(e(ŋ zf?hoow~7~3^m?Jo}~^+wG$foڿ|oߟo/wZ#jIqnkCn&ICI;IVSUJ9,JYq÷VX,C10fb7Ed䰑@2?y}_e-`yf>-Ϳ+Vi>++Gynyyy/Eնz:|Wsnʖ[tʅL ;Q8*dkrG|u[y#]5agkv3ow~wUKvZ ua2JO1M2E*QgsgG?|H>ߵh.߷U?m^yuTm7ow~- VCb|ϴ}?nǛ3;O5dc'߻Wr[m]q VI.-MhbX-݄(i[vj]yf& Q(+/ xS?Nk o%MN+y1MxsydY;Iq L] ռ9>*x̺In5"&K)zG1!4GdzQ⻛wT;T/`ghrS#[;ź =[-&UD.2l!<*oDŽt|aGqAũ^q4[EGpKhv4?W߆Ρ]ZQ5kdiKmF4e26GO|?}/ϛϺ_|U -[PFq)3izۚ/-""FxpU]Քvy~Gl{y7C~og|Fmߝ|6|i$[̋VXz^/n RӦj NVmHf/-$6V2U[—MdPuDwZHȕR nc Q^U cC'*,TG6oh3<2#(h41.c l ( lv^ OZYxWna]= ԚbmZLӼd47 du[}2O8MJn`mOÂibY$T*4`0 7 {7o0u>MVŭSxCxg&Xl-o"qZ}vU|cv>6Z:牗PH!ȫ!IL*9 Exσ~'>*Ӭ5ߎ:~xtx^k3BmCtQoU"8MA-]ߌ_,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KO't+ׇH+Z\;p yP9f1}WF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB~ xBVS⟝Ο =X%xR ^󏳨c,/v5~dAL2yj7ۙK0Iqxߊ>]ީ𴍛:[4^D2z>~дC-,.--Bv<2Ce+I)Q캰OMHoWrV^en9+;yf7?߅^ռdu /W/J:.b-%ż,I,q+\0_̭@ih6_hCy}O,$y G܊&?88#[[wVp'.㲹=od'{}żG)Co'm/|;:u1-4sakؤy!S~m.#MqR}V?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* M3S,^6ІٟHg+R0фr1t&6_gg}P#/Dڌ?"O9 [[wVp'.㲹=od'{}żG)Co? FGOgGywngչOiK+#7>֊W>IdLi\=??ooky뿴|_ n;w߼ [k[tVp'䲶Mod#h9K}wèA24>1EliEsr$(Q1qmun*m[EvVIo q/<⮙v(~"BZfͣ&Xm -Cϳ?War+\b @ OLm ІnYHg@mLpqG:6:O]eszOy*R9R# z|:?m<1,sQ6-HvNb(V?/Zf?Ŝ8I &fF2EyխqᧇDʒ IBomEcbͅT2|#7i6b7_ص>G9\r}ȭs#S{I$so |F*>%,aEPk(((((((*?RP>V's]!PK U1b(\#HUmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W/ j<+)b<7j*%(/*[H^KIG ++jZ~ya|L(us%v-;.r|f.b̈́U~K+LO ٿw?<3.O#$f|w<ُo3o$jonkC+Op &ICGǰVS)f.J Ji?gioo}oy9~+f3~fQs?Joϕ~^<7o<{&zÔf~ ض%Z>?/|_n|_6>gV#~7_>y˷g?o巗]j\gw쨥tKܩ_=$سa_5$U;{vZZ{a2J?-=2K1u*QWJsG?H>/hyUbfys?Joϕ~^<7o<{oyl~UK{uV c3ZO1=*v,]T (sfmG_ifZcQ[yg>~ϙ'|-nudzN⻛oQ_XgoXrQy% [{x-^$[7iWy2.\mTmDt}ٿj]o?y~~-߾ q᯳hy_mGyߓߙm{]Q@Q@Q@Q@Q@Q@dŚ+oĚΟo5R-|BYFO%kZ'_?9=oh~9Эu :4[gtkm!*ee8<#t?L/hT|;oGjX ' \jK{G'̰,MY~JT@ hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDdo?VoVO?d/^)E?!Mhh~d)2}sUUPgQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!k??i;ƺ_._K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥ ?'_ R1Z߀YQkojR5QC3Nks?A:'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJ 0E5 ONU xe%%6-0J:G>7C.hџK}G^l[?nkOxHab &< m̥* 0| ImnJk̰3q9~go?`Ew 0E4}OQY| x%Uu6.(B@=~9%erm>@:_ &0/TݡJ6l][[zfj$8aU2VH\IGg(s 0F|<5-+LҠ| yWRK#0`Q >A Ҡ6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+?Ewo?_j<:UԶY)h0W$2Jua˵QC$g" aPfY6گ<sWvͭ nWύP}˚?Ew9%erm>@:_ &0/TݡJua˵QC$g" aPfY? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.h hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcID@:_ &0/TݡJ 0E5 ONU xe%%6-0J:G>7C.hџK}G^l[?nkOxHab &< m̥* 0| ImnJk̰3q9~go?`Ew 0E4}OQY| x%Uu6.(B@=~9%erm>@:_ &0/TݡJ6l][[zfj$8aU2VH\IGg(s 0F|<5-+LҠ| yWRK#0`Q >A Ҡ6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+?Ewo?_j<:UԶY)h0W$2Jua˵QC$g" aPfY6گ<sWvͭ nWύP}˚?Ew9%erm>@:_ &0/TݡJua˵QC$g" aPfY? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.h hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcID$xjZV}AhFa A|@K/KT|+M_42Cy N]wG֧$_Df04/۾$hs\ ̬"X ^ҽG>7C.kįxďeΕu-odx'd-0 3Ҁ=Ho$w리2ng~[UURXɰms;g/7y^_7w?y| kZ|%ݞ^Լ=y"w,5exيDb gOHӿ+O𥄗W6kq\] %_TJFPֱ|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHwQ^ g&'/aug%Ǔo1kBTiʻxi$9˚~|S--UC_n4 (1!1v^[mqt,i 砘0w;*pTGqnj*nfyKGɼUQ(e(ŋ =|EK@|_麮aqEJpVa*C `#O|aUwԭ }xf)65휪CeƄh}\gWg?|y{sVjIqnkCn&ICI;IVSUJ9,OaO;?`o\y_jGھѷco?}ϟ;|-G/PFO_]_׷Zy$jD[GOڲ``B3q+'%溼wW-- xv^$b$o0HۀAvޥvVz%h{Ҧ|"2}KV5fMW[ӥaH岄-㸷;Ѽ7 !+Mo5oiz5+$3cqd31dks ?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip)x^?dV6}?>H4K{bś!;8J>=Lj|w%ןj⋫Ҭ tKBgWP ( ( ( (xCO.OֵM_U1]8K/]4pn<!ށ" WߎwMi<\&ww}jbp_nh&,ys\$!CK D@<'x|:k~ Dῴ\[ɚ$}fVsw, <5 1ìiǓmZK3m}o /QEQEQEQE柴wo|&/x_Cu}'LEEin[K;K>P"#wxԘм]q_}+࿏!KoPҭefXRYʫ@'=+.l{wpѴ1ynCơH`vk;n%B8|9j%dž'ya2{{u8۷.%H6 h|$ַ7s^kNsG=ik.Ͷy4b17@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP endstream endobj 386 0 obj<>stream JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+_]o.]cZ0YMyZKs4mF8iUX V)=VĞ2dώ7#ľ0o{EH4}SG]-n!d-# ga`e(??|@¢E|wc]x^bC\^kޝI Be@5f`YYR0< QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW~z6Wۍ;Rskyi+E4#YXA}~7dEN s?oĚΡ jGt7mnQwaUTd(((((O^wZgT$o6y'm숊pҰQO'*%U][\4)QFD.B@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsc+%-n\WR24NYX AA_Õ>6?_@ই;|'оnPt?$ $NV 8PEPEPEPEPEPEP^U?:&xK*Z6^* gG!/4ޑ. E(#܆P@ ui1CYG[jI -ťA #gr[$)w  62mEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^U?:&xK*Z>|UI|7m[FKeTiZ;[+H]RyvX_ψW%QkZΗqk[=NBH'ʦ㓱8?+o?t|%Kh5yM02Q Oc]WYKGE|Gqk˟j]X縍u#qY d!jN% :|ou+UL/J(M̖z&my2DTR7b3݌e+((((((((((((((((((((((:|K&u-kGΧXk'q /ڿgOuԳq;sp=V ( ( ( ( ( ( ( ( ( ( ( ( >&|+I|7<'x%HD9Sy!7w&T -R2GוxN% =+IQҬ,.4Idhkfe7t,v\#ۢ((((((((((((((((((((((((((((((((((((+¾,o'4m\ԏH[zl+4<;k[pA`w }ּt?L/hTZLiVRjvzuoipFI Q  tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xWś/__ zKoHRfsnCn(wo FӐGוxN% =+I*=NRHQn--e(;R!KYn((((((((((((((((((((((((((((((((((((>!x\ݞ; ^;2$S41mXD‡ܠ]xWş?αkoIpkwTŅ憠m%p,T2@c;gIѼCLiZ^ykovO"nh <3Ŀ]Pi:d:.e۽Ėows%̪Aydfyv,$I5n((((((((((((((((((((((((((((((((((((+#GxVD=X{>Kyh[bh '.QOkEyWh(_:Y_k_yv%^e7WavSD" J/Ώ6/ x;=n+RQy$0Wq׺ׅ|Y_}O&+/[Gyg o46*v8R{|uUS|/]JXM&mg3YX^4RT!ۜeA+NcVZ{o鷰ͭ夫,3$GRC+)0$An ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( <3Ŀ]Wׅ|Y6_Kޙ=c7/D:$Q 6`9l‘=֊ͨVWw]Xݴm52csRpJ;.AmEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^U?:&xK*Z7* G5#/,ޯ. .$mui2_MYIO 5սO R$dB 1D$Jp-EPEPEPEPEPEPEPEPEPEPEPEPEP~?k?Ljk+gWY޷kXO?: P"nBrFT3k\~_LMK1?_ӥ}U\߅-M3 ?7dD~d+98 (((((((((((((((((((((*?*i,<p$}Ee$(yi,Bʌ0hMveiqq\A E%Ƴ\G f#$"*(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|BoK'K5WW4}/ey"6o<"" ]q_$¿ɬcMiWҹy i%UR$nk+z^E~II,/$9(VU|G'OvV.ugWX5}M5g]^x" hox7,Y};}?S-m.MnJ-;.FTW௄:5Yu 2Wm5j!K+"  pր ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( <3Ŀ]Wׅ|Y{__}3U/\gEy J/45X 7c8b;Z*UY[m)mkgi "H [((((((((((((((((((((((((((((((((((((+ώ4~_ NX^$T4KV`C`LVJS 9`וxN% =+Iִ-B.#.#Ki-Ue " Q}hSjp\c[&xZF]=u]9,UU<h((((((((((((((((((((((((((( mG¿{3znjn^$tIl572wqm@ra#${yWؙ_.ШҴٵ*KKfPLncwBN Ge8b0M((((((((~%xľ布M˝*[FU"& +\H#8=+r~ (|go j.}RD䝷")JaGu<@(((((((((((((((((((((((((((jڵ^zB7WrP)g݈ Ā$7* G5#/,ޯ. .$m_tWF&uXP?: PIpr3<3Ŀ]Pi2_MYIO 5սO R$dB 1D$Jp-EQEQEQEQEVO|UI|77C.hh o>ּY|H<%UY xV9V,`k#8$8 ύP}˚Z+¼q[m3PxmUZ[;o"R[X#i d`8#s?A=VG>7C.k?o>nt?G淟SuVk3 o/fA]` K 1A$u+VƏ B8ΛWgM5SJXI*#ύP}˚~|a>$xjZV}AhFa A|@^U(s|aCSx4LҮ-̑OD셵 FqzP^U(|o;\^ោ|+xSy.>f^y*Dc!BI \V[q[7U++y-Λjv U0F<#?5&|H8Դ2J%-]Ki,c%YD  uύP}˚!|&+%#is]Ki[ř"& k rA uύP}˚?EwU+? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.hh o>?mCG᷃SӵUko+laIm`Kt 1 ύP}˚Z+ʿEw 0E4}OQY| x%Uu6.(B@=ָ[Ʒ<+:n_UVV[[6(N+{)`A$`yG>7C.kM7qiZeK[%YK)AEyW#?5BMW4xWntW<,:lQ VRIT |o;\?{ o#RҴ*KEu-3팖 eR3=֊G>7C.kįxďeΕu-odx'd-0 3Ҁ=֊G>7C.hs?A=V &]kŚďq]M5[ścl_.3Is?EwU+ 0E5 ONU xe%%6-0J:G>7C.hh*s?A& L$xky=GUf-0kT$p NI[V4OSӴ(^U"E,;UTXKYmO%/nEouHmOu m&ؾb\]ʐzfߊj~:=暞՚wM,B]6@b l`>Ix[Śt+]ozΟ w..mdJYNH+ZU\ɉ2.(((((+'>s]h$Ѵh[~ѧjso6pUʬ28*QZPxIļhƋ躾5kk ֑Mj,!Oږbvࣙw&}ǩZjztHgDhƲ5FY ]n?T|xBG5-'Lti4oQN⼖c8FE0*v~p}jY}qpq .>64 |<&?- ~Ѧjqp\ml{1ҵß8`InoᏗcO縼<.Lʹ{hz]lhcxo1~((((4c>}KV5fMW[ӥaH岄-㸷;Ѽ7 !+Mo5oiz5+$3cqd31dks ?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip)x^?dV6}?>H4K{bś!;8J>=Lj|w%ןj⋫Ҭ tKBgWP ( ( ( (xCO.OֵM_U1]8K/]4pn<!ށ" WߎwMi<\&ww}jbp_nh&,ys\$!CK D@<'x|:k~ Dῴ\[ɚ$}fVsw, <5 1ìiǓmZK3m}o /QEQEQEQE_'5Oαx[Ot-k,eVCKXyH E&4g3;K>7*WxCL K_Zv̰I3V!C8$N3zWU{%\-1[ǚhb܇B0%vJp~\<5jL~'ӟAFuq[M /`J~E'|?oῆ>_u?SXt2?6K]tfmϱ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (? endstream endobj 387 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>/Properties<>>>/StructParents 46>> endobj 388 0 obj<>stream HWr6}Wc<@@ɌoSntX RJRկ$&(+'U=&i>'M2ˊƧ+1)!.50!C,4WA2+E0{p$RskzDjP15yh !h,XM=tHU:cTٺ8#s%M*xDQ_s uQhRa˯bR\Gؘ]{ДָbT@LK a>q{gnSaA|巨eMe"4TfAdX2b]ɡ)=sU+1vQb$e 3y)O-jL.ЬY DDf]$%[8P`[$7%1t[4< &i7ĺHSE*M Kp"i}<56ʅEn-<'Uf`˞&M⸶>нTsFB(c˱E#7jЈCi="Fv;DyiSV5[$YN4]K[ D{[,tz?ڣ)U 4N/J SjDoqC~7m;̛~)(!Sř^:eYM ήád-kȌL`Fy집oh!<_rX6.8%!0O*{=dC/{91Iiye\Fj+Эm;ZPڦ%X|~ǐ.?\SnF6wD?VPj^>͚[| zXKש᱇i3"'eԴb&0#=JjWz0op+YnaC{IVpضOIrȳ s:kz#Y-5i#b.^9S ̰-j`(<yTtEx Idxi\N&5>=-_I ϥD0m<1a*x4M:ƧeӔsx}|}zVVňej7uZ('Q|TEi|ӭ=v}  E(\ዯ(LCq$^M9ǢH٩d#*x_] endstream endobj 389 0 obj<>stream JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((|Y$b/[հ>[m95,!smcm[ukJ;h+kpp_L>Y_.PExľ<ѮxCN7B]ys1Ql#(#s$*x??V|+Y '<3o ;>uOal,E;=J d\W/h^?eZE g'P @$f1b2@’;Z((((.|_Y֝wJ50H? coCI٤)Υ"ݕݻ-ߢ5袊faEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPMZ;鴫ˋ{=IuiRcj]C`@eGi㏆jľ/u{{e5F`"EEX?.(1Pj ;Z[ㆯc⛍ZU1JIcUI7u[t%A@X|e|]C}KP>y~wao&;sz1nJUi=z5N*>;YN/g(Uc(=R|]SѢ?5ϊ_Dݲ{oEϹvFzy^9ƤT~gbpU熭nh;5%u6QEhryčwM[ Ckfգ{Q2Iv,Z6yM3+aa >]zx.~"ӡ]V-#KfKtvQYᘨgkP)lE>ti\D.? =,EW޾ݤYhǪwH+Ҽmo6s4>gkh'7ZFYv3GU«vz5}^)WJb^-[N-8I4I f//? $_j>^~q5S8ՂtTb#:rq٫f;QZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^gw?i/m][/[h%0cy&+Hu\)ʅkʼG'Ov@pZUn—ݴ*UlQ2U((((~1gMW ?d?Z5|G~˰3̖ c  :ВZ(G-O-P)Vw^ޗ{kћ-Ot?cWſ>VHgů,_2@'iVs9S^{j>4=Nf[!|gG`ϴ$B_ ,~24kDҵ /Vk SʙpFn`FGe4o񇌼;sw~%9)T.۔0$$*ԦyZӽO#ў`ѭC N*xH?{K_鿵7>!,~/[[[8d-pLn)Hyk i m9ͨjNO jWޥffLqk6CF}o'ÿ:~kZi~$K_-{1ܤ?)#6joÏ~8ՓG_lʓ(r-dUHϕW?z|/_u?x৏bkK ,lAr%BSO>GX/kds^G c+7oc)7# >_%o 8bմKFK ;8'yov_fh8|;ݖݥqNK> Z/z/d[-& $  X=ztȬWWeN>OrQ{݇<יk}?lEAP]E%7$/b2A9]5 5'`DiV/S]"NeXW-%/y,x5J,eKm~ hxwzuoh:ܶ&vd3E*rʡM>'> |Kj^l4`KJL`2(<'Ҿ7|4>%=-믵. 7mV˝uK/cyCQJ7( 7dakksi+[4^cnrpEpשo.utu _W$^ng+|Zy/d_5mf"6Y[KñoBK/9Y6ctśw~0X3~h3RҵMkGoo,7QFTo@O>ÿ<+qO?=HkͭZ[b;*xeH`*!mv _ɣƚݝgkv46puy-w EyJxjyGF>s8դSf:2q$p%#bċ9.[&Ot?B__ o |2|1aI$Mvy-frҤw:3IrKlrB7*|9Þ [o%;;>-_pt*I*xsE77kIEI?k{d/|SӬi7iH>yp<4w8«o?f#oBs?]>5;4,3=Cq"ʣQ#֚JNJu2u(9ԡ4ť5Q[pQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW|YΣKὦc /J$VRM" Ȼ6 l}ּ+ώ4~_ NX^$T4KV`C`LVJS 9`i6SiUƩq)krʠFp` uSIִ-B.#.#Ki-Ue "~gS:*`nJVڻvKŸ |ЧѼ#diܵܐ}YJʨ[t|95EmFT`cb+bʾ"nsɶoVQEYQEP±R6dy|ȷoUu, O2MyRI-;s;OBB5]?QλjV&u;wܡUP@_K`$y+OoՅQL((zMޡ囦G`.rۿn/̩DhOr9E5d~jAT?Noԅwvo.-QIn`_ˏq>ZmE 'Fr]Fx#,O'燑y*!NȒWbOT"f,VW+Z k폆F"Fvff 3*(,ʪ W%|K欟پ 'dPt7EypI67 X)NϕjgR>֣妺ۯdmv[/SxWFlX-JݟwĞdB >'mɨiL+mbP2A-ԥF;  騢ch#z֛o (+#мiat];]A2[jvF@p 0\ZRiIY )ԝ)Ԗh5 kZSۦӕ+ئv8rmB꫶9# /#O`/8%'y+!Nܶ ۼJ?|V~g:b𕦭"?xVmukei:u7Iv,y|XFҗ-_x.o>j?ub[nnᷖIt[ $V#TN@W'-,/W4V;}W:l.Ù$.]݀A0Ah(((((((((((((( }nZqt,N1ǘ興w;Y%EjuKV}–}}#-AP3MAn e0^HȌ-/j/?Uچpo/s@v70U")ڊ\,>/B*'VQ[={mdԕ MM.MJ3g ΦJdyq:(^LD.vK ( ( ( ( ( V>%ҧӵ r8& T$veTG5 BǷ:Fs5m#Ai{KW :A3o{~Ot khl쭣X`$qFEQ¨ v_Ǩ R*d]_h?=4- ZTvi;33wwbYݙؖfff$jV$:sI9ݽ[{QE2((((((( c]*};Qϴi*# C+*@5m3Zƙy"c A;Љ5fcUUrDL[\v_Puk ho,chgS~=Q\ww Ѵbˆ3HOGP<]Դ2UetR+nbXLV&Fep\0(_stJ_dWiÝsUUfH   V|WOzmxV$Αyi>4sȢ9j %$ Cy{ #_ [),V@ij't CmcU~ȿm= Ԡ[oxÓK xdytV/hyq$vn$yWؙ_.ШҴ/Ҭ'ᧆ)J2!u %W8袀 M[{S}鴴Wu)ً7ig<~U*[tP>~⾟sLOxF!hYeBBH$KEY^U \i}Y$1T[xO9=V< #Kۭ4kN5 Yk[B%O,E <!#(((((Ot |VrE)uV ܥs ,0XGKZ oVuvrLP.oooy"k{fBVXՉ3\)䡅~wf{ÊƩ]K뺃!TC$ ώV +f4}/-H7 Xˤm-n8vO_ |7]X=}YmV9En cohXK!k'wm\U)я,?'/utW|#>8#lQuNԭ7\]M[z+]z6w.-dhY%kZ ( ( kI~k=Dže"Ś$VEoۖ)X w>L"EQ"F@okvknytSKYԴE msch&#Ɏk/@[KukYVFу,r!ꎒ!WGEeeer|SZ뺧|Uu{NM/͈bX:nj:/wPG@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^g~%~_ gGVIsa)(HE`+݌kk¾,o'4m\ԏH[zl+4<;k[pA`w @=Ilt *L,6bBhUUM&K鴫)5;{{=IFiRz$]Cd( U(([JwlPCG*$ly'"veCaw2[xGEҰK,֓/ 䅘K:[M[I3St^%u*0!T$EyW 'W_kR (Uύ ɖ(#k( 3Cۭlg&l]_׎2>Ĭwlb G*$O$l@:( ( +#,a޳Cc W$s102N3PMs_[2 X)TQ|WV_3uaf!|ʝe~ *j]X[7[qɷZYv _k+>ҏpFZwox[~Uwww%f];W ?q|GDKh^BC򇷚4+J0Ȩ 2 x^dbYA' $0,nJdfZַ7:_vo:ذ[+9Te?+⧈32O 36o"Dv#;$8u/`2Q#?4rA['}HdH%$exhch5TOdItKE<^!>$98Уvl"@#FtMV*(((((((,xfOx7ڵ$:F!CržUq$Һd_|+o[nYM[yc7! V#*A@W&N{o}>6\kjRfKЪ2Fn5 @((((((((((((((((((?|SxĿh_bִ zϖy3k$[ +<: >>kz. \γ_[k 7OiunҴ[VPxb|Ym/>|7E,ﭼƏ΂T1ț\ AW þ*Ok^15{)u,b;2S]FJwN' o~ƚ߈t&Nd6Lz\:hEvJ4>I5 kxGjTU*pUƜaZ?~5|e|JQ/ulWU (8Š((((((((((?mRK~g|? Mkvʠ7lj< LxO:_|+xDnYCXm$ V ZZZ/oxChgc2BL%D v񩵈zQ@Q@Q@Wcm?@'ֵ'B﵋}K}Zo6-і61aVo՛Qook{]xrDr>mjt)d^#nVOܴ$QEQEQEQEWοE/OG5k;-WUּG m,"r1+]t5ռUQEQEQEQEQEQEQEQEQE_|xow:ŭ^%¾Se'eRpHʂ=ּ+ω _ 1 x&%hhdM eZNYiq%)os3*P^YF݋1$M[MڎewqaqO K%F[3(&71e'1&QEU w_/O:ͼa=w;X2y$y>!I-߄|04Km!T#wޜ0C+_?c!<~ߌ>$,}xIƙP#ܯ7@ 2 $^u BghnM%226ۧpJ {k?9 /_&&q}MJw[O"pΊ#]B{Ĉ[B<^o|;em,,uecJFu ەCnxռW#w<m?/u׎ﴝvT^\*4 f_13_*/|!hZI 8&1}qNn`c-19NSq3*c!<~ߌ>$,}xIƙP#ܯ7@ 2 $ |UF|955~/ҤѤ#RxH%sͧYxSZj <]T,M;2:Z0|xX-t}%㷺fK?=ؙYܑ~*[<^6> Ufgeyq*nyr%_zmޠ0סO?]/G${ ;d.˺,6MFS1<-Mxᮨ_E0RF`nV3m[y@K@_a.#i 4 W̡fX<#%.*[ǟG~GFoMao9/ok’oaYwp2Ŕ7(u/mKĐ|^4 jyG:%YYm}c7䲷}J Ax)(KI2 E|1CqkxJeyjSxAľqIyf)PZ5iƸ+;_o<mq?M8a>kbxdٴ%s(Нb<~?(J?)F9@'}&ͿOF4m^LT5{M7XX:Yxą#ll(h<;g^5pM6SocmzkEw/F|iL-xWE4sN[}xoڒش3[wy3`-Eel"/W1:znk/Ŭ*j2xU-K+HVD! "x x3u)ѧx/;mY.`ٰ`g>5_UPEPEPEPEPEPEPEP^U?:&xK*Z>ӼI|7;b/ x_Dt @2KX8$eAETtt]*O{-!KxKUB6.YI$juψ#A®#I!d+-Gls)k+CP.oooy"k{fBVXՉ3\)䡅~wm xWMlS*!ieBiY(.ąDQPҞۿ޺K *mjWNɦ`&wsCo čcBA³gSr%2@m-ה_i-c+ʼ⟇ ̝n?˻-Fw#lZ/?;U5?~ -:[IEylH6JϰQ@xC-|sOei4"[w$wr.ŋ$wGxI Po W ØF+ޠ6uZ(7ȿhWL!2_ԴZn-&"P*HRW=_ +/wBI6JI$fyWs!UaU@h* DϾ6z_b,i<[IDf0R mB{oWPuŬ[7q&B1*w^T3##/c-P_~/x\'&DnmZզ&C" 5VI+. `|_/GWi66>++jGt7r@+FyHb;aQ9bcPEP^{RxռC,1} ՛L0Aw-QsP=֊OfxN/ [x{XO4+g{n\9(ۤ-Mt[ x2ҴϲşcڽDb&b>E\''Sÿ |1OZV_xWhXV#1DڌGȫ^kC8ƓkW5;yA+K6דEE#<E2˜i9QCHZ(7+׺`ѥԦneUGbwƯ"勷WbjAw/vf5(,/nJbD*yq # (?dx6_>)񷉵/B^Zl[Tc@\) +k(((((((ciW{oiPܫ0DYwb$ 5+}˦iXԒrzm9(V4I]4ٵ*KKfPLncwBN Ge8b0O|Q杩%ʗ<1B ԩ!el's3TY?|7+Olyn0|mvoeT-+ jGo{ *zߣޣw}?Ol-lma0G *Vh-&wl(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE i~9n.e6}m4~tD܄2Xg kQ@S:[#w_l_A|SƑ4M^R}$m@*[~|Vo2vɸ&;.$ڞdch((((((((((((((((?i&_~+eƣ^KVy^UH@ $r'/ V%'?t#Zy_} ho0[{HFv6=֊_?x~2x3ؚΩAmgyWZgplKgmg\ǂx{2ִtWRem^Vv,H ;:)R>ǯ ;}CS.-4MU1RBNXon-44G?i 'Wi::֕e[vpiwm%ʬxUxu AnU  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz=J5;j:m/mugw 8!Z(ʿ|#AqC4G?h*i 'Q  @ÏNU<??G3O/?:Vf_u>8!Z(ʿ|#AqC4G?h*i 'Q  @ÏNU<??G3O/?:Vf_uu^i|;wU.ٳٻ_';6;W]QEQEQEQEQEQEQEWxN% V+φu~_ 4kO xV"i^h`Eݼ鴖!eF UM&m;J. "cYYT#3rN n ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<7[k Յu n[Jϙip #vAk6s^^ڦG? :o4E2=ƚ9]Bdܑ}+x[:_4+]cG]ѴNRHxGWGº:2)Z((((((((((((((((+ώ4~_ NX^$T4KV`C`LVJS 9`וxN% =+Iִ-B.#.#Ki-Ue "HtfCbB%I/EZ ռ9Kqko o,RPCEsn#%LF9Q@|*^[ѵx**K 6՞kk BDh((((((((((((((/kP|$.7<7;hvsݽ̉u-L-7A/@W|YΣKὦc /J$VRM" Ȼ6 lm~Пu|7.}{<'x X@{,kMwh1XymZ??ŋm'ONJ^)^ԜQсqlym)J@e6YZ\_jBI}v,h' \W/h^?eZE g'P @$f1b2@’;Z((((((((((((((((((((n/#izK̒Mr~fD HJ=HC^U-77uW|wϤ "Z^mHDҐU((((((((((((((iw w?꼯yUW|9;a4N{ctG-wљ>ƌF7 (V~%yj[:Fmo"ʑD[ 7O5}|cYjͮ/jY35/5}m(o Oq(8#?EW|YU%?k:> xu(Z/hyAw66vm9{SI*=NRHQn--e(;R!KYn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >$x {kNTҵAm.mH bw2#IGD>x }uc[ִ'͗I-ݷzʛu4?5+ PD5ð%P\Oh.TYV-x@ukJ}GM.mo-%Ya'P":YH!  tQEQEQEQEQEQEQEQEQEQEQEQEQEQE_~!xW%S KĖkwY aeƽּt?L/hTZNcVZ{o鷰ͭ夫,3$GRC+)0$An((((((((((((((((((((((*/hxWPInnVCld䘯fH̘ !6SVlu*L6exJnee$ -^i {ן=ڟm|5/ {Pie]fªF$qHTk ¿ t?G,;n+8^R02Q Oc^{X OLtxU{Du$2CAVG'Ov^iNJ,<_ԴxJ-oCSxO$أ+XX灀h +ʿEw? 0WZfi#\xSMVf-X[+k0˴w3=֊_ 0J|!H<n\WRxfHvB\H#8=+s?A=V|&kzďqM[5dlI_.CAܨsA?EwU*7>/GΥ:T7o<[ce ZPĒT$|o;\AƷ?Eo  4[eeSugN9b0k^|ďo>>f^y*Dc!BI'>|amj< [xXg{ JKkm2[a,{_|o;\?{ o#RҴ*KEu-3팖 eR3=֊G>7C.ko>ּY|H<%UY xV9V,`k#8$8 u+o?_j<:UԶY)h0W$2J?Ew5閑[o_M^4ţtB4d0HH#k8H# 7o>*ּ'HA koU⿉ZeVkVm i"m+O-!,Ao2Aڨ1IEw? 0WZfi#\xSMVf-X[+k0˴w3=֊_ 0J|!H<n\WRxfHvB\H#8=+s?A=V|&kzďqM[5dlI_.CAܨsA?EwU*7>/GΥ:T7o<[ce ZPĒT$|o;\{Ʒ𥆧o5 [fQkg+Õ9`27h:f#[ϩ:5ρo^J%ÅPrI㏄|iďojV2yLc%KAEyW#?5&|H8Դ2J%-]Ki,c%YD  uύP}˚3ujv<%lju4ooU !|H 's9h įxďeΕu-odx'd-0 3ҺG>7C.hh 7o>*ּ'HA k5o>"Ϋ{|<-u3]SXI^L^i"tk9p7JXC<ҵEw? 0WZfi#\xSMVf-X[+k0˴w3*|XT|,}_Z-֗o7Go"o+l-١tFso澀 įxďeΕu-odx'd-0 3Ҹd_ik?|V :NH׾vGhbD}+?/7OúԺՕ)őP A.qF\^(zV_ 0xY|<u-WLҧ yV(bײ$B's?A=V& L$xky=GUf-0kT$p NIsJH\BbIQEQEQEQEQEQER=&VS5+bbQ4F4q,JUI29snh7^E,zu͢V&v!;,|Kfo7J?鶛|,bEe  `9?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip9j%dž'ya2{{u8۷.%H6 h|$ַ7s^kNsG=ik.Ͷy4b17@PEPEP_?5?g&;??~v}v}_@W|q_B %i!_mj۟WE|V>WCOkEϢ^k1AKsq#Yq.-vǼ{u~ xPn_i7×xHCqey<.H 0]kf+ v%M6Z6i͖y|cI XԲGS WJi)F.Osemm-I"ٔnT*U ( ( ^ͧiWv4k5*#C#b0 H-@/Z_OugKyuh$uVrSq؀4X>-Dc}G4/5'K4ޗB3!_@osnOԵuWy>٩[$S4,񫰍C3Z߆H|?qΈg۵CSGm2O*-Kj&]1|(((4ox__hvjsX_7s]GJrX52I& "* Kǿ $Vc֓];[S$0fi"Ou4lV}mW*_]N[x5 [ř46Y w mW9񽿋|16++}.lS "pc$qb_0cƿiO.|/R?eY"TU3(g*=VᇄT2oaX__ w#-+GH͛n۸8@]Q@Q@yGĽWOa+kEsTۧW8bh|&.ğjPLM+7o/u]3Iд? 0ƝxMSv_.MXc~76|aˋ=5$,mg(xQ`v (xƺZ;j_قM > Ky)wL /zzVos²XYͧ[Zn{iNȋ C Dұi&xk^!ռj'X5k-y22jd@=.oGo1^h>i&0VrB`[g'?x^?g }C->I/57eH&# C[ƞ6ߎ4/֓e荣j:ZKȺKIXJOt>N82tk} GS=JSkVHgDfcAg()w۽Zx*>v-ާ7Ih-ʦE bB\ bbQEQEa/[Y߅UOcdH".w"_3jaRfBk}ޟj[]@VJmE ̰}n.c.#9H0x?Nkxa5ᝤhZ+uÆE*yB0.K% SWχ˄ﵭSWLWNwwś.k3wip||Cw]еwO>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 47>> endobj 391 0 obj<>stream HW]}_1Fn&ilH`Ե\ib%7$e{ )qFH`o6s?s^m-yb6Y2eUIfoT W$RLpe$QThC^mX%2WwWo~xK.f|Kf2ऀgFn7|'/|yC8ÿ_$L8Pd!ۋww cU}0bER1alpddL rOi׶uY )o%E[7. I@*à0Lnl`oW%ۺXX!rٸG,KFHRbQK̲HSZE[,rY (! 13g/h3D/ YU-ۼo p)n6.FS4HF rh.,mS@\{ $>yxO!:B$4e\O)=j.)ZGn@ oo`8\f4c3 d`ڞnPC$$검Xu]moն%y7iD$.413"OR ~ ]\}%$ BjRyF J-S,S7SSftpiPȻ}uY6jXCN jqKFB˺D1wz€^[pEOM;62l *SlTv#SLQk?ٟw $װwq_UiQ#@Yw:ݢFb0g:-zcևGs@)&-2m`5ɷ^|M0"4zzgqK~Bq X^5Ӯst /΍`-MCFhmM6E$$S-aQz氌J֓O?D_ nFQ{i Lr$lwrSwk'!E:M_8۩ a- OE.C5,aYK$L\F'I1?7#Ng4IqWǍܾ+6g/<d|=<4 ݺj,uSIN*TTEIxJ`(UK(n@&k۬rgzM֙҅9)Kthl-LT7hۄpqF'$ O1x@eI*FH3Mcv)0TQ4M2aZMs4q~H+6IB5U^: mK[V߱Ӿ@ 5bLΨ< ?htJ\fEFE8Ç'*衑]$%&h-i+R_Pr?#3pQjiwbƎ8ZHHU=T4hg5iZ)Dj8dvIJe&/QmkTrU6㬺Զe,cSc, -dRP㴡D9iOp؝9TMWX!y?)jsY`62^LVMdl :]! 2y+Pr ݖ'v#C 380ijw8LM ;)xk%S:)<#Pa$ vj*){YnݲeY}Ԩ|8kCl4bQ٬nzKhA))/xaf$*^1`(pHx?ܭ3p=aG/h7V9Ӟb9z:Fr\5F+QO? $m endstream endobj 392 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 48>> endobj 393 0 obj<>stream HWn8}W̢ ś(2H $i 6۠kPVk[\_CJv$VvŢ,)ᙙ3(i:)4Vk u:Vi+G1)!.50HA求qtVdnoa 5߼9{DW dwQmA4R`0  0~q HބQ)Bc p46.ЙDn_WW &g9cV;>hJRVc7eڻz=<1Th?4 'Г-h;roc- $w6#o fEC9 ;)1in: ~2ءnkbO6zc=$;|LZ9QT%R $Xh41"IT"[bBwWsܨf2X&(2V*JTB2n70-򥏋 >:ΚN:pw?( 12~0O-%:Vqɑ&1ǃ+we`.Vk!],JJTWs't.cLn^nlaSBcz?90Aq&ܿYX|ԻGD1榦TvŝYmQ< :_63Wz$L҈q8ִ$"f]lQv]bzd ҫ3ZNWU9ƌآL1ǟA t-j FYHD'Fɓ$XI!. ZZWI(af5Bϗ7/S+hSюVrpb$qo +M־?׹{GF&i0Rfh5y◯~/Z|l4ۦwzJD6վb{,jʴ% 0%eS [Ľ9*%Ji-pN5+_U eޖmhv(&Af$8e˻%̭ p5wyg͸q8Ɣmy/O) HQ.6`fTɞ~K' WOG޻^Ke13N&9>gWxiWDPͦkwgHO\쌊 6릭Oidta ʱ`僵+xҬCE'gn C^OE> <ZA֞xd~n\+|~1>F1@-T:0b!|bcs 5m{{fw{gEMIv9tD#%}"qK7g0,7n>]G 37y$I윴3A[ˁÁShe4뛧iCwyp/0S AJ@m|c(q3Ex_!OI endstream endobj 394 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 49>> endobj 395 0 obj<>stream HWێF}`1`ٛ /o=.wdsT6(7yWVqUEZS`DtV ~~u|Y,į׳ܾ~Z)JNy0 R!CpGNäٕ^72꽑-}m7IrVT ZC '(Dnrӕ@渼μV3)l!z.O [-SȜeps1fI#"3{{4?UF<49Y.[hDO іz$bU̇|4CЀ3cjw79 Ǚ9Ӊony[\% .WӂIz`~Ŷ횧4zǤ_]V%&bAF<ט7%J֖Go- $.x]]˛XaПo琠U2gJo+&`}7e݉Ѕ#j7L pMŽ5~iNٱAQKLg}wB+Ǫx;vS 7=-$4Jwo' TB|мg= HL7>](Xޮ5䃂qџt KV ]cٮr0YNxb_4vj{\ qU&]l {f(- (~+VE.2/V+|/Lgjz@ݪU=j[eCʲ^] / ֓v=AAJaQv<@/X:WGVdbb%hϱͣs6`ťD`L=vYt<KP#9PJUY>>]>;b&s$}IMяjCcDܯvAH:MaFO@ۋ6EﹻӴ! oi"}L&$鈐rՓ,3HSR: Zi\ܕ:Ei94{ݳ;:fZ+#Tpr25)(cq'-4dRe !Kڊʛ,dmD'oԫ3+dvbh}_!Q,_0t2pd2䀹&*E)+bziԖ-wa,W,ݳ`z 6QjJG,*QN^fbPgǡ&„88S<7PTͅ7j'v,8r1 sqY\&smX~M\Y`p@7/V8+ gxˣ e[' 5nb?vYʟE4k;v:]d23в|XWKh[J1!|%M|h^DL4 kl=p*e؅%2`*Aw_/Z=x3$1҃Xㅔf` S#B*0>h׬6Oy qF|~^TKga0s X(F\ pX,҅$ Wlٳޏ5}ܲ,#.!`#ZK'ޝHQ}GnK :~xA q ‚4SP`< ݦ嘉V; endstream endobj 396 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 50>> endobj 397 0 obj<>stream HWkJ>Hܞ~{.!Vh.W+O$^; ~Oyu9 bTթS7]9ϧ{~s(+ݿ}[??1,Ӛex?s,S̱psMpc7eձ˺MYSyS;O;mzZE<(t8zE3#_!8#mUBח\狢eyS|֬%GO6cOY=:߰yݬ˫eiyѰySӊu˂͚!~kY=gS"|?/wb4RKe;!xz;xGMW,(M(5mj4`zCEVtA̬7 @P+h@]>5fBG`''YoVآc򑴫,τ?i&ВH,蚢m#iM걨"=ТW'$F}<fULQaĖmVu; I9~r1߬g6DNEtz"j3T~8y^=]5ɕ\j! 1oF`0vPx޳`T`p=šD\vW`})sJ}^fB2OPwVG6V9bQӜ-[hYvdozZmb=RY8\hA_DzJ{tI,5NynèQyXqL]<ͫ8l ud2JBxOL}~Շ管 FL'vJu\g6=,t):$wqU +>1<#NQk${nd] k,*mOˬXH2D}=u(:zLѥSs9Z⾍lі* E`ϧvE\]ipTnA ilhV4!,0j*0^٘ jF tGA;p#^K)a QRjGD rU_֛ۻtTio9PTt{Ŧ R+=ۂ@-M ;ڨ>h P(חO]lVjC;#.H(nڢH[UAvL ~>5kƀ.B#ǐheղͰƤ ZHvY4+6=䍚C>y>H˫u̺0ҫ@aeϚP@v~H5M(ϕtIqSώDYMW_ڟNW\׮`u&ޢz~ έþ3C\Noe?OvW<Q4_͡" 0N::+6+_D";n_?KIAuZr++<Τ|6ThS:5lϠMYƝʶ@CR963}K"W)ů1F*2X 3{륬fMլoUq@XrAޯ/V&&Fc 0{4 d\h!&:y}ל#/)o;]&Yu5gg֔]Ui0k)tfY胩p͍D(d() a*%bfΎDčMESzrqoU.Iw!p*9HEr؈sL#Q܁a =~+l.l 'KJҀZL ARXyTc!1965  endstream endobj 398 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 51>> endobj 399 0 obj<>stream HWMoHзdf7n0@ 9 &@4lh-Ԑcϫ,%q#bW竪W2B+%Jq5%"SyR*dņ>Fju5 ^B)/7WR̯fJWWdtKqļJ~ eK0<YlS1\|{붽oſ]_̍#N$t'N&_~KY>Lj#r|J`lMۗ+a[˦^|RƈL(ʤY(qϳ7}ff+>ݞV )H$3 > H"CrGN$ՍDSy3֒aAF$P[2qٖ۾㔝LL"#QTCQB1;/v*XVڡ:>V6= 5(E5o$(&_U\M6 ;60 NsM_5(\]БH]۹6f]fy4DȰ cxEM0z-Z|- z1ds0w&<˘U߈^W]]e6q1Ġ%;8.=0,bzkӭOV0" 2ҕraX O!r"FI0TiI8e$r6aern;yeos^l|dt8imxo4#$A'Eoakfwp$aGa,(?bgU SnhxsM՝*2PJNu,2cT'JL]!sL$0oĹT% 9qcrm9;ՑN'JH1J?GbkR&&6MKہ90A 1V% xf0v2hq.ZXB?pB%&fm Fd0eo|?IF @yv(^v]l(]lfN\kIKqd|c2q ^֤ٷ͹n*3Qd%LfCc^@^е~٬$I&*.P%$_:͇|1 8A:r9x- Z #;X#vklM{)[YH*́/'7O $ I@6|Q1Ht{XG Ьv(ֵ%6װ ԮEY%ͷqFȒ= ,0bZv ٙ ؄v;J|vƋ'`B3j "[*rkƠlLꮥdXAyA^wUchc_q6Jxׅ> )H'XxY \M|{BQODž*>쏷;ImtƐ2 bQ৘&d=p\IȬ+#{?N1[ Ao0+* endstream endobj 400 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 52>> endobj 401 0 obj<>stream HWnF}7}t_l vd`GyŬD $e[{IJb3)XsS|Ѳ￿v?eUn7HSfJL3&R(ed6Uɤ6Om/~~W;?xnng_98  _9{nn79gW/ 36oW5 QE|2 6|`.ɬHEr͢.vm3 ,f1,wSq̹".om'! AED,"GM/)~E#sKg!yYSlwZֲU͌Ug*VE(#r.htP٦(}~l o#-q8DKG-UU:(%x5V5ܩo(i+}[|Cnbaŷ_a+8W'9TX8K)"/ٓa9cտzƊU҆5[.h K\Mn(V&u8su9:-jӫ,G/!OV̇ݱ]Ybt;r!p4kT`^5yl_7mV) #iE1vC3F\+A*m\45n$_[4F1jnFanݗ&vXMUkܙ tFm>y &1HNǍ}WA\zH//ajt|bKS.: I[Dn=.6([X5}(xc])3Ģs dM\P_K;*T EpīR ئ&!0tst~'-<H6/Ag+/)V "ƞXS(7EFOT t{-;x=kdD,5!O%8.mxL{9I*Wj*(/?| ÙGw KiH,yG<\AMǧf LJ33RAƤWC{qY"(pqfane;_.@Ȉ!ݥ63y㉻qqq#L Ej\jھ'nK3 Mɻq;OHHyEufy$2!R)/yo5ַ7LhͰFя@9Q+NI,oltlc4)wf6c[P&NLr_>uvzX?L4s8<ϫH҇|BJp{;rMo_L6?:R`s\P#ڭbDLtN-d4UkTut6t7̪Ks] gk0p` yn4{io`& _%XI6RӵZ:L$]'9s!$`RX5aI4.-9iz8I"Eԋ,1Pz,еvS ȍU>xȣ!Ki}~}dt0s~(QJXDžZu,+nwt" |-ÒG_dz/}~ޠ!;Z [tUQ8dƖuʞ|n'#uĄWEe!w* g!&v:e[GmxJaC pqsgUmpsz`ŋBCLbQM6?pkQŨ=TW42i١})]^bk"^o#m OS\(ƚ$-0ClcԲ6ΦDϟ~z , gR˻+e4iY0Qz0$+}1* 3J$?X%cEk*epWj'XXclM^;/]6Be.z㬼*+'MWSpdG({Jp8R`7VI5~!}堫m"T bܚ_M2-%&0" t[P lo:CZ:ƿ?#ǀr8qT9Q38׉ tξo'_«j8a'0W1ᒂK(Ǯ;>8rCR_,- VK4s <`}8>k|6~E::Fs^5=mQG*0*TCZ!qm-R.X܉rJyq{AKedF% rSBmzX]3QaE j6e NL K2udQɪQZΚ!PuauӁYJ`֍x PHd)cHw/#\Ncv_ں&7-LRpe׫D:B솝kV:HN10%JɑIejhİَx3J#p]#0~Ԛ&e)TSnu~3A}㪘= 5~O-c-$n&v'61ofwg㯧?qNu[3;$٨K3š AabEFk oUX\A°xjF8\1o?"exvaCzWyJtƻYw97'|`0cUjvb_/CūoZ-r>r&9]&nJU)čKvjt#x]*ճ"3`Gq!g!0vr_HRX|p0k˦z@,a\BtM hZVla×-`!( endstream endobj 402 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 53>> endobj 403 0 obj<>stream HWMsWLNq]o>8v!e0"l`̀%;RO7_}˞}y͏ᾪC_55yybHcX5ʔLǵ.bܕ:}q~Y4;W_`d/n $[!XBfl1)\"r\;^}>_vqq{?n~Lq}o`O eʥ:|H]lsf:w5"P [.^7Uǖ~bwkg}n?VXrjh4 afz~IQR2"7eSU}yQsKnxnYW9Pwej۸PFR=(S+^""I"}ۦkvY_-CIY~ S0W!eӼ@hSwH[mT:GRJ6Dm"Bp-KEDvmHQGűg/밍S3H+Cc:hh0 H-c+9 v*>e),rquvV[pg#԰Sy-H4%K]D!WBc7{4}!fP_.ؕj?>-i /L=81cx!LA È@h!m1|hQG!DA5fo6Ϭ\=>:pLBjzD/g@b }TnV)H,&so:Q:q#@Y ovŨ2 :cr ۆ8*ּ60ŒVLi)*FyB\׬!Ǎ߼d@JD5yݡ'mL8G[PP_cK'4#Bς8})E6Yޒozyi-*!+馰VqeN^6;%w E~SxxP=Vb a:lmrF~AFģ@؟ax/g/:i&)-H;c$uQ['boHDŽU%TÜL~_ۗ/K'xGQܿx FE#wEDA^֜=d~@v· 0yDOqOwK=V8 jB#pdjk9D7Pjlj^:P;xbNbZAP ̅r*F7*SMDyT  hB+*VrZ`S1[*k/%UY,ڂl~'bɖxT.·F93={D"BO!L<6#NUa`ܺ{a횈_y)Oi+_ SfUfH%T9T$2э¨<=t6qA~ȳ?`&$̅4 0 \(C{*fD .Tu~u&uQ㖼Br,._Es{`:8$kF:ɱ_?L;-=Wd]"C-|=\!^6;7f,Ѡ㲘yҙs)]18E%xa/$Q:ۺK8 *58:V3Z %:C)%}*kM!m)2W&Ɛ[cuNZu\Ʈ 3 } 9Yd޽?ȿ]EgSq#M8Ƀ:}-p>`yv:jOJ8kN唋9V4u.E\%b=u\Ul ;؃m?Fx'T*N=7`D_Sf25yV,BdoNXmN9~LK :*]Z;R–٬@.45\g; lK)-S1QaW4 JPDx9ef)+EI$A;? wd.-&g"@s* ^ ux ڕ!REs0SJfzx|V XMU6#Q҂@$/HK|._' ,ÔO~~1rJ;g*SS XlQ%Yt ;Gw;+"CEiI!)ZA=yfpU|!UK%udDy%/XҜ1_B,R  /=F=A>@pHunJZ'b>;{ ZրsF)fP" O=gipV{c!ɉw9ٲ_쾶%҄c;( @x@P?ᐞf ҋc?2Ϡl X+hkŤZpq1-Q$60Uje9[iY%iܓ`K|WKdy^3´`"#S W> D-p:~7E663;tH@B"v߽+"a\%̩ed]zr-+lT8ޖMx(F0"iio F/kXtE@%eɃ&K\r8HvgGI BmyVO$31M+'ޑ~+(:2y؟B>+hWup.?(PX[=18Inx62U\?T[PSut53¶v@c@rcn4RӮ!$C=kf;9F&hj'1mPO›;8URQav2r]ʩ(2p|J!\J!|T1$da75k':)N{GBLiKĻBhB ~;6>n'“(S@@>BPUdkz_)/` ~5 uCRTǺUPWFebύH/A+b_om'!I5 w 'iFکeԺ*`3J`\p o _bq}l< #Ac?2{-ɇ??^ dzقVGqGsF5؆l9_XWZPR壉>GߣMmku,W`LԙAk\-~\ \nn1gjEp F8fJ- ?n*-{j3C>5w 7Mtj/w(܆l Łv8BV?c47:D .^og+7Hi."^")R}R4 Pot z9B/ 0eͲ endstream endobj 404 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 54>> endobj 405 0 obj<>stream HWkoF_q5Ѽf$FŢ()E(!r,Ad瞙]\J~e6f0N2uyUzLJ0BeLj"D'\i2p.]%|ͫ-|yk8}| )(39~w wl6S`0_50iPL&*MV|s^ο]Ϯޣ1y 0E5hJg8a#kiˈ￟ͯnn.>*/2L<(A c=b8MVo~p9o ~cjКH,LoWn^<ܼͼaVy89 *=V3ʼn lA^CYAoruu|o=,Ң41r Qؒ$rBG G*2_02I"etJ"::|@ L\( (:RMlPɣcbcվյݡއĊC--vyfMBf!dJXU? ={qmH2e` t(%+Uff%,aҤf@ڱLGӴ_]} 3 :Å!amv rܧJ6!eEe#FNiQ;lOSS%F/ <% }5.K ;Ips|t4Zj֔7/ʡ![2$8!2su-,/I7cc7/T`LE@AF_Awݩ?L'b(M{=}j<-qP㘠٘*tIN4fIK8j[/N! ޝ M&̬NA[c$25э LǿpXK^.硆961?ōTfj%l =BuV6'_7.c]xHB--j$#n^pZ d Z}ߴ켉ѧIg:]OAa|*uQ1SgryZLG.2}">DoyJcl"WmWiQg^weJ40D) =(/A~oMY'4=³aOרU,ҩ"b<\F8D x", Ůu$r| Ϋh׮;vX2UWVخ~ F,KYJtUEuxQU xшыwdy㑄X ЮH#$$ 9gۡH?wI8 1MxX2b6ձil=3)2K9Nnꧫ>}a( 4͆]qZOJjNz7/SS$F YI">SEGQ (Q 䀦wY[= XMU۟p0վXnUD4`e wB^.U^.+Ͻ`/SHuJ9YH{A#}'|'IO#f Z. a!SXLH$ z[fn ݲ~8̞BQU[5t< f]^A&./$ǔ@&DQR6z2p.]?.+_!}| 8XJ7BA#ot2^Pw+`s@6q(c =j-n4t>6p#ŏݓH9)H,Dxj8JJ[ì* endstream endobj 406 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 55>> endobj 407 0 obj<>stream HW[o~5hA҃8I] qs@kK$$ן%uሔaZggf7E5F~=>,< >gyVM9 {8ZSR' eJ9+il"۪Fc a_~9~g`S p-Gᐃ G(3 K<_Ǹ*+˸KS O|#pNƧڞ䨊*"|Q[ hW_xj aYh: Cr[XjZ:el7T)s *ϫ29dho!i> DiLmO79f'4[u..,'0Z3_jf++bu<-7}{hwDi*C{(}CXG.h (9䩔aN(*@)Ku#9%ҪykpV){MK)eޑںz-M)ͥc}:x$d?97\7pu|Н ]|Sέ򓫞RFM~F5CQ6G!u)N[_E7V"]$1D=1KUt)2TT_7hhS&iPg7?MJT!Jwu)B| "-X|ى!82Lb] r;ɤSl8_W MIW]Irhk-ÊRf80blӘZR_<퓰 (pۣW!x7IJ2xSc> }x]{WTPp5grScu߽I<+NT fb;Ϣ׈~48}&n7Y}ڂ&N[ވ3 ޟ+{ ت-$;DŽ X 2>ɗbN1I:KsEI{yl:w8+ s]!S)*dX.-D6>:$#00xiteWqU…}}v*&pq{ *նZfZ$PUC/p0#i7h% $=c$ u%5e0Dc]/~ٱ%H1k101m5(fž*Κ8 obѮ3OGUYJ!o hPMKb(\Hfq'5: kIrSKQ$ y뎫!,x"e1)Z,&VW}IE^Rth 9Ze1wj{^UJcvLM1e>`L}r8P?唩`@Kg&Ng#3NaoϞa6\MZbe/I[5] C#nLk,K$,FHY# ֖%BqjKw}aսDqUI˝[a$Ѝ#x%w(GD'P%yVMe`fBLpV3*+U>$؎;w ,cXw0 w?]v]FШ2d$]P󰿞6!TؔS9n5n״ҎY#pl{0C6V i11rs DE!x~V.w~f+M`Il)oۢd*aa9̳jap|㪣qBl;BC1I( frpn <Uq`AsسGKA1CXT;ciS/ _X47_>`C#~Qx*qOy F56/L GWb l endstream endobj 408 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 56>> endobj 409 0 obj<>stream HWrH}+:MRhQ*I]Z']lH$|ٯI6R#}z˙Vp^T"Ws0y&iWiA0p#v tȔ 4!LnIׯ ?. PH@}ò'`2 `@m&xI GXeiX( a_KK\rg#G\xxр"*1Cg_:&$ ߫?[*a$C@G9w͇vPILo$k!񒫎o`WEJcҊ}$fbFc%ZVS=!9EOmJ5oi4Qd(j]X$E%Cd5QɬU+q@GMqA Lsy`K ՆXY=dS+Ǭ#6MXĨFQ?C`|w͆ AQ 5/)^ٷH2-%ʂlƿ뒎 !оr-" ٳˈ4 Qg)*")(sYr2GQz۳/4O /fXsiqsfdsYijYE=)+N 0S!r|i5,c0fFPqY60, +s48$vxL]IEńӊ)p,0 VR|fK$ՁifpF3a7] MNk-4Su%dIY4yIϻHD,;fFlWAQ(2=OPUh~O] 3xpTl`C Ƚpiж&7=>+xű!FCi4OL_⏳-z/''3'IGo^T>!O H:`N ϥ/;G*>mxfM8ękAmcJlU"׌ ip^UܗM0Ϋ*MD07F4ްUk>Cz.gxTaUKC9o-Zhq~_p3p}j>o~KOINFT/=6M&*HJJ endstream endobj 410 0 obj<> endobj 411 0 obj<>stream HV{VGoqbh8CP + ܘ)L?8/\O5e Js?(P Mg[ry$P 1H Ges>_L[ 3f~ Ǜqgz."-3|e;[hM#l2\ iЖnemgmI9p{߆Hm d4v#BB>I_)P 9ޣ#m}}zX#uo+wnݘʕY(lyuUv 9uk&yǸ/?Ț8xOeb #&sR͆R<JqKqX *[Ï8m' $F9K/6C|ɔ݌D?Iq"{Kd$X[`GRlP7Y݅-W x)]4ҵbw5ЋGu$.JwA~^]Cjk;|b8o5hh{;HTN節il&8N{_g>PNߤb\!HW엙..j]?m4) UȍXЊ岅|?Zx $(k~, Yb.?rY@ű|!W:i j:ѭhBDUU؋t(%E)iYN' |:X8o\U,'}]ꋚVWdsJ2뮯O2u|*ho_gŷ쩍sN~vkPyI!bW9{_Jþ VtHd'iF%Uʹ5"C ]ۀ+Fn ۖh?;>Yj*PAHn$׶a%I1x:my.Ip7${㗎gLhS-\x¨XGZ$oqH+(؏KAIQj-Wxp&So' d9,Rj9Ve,nؚHz!΄9FCPO.ky]CX ;esim~@mS a6ѧ0FV/h1569Ln>I~ڣ9PAΟxjˀ拃;[`{G{eC\}?NG!Ml:[tk[jZer_R)rfC7RuN\Od|'%jI/Y9bW0]A${K*JѮЊ7S*f4jw]Z8>d͔}?gP̵!k$c* #1üĴhruCi""tl%D.Yrⶼ~~?<}y|}j  9B BH.B"|AY@F#DŽC1}G:eׅR(Ǖ}oeۦ qjm(/@q H&$ow81˜ëԌlX3'lL]Mz`8+yYIR;,=H5:_{\Ba{-ve>tݑUM65%.$W)ūnYzXJiGe$Nx?[¾OuiR$Bs7tȹQNHc^=YtEoo3#>PE-CB*K/ MX;'lɖqQ6DŽWÞ8uz>z#Yp]h~+" HE?p(M5 J%xMtznΉFZI3]@9Jb DaQB_ H0pJ@Boѿ/kD3y1TW\Yz-ubq53y,ZPV\3ѿ{ B]^"oW޿Iݟ,DM-`W*WiqqZs{2SQ_x֍)lU[|ej#.N:ꢸ8LOתoX;o,)}6 O?]#ϧJ'- /Retu#٭{ysBB>Ӌ!PZU=}H828s{8ccO|BPu-SJ XBR&`&F!%$(q~hq`nnf!)?s4d{#;/i٬J3:o mw0 {l5"6K>AOo% >fPԏߧ6vɒ]>+f]gШ'ΒcۭC:Q]>dݓ@8?SP)MIKO>-G)gofn699oZge sC~![~Ļ8<Э2􀨭>kE&-fO\[hES'w(#VG&%B(̔ #& 6j_)OY$ 5P\ 972N/xu*X:[5}Jz1{+^h:ˆ1[ O1y$kʒfGI%L4***<|rR]^)f'ZpL/mRpi ^үV(\r4p#1v|n"ktXz G"'_W-cy kk ȔC 6jm\y^STaW[Y#KM&yEi+Vq`o'*!(=R҈mK^6elxU#k:MJ9KWߌ„#OD/2 }˷l^OY 0EQ{s VoJu8euF2/ae!yA2w ;P}V|CMaI#ѷKb>b]BAC@a@*K-w(=."$tj[6ĺ]]HX踖`(pBZ$H 𬨝%)Bbj!8\erW*<\{: =a֨؛~jmh+ŃFw?  8ǫأ C;!$qj;^9߻n1j i/dJ9Ƌ73M;&<0DNј̳QT9lW蚮4soނ$$0LDroH(ސtFJ֫ƔhOHMK5T!U(U*k)=fܣ[c#WsfovYn;ˊg-<Ӵ 6qt|۲٩u;,h.sUr1sOaxy^||#_]1^H9!AԷuWis*RCտ!ۨ՚qWmPo`ڞ 2 U w Z!0. +Nc;ԝ4;mQOdB݇hśXv肎xM6bZm6.ca*ͼ>m$$!fd\DR@ XvMa9Vlfady)wCC]bD=b/Y) 7N"x[٦xiXUdS>cM /IJz5e2NNxGekK%X&7.S_%6 cф9eQ CO;)!z|c؞,3 { ¨pؚԉ4㈟61OSb[3{c5q(ɴ Q$+:$>ێ2l8c8N*i*ҟmj*nI?@"[8o#˸Db$Q};P/qq?S(%S 'b!Vb,Uɾ2MNduwwi4p터8~C1b#78oH2H+h^7c@`wJ\`y~%7GqSQX2SY.+{*㲧-'H3K檛-'5K2ZwG9/%^ݻk׏+#8G8_'g!bݟ2h4iմ>`aeP+ E5QsBE [ؕxLP C2O.U6+ǕFY \Y:٠TszPWԻ]DZ-OXZ6Y[-~l~3(z=YlaZxIa970Dr^B}IK|E_: 5ٌtV4O $d2]="bh'RD'( _ FZhBITKUH16II`,3Aqke|iVrF[zwH52)F2DIg܏6F-QGd,q euWT#%[IF"ww6qߕ`wEl>MN`,] ?Fn1sRޡC#v| E܇~7EԋE.Q7u'G s5SЀ+E~ЇMfW#"1{;x}OfJ'&Nph c9#82{W{G;EKeI+٦mJ`\p8u Q!j9?#C9BHXzϹCC H e$ 1WL ъ4}c؆F u! ?9o7{{]1c;EGE";vk߮mh?E $8.Ms2>|xl/‡\KǦ=ʙʜg= %1As5î 9yLkz壗`cb(qh:41t9X\m`@=8 1L2gR`"9V/#n;L tHs:bbtJbÞ ݧFVmzEZmBgPLvً 'Jam'2dk tZ*5ӫ{۝k%.NMGǘ1##Sw͈tjy}H=]Ϙ;lѝĄж[>0Q`GMjĘ%"{&Mؒ<;lފᙒl(늟}mM6PI\@QGDԆ \I?6Lؙ괕,ҊI0bcۮS)MfҌd,TE;Ds{jm?eǹ{=x!o>?gxe/ ,q4F2qyn97)b`MLY.N >*AnT!ՠ/ uդ@^veXfKԵ$޵ܫ`!CaOfw7eJʿ1/E EUAPۢa5`# Z4MZAű\  Iea WVϳW&'bz"KknNâTʪBaB@PW-X5~:Wέv4bu5 7Ub+ Js:JCig@iXP<%5ZP=>؂ Hr5*R@GUH/($uW҈jR\7g^-/ ^JM2:A;Ei/TPWZ j@XDr:ͺs@&X`0>ǁv#iZeW1ہ%6Z`aLcMÏNԌr+VJ`Ay^aYfWO[8fL_+j(C_}#d9d(Y>>rI>, cJE_*}yX ~2}`%r  @3 qI s{$Wp^ht̷ 5bcіSÜb^Rrz5^9dNmzJ99.Jww=K|pL>̜e\{‘%qsqH\]"&ߠ]hOXb[0a>_Z6=RL OY~,:>#ڧ+];:YN&B6xg7P;h>|0ϕqlճZ'%`P"JD2 ˍsw3Q C39K}C>ǣaK+]&J :h.8@?mq7,@Wbǩ G.?x:.f"/%-|˻q48>#m([pvQýT,`<>8H.a5޲YVv6vZ/׌CVSYɽK9O|/I+ll=Z!2c{Wyjmw' ^o~ڌ~a*3QCzl],GNdn0izmc^E;<,L ClǞO~%1(#n'}˺q}=s]"*s"9\pAhzړD<|L&9V'-dޅ?ʩAO b `1ӓi>@d~lGdW& A(xׇ6QnEcC_*'|O7yQe0>p q3w+5, kܻ`C֟M6kK%}<-5]So/c~J+~8O<ڨwqghC]X"igDSegDT?JAZY(ZGҗ(qNmTb4gvrOXO_d.8bnAn>p(˱tbQ|r/d?l"= ÖWK&'RRڨP99xI RS@: yڀ#d> *0_삄-<֍X]u}"Mc98sd4I} W+G9C`t+!q By-lo>FO9Ѩϵ}a ^;CSlneC A^F0*!9 ^Mw?Ə& pO4fR(՚Mq!EGI۴blВ) %uWmZ&-Bc4OY⮫Z1N`4`/QicLinK{w(wA /@cntzR#soB{Ủ!>s/?k1/%ns{#u8%|ևUh#Ĕ˪[Əx}ORSڎ_ᯨs[ܲ qk ن:?I' [&ަ1p7:_?rҞVZ[o[coaO2V[R{R;ѷmϗX\Z,V^[Rp_R\ݿ+3{+wTwձp{-w|V:# %H }jB{`\7HuP>5_ K=ʚ㼪տ\\Ň3$Cmji7gH<+Ϲr:ں~XNswye7_>NJD!ԅ 1^2"C1Ibd? A {υfe&]YqC')T H?^r/Wa+Y̤=P4RǿK(?AGkcZH=a<ջJ҂Ŝ]6h3ho E*6SUܼt]\BBzjc銻dY|kQkp啤oҗ%#Uهa#%*5kJZ)sUL7o H3_Oà!7!7iԌajЋ1Ě(tC$$4M0*n}h} ƎtEϪ]U5:?^ U6}HXUUŹspkH40#eJ\a99:}9ߵ-z!ri<Ȱ#k_#Od9[$,#{.Y cY}_ZIj|Yagά3P~$ko,i/}, gFafo jdLK6e9fb)!kYոz2ݼNe?cVT RtR~je#Ik^,ɒ/lvc$z'e<`qa3|=%٨NFR8҄w\7A1\a@z: == @A,    E$@$@$@$PO$WDDDD\qqEDADADADUDDDTPa0a0@*"""" "t:B+BQG5?$ ȃȃȃ+"""N\m 9 9 9_}@ gs!ffffU $Y a*a0A0A LE@@@RDJ}$Q.yj34ʆi!rErQdZSdRarT!V~4+G{pQK/^h?4MA r?Cht^mBeSZ^cngs9\p.rLԳjbi!ϩtUnfxn'ٍdB+]hSV`PZtf8U]"ntaeJX͟:_ ~&P AZ+njFy(EVe̲j:~TփAX ްDΐ )%.sX"RM&!>wὥnT{-6+,kA~m1ru'5Yb em ȉNҮ YsP.xA\7 ,>KzFo#ŠTm7Q2ڢWg\|UQ=N+İxP|M{nyMOcԌ/-xQ]!' y9dSp*>}Ʒ՟ ]nj״G۪mњFm֠չj]WUr..Smms0C0"AJu1 1Wֳk+1}]MZWeM[YCzz2Zan14jcJbZFmIFNJ9O|'}ݵ]71IN5`gWyC^MW|wN:8},YC6(,[Ѡ- $@B-\Bb t3e24NJ;Ek8mteɔ?ԝ0MrߞlwӾo͹-W7IOƈ1bU:5 䓴=HlZ7*i0 IFE\NFPqQű↦dbHT QS*fʏ@P NQNy%ub+ԁ<T{T:u VB_CEH_c"[P@G%f¡{Hb'h؉JP|TǗh<^4 h}f8{$HY4ϠLTJIm:Pf RJV#= <0[vqt:v.)(pH(WNsy202{ ~!JleY~PQIcw23@ȲEoE@<&5Ӭ?9]::XQǥ1G|ٽc `)P&Rmv4;y3bžps8Pq[[pKW7僚Dr`vS IFP5BLC@ mnJzr<%WuޙyB ip`3fF.; &-Q:aZ)&!B-P[MҐRJt 6` ei٘zn xsV^ƝL[k!P*]|u"xVj~0ёN _81Opw½3X;:=R;JsYXiD+VJT Ϲw엘qS'/)Tˀe6Q>}a+Fb4b1bB6b]G+? Jc060QiyEsK;އ}AqO![uf e B sS2RVTel~Q-4!ueVyZ`GxϘ}[V#o?ć]+?,|xeo kMOLg7M:f-^q+l:l FŒ'h2M&Uo0 "!/<٦=)A;.5vb!^` .lb~ +eccY{+Ѡex*E2G 4`a8Ԛzmf.a/{N& _}*|ބvN]8 HUꪸ*ڲ,^5\or?,<?6,ʋZBW +2$F )i!$BXt  WO$ %Z!ZFXs2=Cܗ^ͷUGӗ"vb7+W 8zu.\j{,DcR:yp~O0ѡR]Mgwgߧ_q>!.,!BIa27BXi$t6ڕ` 4> B- J]6e)Mx}>\3bv QaE 1Err85jMF "P3[g|1{7aǥA2*anUd.;]>hb;({Tf-.iDH$H'#a8ab_r f 4q&9!L&s6T^<q) |ߎK<r⩏)fCkPw݅q`hGq?cdq hDcP!B-hcw]~7ǃtaEw> q@Nj&f ,+t _܅({p]%ŭtZX3xKd%x ] P,q@BTac10ϣ 'J*p͎pَ0 FXW$ g] ͉Hd4Jo!ї~~32O;rQţ )@tLt.9aM#a4*Sq `8>5sl~/! }Wǀ4X`D],h}CQyLms%ܾ2AK *G8;uOo}kGzt7mT{CW/~PɷPi4vySVkek mPC Fhl>Z7ֻl[c&O]p9!uxqG.Qd]xA\ZX KD>xn.{0T>uͳS!<;CVS}lO3C\%IOC4 (yGrÂ?rPȏr}i!h w ѓƕ;ɷ mܛL_ڍJV)Q~}yo7$?Ͱ("Ɩ/dX~WVD bu jac0[ ?tC~d{ HF!WO]g!lGnuɛe, `4{RNO@I0aWӠA3HGPHodGx(1ޒ4| 9ih)P^kXfÊ( 6W 漭LFhd20HjGM(5IIӵ>l5')2~0h~lAdP<^X}jX%w&pcD -x,QG0N1ۚzHp ^GO-zl*ww,Ah],$ WŽ0v|JԘU[ϠJ&FYfkntQ(U J^'WF^EnEGs:0}íYL5|Oj׍c$ٓ^~]:SL8/$P,ؠ\f:gNP qxmMc:IŁlV|%@%pw?h]xݝ;Lk襧k;H{l;j0DifHWDQ .NjŭtfK+U≠g{/VNg R.j܆Ҿ-v| :L9Z4Bp nٰS ,g2=& ̦S É94! !pul񒷽KG-;Aw<Swlg MdG:cY0>uze p@*'v[_||mpt[6Ɖ{{sOmHV{ 5,(RSJj8.p䚸< K2.kD Ͱdg(Ϙk֎^s[܅7 ȧ!./S/@fwva]C}Dߦ D3jNN.|~?i``[!aLxjrq:JckXgDG)'yw}d?oG_r1zi2~B[n|2zE"7ź+YS^{gG(wFdhѹV{3V/0W f7p4v7u.Jh:߇ "OxQnTk}D3ߵE:JK+WmXfY{aݖ<#M06kN9bV-j*mx~1-aX=Ľ[@$Y݈)&GzVA Bhk6jkSڄYv ٷ=u$0TE}4h-Lo :kI8~'S*GȗB~HTDpvk(οyI6:w:v^rRN;E~D j}( 9: j|2bŐvPrwLO?HzNϐ,ƁpF?+.\mNk΢jw2g;XLJ8QbSz9֝v-֋ҍп-2Z6Yz}S(. fycts{+UD0ir*[ZZ,rXVI))'C0˘h'y- /r jɷݯx^U|[|N>t5C%( Jj  *rT鉐՛K0:5%̎ eȬ_aJ/qKG'muug$ށGDlI! (*ϓ:T/nD2!L,# |U QMAaԄ(}K+ 5Rw( P.¢Hj|"1861(6[EJ6?Oɬ{ ^v=uvFe}F%t_C.ٙ p]K%+0_ ;J]!=+"D6 N`70{hn2w͊۳L;Wn\HhZV_ݻ*- z܎O?s^B@q(8}<@{5VH1lOY[mCx .7/Uݽ?.rPŊ( K&TW[V,1i틶IӤƇ&UkF|hBIM M$>HlC@5h bMӴwv3g̜g)1^N6K; <<=~,=]W ̫m:"ŀ/}a蟝EkdA[mwch+M4o73767 S 4e)(w G %:&{ǔr̂ox0e)(72ç Gpth}9%trЍHVc-2ͣ5 _RHhs623_ g-:C[=X6c!mjz)8y RNO%WI [a.%qg:YƼtVuj6Gmi'0 cބs=~'(rGoyI8ٝLlOzh:&=E*>èFZ>%uد|m!fHe"A^Ҭz1\)LţmD,k*CDRј~("E}#)#ޛSzĻIM[[hH$LۋH;FD߉fE݈~#U#,8ƉCY6óGV>2-T#L"fl^Gxlᆲ_>AܭxG~i'X> endobj 413 0 obj<> endobj 414 0 obj<> endobj 415 0 obj<>stream HVyXp*K( ; (j 1@Y$FP`*(KyՊ D^ ڂ"} t"V{oo9sfXD^3pK ,IxLn*LMIꂺUL(&Cp8Fndi4?,}w)S|)ݜs(7 MP y{+D혱3dr9V|C(PAc1^]ϳbCepb-)̧LsmƃYNM%vOw1'FyUiGhU8s85O7ECٓZlϊ\/N~I*!Q&=>'NUhT=mLA/ڷV\&[+.\ ]<qiRg$ku_9j\$j3+zs}fFe˱CN5ܐZZmxLM=q'·߲hYQ"t!msPt尉.## hdIՄ/c%2 (EWkWKQY1" ɘ@0 sCP]Ř*3AE)S@-b XLИd;U^[M5+) .,G=]Γ]?<94kw./ώJQR찎e3\7JsOKkX4ز‖s7#eo;i9R@>Sf؛;83F2iQ;bfhZ7a(Idj}풛XG+3~o՜wNO=SZ?yE@k Jߣ[d{OwEC|cO@o6;.܁_ؒSX6RՉD [2ޗyVӻ.~5̂rl*a bKh-Ajϯԗ{nCH)dKҘr(AN0E.uD&.DD礐.N^Yk=y: _`8aC7A(]hq-\e.n/xšxvYΕ)?W$K::8 RfU~4ɇt[s`zZɹnlWv5y)IgБ+N'W~bP^ EjJ3"fMO9ȿ`};kpY|-?Ծ_bd1Kޗ88 a&^'yU)]nzNZ` *,*U0E a9@BzKkv]C+=*VVTy#r0|S/왼DCj*]Ͷ+1i^[y(EꎻهpV̆ډe e$ED0}/O3S)ϭN#) o=WP{iWtB!j6nuwxT-a[ݺ߆?];zŬxi5tO`zfX&,^!0 ~z rGr!ˍxL~N5:JDbYLNP_yp\З`湣9=v{[R”ĨwG߭ѻ-CI xdrVo^uK#ϚoFUrUeDIcNn~.y`[-1<8kw+z2E~+J[YMOO.4Ix`yTPGiU]3j14B4n_}y6P`4ՏjC/Q<9G /#B(Ĕ. ݎP/LLDv"*.~;2-UE, FK:߰:BY^ݐ`_N]Dydh@]F()u|u_i´ug<[eZy%M )VeEI2d P0l[RCI#c!Wnk{<&v+1GjJSu) *mZ [eGv{vh7Wˤ'9K0i.>wz;?"vvN] 仝,;n'^pܫ^ YsVuC!, 7N݀Ĉ/+:՜q@c\ ŐQCD/A!8 Z( , ~d1H/ UenpA vpI0ʱZ0 0' 7Â>,z`AX=L\u{GFF~&vNTH#$ ŃΉm}&K$3b*o(-Rwl.Z^!2 23R4*"+ 6MVj(Q5.vFN!L_4PMEOmVƿ%=`z?5X2[9z/"}K7וL)>~SLSLn&5YGf5ZztTN;Eu[ICu?霩^je+c" E2^Kdt&ߝk3CzqX|&ˋ \وwXtΔ} ǺUv R}hb5\*`*Cg3:c̭~WHoM7<:31dS#VstX7^ӕ9Fȍ+y4ABI%7B* ZTj|nj7ZTQoSBK=:gwϟ|;sgkuuNΥ#GM^Jn՚J,ͭmd lݞa? C{*W&TҧLD3{/E;Ce"S}^ĭ/B5 07vׇc&`tOXVx(mqxp ;Q3,(M0Ws5.c$#i& x]]0W ?2v`L%3/6F9i.h-nI+STZߠ>ZKp<#VX".B+*6q^hc}nLM,Ɵ-&']T/${1/QMyM\V'֦Yͳ[HEIQXRS:Z)#Sjf{U* F (ⴤIT!]jzF&F" ;&K}8n_ZXe9X8CטD"mU`斿VB1=`{)!OU zسfsޟރy.Te}q1OxY,+B.ePjh&wj׍ l/c[q$H%]TWLlR5=O/=5pz1ӱYNC dD}zڭ;skUf]{v37wƤw Z#jH~4\ce6q1U+ %<V~[;m("լRb;+q3\s}$JlV|qj=&e 1.#l#D̑wPޕ[l=Dz8/UܓGE49LV #MRT5jڢ>T{Pz>Yʊbn0kUhXvsuaG3Gcccc<4aT0/qJ^Yo*>Mt]$C1'E {<.":OO4tz0uPZ;A)S7cu !DXKc5E')_WZAV}PޒJuDB uReSgಮS]Vr*O Ê"yf|wW%RvCYA8)}VEʨϥTHrU* UoW˫jK'NP9YQU PP}qE_`hc;8,WiYi&XI;P%uQG2 $ٸEd=>|ĩUmHu?P!+5V~XOǩiJDXWX*S(2n,K0`|X_9St#hE<#R(ER+F՗=J$qBSflRg]";S xj1oRBNQ4=bwغHab>Z2CcEo+OUf @IT(uԞ9havs_5KN;ķ+W1Qm"Zr uUfM_hܸQխSVNmi%S\,NM>vgDNdy];wfgܙ;M#kU`zs7>pu]ZjD'3kx60E(4bXeُĎDTv`A?dnM0ʒzPpQp>)2LZ5WT>hB_0Q_[H'&FGj*{y[{s2k:ْݹո=ZnۼV(R]0E5f t;dq5XS+1qA76Legub+pS Smq_łul4 O$r*o{zffy.- DLoM pPΰԞ̚F* JDcKa2X3FGս*5ƍ Ѥs=>3rX - *z#ȿ%'Q\ ]|YJKYȌ7dEQjR IǑ)_2#i,"e7E]K<3db%J/}i+%.V%|fQ+]|kAO{B f}"Li ? K&5oԽ ugɫ` A#*6R,u=2$=k]f=MZ1n#uC_ a ߽|@E( ڨZ;9h փ.| [C{|h qx N us@}sro ԫP!c$o޳'m7}`[u<hzغvUHQM>Z'MtO ol`yv7(]UM'ՊP̶no$W~o* =Tk;ivЎ0Ǎ ǘ3?OnGW #̹sslq8;kO +292h>S5"P&iǬkJu9vQݡ/0[Gi3hzߎsC2iߧAYrE3Cz7_h5ImH#^3i6A[ǔo yFoeiC J+C!rOӥWqsxV5BsAZy|ֺh>ƩR{I]AG\=u爵yznHQvK:z9PSa2eNaRkϲ>xMT̈Ϭ8͈͎ :i8y1*Is9iz1Ǭ=|ڜf!Gp㼹f]Yku(z55D3SwYSKO9*N-Kg!Qp_wLi/!`5RX|zF}HE^1:Cc?]BC}ÔP+ MԈ1$>,c]8+^wݦT}ɽ=ͨ+]AT5?pf"UkyNrr,' CrDowE>=j=v]Qe 0ڼՒZd&hV\4UFZ$Uo`gW~ӲkCKO dޡ*1A]zk|8sPQT/@d6U=jP)߁q mgP磆/~CqhOoMRz fBa#3vbE7iKZ}p6> Sc55yK)H[x^ikl=9x^9}4r@ȦMb/%ڪN*)\jhBVigv+AOm;0i.|*0"3(d]&x{3#QkpcN`9$CQ{ OƸ,^{ϞAyKڈ<\_=(pۀ' Wq1y"hru{3R|ǟ9A]):? d3[gxqʄxxjBy;Tpݼ olbn޵Jb*l-qgܽrb1c^]bBPl JY#H]Yw}+sb=*O8 촿x{b* \nzHEd {c˗$afAapY3?gו.2pӳ窹lUxdq7?|-:]%v]âVÃQʞMM '$(`H ]b6{l2)at&{ ggYMdL nJ `PI= iZ@%^H5:Y'ف^bhTB62m_`4w!ɧY ]p 12=t?b[v{,ngY.P0tKwl48 ޙb,Wߨ)Ќp; K߄k5FNc|ֈ:ӈ:X}7]}@ h{XY`M5.RČp]=IlDp^QwnI' DVNQk{4m"_\H>P&3gO.bdf5/0E&͉'T(-npu3;]6ܵnG=kf-qVX 1Grt.Y2VhKz=qOk}Z6 j\D3Zm֠Zvݪ: ^yr=%Sqp'mc7 hZk==5bX`'GyE=/yaꅕ@ O-hڨn# gˀ5k;9(J@%4MG~e3AX &3D[eܾB/텴hؘ cX0VP&P)Pe8P,.(PyyP[{/U_Vcլ.a% 5gdKѥJN 0!2PHt k7b--I( rwKD+qƀ6.dTG^covia5WWGʀ8\3$@euekn.28>E}dUȣRL|#RURv>D8,egzMT/!GteoR>)eov3qvu%SJ%)+cxrQ,rBx˽}O5#<ItČDAw а99/T4z̿致BG+H'xcA)3#?$_%]Wv?4C1q35zG XPfF+&TL@;+R!Ѫ\ bi2d3I@N:%gPNfKvЋv&x3rAqrz@0;ω2Pˁ WI} KB{i,ruzvŧnu t?(Av{}s:&)F0/NҊD'_S)Ag<8' "_1B=΍5ΕΥ΅\gs3w\ɮI.Ks.E\ɑfj>A**>EHq+ԥħ*j2WEUI㋋/;MC+^ *L֝#;-qiUoژ cʺ?W}lSg??qb?# |;!nKbAZS1V Nb2@ m]I) RɤM1u6ZH}J3i>\= 6uQnl>up^\~=nQ<]:wG|ڧhǢSt?)8HG8HGQ`I`0IEabщ@ ڛM\;@b}be0dY Hd2D(u!XBDh>}O e'NBu;0Y F ?[oɮ{bXg0֋ԙ>9}})|iɮ`o4;Mt<@]=>ѣFvi]`W4>9>%[j~dlfkVgZVfk\m> ;'L9޲++'ŌйovoГaikˢ`sچTMMLT98,WTvvBؾTJA>!LZ[kzvմKk80wVZKfQgUگ#zF5RqΝ hG?0 L> p)&6S(~Y#h`)kNI)-M҃]y9q"jڐ 1ҿx-?@z ip\yLe +:2W3YUWӐAٵ'+vfel[VM52ʳ& @H"p5lɠ 16 `=4( pBrL t 飃o)&b(de".*Йgs,9 0zJ8(#"< OY.7ԭK*iľ}YuwA!O}E@nw{w桟\"hD3Z8MƺF3"m} =9( q*T3%uz ZSEES%WTjrb45-O;1yN扬9MN؇' } v J92 7Iɑ4G]4,$^i1>$u}aQuF!/,R]EL8C<˝@5%%p6e2 P37ohPUW_Yfk\ksxaUqɂȖ1O= @ON` /?\NOr?! 3Y XbI6|9g驝/|rAwclV JLJoY_y!SRbuC%_ ^ {~˚n0ƪnXm+*hWW# IEq27Aҝr]5uz,,g&^|Cz*7ܡ{^ V^>#;_9Y}#oG3lom(*m|qqć:5ZˆGM8MV F6haVj)OL&VYmxF5h4xF+"rxAe%A'֫9'JTL xcҮg4:"=aV(!e֕$ +@:ԢnK4bO`aŗK~uc?gBZ~Cnܻ_댿l>űhbHBbLЦP%i/ER6 (!tTLa]EdiQ1Lu e-LĴTچ{Y{w~7 SKL֡sGCddTNŜ˭z}ABtư rp̤,(QMA䎮CP4((868CgZ!%JA!JlY-f@ EǢ"̗/Yէ*3$V51y'y>Fi<(09="\ g ,e0 Ug y]XىO:r`uG.tL-*bVe U**;BjjJ5Q jkT1UeeR%K*@R`rƇxbA!ܑp4LxW‘LHqP%ԃtf%vk='<= K2Wf/Hk1q'y|呛~ts;ᅡ]޹ܳ  ?Sp¾IƏ=\Pk֜/4Ȃ]/ l{]-Nmj4`1TI"ӑu7uHbFegf!!,̝@tm;7K"|f&-{|+Ɩ\/ j(KC\1$_]';γą U݋X/X[kFr+ꬍ61:inً^Kz#QF߮_~z{;$b!E/b!q#SgȜJ`Ry ۃ.ҀI%^UIdgeUUOltT"?Lv_og(&~?:7a/9`V?[}SB>V`r]PQ+ Xas *$x\e:65v7+}+뚅z۶- _.Ǫ:-e{ f"("lj[ vo![HSzNtEJ̬~8zH;LnL0Ƞ%øjd_]5-Dqwx:ord6::8VVo:CawDTm^+qRމY6|؟tXu$ ߵeI=K×WH# E L)::Ak51}N׋}ݡ7rۉ| I&4*"^ ¡ A'qpM}#^5>ś<75G^^+\R&[esyڷdV.^Ϥ3C41؈R:(SHC34(iL駤5ƕ40.3gY|p-.g1:1F~^g]n Szo=)}&!IDyI|LŨ a{}tAp'4 9Ci, ;ݱ6&<Vo%3%i%q^HHQm ԾKnzCd1< w'T:,}!LwD)*Ci N߲3(8*xZ-2h8&E^ {Y4Lyl0)ٔ Y2J$Rn6=a[VBOH-t mi w5uNL y $3h&$וk/Uy;?#s>;sqg'1v'G)lH4mJ"ԪD괍VkODni+61V!6Zd:{>{{ iIi}:O榸SJɁU0 }J,KBL2!QhEi'k3LI7#vN؄%{ƾdSAsc=rm)|Zug㹄+ JJ#G@T2XT"\mW<LѶdf꧈Rܒcf=GW>܈we"pe^oE:)z7~kl5D&c椇ɪ(oO(LP{[ӵn`ʹ۠D ,FL"p#rTjh. H~?5h8i|g뗲 wpQdQ~|8ixqa p@BX$`MOfI,i֢7LZiFϢoECZ]}noY[y<;.^{t2ӄ4sdwi7 e)M Jl(f9!b`f,VGP2HCi01U !q}et/u\Cw㴟J1gRDE@̱̥C~y–G?C2wc|ٟ+_~7a̞_,);eGNdJ2nWY_U}h##0RNYpĩدdU&$d1Qt(vxNu/R'4.kX,a2̈{l`|D938 3w!V؊谎x8@|R5|i+sIs# rؐ6}W$0āS;n⸉H3i,cHƄ1ɿ0F hn=ѹaNp[t@ݣ3HuIS=Kd嬇ֈuZ\p{Y]_d2Q)-o&^Y3 +/|"^>>y%*~&b\)9%)ybk)^\IeBH{"Iv%I2khdDkhB ]a>F}VzuhzB4\l^&lpG]OXWY${l2 GCb_E vWio[‡IR0B}XU{u5<؞{Ia%x!?kž)b8ǀχZV?d.WW3׊~e8\|>X&hXIDbxB_=M}; >wj"&i6ItR&,"֛tih\PxR5"i9MGq[Q2頟MڹL\e|ڡXL8h_,{A!DK).5ŅC$#bC9qTJx&1f sɚJBcM^H1\ `@ۨHsB#|+dLB%+tPj t(nεmjA4Y2|~I ѓ Iv{t9 7!L0WP9 }%ݒ?ᇇ( 8gǹqȘ6KqzUYg;wg'|9^۩,f՚!IU27q3'Nebit D)[JZ!Q4]ŚjB@F%h M1P?Ix&ت ٿypSbts±o8^kKÁhqJFz(j].m)!#Z(q㵪l%s$XB%x-w.ts9w1SL'x'!:z(%>pm2w J/UZjJž&H nMF)by29䞡񓙁LP)-˞׶'ۺ_qKN=uUUG;O:V.o}6'7L}UŲz Rm$$auP'+$m2ceպD<ڂ(u9?"ҕB 1~=vJ4 X{dyh$t`ˏwy1[.[v696Pm6Ք?`jY,lg{}y^ϣbP`3>,-ccEoN:Y<*~WUET9j:i9-Wo`*; _"S@,j_+eP( o':XzN"xSuK˿n_ziU-cA_3Y","KƮKvkx`#ۃ[bpbkx* ~^BAwvϽ,&:B_b9BƂ/>~N`\?h TZW !1!RJ4o&)h|MlS۴.=?&<"t_Nj'S¬8^/CWfFk Z^mЎVV46h"5BY&m|;$lf5>=.Uh\ԩZd[.#?)G)VtV/^A^!EvC%IȮku[tVh 9?Nc/7x?$h3G KjZ3-s aR9|q‡C5.9H7T =_G zK_4.i-ҝ{UGlQ15{~} 2UoK[9gE+ƒ9T\1"(y!ӎY!I2+-"ᖠbq$R*JyG4{e4rnpR|_Dp96lz6gs }8.r H5(נʟF4P3a„ &L0a„ &L0a„ &L E^wJUM1w޶N ]w_Ӻh ZrëAQP ȳ(s*oX'Qʛ.C^.~˷p:W!ղ[/v+E(cy~q@Q[Ps o+Vg  j׀GuIˆ >tȳQ}04#F3A;d} K/1v#raeZHSSV3]&i|a]Ez=GR :t+xd25Nd`,Ez<d6̧d23%ے]:d?i5:hdk&CӤ/5HnHweǓ=W$N\r$5=L4ɥ\j'H'<st4J#$Nng .fݱ0ڑzy303=w豆om% 3}:ОP6)}3쉡U'm0clH740tlUd+ ۣnl?w=|/|gȵ]^Y:f৔znė-Y,c endstream endobj 416 0 obj<> endobj 417 0 obj<> endobj 418 0 obj<> endobj 419 0 obj<> endobj 420 0 obj<>stream HV TWyBy5A.a5q Z$a $2ëhZjTDWXwkq⫢k+Vh} ;ں{Ξ{̹?TIҨRN%i jMdTIW`| h{Ԏ{TNXD=5h>vr=ߺc4Ho)Sȓ3ܯ.;?1!?7LVDQ܄'Yln$X%vW[>Mokn:]TA8\;ARh誢݁/<i-7"z@%ba../rl=%BkLC 09p\d3 LƯH@ ƛ+yÃdń 9u5~g-lA#)V7{y?X1uhF+(9?ņpYYlpw5|: I T1&)@ U6D*&-Vj(nC (2qItՇOWTNւE#OqfY9mܕfTKY2y]̩n^ĉLJRx|+NmX^P1<BxÉ >+n+uLlAӳrNwv%gtE{Ӿq[ے/[Z<۾2l~73$&,^4z\7(1L_gW&W%qt8xS+woQ|z>_EO U6 wp s"(̡Szz5)5}& 5\Ѷ'U%V-rVݖtcCs82uyVݾK!h{흵偪DoˉM ݚ}_KV.ߐt ~%+t&%NČLWښhٔN AIp '5V~݅]'yp,켳 [Yx:kS>=6!(ݝGGŘ:)EZ5^m3,><(mӕ,=9B<s֡Ub2LҼZ۬lu-x(rꯎP4& xسPV+0!b4*)9 !g)IQѲXYDx?NB%%K! %F:0A)QkJa&'y-I&ѹ#}Gd7ShAUTX$ aL3(-\=e&l(J*x=WH-  EؤޘgQeV–+h K^8^OG _" ;`6'2+hF.*I_e=:j5"};E׎|5 [=}iZ.cg-~?z}bzᕩ{?9 -K< 8^άkK==:=;Uv'0$*ku,~u@a;Pu폻XCnm)cj'uϓ;fOȾG؛}6AsJ?qtW8kmqL>5u7Tk\o1LotL `Ջf19lg6»o=?:b%p6 a6B,ff0a"bUm᳹"1aCC+(NEFXbvXZFAF=CsoɆt8<܁یmLD0l,|07R"Đ2%á7RtCD­!I($iTEf`PO_x2Š D+D8B1/A_FbQCʋpH# mҙb1 !gig/uM$1/PnLA?"dNWAX%(:4T*\Hh3U mP8NB6?3_aM]9/+.bXT!H4$@@K(jHyR_) "Z+\jUVIXogrs̙̙&Njr\C$pT|( X G[܏DP>%}β0ZXNPJz)XS;X& >+Ua|<\gĹ$ Qe.M" T NR RR- @ (xUUa|$X2Gv2Ny C*=-MOÿ,=ih,&daY&iiJJ&{Ap9&V^I]i0ҳZ>! B4Y&!ayfo&g.5)0R%oҼ$ʯW' 2bD"& pVP۷G'SR|͐z(fՇt2x6e$)|jf+zw !TƱ"V; {ڧ#ڲc79zV/Y[jM ٰS+o]ۖCfyhoS ?#A gZs_oi)u{[h>0ZVw2a.|k{MrkvO V5M- {B9v׋{Ʉ>XX1CфFVlɎ`\nS)keD CDNy04RH4Hqj%p{*8\~?C;mH(}ehtō_mi[SAd܉uozBYZJ7y_*#{Jz\_#sߺd>?kB+rkS&jeWcTScjMb>rօ2Z.(W*/_DYv=< c}@bQ )|gUv,aT%<{iV6r:6s+߼erΦZ{3Mw@֊6՘ﺮl* u괋zTYlzp/- S@.aw~ H#C.mZCEic~C!a-=8j_m 'nLwܧǼ7_鼖?j^[WۓU~2J:7D&Jk<TqZZtt/jkL{#bO'3*6] Vlizn $ꆋLlmS/q]c2Vx_3峕4Y mR ޑ_Io|Ԙe#b"4UJfr>/;tw~s82zm󜳀 pϤi[op JJD*o|dH%!83@N %V)OpV 2`|QHW"3;@@R D 6hEnG{T"O5|S a6 1^}"':r4cYs:EAb]ѺR-p?s.d8ExDfԒ&L.=˔1ىǞ(#@20x+p2,Aw, @C.5:q79!B2HȻ$hH2YDRH&YIv #-ԜQ':i,MK*Z@Ki6+3>LbcX2 83SXf1B|ô2nXdZvsNs*n#k  F9 AX 2!R4uqAof=6A}TCfB'84c`!$3Pa,8Wbz)hS#l[q}~3fx{yzE\~INBƎ=jňfnfjbl$JE& 竝Y'aPTP D|5ix:R& $#0s /Qa4_ajg5&@L0 kCyB` ?]bAbp#\Al4V*+?,%l$Uj"YLTm " *<ݝT}!=};Jt`j1])m!'nyV:ʖ/@sZnJmhؖLe fVUpXߠٕTG":Wj]vXBWovCl]9?tbMJ_XuwZ-ίެ~ٓt$'d[3--)mqsՊ:brqΘR8;Vft'8TZ %y,|؊H֐s4`-s\>-k'3qW[dz}Jm~z.^TtPQpnpiNrnAkkd"9`B5sF,ÿNx B [@û+5MKrn42S-4&뎻Ht2LbSjZ<(7ӕ,MΑ6r4d:BKT閭*. mqfpa3Vt&W9W)&TteƝ7e-3l9vg$MvSn8=$ iu iƜKJ\lJQ`M[ooϾL ~B>&S0ZJ1j҇lyyJJkc%߬Di=j ) xmX03CI@`z5ۻ S+pPi6F+ڪMs 8[!,7j:y x6J]j%=eYVj @ԛ2T} :U*yaIe1^ =; Bqu诂C:&2k1vu{v瀜1cm_KG~&?@> }awlo:K@Go._ Tm>r4:An X <(#!48ns1z91ZsGi~b0%yFL9`}fhhAfh8ܧwI}3S/vS`FjL_b>WDźe$}ΆQ4|Wvμ dP݈'Ȗܣ',,811.?0J9$W CvC.*GraQ#FW;tOkF#2]C7 r9Ƌqc\2b3zz1tPqB-f*,Խ^1ǏONRF-\jn c6,z%(2 #xTk75r C_&dB^ي.:E6WoiV_FPڬV-z}H-ֆ5`FZj)< @ARgP}u^)wQ=}Y37fhC:VNO+ a_s19r/Q CB]PJH Ūu+v #$Poy#x-%Y:*REZK%=AC!sr-I&KKKKJO58'x/-ē$$S5F1ɄbM^V~ev?&aF#%ZWjo &N٘l]w͎+٪uQTSσa E*hamέ9K󯏭k5A5Bu6T:;mOwC;cvƐ60ZF(*sώN?s"#z CORQ ][X>}~m>>DY[k:);#5lZ^q `!JWBINvԜsI7=xUx8XȯN@|' ےRWhTfb$$"J Sw:F|!J9{iioMX]&kPՁh<ƺ헟$|6hͽ??25Crfh+zrVT4f9V7Cw=s@kmhEpa}~:fyi\g l04*Nב=YL#4=Bގ5X m$NViЎ~ژ۾l:Q6QMmm=KDgSώ/o[S)B>nuA^7V˸hڝqQ|(Ң_C.[YCJ,~$6؅'ث2u'm%Io-{Jڕ+Y%a]%Y- d$vm `c#!20Ն8pIvhv)u.NtL'Ë[?t@;h#Z1^a9i A ‘IJ---R  k5*_v0HdDlF ʏ}~ze?ԓ _R4OɼxSitg2福8&ܑH$Q:)3(I=# s=wC‰S‚,wLDr>I'va)< lѻ}=,uuܾM~hb,:SܥGCO4~ 8WG}w 0ypql!HG:ZVό ;:F8| rdy#_a ?ѿy%)A^JEp\ZjZ*UpjƊmhJ8IEV0T< A>2%j( u!,"sGWf*kBr!߳3d;'W>;+Rl:>M;qE.UɦqOm紅DA]-/6ڃU/:1F˭7&ָ>Z%C!t;EKWCǷgfqkrQ`Oel:b'E{/HRV#ixIʅiMrz)00E9= 9KvA:~(P$m M=}Jd4D-6c N-ɞ(Ue[<.]]7 9G!{Laq7 JJ+r֜)ݖo붡j'=p94"Df#mAKfE7}mC1N7VuR3/`iAzBj=.H"W@؛"i5$bgly9 xyLt|V&U%0F;Հ׆uBK"6z#>N3$EmZO4Xm&7tA] iAjpcNpxh5+H,lØb~lCjޑw]ywޓ}y1x;89ǂs:EXr.C%3GCvUsJΞS`r3ʹs7#KYzqq.%?uwCKyׂ{[ߟgeʼ{睬hvMJ֞U3ʺ7l̥ͷ] bz.C+J1<88Nӏ SggSLQS_Moi `^{\OYRgu~QV]Azoޗ>0ҍGZךkib:sd(>=Sq,ơWWMШNjZȯ(~h C+J@CA>n9hy#TVWXX`.{G{5c*xE7H"|\XkX$6cm&PqÆ&ְ PC6Q #=RhfXq@`u <eÊ>M%:3kވlADs2ق<\ ZMƷ(xsEyrBzӬ*ٷ%*f€,ïH"w@/NR]Vصr o Lxţ MC`\Ѥ*z 4ٿ㪳I 5wx]W}-ET7<$%{,?Vf@|l x#[WG?O; fTĩͿ+D ٬v R:!}R e0zS%[~d,TJo-F>"djێ""IQ+Q"! (`)BLƋmSJi=} ] vwTΖ)@Xt^gplDy&ͨ=QX"oC!B—؞MLN)hK[ 2(9 4(bQS(姐pعjX_R(3P?O'=/D$X":X]Nh7!Ud&vT 7V"1V814dԕ` K-|b"$ںF!,ZL/L WE@bdl ̰0Z==z@(u{& Nu ΒhT)\t= lucVỏ5`{~a5G* xp 3DͰ7kf3ӝgP%wcldbxW+(=aC'jIx_ (?EAEtv@}uzAՠ?Gw,ڽ' Ӆwz6WU R>$gI-w) {{{ƍ,Ͽ]}zFs/|r7lr=uwXYw}ʇjo>- QY$d8Y$+()$r)"UXrc 2>nJMMHE4ٺją#Ü[Z}uz-=Ի>]OC&ҟv|bApdwq?n̴ aMð>]Fwxk/5*.h Tt10]+DE(TPxW*{c۸b8~ŏscypcn&!N9-S6Ͷn디hCvB-40l<""  ?BQM ]wdgJ]9z&5hSP+Bnj/thl ESENdr)AЎɨ@I^;>{r-/㰵Rs9v:iISYJEvWO=cǻ;P`1ʧo3G϶@Zpĭ}Šl6#u&pO/'p+`6ſyRYnLRL8M)(0iȼ@OM^z砢3EF#GH+KRDLeԓ3d)rm9bm5E+"Qlp8C{yW&$yF^[R|<.tłxC$f;"~L<'n7M$J".QaI]_`߯n*0EZyrO/Ttt*pW Ghk mjw^?P|_5(^_yEPzJtؒV֙w^Sj3 ia[宺m@6D멹#c#a{+tu hv:roݺt#\#!fb18#2@ű46.I]ZR_ åU Wf c:C+D1^U6Scki76ka4I7&tG7ҦDI6';uT{1#!PylAS@"wͽ^ BNl|rکYyfSrڜBh)XtVbfГϷ'rL^Xz$,w$`5cΠfF. ?6?H:6ylhϢZqx*'..l|^sP$t7L_a`vc8 U_"f1{i}ݎߴ?ۆ>߆m뺚]Pfwj5Cתj!&1˵8[7>/{3HiqC\Mdz;Cީ5\?10ޖ]S",VÚgYp406M:b!ȕƊs3&IϰrL9+eSRE)@O!x8Kb %}a!Mմ"%]i8ʁbm6p1Nk*PգU ymÇ):Bf܉4cRߪR(z}[ ԰ Tѩ:HΣB0=\֠ ꢥEK$v!! h-j8\HŰ3 gLeH)V c![85fY# LcUoLks26&X]W*m)#o'ل?z}A$_׌75˝If,zp 5jm1 Y{c٩QR}DsXt8cǘw7 0zfp&unw9,rw5,i:IG 0\o`ºpSeᑀ hH>vTfoEz=4;{f= sQ o(f Ҥ:žVʂi4'qF}\h>e?~h8?}d%{2 IT|w uw&G\ G6 jFKy[qls%y՚ =A0ӟ;^]+3e9sH3s9X3]<=V} @JT_v#0kg mBD!i?)0$7 u~B[<Ϋ3m#'\n}[k/p 1Y~TcjP`&-Ʃ@Ҫ֍Q dKz!S6-XTt,0zg15|p0zl9s-X_g@0A۴`G< f#I.6;ܫ|>7cƄw%qlB.!RX֌i&ڴjkS)I٪)HͪVS5iR1R%IOEH!G|MO\d'U8̛u[FGy_oGb*v Uޜ8sɇ`f^F@tBV|q=&ñ#i}{TՕ_xaj-_6=aLPgԚzM%@ AaL%Q+WzLh-c,`~R 9[|G 2bE`6 -&?y|kA)?:Opןh-@|뽢X!ȰS3Ge}S@!>4&5wMg -h*ИOr3qR h6,PUd- :# AGcww_䔼uP]쬲y%خh:2>25tכ|K,1g%ʑN";wPX2c_`%*.݆4DP[K 0埂S ?b v|] P@t6wT?+Hh 3ɔ=a,ڙӕbsi gDP;zF@NQ5@D2B/^tE Eo։â(Ku ޲W^M$Hs+0l`!I׀?QۺH/b!XwljΙ l4 i,(b̑Z3ᤉ$I np4*7wpW.|71h`-N{FAbfQ!{m4nQyK(f|><&"`WSLQD9Η-v-XD)YlnI +]STڴ֑1klfqQr Ɩ딌T޴$74F3ipK pk33=MGVͮĭDgPd˗y#o$jsll4qH.?*G8~S?k?k[c-zm!kryR"b U{ Z>]P( ,_)ԝF_꧹n W& 6ż5$ie^Ï\Q6 փͱr= '+Ut./.㪷1PbI.l윟?XdERX+rШ{ſ 2ZՀP uknҧHJ_nn,ڬpJ냊A c-t*V]'} |xڦ];-]0vRUExqt,%X2ww~.ДUAR}9z2:J\ѝ-9->w061"%?a`aWO) .\Jh3ѐ4'Ca@'F*=4c- fGx&8)_lڜp? y@Dg3d<9"o EWvpy"sךζ% MD ͊d G#݆O $cE&0- Ž.}drYxp¡1d'jzJ0vT^֩(I6V;@6g)cr-S Ufڷ .LhJ@RAKfO IcC,C֬Ag4T Pt\N'4-uη"gh4i,8H™J[VH {fgs!l03) _n.p;fqȈ;ljc'ql/Mb'qju27!ɒUɖePZDDlllI :YAC*L M LBDT$PRMH㋜;K}0Fjt'7܀DK1ӳ Ev.3pk;Ͽ얪.tW)ٸk--D"!V.f/ ȴ-SaamO3n&[<( ݧ 婋MymZ6ڛe['`gx&c}B.gOd|u *֜N14>'s'r /F)Lۙl!/yjdg|:Cnz'_+ޓD0)4/_?" '&M"~$u$ HGN&]XeaJ"JT&kv./0aYl5T+aS?Uz`gTEF YRXjiN fNԆ>&_Dvm;Uk TCΧiፙLAVNfΤMvb th:\6ڟm+K AFWu'TKw3_3xe!|z |cWo]gE?<8JROwJj̭G[fF޴e 1'yB`3&9&1AqtukbҗfHGܦK@N)TIe֑*%8ȶlP6Z1D. 9>Kyo^Y bnʃRbf_0A^O&+P*_s_{QseL5$#Y)CӲXqJFa&{z I< 70+dRLO, #lʃc#'V֦-R]w$vঃMedQEq] f5;W 1MKFa ;^w'i;:>sso/bn䖥A 8D+Z4ZyVK5ZmVPSۚ~ s#wejptr_ƌoy2N 1=6=FGao_ cv"8Une\D1q͒-)qGtR n = n 2I%?ȔXfԴX˖R>L]Bz ď˺xwg4Ɋuvlrf+4 2$kAmVc罊ug3ZScQ bYNGp+Л Ġ'"TU&uELy#"XY]q,L$\YT;;tأ[#dN[V@cZ]F V)T<@ܞ&,HԮ#:JJ[8o pz=qY]rpK`<1ש)9҂H;\<8dVc  Pz13qŃ0%C.[W&{N㔫=2-/NN.sD.WQt<~8 8cX$Zюfg4o{ K=KAz!FZ\D[:}zcfpftg e}ي|jY=ӁlY/==,/*k&qH:-YU¦,VDHb*FWhjWLU;Gr|)S6(Z0 (U 9n08w/|c4*d-IN~|7$9X:~'HH F=GKN{IIjgjImB(Zd{;`dH+YX ŵAO$676JF~Q$ֶ_n^' ҥL~ +JTߓ*Ҁ&Fi_&R%KaF8/\ m`1 X:"^nI>-Ѭ)}AOSF?k~mR[V5c@5x Zgek!4kO/]II0N_%,KWX镘SU #W-f]nc'E/@eSHFHFP?PᮀXJ #Asm58bь3chb`K*j"C10 H@Z F BhA2dWR_<eqi D{i#N׾#[u`sQN\÷kƇ ݷc }}-ߟ}Af|wl\h~h65r44}>G[d5=D#) v67 -zA۝Զ"G+K-uW ey~ViYEmzzVW KA$i cz{.NQkI*-bg֕n@Άk USI~[ Y(ၳzWNm {2hWwȲ)xίYp\ yKS`G'%ZG~ea8Yi69hV]nǽ(f)d Y 0"ޟ:f&NQ}xơXjw*z)(VIg +FQ -e~ԝVV{:z`G !WG.~y0i0MddtP8;sد6#KW._aܤIt]>I%yjW2W3t擗7wD_'DJ IT5+9Ms<[9[r87u@ꟜYwN bnSRYW:pxM׿Ar%$fD_"5F٣4ו@z!7EۊO!G(rT탟VӢtE6X_{ d)Ru(^K0:w%7_3:;N> 4>2X>oI<;s>Vpsh˃.{;{Xy#nA#M9]{.yvh5;pP>Y] tuTMɩ 3&`"+;+˫!gbbhh=f=V:gSACl(sCgק^6gr@2'AeGMAgw z88=e8Ujt4t4D> A-bhmUXa nr`QQ*fAVmjYTn9 ;֨e)JvcLit>?ȱ svY`<;z}q{Pb(k=qҔŶū͑ԏ݃VGOD=C ٬:>(N#RvXS`ԴJ),|kan^ Z3ԜV:rYV \snozAtBΐ(  NCDoRG~}oX6` =xKyojuY?s;ύFݚԻٷ/pN?6|m^Lp8]TQ;;_Phn-fLia[pwWR; +ܱ @Bh"*,@ Ŀ£#Gp!/a;{} ݻ.v]aheIH}sד6"{v*}D:8tONStvF>w~f|zI  $B1L@JP5xYrloi+'=9V_n{,10OǹЖڲ ?e忷e Ta|ymPL-`b m?l*2r[Jz!/s͜XKKŦV͵ZA:V.sZ@o0 JC岤h7zQ;GsJTjH9Y +tXVrkB]*5:T fR#_ZlFtz,5ۙZuypq DChy&BEVVk%*TMa cD"UQjG2^ C[:/'}fT媲=gy\+JKƺҟQsEѻuUx+i)>Q&a$+]Rfm*m] 'Fj !&+iUɟD}2,qH0JePX~nA~jd-BA[юז2\Bo"O5y[vFs + VC endstream endobj 421 0 obj<> endobj 422 0 obj<> endobj 423 0 obj<>stream HW TWy ֵxRBAp,$HU0Ѽ EEji*>؞KQ*Zun>-ATA[wsvϞ9Xpd-:>&G~z?tzS ??^|#z3aCpZr:IBZ,6#stDBf(, ̓Vz&ɝp*,vS(vhCVLGC V$[1$SB9(`D1#|\=O%:TlK ΰyzes1bioj]c0P؂+~%k\iXV!+(}"drAzIj\9)!3)@ qI"ca}Z`u\%`Qp$< ׽ 2CLиX`ϸL5 qҨh98eP+ee2GHʆ(9]ۖq$:lɻorǀֿqҟ[a~ȵY>wʺ%kJ5;U6)oɩSGxb\>}՛ A+7O]6~C.qT/]WKZZ\>"x>I+MK;{LbQyhg^ygqǠ J?x%@rcul⯯Vnj1&%.]w|+YY)kÙ [f$wY)hG+~J~qn H7ÇLZ's,fuxG͎5q.{?>MĔwղ_ƦfM-܀.m)iKS`i4a)wD`. hxr,6ۧ(6wG@[MC=ן1wƤ"vpHj9tI|̄ yOIb$1*Z'XIHS^BI2dFlH,TdhvCEPCHL]KtL-JF%$Pa1P049Co`ATy0|;S+a.L4PfthMyMCd[li6p+GyKQዧHvX뛲~k\-x`kA!*Id.[=#GʚnFHK?.Q}o t>Y=Q.?CKĵe^эowsyGtij֤UJtw-}(޴@[aŷoΘ˳o-U:1ԋ?5׸?gZ]ia*6Ox *PxY֝EL95mD7t׻xa.ٞyUec2\.ͫ*-+WLm^˨Ar dpY'|} Jmp"0 Fa4##X+squf&I9@90LsjD$l&B lḨ$MH@&v1K3ypL4Qk +a$ThR @*Pi1- -xVFX(B'(< S{*Qh!RmғDm!bZ99df4..w-a!PO&%PJ0QU:\ɸV&ӕPJׇtaApUj<ԍSLS+q N ip.-LTN͘J Xq fh P"; ]!L\=,}º " AD,] "J_q-jbA&J F|ZiPmTjw!׿oޙ3gΜs朙X]$J-CB#T!tVED)j~*pBX*F!HJ@PeT`0t BÄA#@U@VzĆT|XxgJI*8!0ICɢ>1)iޔ:R1g$y8 R B4gtҴTY!$OeДҧJa  Na僓dN"[ wvʠXNsrDf g Y WHtch3 |=BE+?Jn-{YMA;V5/gmS%L|9kÏf3 lE3$/}GNXy],|йl訮sM>tG?k;}dRԕY;>,^R!g_]88tيoAK0A6zK|BC1سvd'r[&eC᷋mGTZsؿ'i4hKsnYWuj;NZ;U UGH=1*cY[֗)D` - ae-Z> Մ HV\:n#El4%}dv#3d3ENGnRs2QX ,FuD{aԌN kX|L q!.T A%ގq3ww` Y`I5!g9=M̩%ʡvSy:wk flY;6̹L}H(TKV2T.atЎ v^Y"`&V  /9xE=[:U| %,q  jK2Vl'!" ro`eKS(%Q+5AJuþYsh?:N]IPü HgBtWlّ,v-[6]KΞs\RNΩ,.000K<>$CޣݧH;9 )k#\yiv:{t,FKYpQΡ~*@<|Pnƍe'q>630̅H?Fa\2 u !3Tcv[AEL!;8i>D>Y" ;=m\6E9yD n︺8ǽ=vhQv#mGXeei!17X y*]4]c]k"4FHAyƿ8M؆f{yJW•o #]pb;Tlb :0W:+x#JcP޿X/6*߻]K[ud;XdNlEa|R!WF)-̓)d %Vv3}`ڤi+t)t0SL'JiۜW6v(sޏsW\"3MƸ6Qh6,>` F mD CXwb|J;J %kp|RАӪz׻&'tМ\l/YDkRƏ4v2M:i5A<dBXRGD 9w$*ZKMSECFΈhhanLotKN,f1:[D'eIJw7Mwd7T+!' ,mU6Nxû#b ik^{7)BF֧CGz*kIHKC?\Q*ϕh -hµ~oZc2$ru3b6&⟠0~ }q`_'jC Zi8vӱTD-ˠ0?kw xz- rG 9z;8 uNߑ3p,/9Ǒz7r]>m dmhRBSQ39TKbtX.1T^2KT^<\2Be(>*DT8*, w;׀p\ǁIkWHGT^,*MEbPA(o_ׁ_??^+E)`j8P[Q[ѕ/G#B9!=!^?,Dž?*i!&QwSbh-Y4ȋȈG6$pR:j ާ֪(y$Ժ~("OuC2xyWYidQJz 5.$=$4L ]5'tRETq)zO\cdj~E^S\k|Mu%lY஁JK>1oxs Z +cȜu2g5KV9o0|t_٤F<55M62a ~4z侺D'eQG6ac>=S'5,3zV$Q$M~ԯͪ)BV3 ];v;QM 8v0Ciix@^x^Ux[!鈷h93H&!, Yܼk!n>6vR?fkKoo.~ ~=jiX#Hmh$Gn:޿+9{dO\o~}/o UT%ul݂Zlc6Qߜ媭P7[Z+Z3m3.4 LES[!$Q#;MOayng%uɳI`U *J :UU4yBd$J&ڃ@f`"cO>sٱvmf,0qv_MQfm*(%sB](्PSB(’ln3agӐG/A xP< ޕ4J/L:lџFol}Τd-Z.CLf;bDO vkoQRi5jqttae/KO J7:}("}/ 3-c{ : /7NR=,0NQ,9xkBv"zĒH'w̡919|[]+^[Fee6TF0b /\=-Y.!+[$!K @dRN5ت$^'©>%㞃kw;f0ⴍ>"*֙¬7]۪q|'v/XYF&:} a4ǡw-Du X ZB]*Iok(s[_.%lh/&Mk>$U3! endstream endobj 424 0 obj<> endobj 425 0 obj<>stream HV TSWY!IٚJRBx  5q$/A{ D j"( ǥLOqFqHm.-sΜ3̜9wyȊj"1hX6LV.2 ܞ>sw`(Ln+˱Zn6 !`嚋rZW1xw#gF&/҈Ѯ@aF 5R)O6 8hT$gYvElVBiy#76zҍ,\G~ᛰ[t~z@O9E,./|\=7 )ƜLCꎽu09eq!\dӰTLƧR̀_|Fqfxi%uNw0'ALuŠmڌŘ3 6TF:{Jg2IkʵB#`2AӤ1o ?jHXp!``B@-[&k.i6%dQj5wRRqb8 _ɥ2l$~¥P38UŽYVNImLqg'wF^/絝]Ãw{/kՏyuuȤ?nκygezS=y7hkZvo+̧-fؙ"Ok4'v+[Ɗ~-Mmn< =լXd~$XW8cN^+}T|fswSQgiL^y'Էym,޻_DƊizK8_;B圍3yT Je*Osc|Y[ڋlY/ Vnj,-0u؝QCw$|ߣ̹mՁDYE$;4Tʓ[ƇxaE誱RJPXY/J ea][V'T_hb/WsڟT,?vNݶn<1S  [Cy 6!#O)iץtv :dOiGWms&|jF%kK6e6',:}gbd~-YVnS}o=b>4Myrא~}iwժ"8_u6^` zTcގ DZ wZ `=JK:g?X, ~xHtҕPlkDG=`2=rjsvtanki&gDJ_pLڟgY,`Pkˡ qSfi$$T)Jr!İg%IpB9IH㱸E1D %% M`il0UK91]גD]]ˑ1~?8SBjʌ$ 0dpHDaGn6ef2BfV*ļhUȟFz*CFd[ll/CkX"*s.xEN@zW'ޔuO,[p^ m,i佚;k{Z>JooZ ({m6ߒ:c߮V:N~׏}׺?g:ܙU6Lx)`xx@RΨK5S}`I=5z'+9חl&0fzRlvgq7'T?:jI\g/4lF_̈́``$$)@d~*a eCH IC&37L^6pSQW4f 7"/ )r8O/T erE8J#&@$[ Q(F),"U"a5R*/Pi64A?"d"[U4R̟LKS&4j-hUJM:*㞛É$ >N$'DA85LתaJ|eZᓔ(c$0$Oge;0 hH^V6UD"ʠze$$MK&8u%tX#[+=-ʦor åh-t Kҭ]sH(_s\ CiBg[?iVNME=:|z]nۼacWbQ~|g> Vd=W}./Y{ecA_iЗr\lZDa"Q@~cd+Hz wd.'{H"4B+AYtACpS!&S)Ro_+c/SV4#8!GX|vGC{ߍ 1EW#g`{2֚9L:0el&(\\ied'1{U][ rW*nv !8{xb||P+9~Qt&Ltx[aln.+?:%/7U/ka#6-"r.]!ʄ-e01tq6Q~##cl/>ߗ+ή?U֤UՉUko(:U͎KsW2'겦NqE` {<:C莕8\7k}F$| Ie!CbJhNaCSǠPvKn򛻗6ڣ-1oH.z=g=z1dW:#GIxaM統e__^v@}hSFgߎ| >t6߁_(cJ?:UD`#Z#BIoo/VC"s>FV} PF  &u߳\97koE2{'~C(iӳ7ʤ{v#WkS-,)~:b`2/鿑Ƞ!J^P@,ߠ!Ɓ$A-0{0eT=FY̛l?10j<},->TzLDzBGj.Ն3P 4Æ 4Rob>( +XoƙZ 0K4́#P${HE}j)ÉI)Pa$Sp c'.8Ox9E #zC(K[xO msaV; xQ|'A LT\Di|yiM[Xy|B1ҁf. sȢRX `#P{Nܣq^B))b"xbfd~v]x V =J;?_G.Js47C Év151D<")vir:|L>o"kV NK8G '4sp ~Fx@;z|PBL,,\p;cx%nm|M̺0֓Л0}ưpgQ,e\5  AYf 4\v)ݭ]_kͧo>˗_jR iRܹSR,}BEƒFfiN$$:L=ʂlR+ʷl |FX[PAJ*!m@=܅i,Qd9vCg BPa18'8g'<,ŸW* ܏(SxtX ؈O5YFpglਪ3sb@0\Z$$6JnN Zai8 e)upPYˆ}gMbn~ΉL 9SΖj5I>#; ߖgDIO/JjQK1IFQo,7^3N2a|ϘW۞blOGyy6h? 4ޔO"E9EDY/5)ˣs 6M%0Uꔧ?^ک'D NTULJ;mnO#}Vn'G*e(\STL$l.K XVDwS;ڡik8k#LD-Q&j‰Xq yВ<~<#{1 -Id -tXƩx x~7&;NKߐMسR'zB&Q @%oX q) 1HPY4 zHQwRG/~^^׫'tttXd_ W>zHunzJ1}ImXtgv~&=2HMu#:Pdk1?|ZŠ9#]K,KKW> |!Aylvkϓ6;^щW  Џlq/^I* /) ePg_ea`/pPݧ+hYPȥ M, 'l_쬃IUgi;#')te93g_Yb9yo/r|r~"amfdM99eV64d"/ĵ@#uuA妢 _Ϲy1~mg'_-e9e)j wDߠ*o/ŵ#lld(צ892ŸU<\h<&C~Is}a{xF06C\sSn$Wsӷ]kLcܦ3.D͡q 5%i K+81MtR6u"v.nv5W$KO|O{dM/@-yxǘ?R^F>Vr#grOM{S se/޻}pa6Q1Cڋ8VC~™<:2g0&C02Sk^ ܟڟ8'~Tnpo4q}0w}_龟@~dx݄E i:MϫQSb^*G]Es8/g |V#!:i<pڳ1=fcDG=1BtsF:w2e&iej~5r,<=>'mB%3ػ_=)1]Oi~lq^=@QW{rwBX r9!S"z5V&jQX%$:5uX XǧubfI'δMb2ۃiڛ{{{~vw\{>\G KDxM DQJP\ӈ~}J~2y{ bvQ4JP*P c.ۂe\{A;j-v+.DVUr@63XV M0k,txPJx®,"УZ7iakT[Q߄"Vڃ [o[WJ\(sм D$3$>pnIdv3 6Z+<'x!=|i 3ڸ}o_A5"-6"tIP3)-:\C"Vz_TTޥ H HO%+W~Ծ8redD%>gt- 8Jt- ~kCl^&/ ihݫ !,׵Do||#P_ʾ# k:ż ~ݩ=G;W"n_8Q@Fϭ[7#K.f k/lunR]VhbM" g/N۝1@f۔cD4'Mv/SS.;omOCڶ)5Nooo'aZ)BQ®ܺr,9u7Es^ZGVM4')PSIXosfI'@ID)%i?W[pVWݭ"x2d#ۑN __&/F & LFR[8s,%wXNJRY9Lhd:DhRn y$7M܉u,s\Xzė4 >SH؈%B"~I=*іja(| cbyO),%(_X6H)y!sd)eřV.N|4͖>icWcX,38v&㘁[Mvyי`r:i2@<, 8ojqReij|ğHx%d{P,,+|AL%5,8+YQ~Zvެ9؇n{Q fNٜ%fz} 'j#ae%jpLw$QXo6>{{}v-x1Ml6 +/#t@Vge0zM!jIn21m‡JS2&U"%dε:=>=<ϑw^l}(Ҍ+]Nώh{c[`|#{JrĻzΪHX= 5KqǸ.8ֈ+X{OCɩ >-<}Ht~*oO'% tT~?'^<q%&=̲qln&&nM޺x__ ΋> Q2c.b<ǬKk;ITٺ;Iz=o%=.~@u`98@!;i"Ҋ[)[(#%&̴id4墽H(Lkr4EkɈF^r IVd-(1V>80iEն^kE7Ƨzu`\ c]KM#aICb^;Vvz4Zg}#g#x-z&g9+ uFW>:jmz,nm@Z͢lBv/VۃA}cYɝV͊FjPk SNC4!N+!A% F '=@q^nR>MzgS{>SS=#!_oS?& _?UKBV7 ⓑD~1YBW`4G\`#Aʵ+,2+p5х>)c'ʰxm>U0ŲOF\U)5f燐l@HVh xUcYRkbߺ1m OKEMlTq0_Na0V]PN]^gy*ij e(ƚ)B*1.ZtYiBĨJ5vz,Xk0w[6Nn h̉;:kTM{3( ^A/ 6X=<#E6iKACr;.] 6V tkX|jVVLz eCAn$Hcbx}?pE6Ф)Nj%ot_g`g)^:,v~߸ʉ@M0&iچuI4Sf!-զ& ֖hU{` br?iQMtЋCSdgIM=x&4+ uZV'D0MIJ[/'xc֝mɾ;/mmtXGs,/)'ǙSSdҒUasފ]¨*-o ZS #S=!"oeg3 )($pVU@Ry9(@(Mk{&g Tt>&0 Jn\eeyq?Ͻw}>%_;8v\l. 4ā4«xkDf ]ڮU[Muj5!mcѽhݺ?кP%T+aϝt9|>:q")ÌM |>x;prHF,:͝֐tqZYR SBLA< R2l7cq Ymtl)ȑ>gvO*fM~|ΏbC@e3jvvl5n~ddd+\Vj7#ܢ@LEH`쟙:x2-~S6͐ xkGWn򇒉$ab_$-0\38z"`bDaL+ laS\z+ W )|ZJe!lS2#$sRz]-g?._LЇq4\,KxޚoZ5ukJc_MJH/KoJOHQrH-CRW+%~Df7/Ay&U; ju!<j_$^7{.Gv܂_Y1qfmu@֕|R# Ը޽deݬt2:J@ i2auZV \C !*(+AN?ԎiR 0*пw?Oo(+n@l`rQnپze6kV< 2ipy~]6y%F@qxcؿ/Pz<'2q#$'C. o[NsǻVI c瑎IHX8/~/` rC0q) 0A?L/$D Dau<ݍNpeB.a1G}w{iHҧgYux8oѕ21vƍ6sMZ%lK fh422|SStq"vօgQ ^RG l᭟Ltί&UY IG=a5CjU=UϫPT9U-0] LLku<'+E4vuV jk;ZKZOdrVtiH衳ng_CurWl(%Mwlk\1bÀg$ۑ>j[ϧ4u)3##alwWHbqc:o\>|E,OB$edp}_@Vp0RղާwWy˿fHH o"'ڞ=LKKQP HG*l'k5%x#tfmxxc33Xl\Y12yU@KէkftkR؅2uO.?œ aܚ$h $] 3ظdE乜޹);@7T.Ӗ#MB7 㦸,G^Z{<|@vۿ[o0DZ9U abMR<-No:8v}(Y0 V6SN®?~2f2-Pm[#b60̟)$R%J6-J%eˇآOJm!NRUf';'2k,h%M^ Xs!C%V`m6`v(vX`[QON ğ"@ 7:62 Nyy3ƒGe@3ՉFa!- rϧZjY[y#Б#g,.OKAC;U[TR ZEZ]G~Rueo6PلDAy.a%YAI$Ⓒ(ɋKƠ1X.\&{C7qr șV1GVE fxE^g{ih~E'WxFr@08zÃegItӌ( ×Ԁ tql{ Ey(5 4e3INg u e;f<0<Ӓ#7/8@Sw~,e$ps\ j{f{GTӺXfEhI`m6%@ «o\]\60;b )!'i|9qޗ<8`JʑrcC`fx|6G;tq t06K4#Qn6M枞m?':#y}d$k*)L֧isEvWKi!P3 tg{J+-[nK>2E9SvJi jiߝ9/]&Q&p1.1SnӤr -z$~E+nylL89|#gwVjbt>H=0;KDPwa7C3U#hoϣ1Dξu" D}u|g'V8( ƃ9d1 sk+ۯQT/Da>:4sgFɪ;z굫9NrTj Z33+[ooaA)#0Hx٧4_- HRi@y'<0Ia~G'tݔ+'56÷[V sf'Mjjʌnl}^ J<)VpBF 28 q?ViPANI`Y0E3i4tP8cwQoxXizẉ5Cա$F U &V\+$BXrBG蛽 ]0D/TGok;pF;?gw_[??ޟ z ӡCbi3Ne 2qSw4̣,K 1깤DIwa*Lkn}qh&u0HfC͍sF97͊~MB){q0%$Ny {5Q(i"-FZ"w 2\P{su$uÞHw3X2Oѥ3}զR(Pƻ :?|(UZ_}cclW]#=?}}}+>۱cbǯ\KqNRBVHl<ڕB iLMvtm3h5ѲM{=&**M*" mZ&9I[\bnw}ӛ c]+Gtm4wy0 ܯBXkbPP%[JwZjrޕ?MpN-v*#ڽ)璏)ϣt d.=Wܕ >w߮v,v8rxUovLzAoMI2XFH!1r l_ll^Bqt4zp~י\lbB"-bzavGzvw0c{M<3Y/C2J %pU*‘_^G'96c۝p8u'2/dr+F_dU8Ʋ"8-L֓Qrf܎-Ʊ34<㴺$z<#)g$i^ TZIK%Q(4n!8ZlЌ6Us~݌01f9 ~*ytaQi5CQDtDxgXȒ .F'"5qÕ1R5m@uǔ*X M`ùhgd{օhIf5vK'ݧfT\2[p =?|k4?1>Wl3muܱEVndEXsQH`ZFM#FDD.K" h+ES6YMg6>j!G0K.Ȫ6},Ŕ^>ۄ %4'YKR Na{t3X@ZcccD@x<5FIm6ڜ`t]`%]_wUg:rg׃fF禨o"hv2VO"18`*qGh(փIB^اd͋^=1q^Gi9_oQ<'ɺl>Y|E`\AJSULr?Ũ-|~OK i1;˅ti%-8٤#gTo\'2N TeM2iNm"(9I,R[JT߂_)Lx ˺Mgv8WO1 S'l/ontS[ g.p|hСʡC_XP<+RٝÕԎR]nMdw37c՞'=I6%$;1$Y@` M.e/![V+5ےR.*TՊU+Ѡ->ۤ K,>V-d\';g Y Ӆ+0 sŇZ :U6j[_z,WnHLeXYV̰M.cuY `QBk\uW-3A2&(0Hfb=^/z;Q]g7|jd̜bE3]SҠ~n$??= `+Z(JSཧ|Eм=U+, v2isFcVS0YK߮*ć IO}q<)QJ]K.t.7A&;"\al|>̹820F*@L,SJ;jҋ\F^"8L"(L W ^Փ+Lv%5I%Y8Z];O/Iv2< ٦`TX!&A 衷IXPW?/mig]/#?W%*xܱBP\8⏦ .-d 9RSClivFv{GP(oODzzFQ޺sU}⽚xy>AfΘPrmxhT'C]wDn _UvP3C)`Joqe=}=*>V_phI'H<צDz|ث^je:xhcP}|$Q. K _jv _#Ц˧R}GVDߦGc̽!Z-NċDFf[ȣ\Z-4qLҕ ˹xkqwL}]QɾuTW,Se Y]Hг40]xC/g)hop0 ]AFQ'%cPܥɈ8$ kBܴݜ%[0WU${]=b"fK$b A\&0k>}v;\l9oMw4:֑uU_7ZMu]@QQb mח- Z4iQ1D (I&P))ϝ2|=>c˿]vmUl}e]#!<D{H϶DWAf8GnD*5; -·%#0fw{9ܓgT=LH^{j5{5lmwx-mC_H *!f$RgꡗCDɄf"BΨ^+-X4-[C&{$$i+VEͰ,Np1AvўEʂ[lfk;Y&l':H$]ic^1fᕶzm |4IP1Q"l&w@m}>9+p3=0U}axd܎cMrSڑK}@t$rջ #@FPh"}/"h*`өN[LW+glE#79fe`"\ŗ "fɀt=P1UUrOyt-rNUw4䗻]^P%e=N^khQ+Q#wCa%wɎMDOthaI!tvkۣT_ l@v)pIdKuo?a%笢ޒPdrR!18@CNf4<9 I'`~HG; pE نNͧ6C`vڧʦptPx= vXRJ6+aR ۝f}\q{m0EO $!AB)C\÷o)HEȬmT8*v'6EV|lHe_ YY*Gw[D.HM}$¬ٮTYT_:. f=㛬i\p]ȦaF>tu&RJaSSJ<,2x\vAMe=<5EY^$-V9w:ɯc_}A<% j(3sFǿS%9!<,g_(a7850:x0 vvv;"EB) RPl.^z \ze)HaJHW K["X"U8EU0EYQӛɚ)uVbw;Qm^j x~RFrЍ;6 OdK._ZM'HExrsDCp&G?V^I|yTD5&{3Q6;JWZy6t+[ۣ˝ԇiX:j0#k:Y`URoTM>Ν./H燗Oג="R*hķc*ݼe"[a"O$B+Fl=Yb~RUҤYяT+jދtE*.*!6YP064Z-q@ -U6PNK7zqYm亢Ɛ/ Cw w (FAl׵o7 Ylz}'ű}#s4OC:E2>x3hPsG'])M̽=0&4:,Icqitsb1ŽG;-zmMvvAobv|yʁOMlC6O}Q9@h<>vpTև_MG,OU] '6 C6CQ̌ZCuf)* Ft jv [h5Fͭ@~ إ!Kv)@!E<Т7vFiϗW/|n 9`rԺ;泇,Cjh'#tXљMS^p7o$YR1>؊E,˂5#ck.k(X %^l3$qU~xeR}N;i;!JG[9Xй%׳-^e=x6 .bOhƬꢢ1uˌÏ^q̀:5V㏺5S<&F2{*%+(5Qw1,Kͥǽ٠Z rRԕZDhuZ5DUȤ(*.|oƄ^ۍY5m3&6ݧx6D/M hQD93u-k3JlZ;}}҂?lûᒑLM \UtXXz='XWτ%4wQUUIRvip $4|y=NyyF}rRXMI0MTk fL2/iޑ_cFplt4}*Cŗ#ǝL-&Zow >Ko$EI* /[ ~q̽ⓟ4 N>йʅľo  |@'P}:/6fC%NmM/[ XQf),+k:;=uӫ5jnsƬ]et\ans+ZuMŬ˚B&[e'F5q+cLGtB<h1ruIQ2:~Eg[bWwaWՉSX4?BؠUQkB"W4m{g:䲑V&¨*p0Ż}lDup+ k%մ<]`pUlJŦXln_)4QDt`!bl0F r9- ǠaZt0xO#F^;|a}.rN[O<^?|}8o$7~>x`D¼ W*%*MmPN hڠ[yGYq͹ØB{ntW){1+e||z[%ɢW"כ 4QΒ C7O7@x>f?o!pAH'Cнh҃lp[lbcrԩ syB_x'jPhjM_h@0 6zkt!ezyip8>=S,̟))y#z4UA;tAqV`߽ jz "iݿ}+xaJ{@0B; 15@KhF^fg̀C#"вFf%-FzXHo dq\"NL̦Vinn>CSJϮұl I]0XOG:IKtb->7쏥cKU­ɤcR,HR?d?:z.?f㓒tGw8ѳOoAІ[YGw@-.-ګ|=M\Fw_5j҆ endstream endobj 426 0 obj<>/FontDescriptor 422 0 R/DW 1000>> endobj 427 0 obj<> endobj 428 0 obj<> endobj 429 0 obj<> endobj 430 0 obj<> endobj 431 0 obj<>stream HVyTG9 z8dLfF93xdJ@'s 3n@W43 bF]1-*.u#++OLjX '씍^,7yhoG@EA?diB6"݄/A υ iib^x'x8~W3K$Ie1qfCS eAJwf+4H\sn:'X()LΩš;ƞ*qӜ8wYs{chZڪP\9-;r;ͫ.VL0!'Wc̓d^zZ۱5nIUz$)^l?acWlq;$/e:zuqϹQL'SRGt"q9xYc6Qm܀&Ӡ)'{lx"K{Vy 8g LFF9{!abB'㡲=*3H׫ԧMSF6 "M6׫گn*ʜy Li'~WwUѵ]d Be\K !!N}ӰNa0pE<}S٠@7b#G"\빠ewEr_[~wdqMoY5̾Vb[D]Ât&y|oX(+R>r~˻LסB6(O>EwoTiܜk>kl i2GHxա׻'\;tAޢy>_M@@%a<`xw Sz$hBG 굄JqGDup)+ON+IG/ sd @$+Bws^:p`w ~^8:n>/e/˹(W%#_˭^}!l/.v6n)uiGaoJvM~紹[nֹi˝yʻ\?:ZgP8DFrZ/v)R`PFQF Vk&աVz.\6 jԮ'CF" hi@*bɳBqT{XM ͉H"#g4q1R-\ji!S3ӛ3lIOqtvsG T;rtSpvIDːd3^{K Z ;\I?Xl*?VSJ#I{OH{Ξi_)^ V  ?_ ?\_,]|%'Z[Ϋ{UlwvowY}hU]Od >nTmy?UvĶYRusMc7M<-vxaūު{生CeG#u^2?km9~iN^{ɜ2n'+nz(la~)sQDs>xfΌN᪭Eajcd[qyRDY =dv]qds dB:$ h=fO =s陦yiulN]R7%T$潧C'7 lJ~Ų7%WWoYr7tfDA17ljt9|db؃bMl_/#gN8k*شxm(K68)t۽_NK\3陘ZSKVwy}8S'% Ϝ^K"H>_kJJ `6~u)y2Q>XoynouVƪ`{c^trW Zi}' U3e#v-.ؘ{hC_֩ l5 P]7f!NLgJ%e~/g#ʒjQM a!S)MDE,{*Ʒ/b}Kb 6QoiOD5a>Ʊ@rJqeW?  } pHpE PgPƟ 9SF0C J$JPs(ؓbl$ Â+.O~a|lBLA.#L:4d:&i=&.ELa|? =RpFRWGYrNJRԈ XϢ!g}HqL`*4(0`%A\"ao8H@k#R8 ędYLlU,x#Ц% *;'|6eHOdY@%+G6L09l{[bXzCO3![ @F? `&Xqx p9 b<ȅ#Pp#=G=1LD#6*Ct/=3l Ӷ_ Q,wiqz`2,:5 k8^5G} P~=ipr i90&9` " 1 cAd(ۊ30zj."DN4d%SH42dhR!"KYD=Nt*|VZz23,&|dVFSy0N2MݛRl B[0D ˄BpE" q"$"bXeƫ6ϼ;|qcC76L66pg9cB"p#!6=H6N[hRڸI) E*iqQCVMT~oJ{{3f潙G7 O|h<z? q;v&ؿ$ͧ y KV`Xb@CĿ"DY,QVOz\UFU檋&uCqt8;::~rON<ʻZl cq^T.q_| AE Fo)GGL'WJDGWY)7-96uʈ8.W*L{ D&JTUyITcȴ7B9sp 7c fZ1?L/?^3X0m] Vnk,M\\I)s(݈ӭ8wO1)u9P =k3=JNGhψ-R?E*O {KVbpSQ(P7 rKGdz\Pe-S^NN>:3x#7W-k- իVg>ŕknӍ2jp*pNWb+tEyGZ>&KK1ߺiRRĽut?謡N?ٷjEeE򲇗-]xޒ{p>ǣ\Y3fNɞʚ6%5PTЃ,j^W}S*8yEa>HHviT-f 4z1o3x0A Lh3Dj.4o LGӷ8 fB)3_ ZZ;̆P%&63B~[)[XiEmuCTZRƴbȭ5v^y оnd0iT01#7i&C&HMD*&͜]Ʀ\o)|ߐu=Jn} 6O1˧͚L\↍MJ422oD'hv.[',R#}5hұ2^axŒYfqX\ n-pٌ{h&Rro(Co4 XAJp&K9zkOM9E%sPCZOȭQ%Tl0f} ْ;yTܒ{:*KֶYPSlL*MU~.7ч!Dmt77Ps!| m͸ FIzSP  뭅!XJk/Aޛ;piOx\ex{N Qq2 cC8'v0O<" V-l؃[}}zˍ ޕE#U D!*/Gg?O$x]S&4U gA)c}"Ki4M!6KZ)n]("~@<' ؓ6s-Px>lF56JO舯JNnTYwe֧4ߺ{ܩQHd0!m,thTk}c:QG^M]Ww <( vpP0Nl2 ..q"آ @ְ2U!NjMlb8YdZ+L@:M*Q,>61i>s{޹wo&2ŋse= sN.AESer7hLȎ }JnQOAQ ,QҋnxQ$s ٝ#v?@^=jAu'(_ɺcxZ'#R-A<юObvkK7 Z1:'Q hJdI%zp} wt.3Q(Mb881gzù8Z'蟘߿%O!^+ ;lGTǙfd7Z>3K1_KbQ|W:K&z|uvp6fvv]pƿ nro2Gi2 ~qD^-y_ XZO''0`3r#*ϠI_)?f~|<:]xDZ263|#>E9r:kJbv3nR9BV*x.i}~NIm!fyA-$"r#"ϒR1W@`6U2@ww%KZ KK&4- z(X#C]t ~t^~7f=)2*@AC0_oM V>Ob|;N|>C?[ƝJMл,~>*~;ϱ+o|9b:w$!}cgs.s.у V2z^76R։qew/hLH>A> pCiP,|ZWx}x!!< 7hX] ..X0 rgDžqIV ϕ2P&Ta6(֊EX izPZ/4kGV}cdBّUڑ>BZ-"iW ^kmif6٥lv6"icccI6ec3|lSD'3DtdXIN#mxo- ծ.ʒ,_dٺ lKh>ДRS2dyh`)f0NӤ(&\´<ӗ>dHLE0Kٕ L٣=YF6v? @Q#4~pj HVI[ȮyJr1($½nbp7$5T}]J:܉vJƿ'41[$ z&u iL Ửw Y/֘54<\bJ_$EE#>L*A *⚏XND%P*( ջ}.ApQJ`3^{]eRoE(R$7z|pEc%.: 8+z3-3˞y]ҭڢU[Eix۲ԱZ|Ǥ||8H#clMڼ)J3VDYɺ1=EbRX{~ܛDSxd23%o>/Dk~|ڼl&)LÝ9A gČ3w9UѸɝ;r =>=\$|9q{/8A.jMP #8P8EvG:0m=HCIB{=NU ,@JLpRv+ IٹRH֔KpyUJζug}mN 'ALx%<1*YgrgƗWȍK#$;sJG?}Ծ=WFY j/kP4GQBwnZm:2+QnCY6fyBQLՑfX4+bPv=I̛8JL:t&&w^@A6mԹ|R Ċœ̷95`|33]AA?{v~~ii~fqqk(W/˓fgZb(h]r>=6pť = ONHO1:hhTBy{aq ^p4+h}DXa/Қa0Ž*8@gH~_ W]{\ RȵΕe^CBI u4VOgkiP[t9S9/ ?} o.h8\,^WQ"ESuYi;GVgltLfKڙp`!q!Ffޞ[q$ jg fꩅ%mj>, :]/:Y|8E|zqCbԫ@.CZZn0>mܼET l@EسMJC!ԶfNZ)Jج%ũsZ-E[}O iP007)OX̬MywG~C3k_yWh;lh <-ypZ\yZkWL@wuxam llVFM: $ж)mڻ.ۻ+f7*~_#Vij`kⱕ=*X eMbG]5MgǾ矋ώ.Um`&T4RZ֡QFժhjln-,: ?uS, aMimvhNw~>vE~3kp0 ޮ.UJ),d+ީrU<p%pâ&ÁI嫚~8NfdUMܪ)+k˗U9hcL?,5G+q~sTԂ$ ]`nׁ vl0:l&> >,@0mTz|VBxHN˫k/6!9aY-eΠ}Pv #:#8NrA6 \+/>HZKҸt~nRsyHm)'㧶 [tPRC&b瓨P2OS[7ow:UDct ynfλ5C*ۄ-|--XLv =viZAtu_[x3hο'eU7Eô{!*E</UuИ>'v3V<[jfbiEƭ$5oLi'ViSN5X)Wrrѕ#m\Ȋ(S+ ʇq>j2JHFh\MA.˨7ކ˭yVfYo89fާu8n+phRw@\=@鐦jA-)#H,0t&ݔnN3=atA2--HYpR0, =j QWͰlCuфsVR̯*1IHbroCeAҨA $ J ZmsA,h+ qTrBY*UO|V{+gm_{~\׬e󅾖P{3/PY-7E7YS,_Pv;PiC N@ *BYG竃p]З|Ѿ )t>fF_{.\PÜP7W1 ùe\Bn[EJyt>o;RmęlTs@GU3e{X?s80=ˮJOh*QX#g3Tu HܜL<]Fv4m)+Rwby^f(!&lINaS;YjZܶtm3Hj=op95"S?ȢCr84 6bSLB~9Xt7ZEU,&Mi/6b:c-1ĩ#h8[i=I0D=Lkv-9TYfI(u9T ᪑"(v F_󌗩p'ӳfg2Kݠ7qlX/oo'xGʹlClo%*LUPdX0@l3Ys|dgZzvC/?Ҽ]ug4~͋wt͏n߾ݻAeE"jq6sLœD{}a6JD2 }5u|6Ks8oM\6##*I*CW@5Sb]7sgr̃FQ;UY`&DaA`xj"z[3 h@^}YSo9:AFuc%^uqai$OHF2- W,V 1n)V;#.aM8ReĢAw(68,aXEi6s[ƉjKZok̍"-8W-y.;ކi=POv9{bgq~ů)kԟ6 +Ol4EUd\{5qU'OCcz> t[q݈u h^M9}H%e6,"1*OF=2a@oi2\Cn8\I Ptu{s%7&eOOց-?Ƿ S.8[%j H37S8f6qtTRG&540k.Wܚq[} :}n^&idg@]XŊ%sHZ16J,xa7"ڋ8|= ^3O͉ר{ej܁A :0<Í?UcB~Kʀq)6I ޺N[dSŖb o4o{C9 {`>g䤝ZySٷIOEKwĒ1[KH_$9u8/rxdC Ӄ?xzQn di6@J-! muΣlSl`f`0t2"*QI߭)Wq`Bch#g4 'NP6{LnU-5kIMѬ63~oe6nA'm:ETvױpޢiY~k v>tt`_?5{|g_Ìirx7}P"(wdz쥃t-i_]<8 ޞon^ uotpV B 姖%-Ϡ ]ůWW+Ji@U4$I/qi q=)ɰȫ(mT!,lm%f9 !iJ_+"SaQ0 pg&J~W$q'b9ը&iGާ!?7J~U (G0 a v- {8 >~3Xi3˷"nyaᎉN|[űe2kGIkZ܈q^[y"s5݀b~#\RW6XGd $']&1 v_ _6˗ExO짘9ȿ`{8Ib^`.0Wm(\h[ 몝}H8~aB@1yʴdvί5}I) θu6eK1 LLLя:!1'IJ`]:道LUz^ifOVɼ>:tar"u7rlQiGk3icG-qvnhd1g9. r̺:z)yjl`C%`f:c7&svUjn '^4\R&#>rO=" uoDbKg:Zi@xx8 HD}ShDuR;iqZ=JMnrI)]/9$ƈeŧ @ YSj%0iJr صADDBP$B u!p#nĽa yAǏ&`xmƜvIu6z)\ŦIYN-&DJ4)- X1 bm8/"}^8Q198+&zM 8n?%|m#{f;q(lJ,Mu}(6W[gR<S?=׵q@_aG#_vHXVp5E\<.DH {-*ZkIBE0T4OD TZ%TMQC[K<W<9Q\<7)TފEH7p:rm RDNQ(:2-6*ۂݬv".O8Qg3ӆU_^7ƫ=~?ۉ;3wi.ٹu1瘂JIZ7Q!4vh/EIH0F7iۤE6VUJID:RъNHh}wvWRehViyp ZKoaK@ie{w@:0WHf261,kceyؘur.]ڊT/ i4y_e.VR ԊE.i 4`ÚϱJ4Jk [a]LeS Йь#CI&*Cc,=i}vlIGO7ù^,> EICh0Hg^߄yzkl]tV$W{##ɷ;N}Z/䴥%2,krT&d@aJ&J4h*KvaCQE>Y7Bp}/Q:m &c]@Bchri"fo.x5beG[!N҄$QY4zpw- cɣcPjćxO bsp__/n|{} ־Hm APv3e$Sk? [ w"xbj}vwNɪNZt%+nl nq=0.fd::‘>. .tf!݁18Y[[ LMrH`uL^?\C5EDOy~re)tmÈWy}l0Yƈ֒RaX)=W{IXrm`݂m^k`uAc^ |2Ƶ b~3N;XUT$! @j~o5g>K"w ܂P9W+ko'K]sky6/x%PJ)*|%mh HN+R8Ač7_0^ N伱a AL:07^ՐV5ON}͌sq! ArexV)Ex>)īXy9J 誡s[Qe!WMp ꘺ITϨ.TE (uzARo 8^x"y6qqyv|v|>so )K/0%,XTT}P hU[,N-lmjlShԷ=ny~|^#=ewyw)z͎KB[ˊKH.1PuDʃ+2g)nXwlT:*}=Z|֯;q *Gڵzݮ7H%u܉ LխOrx9uZԨ^SD BkxMY)lq 7YƢlltIfsvdk3fZb5ꯘhK 戏Cts0kn+ MXFU_4t!Y0-[qՊf9+ie%h7i˵5f֠yu[ί7x#cZ>$ APckS֡n 0+^!W(w0<-Fjz>Ib^ߥVo'թ$f_}H!Ϡ&Ɵk'W7&Is;;i{3{XEx ;-[m{^GMm1j7鴥Vd\Z,Jt XS6ie=; C΃K7 ,{+>'=oi7".%H׻>;L; ҍLэ VZn8cNsӍ44P $DȄ{3^0>Y'IRUp@U!`dryu0HaN*0\%$`f≠ɣd4ޞ^7rd2-S#OFe'xlhvNݥ"#,٦Fi6߉l!2StFE,P"HAΜ!)3]8Y='. ,p7b ^l ^6X灿wWO.[PInJFRY2zه9+wɇUk ](wz{BolSW4j #1RD$dq"=4 )GB#S"Cܮvm1 +:2pz3f.XX1U,x)ګE(~;m56t G2Texeo~a T5zs3ss Hrs\^%kŕ2+&dGCWW-~hM2<$Y{U[ bk0?2O{P]XmlmQؚܖۇPR>INd&r|h̤-  4 U

cNUpIfWLj1Փ,K nky*F֋Qh?ZSDpLmPYj; P'Pnʍ"_[>AH`t--(#Խ,7!!>6xQG!ϻ ,n ȏ]gC80gu\c]fH^ʍ=#1&}f2lHd&dp42q11Qs Fh;A=J+}k|-(T4-Y/9;\ww-u\شgƽWzz-c< v]w8(+Ν;s9vX`S;:h1KX}lL ~oN*[6d`z__rQ1\&vN"5V2$Y+FFCH, &hX"MTÉȦ_$>Jgbs|g~Ed#?d|-Avyt7x n3WX{&;7vwWC<݇\'5{uo$ð\ǩkrrbQG[jKk3("B E K5ES7⺻8+k!,%F"rZtXtX]}L.ҩJ:v1 rsf0а8"/ tȞ91{Crǟ+yp͊tCd[t ?s ?I=l~m}m4 us}EZ}:oidYyhhZ>aQ[uMopBd +c& sQz(S[NkX ZZ@v[m[eu2t5#\@`4]4]Ss1-0O0BO_/pRMôWQ)Y i9{+OmɓSi`0B ˋGѣ}Zڥ^) sn4໐dŻXL#YCH{\ D/XafJ8xZum_j3OWtjB0.kAc1fdM:cXXbڦn 38JFch

Ԉ)9i8)̌Ok'aU'|!IfXv^$Go Xݒ2;9 ,] s=es{qH^|K%Zmߌn<^o|R>t vd/oX )rׁy{}LVERkV{ >Qk= ?>۳~pgώ7Tzt>Z:Z wt2U]Bm HƤKإb٥RU]mTpD #T 8MUZez_?-t?%}8/PVtV5*Baªj!fE^q5"@]y [!,2@YGJn+uZZV='uptlѷ0Y0戡O7,dL(TuC#g+đQ RpÎ}4$6П~ͷŸ}xVEcJLPXC xq0:,VYCܼ?߅>-Tn!c06Hm[?ϧ&6?"zZֱ)fK:t1Aqި.'!1_@?9'TũϞqDW,Qx}|BZXO؁gb_uq]6܀y45lem˴|?X&IBOOy[F|?~J>\#jxe5μٙq8817Ă 4gڒHKWP NcF^Ԧ4,MHdÕSP:>^4K"|FC73}8(Y`.IN郀qXs,}{fjt/*>7LWg!T:_Bb7 V2zl䑴^\嬨mwg}cq4&~:Y(on'R풴k) iVm !',FR%BKalN6+.><,\˘i2t@7/+煵T'ggn |ENYEQvN5|CLZ+T1Hu!t?Mb+*#IH5"K(s =rN'>sm7e#XFq KK $2_}yԬ5h,NM̦^:}<՝:ΥWHuWӇz 3s8Jc!]Cy f&;Ef22B[sIě&cwJח@dG{aN٬[56ŦQ') Rɱd %RֿزͭBNE FmI%BS?l $ZqBT<\;SQ\΀Ҙq.[zCٯmEhL'bC))~ * K %n8$1SIlifv l5Fl 3M*z0~,=y5 2CQeb*pp7ی68^jx{ZcY][=; @ip"syEp%/"`z9LJaf06omЃP{;ypa d1R=ǷL#_lЙ̌Xp^<\9]7ǃW+Օ\=:O_W FUjPb o 7ۜ`oa.ƈ6!ZP\c'k޴ˇ>Q>LBCкRJޅ3QcsP-9J$֥`M.x]Lz8KHQS,I$BTS*cdd`!ʔq?[NA?<aɟ}~[h$3l%\xzofdY"xğ q'QΗ^+6-@:EVNbh3;01jYPF:Eꓚ Por >tHc3MDbb?dK@B. MEʄFMB]!Roe]PYY3gV:&mpMK&U#+_^ݏ/d;kht2:Qdgf'UI͠R-q/e<TSug~^ku?{{g?:9JMD)h2h"gw! J19]nHAI"բ$ 9(0{DfK2$uK>/\z XsӘXoYr]ȧ6!_˃a-s6U[OLQ*c>Pll8;|!;9 Eq4VZM)]ɀu1)46 v"u? %l4ѩ*ETh4iQuBBh{gy>_LB}⋨2up ǐ`{}6giW1B F~A840DW֗bCV iKAhAkfi0<9wv^,?خFlkofV8?sLK-FT:4#t$)A!jOM퇂U1 %rљW~o 3p;43=Wp=ydِ-뀉ب2ϾaU2P1_hrܶkד$ &N%G c^‰ݠ4p bFAfB2:KoXc\vXl'HHZ.Cghп:\lGjP]NJtjfl`&w%Qy D@xnj4lj4*!.l0bu"X ?Gy z\!\E"DQg Mvʾw=|m1.Zfs=b^>ʇ c*jgT_x7$ѹ?X$ۣ鍦 pAZ!J0LE-I"MJaƒ:'%΢׀D.HXy2zaͱMonF4O]۹ŬY[Le#.^/׶鵬oJHCt #M! n?!%Cq qCb?%=njCvC{8ȉLS*3cR$xK(Nd2? $(IMLSU%IQ S/|E Ջys.ƥ#CI -NxNpL^N&{dNS2ZBK$؀ T ΡB=#d]{Оf2DM;vH8DүP}[K+^#@C+]Nz^nӱk[(he:&؉IZlC@۫V[ O'&р:IK ]4;loHw">ʁq4F[QlPG2"zlÎ Bڱ,炎!U/|BOߋv˔J=N21_`@#)p1C!9vqw`ځvjLurA> KVgU.q ]Hr`l؊gjI/j3X@x>{ov㼬nKHQR Q7`jB3+'~E L06FgS=;<uPQr ADǵ[؝:m}0mT_0zS)<%/y78% q4V*';j} IޑEA˔p֢C*m ;>G9Ms;qkw2F`_2G(եYTyxMݸRfᥕsӘͬ4u*^98i1sݜ\_n]W3j0>n{\(!O T7Z\ۏ_0"4 fmVtAti7|A\~ht,MT EWPr`},&μrC` KNh#o򀉹ltSFʥ@OAzYM*,b+ L,Y&g$S3J`e-r63? l?PmcL$=\hݝfN:v2,i⸥^F,MSm9>!Nl:BL1 `[qڒfAx!&e71,ݻg3`RDC`&njTFx4%,ɞP70Ze|vU[{]XgHiKoC輑"Pض=̞dao%Oyy9]3DAxs#'^AKT?~z"#ڥ9yjZAoD,@` )z0D7@ A@+g9։a0EP帐SAlإ xaHE 6YGX'_ϙ^=Lto߷,? j!!w.f||9Dq>c%A]V!4Up 2KhR#5(DBScIeUQ J4;eTtg+3PBA5Cjy9#Z( "غ%;]R.lEC@70$\oH4dZwnqqN?^Ozy+mQMs~0 qŽbDʩ.խzT^xB^DCs#]b Z&  FG1^M]Wslǎ?c826wQ*XAtU$A5iA:&_(SW F@!&mZ )&Plh$4K>su{aC|D",qb2i)W'"$Q9RqƒEY&N)6ՌY?҄ALXOxv22Ăd A4*>82œY 6vmw$B3} ;>aa+q\{mS3'qWa^\M4l:딚 =O['M>o^}Mf{;~,+E}W=5e@SOՖ=NN?6E:d9WLan8[mV[k܎vmCnO +9rkOk?7VV3jԒ6nS/;pG{H51) EdI*i@]+v[ ޣyvW~My-cD^XJl_PMzcc: ;bIeYVl4Us/ͱsVlGEL:|4,]C[#,JxB%MF70nfr \ۦo~2'lJ&Q4`AT5 Dl-BDHUBzX%M8$ykkWm瑌jbxu5\K3_55ՁjU>H7 *AwLTfbV6نϴ7OMFPJYNfSԘ+\CiPݮRIFUӾa?F$4bR;u(˃qi1~Fk'5eiJz@N }(_c;Jg^W"ҰY$ K~ IzWW(3G@RWU$OuI,v|Jٗ|۷|s}__^ \P.j/&Zc5&\/_,MɓDOns\2YyBf2NnrG\q2[#gl^<9%OQyN S [֯V5MSzPq y(X ($3$RRLFM+PRmʑ]{t2nw7{|7.(U<"0W<Nhwճ%D]Qa$:Ig„Z?0rf2N$5<ŏ[R.f)༑B\>yɲF1zab6iA',D{&93G*lW:q5LJJQɞd$ IYNġx->g㦡6F0o$ma'$ZlOu8!A)16pjD,=x9e0 vg벇oOד+qߍi 3f9rt!Ȟ C;Pp|Y6ůx9$9Ɗ l2d91yfmk1 ۯ"PN SQ !Uu4&1JZWeV\?>{6mlI!$n0)bBII]0Ԙ&i}th%UeS֥[)Dtu}uTUm(iҴMٹ֪i~s=sĀhd}R19;l lÃvg^nl]\ٚJsF)k5naM=h+DMb1DMwSdKJ/ '(Vy^Qs),D!#pe.8ƃ9B 7U~V#7|}&hK1OGʧaMᵍ%HBfҸ#Lڜ+ÙJs:Dwُ5*[ÔQy[m틓>ؒbuo\e$U2( d}l8F*[ĦnIY,@hŸP/}ZzQCdHξ-YߢG  I2I`cֈ6WQ5x^5d :[2$Df :#/rޯ).|X~-O5=Ӗ aI>}>eǪ/ %H>UwgE_ζ }-{gP8e7_m ;e]k^B.eD?]9h+)1\f0A7Zla2k9myӢ\\EC;=he;UOC вo\#d *C쫼-vKt-2]&k5B4?gؘS\Ir}Je-Zn~6q C;UAN+ZfI+3r\6&\bs. *d1f^Z\Z4 q(;Jo߱za+mM׻ KdivVdss9E,n<@^10\M &*,dc l{|(E}=?Lx=  fe7PE#? 4 IQ&͟nk)qmc@ow@O5@vhv^4nCs3~y JM(7L &*)d4g 03(?G'ٍg$)Z3gq;G?p<YdEYdEYdEYdEY7SKI▏(Ary&sZXd+;%.Geooh شyН[[­m꼻g;zw?0v3wxE^||k]TaEGxN%W ?p(#'XGO_KYj8;"*K$oRe-Ug^9WUR|E䋿Ve全JH$2#1#21$0EHV2ک$Q 44E3խy&cz&1f3M.35~QmTӘq! IƛȤqZ9WmF j{4EWӨ/C#KfhΨwGZʸ 棗JBCYL4u˔93@v)^oߣ\V~zƩ&JuY endstream endobj 432 0 obj<>stream HdTYPW}=3==:i4 q`( 6 Eq@)6! hph ! y(UB)!1 &&Ҡ~}=sT DQ}A X֛,OIN*yc)cU !P萂',ץ~l!AJqj?nSka@PJ2LiyCMug-XJ0TؔR.\ǵ +Ԃ/ ^I9ޚUd ̆EL3cӉ jW'd7^ :PԟO++ҩT Rɧ)dEdh` 9PIVf|Vu}rmn&>{a&y]"A")('^aB lk^o،6s8qID`L>xsKK jm:[O08`?6l&(5C"n~8ebKdŰ%^"dv&n8  :9k _?+ϔ_0ZURʥ7>>iQ|Ԫ}&CD[~4] (t2e"];QgMX8Rݺ<c-%,~U&x|DD9 id&Iwr!j/N|ӫ6TВ0 ,n3Ja3W6R`;bӗG\?$[pV☧hFQ~S{J̆MvT!brPobЀҚ;mq!!B0Yl,#!G0L j$ QC_$B|WFė̡D @/o'P nnGp'r@'}_lp~H_"ۥk lHؓ endstream endobj 433 0 obj<> endobj 434 0 obj<> endobj 435 0 obj<> endobj 436 0 obj[/Indexed/DeviceRGB 255 289 0 R] endobj 437 0 obj[/Indexed/DeviceRGB 255 300 0 R] endobj 438 0 obj[/Indexed/DeviceRGB 255 301 0 R] endobj 439 0 obj[/Indexed/DeviceRGB 255 306 0 R] endobj 440 0 obj[/Indexed/DeviceRGB 15 310 0 R] endobj 441 0 obj[/Indexed/DeviceRGB 15 442 0 R] endobj 442 0 obj<>stream endstream endobj 443 0 obj<> endobj 444 0 obj<>stream HTn >,tֳ0&'礉^Rm5H}K ?Ԝ5Y f-Z&% fB e 'a/v1s ĉ}87jX钫5;!P"D*y .k8"凨VǼ{Bl8 ¤Az~% 0 endstream endobj 445 0 obj<>/FontDescriptor 446 0 R/DW 1000>> endobj 446 0 obj<> endobj 447 0 obj<>stream HVyXg`@!p8Z3ጠKIcJ n$ZVXVj Q+}Ѫ[tWVmo`ǧǮy&w~^C @(QS'/I+w"?k  62$m`܂3, S& @&5;M2v8B!g٩pXjp ? i60݆Jql/Btw`倱polHQi n3A"#3T^ks+r)(vy^}~~ո8 Yn\K2KՆ3{=2<ؽŋVf|phLW7ӹ3CNI%c][L2᙭EfThz7ԕ=%b DUZ- ?Em5P!TQPHVZATbJpWkEbq튮VoEE%|3:9{ڶ,D&k vLeaR(%|T%] 2T%DpBlGj-LjP yw2EDe!UIB)Rń4 vyLyhbUE*҉CrFgKmJKm $JZqB:t2DTL8BTèR>+'m`)ΒQ#d I!ddʐWA/6ΊM3鉱FSgp(޶Il:hQf= [ig>O_%;ɦOBzC)vcc&fw o CUq=;=ÆFx LPhԩ~žـyt8O_N#z)![ *&:{5zl!l[+meu]Zonr>bpTF!ԵQE+S3֖,nKJ qrxXm_w:ѻK#'U?az=ȷٻ._Q]2>0Gc[}uvKgpGXknn/jBãN4ϣxг/.QOD}tEwju+ؽT(Yx"35 Ik"OH]Ԥeb+٦%%O^bD)fljRL"}BbD8)r=;'rfd/ϙ+8:}MW |F7OKT!v>6%vݪ?23mܚ|~l8tϰ ]g=m:="=mWj]c> *hcy?YJs6{u3ٰAʘ}1J}=n;十k=~vܧIJ>Iſh{p45)hTTİ71Gw ==tOƽpZdIaK-. T 훋Ͻ?]YC>cwܡOձ>%2YG-6⃁Z¥hڊ3 D(Jr t)E3:{ ܱbkG)=,[C~Se6t A(f[jx5Ƙ3=ŝ*b`5ɂZtsR1 J xj_䞄dq86"6y.a3ZׂCPNhY g/mB؆r .:P<; ,dBP;Ѩίu{+:4gk9G 7,EoP kݦ:ZzE4AZ3%YQaH pӛB<] Dm6k7H߄俜W{pTWν!͋$\6-ei a.-Bz)Et2jJ7IBHSIUSԡ80q V*w,yP;ze,1:~K<i9O|MEvoB*(+T4|.z1zz +C-Ǝox^Sf/?(FQñҍu|q|F}BW?2?2hȻ D`!v>FIf5c_qԿw>#Rݗp=*MsJ 8NMq ^w1MNMk!E!$J[W*g[E#4=眴Jn/VyFoM [XÂ+!n @7'uKKat7^Z!mCF4K-Tkٓ? 8 btmN77xbsuѽ)ZTяw~h\  oUqxY.2e٫Kd6Ē|DbTݸyf%XIy#y3W0 <зRIGY; _Nߣ3x327AS`AXւ̉"=Qh#lx öKh&׶p֝E OC b߿||g'n Yk J^d=q>}xA^xM4J#F*op}x$mg4{R^aeQy w |<.!ZW״rŋj Zy_=wNU`}n.]9c4ujEyٔҒB3'L̟y=ĨexE(#FP4iS{JS]0}, \T>!JLϨO$&K7w| 2|juK~ -ɕFu5KYɩ0z &`N`i`TœJĩT0]mSGY]P6 2\؜\\tSוxGk*ymGnIGue2*L3]SӐ }Z uf7ȕceuWmBDgUmEE}BA;%12bb&l޹f$oanpNU2êc=Bk592+]}M(ƈfA+ޜ-_)yΪgճGHܶ#vb jhaQ{לgRy;ƕx[ |4DDKzP cӍ4)/JVB"U2r%(*JP_py4`qU47q}DtsE4.(:jXme5jU@u-.fgJ׊ᙜx@ʣk>%G]hi5Վ>ͰAt#]dUrG*Q~k / 8'hbh 7d KbRry(2T9oaRΦ::M]. b2'v0ab8_A3I_pLc{8$ƛ_/,2~}97jnF;(GE_zQ|:璤|O@͞v*4~o YK}P/Oo?_ b BVvڐ7ڽ-!4z1>L A_(vpVn=9 =T/Jګ˧h2-Bsأ8"촀L/; . 7`]NU<F*~ѥ.1oBIa֋tq ]= pfȉOJsraͬnĢc kRM"Oj̚AzձԾaߗ&ޯx7ǽ|q-i|=iĎ?o1okFKط#GqrTtw Uei/wжx֖a25;ie&> 5Y;vĿK }m{ uկ&ioмx5)pv>$V+F@6FMQ074h?~YRW~|,WuOۨx-pP o[f];ͷ<ܱ>&q!~XR,uJ©G; S(ml>VdieM\ q ]))Z d$SsN˰)"}PoM?Dmօ'ejڠ9zе˭daЍl79o29LZj^?_.2KYpdߜ]lV_`˹18oToiNMNDu\ W}TDWǦ Zk|([&[_%vy3KnGN[ iڻs/Fit4sUb-w<4VWǯy|PB;<G@P(yp.F W1'ߝO{?Z2HXJ)^{Xx;KmV<3(k1Kң@[=Nd6 7h &I7Ϝg Bh(kO$n8[]u`-Z@(h7+ф#ENa{z2g kkoOi0vU Ko^7}yO x98m"1,V_}B tH>cnYI; ErQZʃ =CVxᖣ74rk5^3>_йOI^oŏpiJ|^1S FD r йdv Y ߈0 8x`O O#^@G>aPhbfN QF'7LgN?B9&7I<+-ϜswtnyRpBy' J`[P"C 9{_)td˯_—I߁Ch}8;F^ٻ1St/%ܤ}~=^` p̭GkaYmRκ3^UW>wwgb((!u\u\㊇yP#rml7nb :@8 lP%PJ%)"-5 /QQ+6`AJ{:tμΜ93sƌ)b P>V_FrcXZvU Klظk~/˖3AT2ߋ^KčSA{>"6W}9vAܚߺV@ 4xx XY< Q7I]E]yvpa⻃ZW=_Ru[7O7fsw/|<.T̵_2&4#sͷdY~Z8l&g$a?ZBe*OD)I%Y^-MZe`v+t9.ܮ <~6Ѿ ]XO{/yn29H\0 }>L`4s.?" C 엤@3}%j|,ƗC ƣOL¾M<=Rh_%׹j|vo}%M 'x/6ŋQ␉(?mc0fcQ#a*x(1ntcDH$txCݯcKXFJ8$i"EdL¡32Y >*B6v_eZo2s9&k؋'2ڷ0ثJL|<_Vq! ;]1K8kI9M|cL֘G7gbmap:W lW57 ?cRg9yG2ALz&mzp*l/gn&ɢm2TK?|T/.S(~;?mfzz<6]ȋֻD_ۥ28k>I!O)W:n1 |fqye~%C̯b:u/1 o1ʙIZG8kYNnݹ~O&Emm76oVjδ5]GS3%|;=t2xD5l"EuP׎^󩏶 Ze,pǵs(2kȉr<ɽ}R {h` iyfojϓ)Ir&Gy9V=^|_:ªro秓#U4!'(#p#!v{}G'x_!G~0C:=5(!Pa#pA61ۊԾY0g2z:L4z1eJ_o"w+/R<,^Tc-\L䮙jAOT+xD2Ɇ3i+G^+%_"mJE~s2Z_#ޠGXG.{fJ7/sLWDi J ;X0v~./F^ lW@G}`'{+ptVC.Q;(L϶}w\71 ty62&, czvC461M1YY c+/f흗i)?ÊޙCy5U+lw"~L{Xj%:_ݖ%繈GۑoHz'z_M%s2$8%'"v3HOˌQcOCze{M6J i/5; VYr[˖*[[17&.OMeeimSowД@mA_ QZ7aC d|~nF|y=GF#WBo \:p TCebMh04?_]Ut}/J|}> 9dOw<-O~}ێ@:MkH9֭C%fHyp7$VL^ oLjƫsLy|gx["<ѳޔ-BXbnku˕/ 9̻#ueݛN}M(ҝ#׸'dM) wWyN+^ְ̕g8{9dI1i&&j˲!# ;ʖ%]n#~'^/6@ ޤIsT#VaRF}goя$婡zw5'rmY]b ƛvȘI-:>ˉ>fgYyg;_k^IyZ&{أ8=yK,Њ.Y|k0FCƮ5&6+Ǽ^c? ~E퐓^g`5~Uit֤ٹ!U΢\v).ާIy5wgsOs}Ht0fZURd;\`}/}kSgwuI0s T0̯w|K؆aYU\5/Udrw?\rC3]l&ʄڵ(+*FBp2BYpqֹľYCDHhm0VA`]B\JB$siu].yo=1ll|s|s8tu@%7A;@Gl KPd2 '@kͰkw͔^CC9<~ƀJZ0K?i:klԾН_L \}[:azJ3/O7Va;_9 \Q{q`CB}erfSbnEL4G5l?nLG~>ܥ;赃ȧX ԫrP y}d_$Ӛ9ckܘ>OP*u6j 0c9k3pgk È#Xݤ]'̚ :)UW7 nM'1\56kg~ɇHφ6YasNrɳdj=\mdZMwɧ6a5z3^ƻxytsz]4^׭*f+| Fl;_m*k<01pZgzc9J@}sowS>K}X~ԥk :\ޡ1#1gmet@ٸif+~⫫B}%POQKзOϿ}!zj͵߶߁z qϔ9JL* WԥTߖFIW@ԭ@A[νs @:{|8D^&j1ӣо ^=̘k1@unګ}I>`N>)By-=Ms}9#;ø ^e>5IiK7exq 9ΒOWi iRT8׷u~ϛYqR~M&Caa^FV~1;De"VefLnI;"_r$IAR4_.g> TcwP{ }۞vڙ 4_~@Ck϶7l͟7Oz)S{c\hźHs5kd[9OӖmMRVIHQwk1-N˻{کtr}2ՖyʺB_PVc'%#w>O_F9݅ ?Fb|Nq=#is3R9?8Q/YK:6zֻ4E?{i[WQ~=?z1l߈5ڸD;SnLK/?SG9\|me%hW^5oW^s[N4&{u߫vw)UƧw/VsSf7'^Nq_c2kN|ѻ7Ce_H0#CTCsWp'v-)q:dO𤤂eRc*wdkE8';8΄-cw-R\cRb Gt(XAu ~gXM3 >W~L W<Rm;oȾ&Plk{7-i}ߤsE:Ւ nfF,[f~4tǜ1^z~"5zqLK~h4xHCQȹ)qO~Rٴ*][J6䥤ڳe٦6tJe288?g7OkiuǗp$ jrN{%V&$ׇX=ޕ+nIF$ )eb~tԃK^ SI_Qm [%r\M57`q '3d o'լ['` 1jWs`J(<v;~y |N2 Q9|籆?ԃ=<բPj{?[Sg3ɇiAu.)\n#K@ ]9$Gs+9n+æy"cwuвP3tM+ymȴqGL."`sc9Zprt͟&/r]>xaV_cƩx!]ܥs2YGoI >k+K%_q?b9|{ `CG$uķuqї!(:랑产$UU_sA5?OF w?`S>ǚꢾeQ&NO5Tyۯ߀wEv\6~oנ5[pQTlb!6 .d~}q tYAQ7z K7  K=oAV{da?~}+Ѿ8ǒ[{F ڥc iݠ g.dK-(6M@ xRnݔ_ég~l;}%<7Ƚ?֪ #)V Dp Яp~|Wqq{\Jx cKWiR&i!!b I 0G`-c"( ceREd"ST){لy}3(ϽyB3H~u=}^(KaCٔ#kޮu`u.vRPσQlFpN;}g`}.o>o=YLi :0 4Ipw9~R} [&xÚdVX78 T46FfW\f Bi3^ܖV] @$cV ,*+0lmUlʸ rRΫor~&0 `%ΨsμBt3uu7G*Z `7a?A:\؃ U3Tr*z%͠ĵM\omSeir۟4Hc\^ͬɋf }-V?R^r[5U'N 5LQa8\KmR4{yvgf:ڋ؏վlyklKgT/PGvnoU(t?c꾱ϓ[Qv4i'Gσ[)Q4\6hц#4QZ2>1_FbGY"yW(_s7\M$!GQԧ" EOy{vӢ?^{NzyH'x鏻pbvJXPͪyc;?)_BŰa {#ZfޫnrNEqHe eϏu0_LQO#‰Én]Eς] !u8݃Ӈ>|$vF7:qL^X9(2՚rUy;F{2l}I΀ uuSwghԾp,cmFflz ,4e__ƾ&֝lXLl~`1^#l 8_4kkE ;Fz/9{.#-ymkތ%Űg(IGVv0[uf޻5@,Y1鈬%"WnpR6Yq{YF0l[8E9[`)(E] lk.kdnk7NuP~]|w~|8~EIip<e^'@ H +4#Wn^gU1hbAO H` DﯡLĹVig387'>Teq>D_G| ߠ0!z.2|vThO04 {}H_ι@ mT:CT-w44X~:y uҷUjOj\a`F0@2Mi4A_Nh! P.4L'S0%2;0vRv[+M%IC!Ӑ1tvȦG%4+nVDHq.P+ a+sMm{qssPy"*7V)ڐϫ}3S}wλ}_W_Ss.:+k? VִE/7}hr\Wj[?Od~ɭYdD݌ hknYD]QAjBmQaɯdKDGKmvD[jho;v+ڻVu#uk!dҁoEhҵQi[[l/QuT 'τ_'M|T8';^r2'l %dQ.ٿk';5|H8Wc2'[kLޫɫ+1IrgAeϓ5'^_w1hn}K,뵯,9Ab؉,G^DdFQ+CQ";'R9$r@<{Od9q""""ُ."U-orQ"YThPd.Puo`Oq9M;,JK{Xv쫞/}Dp0"WE(2%b)ƒp<O~$rC®"C""{D".ib-p:{u<#2E쏳NG{KUxClNN` y9D Fk -{_N/4u.U7Ib:1w zv*4!"8>|v(G֦7sņr@_{vg=`n:ZXt=p؉4s/]r>̧M@_뚉D_1#o^XGkI'͚^M]D_{Q;Yӆ<:u|Y ֥{Yvu G kгȢ{({>x 8|{6wGg<65,Ipw6{w p| oaO~#m) v@hfm}w8I\=ku~5-H<>vnrnKӷ_q}|{xOa7'mpR9xk-6n#xGo9c;(𳌭45s;Zىgc\pñٵ{3XoZ [g߅k 15;]mtl~7m띿k,^K2or~ "+;{i04ŸAϣw#tώ@g=\w`] ޽qooN8oY:|^=eZ]4k\88͟F{ےy VD]*mw}E4[Emo޴,0 Х|/' t}JҚOMe9dxa[2ɘֹtjoO΃\1Ɛ0 s7GZO%k8F-Q9*T+}Vkߕ_Oz*cc2Y4i7|I8N?c¸-#Uvuډ>1%Q^SzIt @V]Z6%F/sXBU{~ow'L%.{3vK{t9uqk_=W]Ϩ~ljE;ރ`Z 8ܲeGkLGŠ[c1i>\`ql+>g n爭bќޏj"iwDy4Ⱥ0Ytes{1li|S׋*|n8J{/p6Ǧխpan9Y&f#pw.s{;5^w=V;|^Ucǃ9Ws.{BK ѻj~c7=p9H[*1:ͥsnq]b|*GO|x}պomM )W{1GU ݟ8=o[M$5_1w]]οSV?uҷHIE4Zo:ڹ=`Z2G~rk^-=k-9_?v ƖO1+Oa)ïvز#y.1KuN |v\7S\+tk~j4bW%crL3hz*W!Z靨̋$:߂9$~SWy Z'އ']4ܫΣ:x-|o `&^8L\ ʧ/g4v=duی_ bz7gnxCt\̵ub,{>5{:M+M|70N9YscNƾi=珑 :|5ic9||#_ibl<&י= 8 ==Mo㯞p|Ql_c8,i\@fYky}ǿ.ȸ- uokXUU"b1bĈ1"ƨ#"*"JEEDDPU+jUUTETuuU]ם|<{=s=.cr~0r\+αWku ?}ޡW3.̟x.7~An{|cfmx{muiݮ ݣKlڳCj v2_oz=DށEL.>C;`cy ܋#kcyǻ>k]քy|bqvv>dǖr8Ul݇SŖyǺɜbg^Ot1<{\z, w3| QC6 tn(W-dX/nj1{F֜2f`Nu.ٳkkྰ tvM81۴M&<>c;=Cw ߎM 8eXCx`W95`+5;c,;Nxz;|^6}l^eo,-b{ ,udtb=p>ujqcWs=w|?'lWjs"eҤkE+{/d?c9zǘΌϩ&{ŻE¹zcN?7׼[m~~j&ioY0{ 6ɿl2- kǑX]n=|"98}%0X[:r(Y?Jaej1-ݴu_̾:m&uF`ɠ[}9W}q9.AJ&pW&{4ՃS7Ȟ)AT![4矝!p1>Zo—`(sen`S~9~E4<X z*X&[2`qS0dg|s2!0-a5eHق } Ut NaٙO-]2N|W`oEq,S~*#o?ema +,"U>s:d/Y3~.&k!ʴĮ"w/Zēo/;;y;~V~:zu 0>nЊ[u2.En=VO-,rYZoRy3cqK$(<_YNza{6ƺgy1wTW{wk=EF1?-Z E#~O}n82y;^D;`,X> ?|Zu;}Xsɼjbr[/$\U4mQ hfh|y 웲ȯyr-J[@ZeuڪBlQCVgrj|ZOwʌE]&=n,o,2,r`_w~m1^ɢEl[bE{}n[³ smcgpqͤ{^7sB5s"- O5}~"Kg6I} LyY[@vUGh靝uϖ-Ü}ܭ:bU-΍KA0sD: O%ֈlD]y:K zd ?)'6-jXC8x,XENW(ݺ_tCwTCL_[*_-j{R?oQ>R,8;llw刪E\f,[Մ7-E(s9LZmFu|+}zc 2OLJׇW:unVuh36c|}/"Sumv}8;`|)?nsu~<&Yɺqx wg|߆2T\u}{ՏNwިݰ_:7frv/TsSpom;Uwc}uc˸˜{õI|0[!>t3U¹beN7%}P^t.X|[F :=~S<&<:Y8X7 +%k3z~)`#p4Xt|i.ϸ-ߩu\k]kU""1F1F1ƈ#""JZWUUUjkUUVUkɼ{N~~s>*fc ,#f9\KٖbGB)GxO} K?6xpο;yMv;~1g3?Ug(=Rv T:N9 -d m=?g󎻬?s~f.?׽@QՋz[ yMv{}^: VفEzyzJ9d,"[Yۤ{8[~+'Y˰-kvXw{e~qK dV/$>;MqUo$~דL8s|`'_Cy?*xYR8EKQ\_lbKm,YjdoU֖cuto`avFwn9ޯ߭u]f;e YN ^".Zw?;_h7&4άۅ.Bf5yg:[3{/<C ?3{;6n'U -b0]JzZk({Mwr.T"Qp d:=p4ɿӉsYVyg.x*.ז,|^-zrҡhQoײEWt#c70j}bH–Tu)Y/7|So3ܞ#!2x_^7{}y&.[$5k>XK2zJ;.W|q5Քbs4\o;1&2@EnuڊUTMzʝ>z`7ܗwI1I,|w-lRCEZHuf)ਾnQV,4os,62 t:z٧Y'[6Z~y#v-cMs_߇~]D±jm0QWNoĽ!}uq6aQOt8hdk-|>0s8s5_M%;b_lN1vZVJm"grwY)WknXK֬ڱ&]{G9u;U9okSNɣ|nZm AOAȭzE^WmT4-w"ޫU,hY+WqKsgsè_زʅ-x?@M>Rғ@z-jdQ _sGK6ɢ&{f,rM,r|KP=O.i_G6CxGȵXOזEj=(6rlxsW}SRzsݡE,=h*;zbꖾ-5,zQ 5D/ӚkwY؀bN|6-j.KW.S^-[*zq"yry)6Ŀe#&I":Y5:kmh~T9o'EuEQNY&UGo!rƊER-8|ʭNKe,kv_]8-'J6-'9{M/nW9x=:8n#ZEh?+WvY~%wCɟJﱦ:E=Go>a]*F\ON o4>izl/=x1ݞG9qr<^`x_`Spqw mdxП}x8ǟM}#dy;?D׿Op;}O '"8}ϟ%tkUۓp}{S;M-p oy .߷Мc>/w7&:p_z tk%ElD?c&z8-pym5d-h~ns |Ǽ5}IXAG{Er F/xSx<yp/ޡs/xX1^ow>o{uFc"_6FPBg;TUv")/!K[Wۆt^~E=9|=ձIޯo{|,jrgg<0ePݶjKE34vګ6ZDDRRJ)%J)QJ)W)E)%DDDDCkhkŘ1~X{^wGlt]<}9}g SKNGݴ/>穔]S~jE@ZYhp%c0ya{lJTKi;ϓ߼3Yo̺~lmz7魐jweQ5te_-͓w}WƢjX`I7t74 =Bi4į1x-^X`Kcͧڣ7?k+m5uHZ靖}agmtTEJo3=cb+-H:svڵ,0wOmZ‡F}dB͢7*%cOѣ:FN⵩ENJS|E-,9Nr'u;EL7r [_Nwݷ^]]|Gn"wZ>G_t`QOk⋙Xt3əs_6踥=|h*=n_kMftŌų u"h|jҿ"7L|mH轢QOkz:{,z=\I2R뉁W!Z9P#KCWnoٮE7ԭdG_n/u0詮'|d~oDӑN \jl2εN:Ңfe2< o'{EhFuC,ꨯVMv,rؑx8Izo3 Izhob:͡lu9N4[~Cw*ks"ZO8<};;HCذq#ިE#|MUm5;kt"l趓4]-X-f=KM3ޓN$ .ᯝȵmKNdG]c,5]iV3-r- gu!^C7-047Қ?NgX[ |7S"/8OiKPa K.Nۚ~}96ɇ.3y^N6+%?}u/XǧqwcR7?t|SѾc/PBgoW9^BrZ`4z2׷7Z:{oƯZLWQj]o-+ V([;ۗUșFM6;lWڣ!w-z/zRgɎX_Z`܁I/Y`v|?3+/=,;x4=o ]::^vw)t2Zt5ZWtG1MǢ/$kinvs}Y駧dϩk u~!ud[z!$-=Gk("ץ/W0iJ̵~Ըمx,,<=֛kuv7".eDRgݹkWy3E-5CwtM2=S~OwDds^J>p3ȋ:&zIIP-NsMΛxu;۝dsYϓvf=ҹ[ѽS#G?j=s*C\y*Z}ƺWnǢ x$a'R6$~!>4/.%?]ͥE xo#чF\ X\Xs(}q\Z`e><{RgsiMXXζcp&9G:[A^xwn_wy;qmJ7~3H \u*-jy#~zĢF2>WgE$Hx%-_~ >Jz~[rHzto-zuy0,y.HkD< !I_k|o˨ zN~-7=De+`L :z(Y  jq2m0f"-|8'Ͷ_I&z^>=9D?x9_wi]X%W^Ӣ֝B|M ^)t 4 ؑ=rCG#3 l}$48F]KW uHNk?=پԳE."V!=`ޫ>KlYzZ2LWRƜvy=p^[ѻeݞEZݿBԕeKZ`"gw4Fxuhww}++[x7:$X ԆҢ֏יDcn9}ۧN_4]M,*+I'Vt_d{}u־/־ZuUEDDD 1#F1FDD c#"bUZUUu]uu]Q*jUUU]UU벮uWkt>='}x~stiEK$)7c:T_Yľ0x,_#jRQށ}CRݢ.{RMיEWm~.fN;WP,hV.&iœG.=h_!g<y?q)^//嚧޶Ag}Qg^9wkG0o# f,_9Oo/_Bw"OLuXavT>fS}vNFa=d5wSb4A cZ-/Ge`c砱 #,$侊oUԓb?/,j'q˧i^Fodۢu-0>qs1|+zbS"=w:s|okn"mU'*h¹CdRo9ow,vZ0gW-P=\;5Q[}=E+o"=I|]}Qƭz9aY~RmP{X6߶/}e.ZrSosC]~;?8y⣍s-he Sd .лaUO$^_=ԫ*'[=!Ӽqw v-yh4 w蹟s/~f9wg '| ÿd{\Ϫ{ o3f~^^%zθnǜ{\?c׬[zs&_}y<6zW?"Q5ަ~7/qf߷825u=|: ~|]\wawy@zއc p {#Oy> 7iDGUwM=${roךSƇ~vU_6YE}a^F Kѳ^ŤWyޫ >-xL1 ̝Z@k#hYίs %tLJ_&d-Fٵ8HoVt~d]C/atV`6Z7t: 7kgUx;kC|Q\uՋ%WN'/%`MWQ5[m &vVl eVYeaЋ=-{^{=?}!8߷wuXAȺǞӸ [ {s 9w5?oIM9}.iQG))n.w7 ]8!:E$©OnqKoF ulTG륡*Z"L;փemB[^AkQV-/{XK9H=le}z5Ea>#8nz\Tubc1bccFDcDX"VZXuM?zQ՛U5yy2z~?–. K)WUjڢ-pbpR[&po=>4m4#U{kܵZĕq3zSF>ݴ',ԐcemjYxqaO!w&:s:%+LvT~ K#h'S>-j1"fE_!4 /[c͢Z^~!C+l8{[NO5oI~W م8[MtT8](ZSٞ΀G}+?Tk4 O&Etgղو=t7\]#{_5}n ķeQUUv--N>/aml jfvWo-Y`cho5?S7k>ֹ:z_h{Y=2,jGwͲڕ.T,M{#Ӝ hKjv:ï#ΐfQ]S>/ә zs"#kj"v )we^ҳ]F\S?Ebnm%%d&VsNCyʼno~kfPNs3Sb6|ռ /-xJY.%UFz!racU{e.xN&ۍ ]Snilc;ײ&>kOkD+w[NaiOlW~̻+qN|'Zof9=Ry{-c-bR£ أ3 F\'laa_ΗxU zz xهfo,r*+Any:Gva"4ˬ; ܦ9fluh D/r/=\ڪ/WJ劽J%[nieO.l_ExfxMԪ|w,rf7$W9BL`OyTꢓ[8zkm{y#G# M2r^=uޕ7{1eQ/w9Wem[|PFy?BuF# цjqY  ^cgǤ?!cifi׫O]+hygq׵<&X^0 -o՞bZr5]5[8W;ɯ5vᡚ~o :5qTY-V}[_jP|kX`[;e_[Ps_]hUNG&\8;\.GSH8mu.GG,h[ԇt6jϾn!^[gdaS,=4TP 83EvAn+/SNq9)/,p{#8)#teK3*:yjw"~?xﬤ~.skSM7~U}tUF:/Ch܇ob]pcrkDo^356j7R4K/_dQn>[?p}x(!+}c+.*CS8k%܎E/S_Zp͜#\I>G<㽋TW8Wy:4-j?ܲF}CėI R;ٷӟC9?T |?F]q攻OўEbżXaůtsEm-0OSZF'?:I>E7(ʽE]ex{9gW ?)n/72|5c tM3 -0Malbp]v -j52wl1Go8YdZp4\`^1FkVJD)""DDDDDDDRVJkc\~/Z{{=w{12y9aMY`vw?C}zCɢg )sUỷ=m -׭}LY!8abCW`?%S~-p?-0H}5:XoMEv9~qI];[rkQܯ,soJG9]ǭM;$6yF}d" WQg U:@[۵ܫQeQWů/șbG Ш9y'z?JvRT_cZ=O߹'}$N]p[&KWvlԻZ`Wuk5Lޢ}Gڜ&5-f+6it,d"\X!vl,TVyz:K~W>[?9t+@3&K:5D];=q}7eY[<Դȣsע][tt~WeGGh[co鿂ױ=3*O 㫧([,Oon˚}M]2(&s ,WSr]4ͻx.|AީE_X)'l@su;:%fF=+Oyk[.%= sE{jc]IFkf-| ~:O6zW]"rG{u:7__|i',[{|b1OxfKK |t-zs#=طc.U>[1ydS-Bťz:Brҵηӹv,0g;;ςo~7~^qpm{mn#sYg $ fTȾlZ`YWO>֛/%s l7zY!kלs[d=畟kFk3w_AĿ%x,3OŴ S[}f{ɖ|ԇp^<|)E+uk00a+K 5gf/{eѿZ`Y=KP]KoѻO;TJI!ļ̙W?_!6Ed"gC߁"tꃶ]sS^jzWu{VX"_a.\ZKٮV;nb lqy9g4/A{lyc ߧtWk-.ϒNg/-w@ 6ɘ3i^%0숽A;|-{z6_%d]S+/8߲Z)Y# |.8{F{e.u"͟2KǬgwd/}w=Z`^ #f-z..Zѿkxn) uU/|=V[;c^ȎUk֪t*|^$U#9/}o/i7XIsN XeW;;Є~2OߚK_>1,rְOn&_oIrZX*c5k=r]E1('XToN6B4vױwL1ksN+?$C9nś'٢T.7N{tFn d"-,jޜlGQ~do"ߖ*zsd{o۾EZ[}+y ><{TMO"=_K.??O_dOT~o,C_XC|'\*<]aޱNq5-mL?_qu~=Z` g%7{m3Yg:BEo~'[);+/E~O<譻Rcw'I|+ڧ>QoUfTy? }oU[t>}X2F:@n ߳m&-W{}s%5 q1B'ε#b! }Oki]L?&~=W 7^ sZ.Sw|S>~V>^&J-KWA?Z;,)&vGD}>ҭnUſ\Փ2ʵدs%h7+YTJ,C~1t"KN"'uE5 u=W7oZѿJFI/G%v+{o$sQYʏc9G1u;YԶr ,!|_xͷl>iF||\&)2.cd{^kn,0݅LX`Zi' ; \,] L6H/,xZkbc}>0$OO:,X ^?`-9c?725mǾX׵\bUU1bcDcFUqE]Uu]몺VEյꪪZUuUUU⪝|{Nƾ<|ON kZ̚K|tU»dd>fj&udxcխtNt{Irr{v-p$ b+4,re_3aâG5&5rVwg}gˬEa7ar +մE0}a;UOw7=;}ͻz*E|RYK|f,l"vk2?i5Æ-p0Us|!fSfj$z-ad2O˾c.MsO+5;@>wz܎Ym_[NzkI9;: jFʶJkI|VϽ+koX^mŸ1yFEЌ{6W,*9rn{r{ }R9f% ޵q:sDd vXSn {Ost+Sz\#gmX{n7k߱U6Bk7a rD:ùMxדEf=w ?kxC|$W:n1`ѮŖ(^ꗫiAݚ:4R}y99|ZEf2ncӎ`7S+ŧ^\Oh IWE5XExJlqKWПR-x ,z.XQ4TͫFW2KvΑi;䯎ot¢.hPX ?FWq@l+X#h6rD~O8LVl\!?,ΓzOɢ^,1goef"i⌴,pY֡[C43ZDzEݘb ߬\mC3myAuj9?Y#De /33cQk.YEr~S8o3,ư~n2?]g,iޥI 3]?GS^ѳd1dpo*OUMy$5O辕?{+,ΧJ?tZb]Tt swRq&}:_oxVi(τs9ԹQ0N/Y3٢k˷e^~3S('5:+]ڊf,WmLrM&:-SO]љ: PFhof֡Qol.Z^wsr+,ROr4go4+.::6jۉXdy/{빉oyuOqϽ>:n!#4O _k)ϑ3z  4z@ ݇o}У]w߇oܼHq{L|識hq~Jt,;b%gǶ}~~g\ 럭{6v֯+.^ѱȺ ·.e |~Y_CY|Y}kt_ }WUyWag/Oq?9{[įt&m[}?ml&zDwDNع~1yYFl ز2v9:|mܡr3v>Cg~OF4lݣSǾSIl]N}b( [_T;SwY979h1iٱLG=95x~&+w|®}r0_2ž!|Gr1f-rװAsϊܥYdq݀oZS3 lgΦyioçSf[Co|"\ =a&w)8{Nq /ya*ey}^u"g+,޷"S]xxɢ7r;~m|8byGdd/+-\1\#z 9B Y{G 7sxC[M "LUuӌWߵg{}$멷A}ZSY`);"=U]Oe<~Ćڤ'r<Z{ܗ.;̫w9Ӵ/%zi7ZgO%S԰>cw,X wWy'Ek)exh]oP9vY5WT7 ѹ^M$H+Fb{޶Oď!\=a35 L$QLX_EZ9dS='T[yȢXxEzmh9#Cߐz@y^HtCOk)OtC/ȣ+rrf 9w&ܡ֕?V[9ѿ^"~-j0rg9$4rO Q g3?5ҵKz73u8w]gs+uCHfɡ[Mv~3|:+Llu k8:Z-1~bQt-C= ~"x5=g?y=[`NNj..)(eEjcQFWE ~m@sn˜kwo뿀># ,=zͮLԇv!*Z-ԏ tX5Kz<m ZFơ; *Ϊ3|^^-x>c9 \X~=8mc_xTs{_6w}6;$ L=VfCh Ksnߢ&r&şY#|`4-xy^_-wC]e8?`o0Eآo9dB1=m;5:v,VElO"bS[7k%#/OO6;ΰ)~Aw.G>s;wcqjdי;.El"-Vƨ-z+S5}߻~s{X`]ad5C~ã?"l@'ogJH"UgȬ>A[:|Щ")>qgثaE}GWwudXwy,ޠ+8acOg>@N}g>a_8Cq#-rޚEҳAnǢETl{ddCȿ[cM:y1tOX?JlÞ߹"nTP+d+ а ECYӛ[# z_2zS2nX@WlǏ?\"n$Cc| kWV"khg.,;W?f~տ!w?e=9;7qe'z6b[Mފ߻x?U SU"Y.~eWX#C5YXTyJ?1Ts3TGewnoXİW@&z%Cvp= O _;w1s=?oϱ_gszCdr᫷XDOndM=Do[Ы0XԬJby楄jYߞ!kYoY}󪙏yUgmE .uq,0P-9,eTSl9c{rrfusk ܸMΰKT'T϶g{8K+? },jS3 焥S<[sovG?zJ"mFo_sD_%ũ|;L8~2x\]n_kw˸N,O7m򞝷zk޻OTmU#dKsvC]7krK!ycCfK]_C:pW`o'1sly^}E}^ƫȷmѻPn^ Z3צξdSwtt=g vGSՏEάXݙ76ɏmF׎ުc[_l]difkZ{ZED+D)D(Q"ZDl֢h1Zm6Z5\Zk^l?3m999##8m{Śػm"}ƹ?k |WǛ򯂍wg朮K٧:ؿ~q1)ʭg< $C3=Î/霫 w9 8 x,`4[AfmU$7njϥZvۜz$g#o:ܯ_Ƥ6X+ӑus;3&v&~WKOÇ8,|Ş=/u|o!w1|rj߈:ٟfzlZd_6j9>BeNd?l:r8sv~H, ⹌m=tOGtӳ0=̳qkal"cD!6"yy,틑m;<_{֨/k[D$ݗ#0Gr2#XWACr-29i޲3u0z{Z$Z<;ˬ䎫.SlG dˏؿYy.]{d 9W[EEi?k [}0Aetۏ^>_oGs2d `:`*=aUSU[?Cq|@z+<G-bUUEbmpYVE|>U%ScSZb=C|[Tf >=G׬=ſo?.]:9/zo|Ysӝݎ|unF$sF`P=?9HHnB:7#gϕ\|+ы<5b6y.米}6#zFF+ȜݽssDfDֿetIJt9H>}󬩠}c+ȨX "|/b]G ~Ad́C}|L׼Yάz"{R [D:]yW6/rY \Ӽo|;aߑosbd͉\OWx׿kP~H7ٹU\Z$[g}Zz)?<ϸT#}м327B{ث֍8B|_:k1 \r9W,auG=n5s(}|u<9˺'y>4g\O\֯عF$Y/0==쑮Zk|۹3!&8:n}?#y&1psvd.V[cq7˱n| "~~ЎuU5#kq3].ML {oELmbBltGNd_quϬcτ&E;&_`<濎;HX2w?w1fxw>Po3uwU5n+Ǒy>c{yl÷nGHyɫY3O#dz+o~ھ`_Zw?箳a~7x7W† y&]gSv)25WR(w}}[<.sഈsy vlУId3/,ak-|yۍl??B;7qNUUDUDXk1Zc5kckEZk+"bZUQqBUUTy|6z|w>- ldWjZ?~ֳj\U?VjTmӓj}\j=֋j}ߊW&M=h[D֬ȷ%}5t#X1}}8Yϣ;9߹gl{dU}j]}Zϫrq>%Fy_7ЫI|~u_CCuX8D5Iʞw#joŨ6̥kB⸄dYX`Ȟ)1 }#yQ0_`߻1qC^Db{%ޏu=$&--~rH8gCx=2z_$ks=!8=Σ+qww+??AS>9nBX𺎼'[!w`9x}y|db]u`$ W t}Bg4zI̥HlV̧ލ ΐq`"FJdت齟ɮ3F/,TՆ.~9ԑw&gGz9gؗ-c9@!ި>+Ш6f6Ѫlըˬ<>/Gb~ sCx݆#}Ϡ?T 9X5&~!2:8/:~(5c,jiO^kH}8k9Pݭ?zr9,EVb26dxLu\y9y"(ooo.}~lقOoL}:5ʵnyC]VGOD{Z"s]> > rzzN0nuY/eq'#kI&R;b$xF1f~okBz;F{'뻑4k>˅?|d|Xg"{|5yP>^#CD1h]W:bAV\kڜw"5Yg;I FH'9C<3f"=3z>M8n؋0XsZkRJ)+DDQ"QJ)J+ZZk5cck\|~3zc=y]7\ ^>Vuc.;_ϩa=υ)S*XܰgsEwй浕s{yutdop_7Xh[3j0f@gNkO5θaXsa-U2χy5wa!\c%5|{mcxsߡc.;7Ao%^Y`{;MyPJlst8*nގgqcl$~P?SeML9z53.F-)s"nxn{ ڷJl^U*3.{}|P7W֋ߡ+%>PO6mXlUs ]+v*3 ǾgsB9n){x{N*yQqc%~{^JٴZ_y\Y뎋cՕXN52h(Aד8k[~< `癲| [)ߠ8`{Gd6@s]|8==0;}^+1KE]g\cg-l]|mсfL,ܛo§Qlsۇo[Y*|me]gr)O>\ /{r(f/~OyPb Y3TK x7w]9# q e-9gBs骈}sYTW֬/Xs=a.W4Oy >b 6\5q9ceqw5;hߣk=wo9Ж>z16߇oWYcboڪQmp"=v*{@Y7y܇}_[|*kWKyZس*lwM?|~K_&nR9ku6ZaG?/T(gz 8*RG7Fq?v/q1^[b̕b}e f!w\6v@9/yr=o8=˵qU}\zTq?YmD5g#v^3t+E ""(1qvaKÞg2=#+^"{Ps=S`yn/ך8W Mly~[ϔ=cf׻ zM^:rko?8u S슘l[lnxeV9~x Y`Zظ ^;J}]Ϟ2*ʞTQ΅jJL9{tƈiN8@;yxAqD֩2 G.~o<8U]~ߋīQSs_{kW'w{ENm+r&2{~^{ksc \s#3mO>xcGX"/se ל:@:5yF8 ys%>[k/sK]b-^FYbM(kfΞpxNr^)q)aGޞiq".̐AWJ  ?\9*dw)kwWQ9J\뽾r =x*Ϭ.+ׇ5w:3xŷyܺQ{=t 7n:]%8.{^zzŬf5?s|?^!O؛t UK݂Ϻf=WΏ!%θ$&9}|1N>RQG{e.'C޷;tsV5.׮:!o \(Ur(罰%6g>;`m9gп&್)zi# Hx@L?ϕf|?-x $>^;QSݟ{+oC{bi:y fJC f| />%jÍ%~jYBkF_46R{]^r!2{7}${#!ya;žnO9䝣kǼc 1q]7 }oyogsKr~q,`\iy }fJ,~,׼GB~}ˏgsUb[w x͔ʵrlW3/օ&~ e5v{ms_f=rG;~8Q%{Gʚܺ*x} 3nMj|Ccp^Wѹ*ON}eme ?.tj%dK \;~lsyw=adǓ~8pZPUjUEU**""b "FĈ1F1ԈUUUqRUkյUV~XR몪kպϙݑٝ·w;@sQ9[R\ 5 coy]cRcx"_yXS y{r=> 5|eb/w jX\;soJ~e4ޣo:_ 9 ==OQn@|xH|xA~?|ntSt0?F.Rܗ C9Z#y|>1M?z ~}DsȺf|`-y5&gH,!X_"FQzgb.7MӼ\wy;;![s+5Y q\x!#= qo>qW9sb}a]o+S/ւc~#Wا<0ĵ*ĺڕ7 1_(~EWdwCb,}9A㝣pB1gC\΋eMaΒ?>_AsºY 4{s[w;9ڑ؆lb^Ux~X!q܋( u>cxqVs48G|]Xp~>Q|rD9m(]P>8q?q@qpn=|>;ICqMzoXN@ 2 uְx^<}{xY@_;[b/иAf9zg~ϊwW1![t2q ;1Js־=<'eyOSk ;d~ Ť7]S{(^:5U{0Gqd5ȱAp?׈Is,(ۚ~|٢ U5Y?m ʶרOEHfz iwمzs3me[9z{j~篘x|M oSe[/ُ0 I; l})忑8rx7amM]swʖ|z%ԼIcҕʑ~|~^ZUv!^-C)=e[Kϟk菎KJf_=Hr/zV/}TÇwo^_3G_;4'__/)S?yzi[R5Z/ ^1}κ|j48XO< FT֌V ʶb`ZW5$EH_Ee[ fm YpzӀ m jʶ8n75e[eÑ):R5lQ iMAU`|r?V!~wOO/S鶲ˉRoq=ʶH>XySl ZʶB>SYMz/mMlk5ygY|-j^Yo?O}v?q/t=^E_Fi=#Zf O3+֟\=(FT}g/"kdxGӽJ m^}uӽ'ݝ'K(3Z?Gtas/|OWF7cޛ e eN]}ׯJSuOvBvk}dE˳C"-TjAxZr!s! A@–jw5`/1C+;f?r7>iôlK h>+!h|ZcXPKb-JZZZeeC25``6XX <`fkr^Zo%iZ -j,bp0@R 3US p%bX[)ovNS?uXYFΨst<4UXlF" !a.~hcvBސ!eěs+ tM*Kt@:.%H_Yr5[xLfvlҫl(0 hZ팞ό&v7m`ʹSeUgzYʵRr@1(~}ak>CT.x<1\_9ܓ#V1yM:6TmEv+Fd^!KaPjGivi,kgGz jA ib]9ٌk{ke#l6 t9o!-|c|xG]{tc\w %1=j; |ԉK6 Pa%` h##?*+Y^@m A:f<pa1(kd`k v?b%QuY=uv|T! #ǟ`e}mڋ^ś9_A}#W(> o?z_we?FrW¦ XUN cm*{ +՘j\Uc6 D:܅X؅TDp} #:M@߁!0ȝTW|Glh_v|Ige !T|M0BPJ uvtĬTϯJ~GV'vvYnEC[z[1G215fC3yLh5qbhtt:4 <=~sP&␣BUӡ&@CˡIPT2T55\uoc" +,A| 0?yLy<~I2Cſ}6[<̋ uR-!.HD~ {UNE[K7?{ѭv|q/\$>sWNi n|(Fg u !BObIY_:k^u'wgӕH\C$nOU=- ѫgqz^(ӊT*Z78| 4D!^ztPA%Jԙ6yJT1X ,ZRdYiI7uYQZ@2bK@o֠>ZͮB]oU1H˩K%H̏RS`fT|SjzAaa)c&Q~AӊT&ؐx.9qF lr/uR}FėZpL2`{(\I蘸6qcbt“(# r|mvKH[iڟ`w oy =. L9 F5u]Dh?*JQTDz6Q!f Ch-BUZYz 4+ ư`:a3@T1z#{@חחmNR@*RYU*hGN;8o~y7CU,\ RaΪNi=zbqZpc>QwxW"U^POAUQ2W ED<1_i"]aHD2T'Nj$ldzt_z[GN7]KO*'~r6fa2@>0A#N 2ˤl (c b@'1`K@ʿR[$*jntYWK3zODi_`G&%C! ڇ ox v'hDRkGp ## quX,vZ:~S-3WrAף*p_m3+1qOkDEe*,5"ͳ3ʳ' /.LA~~W1f`6.^b46`tr9yкu=ǭMq۴hjc-ٖ70m9>}fKn>LFc)o'8NI6rʇx";MEr s?h1jg.0 F8G,T=wzӮvNOņaDXPէ|K.P X,QE"I)"U+RNTg +YĊiz&1z|)0C88^T!z ۃVΠ/Qه^޵]owׯ\Gb(އMRii#AS]$&ibT@B޽J@"*rQ Q)Ao^@]9s3̜31fS$Nz%zJ"z2Iiáj1kG/)G>.N y8e<J+f[ߔ=^&/EvHaϑ(  }>w>b UL99Q 6N3 CiA9pqNG֤<*GHߤ| puFSU`}bB3>\冐ήap3 z?)Se|rhZft1@:eǂ/2orWyE>XV\I'{qhGNl 4'?˕(5׆MAP;1@Fۛ5 |O*<ƌ}˓ʩ 8UQrOW(">Gq%fMϟ,),k)#'/X;UQ|Ilp4&rRk6tyB$+DQگIį>jl=htN7m~=aBh14YTfOE~.f8Nu:RqO/,"oS *:'35mr_`[{!]nxIu\3jԅ_I]8fyF;xq6o 'mj[xD0\ʻ˩>]cƒcUպ0N;Oqmƹ<߾'G)]܏фfԀ`VQu[v[lz]ۀt '[BU1zŬ ꫎9_Z+ǒsf0,zfT-!]wJQݖ,7V,~F>Zl5\*,^@n[?c pD2,Ί f.:HTX!bar%`2U\"qy!PTxTM-⢽k! gLBHr+ƛpm+Xfք9Q[hv֠lP\-!] NOQʙ$+HqlWZ:}BENqh5J :Tmt E~FT?}dn>m_:h+L*(c EEHBGfGS&BI2&Xib/cG6tE]6lzoVHY ӵX1vqqO G `ǟրpO0bqvf-pd=*b鴽^lC`+5Y& +z zQZl>#l"B=[XA^ZT-,rng*2WT6 ϗ\-Ya( ]lv8eQF3'Rũ苘t;|q"U;՞75Q)X:~S??޹ kISCb;wRMiLMǵ7z Oumk{"rw &Cr:c̗g.*tc`z^-`5}KtPbX BڟΦӴ/BBy`^r@h39F 0Y< hIրBC!dݯWc~&^˂ϦkkVNez(*2- UGCDUKCaEu:so{^h#n8򃟸}^O0zWOexs\Lb >SOK|(gG@:ơ k?.Z]NtVYΕҎE,B3Dxm.8V֎uNvaK-,͝sem~*¬[՝4ݿg϶G7={۷GrlYrggɕlh\HQ2Y_ !{M-͗I;դ3[PHB1N&i@M=P]Ū^g{hxᰤԣn Ks]yy|X{=xɃ:K'C;{JյtNgVUzw=7c;B~(?O|~?1+7N=UODkX;vhbb~,{ԳgӲ" wo}j{ZF⡋Fnf`rrϞ=.zg\жOǗ׶oe]P^.|#o40} ySMEQDKg354Tp))H`Mn^nݶ@YD'W7q+88AAI.';}935ESd_'#0Bh"JcL>BYAM,ѯ`k XE/a=P99Ǭ+TŬ3KupO]izM2v񼴛5= 3s6ߘGpLEzF}ڄ~+oiW皞gS{|sC_~}7ګ7\;vy,(,Jm*]Wz{?kݪ~nea9S)& endstream endobj 448 0 obj[/Indexed/DeviceRGB 15 320 0 R] endobj 449 0 obj[/Indexed/DeviceRGB 255 324 0 R] endobj 450 0 obj[/Indexed/DeviceRGB 255 335 0 R] endobj 451 0 obj<>stream HTOO |9j<@5i[0tI,J[x=Csl0NG\ 'ᠭJ;]2a[ν3Џ\Rf;v -jMϯ\qFz|U xfk\T:FC> @Eu2,# E Hv5ųQ1u(5dg^|(I"? .p endstream endobj 452 0 obj<> endobj 453 0 obj<>/FontDescriptor 452 0 R/DW 1000>> endobj 454 0 obj<> endobj 455 0 obj<>stream HW TSWYD6p ^T^@P@,!|$D6$A{lEEji+Kq [EVGTRsTA[gΙsfΜyw_0 KPI=Z€4ehX=ޅtj]ˍf<`gXsM=3;ـwr9+f_ t<=:q>R.)oMTQ͡l0ZtwH2iY"<4kLK0!wj#%==0~;z A%tB)bRCg.LC :09eqy\adX:&]&i@ H`F@ Nvv~amlB#)T5^|}˟G_ytR+(FqYlSM JCl$S b#y9@qN,aA~d5stTX,d,6NMɸ4OUBL&OWD0@5=9j! a蚆(IXg뇞9XKѹW1Y1+ {?<=dxsNtӰvZS״L7rvїy}2wdΪeh3˽jf?%,geOJoj(.pQTf-e]V㨕٥Rﷶvg\'O=SvX͘jum<Ͳ/Vo=]^ҷjqOmA#$$1saUsbea_7H`9;vc7SLPXy/Rz ":whn7\ZT}}2T[͕>(]szܫ䛱7Fqr2f,NDZi*(߶g:jK}x7ٕMG*ݚ/2o6e=YO -k]~)c7f4TE8w}חly<1ɩn%<>nfu:ߧ~驉ƫ}+&?u͵?%nJ*l6̯Bd A/2Bf1Π1B%*5H=a#Lڟ㱱H {5 3fIHBq2$Xg1l! V*KWkXlV1C#y-NV%й)M`5PhA<ʌ0t6 ( Pkl eaA9\3C)`(MՐzTz,q\AAd,l7EkXBA2bw|yt*3;2 h>8T"M=嵊yo}^+a|I֩wa26?wUӵ8?v>Z=HgqU{\ .@NGhϗpY{~o*k/LH͌qP77H6=i_$h릣i]e.A^.ܸCGo|wH *߯s-*jmg魘yk˭L_J۞쫂uNoJ y f\(O,&+% _VRiY~OOctBs󡙰g<"|$hOA R&hE[nU/NN=s%xHJ9vcUn[s=7ҥe'8ТE6fqam4f~1-<@U,}g}q U'f$aJNi[n}zWgZfa=ܜȫ@yYe~nww5yR*`Y셮\-9ӮPDɌ=XXc,$^CVb,=Klȳy qruKI8zx L5d:B2Hn#b\̈z#b> \_!:7DD=đ$/ K2l !r\5 '3$Y^ ntUR5z;V`M7 ƙqeFd2L-z# 9;'p A%N΄esEV6ݶL} ҩ.' mp)t,z" z 9a NbI4F<cG&\lF4TT`nܢۑ!.Ԍ!+1׵v}+cu2BtUxn/E.ڄ1|$bOwGcFrq:9#?1a!m?4j 'X"04XώB5 }5 HxAx5mnIcg=FCpG jT 1 )nI]z*oĊ9ݾF2uSiKEv+zVk!R1HMj*EB2wvm'crJV:ً{pƀ i"=ue9iTCyN/`7lNm)Dʼ-Xz-F>ԁ3Zk up^\q 8R錞pL[WkGݯ|,>|D&|W=ZƸ OJ-V.6WeEV>#[i-vlR:E892 vsU0'OrdTS,Ŕ2G*X:޷?<9.Ssկ&p»szȦ,ǃqOyj? b |(c?+o,]z̚JMmֺ|e毣]DA4;|'OR"޽7j=d>W1/Y<"G%c[\>}™ WN݌׺\uX wa} ɼyOnK,+ǜ7>S.C>|+ʲƸe^4-BL9 6YswCP7[_MjHg;dw ؟-guMr1T1@-z[Q76i~1o.tD[v=x3Z["p5IIQ_ޞVI U1HHn/K!9sm {gH>&(4[b>A (ƺ3 |mxx :P {!?55{6&%c}Vx\Dĉ omT"F^ E:KK 2_Уގmhz='涣wO" &dŎKz/ ɿ<=: {^TY c\J]%j) LsBn"&m f56!h=6}yznZy ޗA6GTjWe;%ۄ6ܰ1<9<7Ұ{|806vPыyui,3aLD}>~7'k?/|͇o~Y|YSK|([Js Kܒ~-oC8kNo=,WYӁxr o 5_uAm\Wܻh CV(8meDcر n VmH€V2vt N]C'T4~ LSGv: IۇNu2Nfbf%8N`{vWm2әv{?{-BƖbŌ|"Tlj4l>[Ƴ]Z2 -ZaL6^̚g, a{F0r!qD4!4 ! ͇.C ң4 KËmr72n0`Ie<%"҄NÚd%Q6Ų9y/Oyf+qW[(g@NE9d5Rf'e(Cc+M/]]0e' H 3hATfPA6,*"?Ex E|qm48 bb1#!Dw1ߠu9 Zcՠ"L1yq GgnY6ã-؍fʼgtE  |" tƻq3>UL0JWo{4Q.ǡq=9='"ڶ6 BtIB RL)kB4MRdz;/}iTuB 55H -RD隨c:s(CWMU;d;y wGGM3?s+V? ?%s'{{ڊgsj\6 7efb xOz`BR[X,GDFM0[KIKy%fv+Ţ`]+z ,Ro]*唩sPZX]FƵ֥mw5iҖߐɕ/@oyyz tzV]^^WVJPzĮ1X#tKESJdc`b)JR B\_*y,y+-˻:gB|fD֚)fXNن%ȯ!o+ɕݽMÇ̫~bY)OF~vVacb;[3f?jg8&ɫ;YS#$A[&A\HDqiyI HXՓ^zw5ǻ7Ɔ2Kz[1wN)]}v/>o}l1ְ덑G;DXvsg/ ObuV2}`b 8]*VUbk sb,͡R<$}֌*) As͢~9o&WES62")9MEOD#uuNGcr<%e5DGɽrbݣɣ<ŠxJ&1<Mad<XmMy9اW˹ð 6 !<QOwZ; AE> endobj 460 0 obj<> endobj 461 0 obj<> endobj 462 0 obj<> endobj 463 0 obj<> endobj 464 0 obj<> endobj 465 0 obj<> endobj 466 0 obj<> endobj 467 0 obj<> endobj 468 0 obj<> endobj 469 0 obj<> endobj 470 0 obj<> endobj 471 0 obj<> endobj 472 0 obj<> endobj 473 0 obj<> endobj 474 0 obj<> endobj 475 0 obj<> endobj 476 0 obj<> endobj 477 0 obj<> endobj 478 0 obj<> endobj 479 0 obj<> endobj 480 0 obj<> endobj 481 0 obj<> endobj 482 0 obj<> endobj 483 0 obj<> endobj 484 0 obj<> endobj 485 0 obj<> endobj 486 0 obj<> endobj 487 0 obj<> endobj 488 0 obj<> endobj 489 0 obj<> endobj 490 0 obj<> endobj 491 0 obj<> endobj 492 0 obj<> endobj 493 0 obj<> endobj 494 0 obj<> endobj 495 0 obj<> endobj 496 0 obj<> endobj 497 0 obj<> endobj 498 0 obj<> endobj 499 0 obj<> endobj 500 0 obj<> endobj 501 0 obj<> endobj 502 0 obj<> endobj 503 0 obj<> endobj 504 0 obj<> endobj 505 0 obj<> endobj 506 0 obj<> endobj 507 0 obj<> endobj 508 0 obj<> endobj 509 0 obj<> endobj 510 0 obj<> endobj 511 0 obj<> endobj 512 0 obj<> endobj 513 0 obj<> endobj 514 0 obj<> endobj 515 0 obj<> endobj 516 0 obj<> endobj 517 0 obj<> endobj 518 0 obj<> endobj 519 0 obj<> endobj 520 0 obj<> endobj 521 0 obj<> endobj 522 0 obj<> endobj 523 0 obj<> endobj 524 0 obj<> endobj 525 0 obj<> endobj 526 0 obj<> endobj 527 0 obj<> endobj 528 0 obj<> endobj 529 0 obj<> endobj 530 0 obj<> endobj 531 0 obj<> endobj 532 0 obj<> endobj 533 0 obj<>stream x[o\ǿb9 I081I E ?"K$ɷ?j/.ЬP!gs=?I▤u 9-)OYD%S6",jD\BG]bE#ɫK,-.ӛT6¸M|*m7]%5 lBJ^ԥ,*REC3ʢљMmSmj\47fV.]3%K;N-KɩKɶD%kl܉MHͺ`9]fo^J)mMYwSqܬQQm*~-6s3%K2*^jJUQܦvRqQQ-"MHw[F`C9On75 k(}F;iTn1dK LO$۹baTi|HLGk< %[o<ߨ,IQ-v vJ|`0"W -6ί7KttDi^D0Jm%9ybTd:bhѶ-J,/$в5٧MGӤtv"m:r;6OMGm3+$9ԣGl7o?}ݾ<{cV//fJX;,1V" meD'JY؉+aD J"Z'WRt%*j^UWJ_YEL3c}va͓˳nz3{7}m+ח۾/w_<~~qX׷.ʹx/l~؞_\}yEWv{w׮tc7/ۥg]j_5v1d0bcyoP.}k6O~=.׃ >Z>8|=N.G&k϶ۛvm=~=Erp[c?}|ml?|maBrx>kX߱:⧳;w(;9c+ow_YGkuw ^}6*ۨoR='p>{bky9I'q'Ck!iwk y}&ͣO嵳>מgs'}Ν }>w2 ɴ^)t'Kԝ}Vw>;)}^wr؝ }fw2v'ONeYmG I3N>;dsy's,}wY#0iIy'C睌}w2I#Ǟr|yrsvk͋Fw<=])@W[[g:Zvu͏WM/ߴf>lDtpΫO7ۻ7Yv^4~w{} O?~n5rpn|[>^l6{=^ܸOa|nm/[|3;zqስNxGVLuL*L*M*;."`@q {Α`Y`̣!apŋf?hvv6:Aļ "/*D(ńdnbBrBrBrBrB"YHV$+ɊdE"Yxܩƌum7tY4qq<:)SHB w}6~ 8(jØ^] .$5BX0UptȂHA ۄ`RS0>ǒNpB\9`3Ud?` 6{l&(A``sfffUlvmMpLxLdp3#x. Q!,*y,$uRO GApp)3= I!JB 8RѴ QGh.O 麎89HG8Ƒ0q$#a H&7֌OÚp*uh5 2DZG:+)Z$#0hȈ/Xʯo/ZTfyF@P@P`5[  X L"9"9"9"9"9"ٳOтh Gt:2QJ KfH ! Xb! Xb)#XLPHTP[%!|$tPd%##(2Gtȡ,#Q RHȘB21)q e"i "ؘ)Lf4S"-arPQAٖృgB y&y#gb77lB~^ XD6g9lǍ4k>T\= r-3 (#C2'2@Z@10ks R.`dQ3ӳcq6c5DѪhU*Z*s[P Q2]t婈rhe*@wޕzWiJ"tPʜT+uNvs(FbTQ)FbTQ)FTjPG)J-N$JyjJGVjQEZTRJ*e($;z>d||2J)*e+}K f7 hZ82\$rѴ8 ^`]@e`>:cЀGq@xT <(Du%+Q];x"<*񤤙)z>d5(D% /QxK^5QnI)DIdA" ))DGJ~{#Dp3M <ςy_"(R"(R"(RiHӱr;'I<#|ęǘbXmJrx?9`g*xIWW=A%E:5x{q"9" " " " " ҟ#*ҩ*U躀  .R@vD2!K03ȓD@#EgcY27} k hY HG (5̖&&{@ @ s1^x*@4z“9$'=)Q::H'qr1iVh= 血k rq!YM{Hv--`޻Z@t @t @ Ӝޕ$:JBi]`҄Zp* w(Gm8F 血 血 血 血 /v X( NGR:r  ĸ64pxmk`lllu4Z20t /59'' \s rMc@#ǀMtDGd1&DF wԹ1O\XqѤsq]GA@@?בe`u@syp n l j ><Y2 Z [Gu3:B:@Grƾ: :Էoxy0,PWFK){=>䍆SF)ytTHpH2\_'%"LeJX}AIEe YxVF}QeG XrA.[||Fde$YI3>߾,+! ͣ 8 1\r!x{GQy{8>M6"""x"pAAA^t~܅ bp#Vy(c>stream xW]o[7 +]-(E$ n4}3&^ sCY{ +P9")cLƚb*qI7U! PV 3 M*dbY=C$қ`Kd2 $g*JT%H ‘WS"K "\qf0W<\`NQ`X0$Atł9X0KP s]#۠U4OKPb/ȝ{}FgYV`yS-e2/U*}T%W|m]ouĜE۴.m@y ծ,dic_p=b%>ypCꅧa@ ?80??aǠ9~Y㧻Y rK+oMB_' HuRT'G9dDk xkh~dM_jcn΄T1zo,#g`hI(}_ rg];pkHPT!uHp\gpck%tsZ "BۍKg&E)\;voE+/x.xAocN~o{Tv?Am󗣣b8_ 1wnXlלa'Ar音 Y6ı6mk.}R+ܦpnՉMþ*jM:VFk̭ƿ)oH5 endstream endobj 535 0 obj<>stream xYMo7+zI$אC 0`ikDi:7V]82r%]T^r1G$pHc`U I٤bԊQޢu9+oZRdd^P"ڨ87kޠ5*iJ)-IF&e 9A+!@dViNzVƋ`1Y62d ȄY4b2 db [m d+t@X7!B=,~ Pe䀵3`#2Z0l9lHa2  |&)Fpx;EylzNw4at!d+:k a V gw$R yG]P`]гrv@p?{ rvx0 I6lád!|MVKr1OH[r҃PQYu2dIaD.r@dۀ P,`\$k^!2 r`6轊yt9_A7hUD(zaz};jZEμc{<ܳbnfW?eЯo`08k^JVݛE[-j>3^gtyo9{)@(D.m*@BKK|wALGU}{a'M'^ҺRI ? /ɲ7fRL|ƯS}t}n%$Kdb>o@Ӈ1znf]Gx>&kŽM |坱4T zKWӾcOo_a#u<<[dsm lUSX7=WLٛ3BjM[M~CցW+gҖ3:MMΎ~NVN$Ikˁ14kSbU\jSƶ˰&̑169f\?/ec]i: Ŋ}z֊,9]o͍nkMv"E.\ i*xb/gFՋ;'DQYg2HoޮϿ<H_7{6`Hyrż1>a{?g¾eѢ)fN'' 0 endstream endobj 536 0 obj<>stream xXmo7 +ڜ$zPlE/qS$=霸s]IGIQRHƚq @Q|%6TxHRML(g)ك:<~xn2&%6&P1ݬ)gI`BGekN 9eLTb8LqQ3#Rrbdș3 符y802$Ff' ^3*SΫ- G?; 'J``؃a Y̜]C@L K!sȞ0G 5eؒ0%r:L@f5 Ht.r)  !kʈFWu u΢F)v_fT _ iPNa_L/l8 bD erV{9/_oǯRW*JRꇪ>f=k>)[s3jF!l91>\旿xިhv=+Dxit|}~[|QQvTRn"K1Qٳ]pLoTWk~]Ca>"%_/|ze1łl#6G~+Ч./5ow緳rQQZq<^ٗᧅ'F7vwLua) $CBx6γw|u5-M܍֬Z5R|t57v aa~1/pL଴64k؂ZǼ]{RW"-=~?o>550^魿Qistxg[ݴXoCϵ\Xi\[zhWJrRi4V*x⹊*x':xL8>':'*!gX Vkbtψ{< UOQ,,x0>stream xXMo7+zI"F4ӓjo]( >Iْ-K|okGU(Q1 e 8)WVZrdPEw2)sE h"$)kEhZÊ xM1*62㿔Nrh^$('rrEڡ u_(r2"Eni5g`A?5,D'&32Z 0 )k$ cn #( #* # `, @€6l€TA9]Q9S HV#q$aI9 @(屲N9TgjNl QFsŤ@`#HL!\\s1 y1P1ZRyF Hzg {^zl0 ,=UF}FcȑDu^^B1+#ؕo˸`HأɋTVGﰀYR ;*ͮJUiW|me9XN˳u7[bEEţ׳.>M㿖B#=}mFkվc:ey6\JSK%22ֲꥪ^zꥪ^zꥪlۀk7 bM4eӔMS6M4eӔMS6M4eӔ)SSLM25ejԔ)S]XJrHv]-B4it:\n~"m,oq ~@!]l'o[[!?ŗ??tiI!~#}/2K}d>ԭ 7|sbjS]OП˒$ɌJW졋l]ϠS7zsg}Ҫ0?$vr=Wwd[Zmr_o^ԟj\;p.*3 ̀qE +W4 h@\рqE+; 쀸QP=Kr&PIGbz;6-޷YUw5_L(ׄ;z|:_nVf6:ŋ[N)oUxw6V.tduL6IJsl)a*isy{w{>[V>>x\q5O%S)=3{_= =!lR7a*0כ鿛,Ŗ{c}G%|N]y&?d,h7Kn[hvl=4N{hv;zX\m<4Mh4''>< e"CD9 -rhʡ)ZkUnUՌf5~e_9w'0uҫ XMϋ^6>stream xMo7 ^Z Jp5A:޺ulߗcAOy-)8\C )_RIʨ"S%pM*j9h +P拭jRr*ZW"ȡrj -5fSM~Y&ܔuVLMYMEŠE zhB>&?ȼ6Aj(E!h6GQ|dqؘ,nd%@tHm P@ץ*T2o hhc(٘ f l,Ku"1b% ud X)QL`MGCf(G&@ch1c 'm*J0XTH,*NBfU9u"J0a I}`eNE-H|X%j|MTf"ѪIFXHՊ*#jڗIZ'QVKi3ƤFQyaU4>eiS'd1K0G!a̶ WL}Hi9D$)Xz{sne,s}ǂ  0N~ endstream endobj 539 0 obj<>stream xX[oSG++odͺ]_Ф6A$ ym;dvrMo6Ooۗrm>͝Y?LB4͌QhLYj9CHi|[cu?5,u{՝6U:[aH:{^5j=;̏o1ԽxbscmVk㺗+_Qy-埛eJ51X{e׫ò{QwFlig,?%YVdwr4ĿJ[.?74d<寔 /<pjʹ)W ( Cй^4 Z_g ǯeYȄ~+wQ /jh[zy^W.:uaz0aaȗ8] jysqybz/Af.uo\~na뭳=2}=-Ɩ]jUD]{X[ < zzUkұ^l#w#x5QyqCth8Nʧx9P{n]rG;vHc|*rro4u>+墧+%tÉ+ߡci~jmpS}ߟe<2nH?ӭ `;H){7Yf7* UT+㹕׻zQ/J&!4*4oʉ2̌]Տ擡lOP}Xƒ뺱Mo6Cm֗]?c8t>stream xԘMO$7\ cׇ?J (e DY}rO@[U.?m(f]X&#.h9l;jP'R̈N}0#9/e).yKj\ʦ䊷Ι]".`ŠU$ uP1҈jdL[մ$2Pmp8dڂ_B 4+Y#窅edKĬ+6bX${A$P Xt}r$RVHm#@!0/ 1J6\H-Dt<fC8ɛgP4`XlKmL7(bQ&N5)Vψ +FB 16vyfq<#] j9: ''\+ U!aժIpW 1" )A\$Q̠nm+Nɐ p&O V2,1dE*x1$C+M@^(f2kV& 5욫XZ~iՊ.zcc_Z:c^l7g\ݹ:7X_o>7o6V?f}Y06y7\p?~VNW'<~G|anx1o=aOcH"ɓͺfrK.0P8iIyV;NⷭuWL L=bDLg٧}bN(KT8")1C wIxfFLٙOLIM5 ^"1vSh1Ą1# cgqPZgٷSFFg5~vl^$1O},LY`c䇝 F>0& 7ir!,Rx{BOۋ}AsO;ۋ}^(LjtND^(,Ρq,/J('r*/w7ꧻm㿡mDB@S:: X 4яϳB[wLm"R5ھ~4tne۸θz N Nl0Wz!;ToʼnVM .9lj+KyaTyy-T/q; endstream endobj 541 0 obj<>stream xYnGr쥪0 )ԍЁƲ`4h>zCʦ@s=Uwի^.lq!5_gbx9Y 2wזh KJcEe})&rIp&;Aeo2 *So}mbXI2|;_ V\{b8 ,Pl kb+DW#a#\ KӇ%A6 Y2S6a"V2dd3bk+ E}$A8H6I"MN &9 ይ&X9+VlU* bMڐ$=,8!`!bM:s;D_cGJً9Ka ^SۂAj̪Z$UdVC2UD’(W>2#=ĥZQI(9'|*$&,J$RiSi{ɰ<`acF00jVFnzqJy\hkP?ъ "TĀt~=F/^5WR q4Cjty音ftNƍ>.iajt>[|9GͧŲYWx1}5kWt7_ͷoj]pd=y.h w۫0ʋmSiӱvU&u.0+Ss&fiI`->')R1%#/C1(S)e}QYR壘̃TLi0I})?7)m帳ɾWL &QLp!*F)a0tJxL1r/N1;˾VL<ُg#w(&+FbzI}컰b(+7A*PsQLWbz{g}PWLP |f[“8ʳԀf`yspLxu|.J֧vBӯlz&][~5zt`>tH3T~kW ֥ub=߰YoUѪU'~9*sTQ2'eNʜ9)sRI2#JʜY?QVY2ge 9+~E2e.ʬM*\YolN ef^=G]jL /r}Adv?(ӡt,7E/vg.O/'].y]N%Omg ͐mmEU,fWMd?΀+subwŞ꽜_}| endstream endobj 542 0 obj<>stream xڬXn7yI"g8A- q>yP5AP-%e,]r\x%b*λSu%ƃ$Q8TZ@0+HN.YT6] RIpxR@` Q h+{%/ bR&ֆX*R)VP%Vh҆XAE}TP>*JVTՇF[Aw(h]PѺyvDl"!^qT5;d,HhCH>R2X|b>J4 ^QEq-RTEAWYa2蘃!2uܢ87|~bв jΑO JUAP(y @*})dF!(d>JXF[߉կF X0D]abUW '> X0P|T2%/i. l(DSAO^^h{q~_av:;o7r@|3%a|1tDrbo{T<5 f%֦ռQZc6oKX^?~Kr碴@#3BRizh c{Kq0&czǘ{{F= Q¨Gaԣ0Q({= q¸Gaܣ0Q(,(,_qV+/º~d&Ϳ{;;28v#1s0&Zl)-יh.l>pKRZ;O*rqbv|}ݽͷPʑ‘c<6^u8MD4ݴL67)ɖyeh9nNUbTO*%V)eOcͽ"u;_)r'w{6unzPx}q:@j.v#va+-C[?[n:X)Ž/l|_8yWLJY<24MˤݰғҮ;M؇stۖvcB~-YDs+ o4P[aزJ *۷Y˕Xɋ-ضlW8YCV-d/iSXeYF")(ߝVShÄ8aav˰Ȱ0ߓ409 i`Ns[uSe]S%ďSjmxtvxj pr桜9odf9F-w"dgɓ-c>stream xڬXmo7 +DI[[1w p/ څ3m_.]?y|yvE,OK x㒀`R4P$㣈g bBdlMt3G ZޜA L'=4 $A@6 (ɬǂ ]j^p,P<#Dj}DQU ȺQ@K:{6g -(ٞ~#Y!# "DeBEYBE3<9 đGrbtBQLBB:rg8~d~F6;R ([49$H8҇gBHyKI9NA ґ ґ2k#tD:JMQQ2%Q PfR#BS:P8H,R&Yd"^b !N67ȾGHf(Dv,t$2"'ȒElFabZBY H()C y/ d k^S>WՇb O#2Ye`gʛ7$Wu;1ZV sXaV]OfCV[]N!#F2f6}MN]{߇T> ;h8%J@IƕۛͲm]Nīے~4Nr%r5Q{֞"1^>ŕAsaO4JLkюmΓCM[cWCkNʥ:l8Tkݖ=dCY8jʃzh=dKyx퟿q/AhAN@rQq)PQ r='ԃ{5h/ 206ssoHC8;JJ΄rkXqMWrn$ g]'h?O,؉'s~x<3؁ ( 4]RhO\{m𔼚6.8tq947-ϸc6-H6} "X8(h ₶-.h ₶-.(sTQ2Ge9*sT̨̨̨̨̨̨̨̨̨̨I2'eNʜ9)sRI2geʜ9+sVYu&GQgrԙu&GQgrԙu&L^YPT'^uyUW}IM%w"Nd,lwQ#!~$hBW[Rٴ\>o`}]{DKO$v;KZ_C6-=d#CaGW\0,(pv9:x4I(xڐlϰ렙5 IbV endstream endobj 544 0 obj<>stream xڼX]oS9+x%IRV i>BR~ό4"1]xlcBHJ+BV>߈F(*yHtii! kA$(0*jnIZcQ)pW*[rhOv !$mkK/ ^7Cbɠb#XÈo > )xF- yՔeΌ -#Q{eEi"*KZ% ' |H3 ^Q`# G䵉>ɋ|$a E BZ 'W: Ra LCPr()G ؇y#fW!̥(%>2/wtA&b+(E$ MαEdYHeiɓ $WDH(J$$k'#G/k,jA/J҆adFXo$ ^"Uh<6 QË8|H/Q{z7Ϭ4] oF~ sɉX:X\{M=`Gtyllsyj0~;|-n0Ⱦz\=5GGؖKCE rm23~~fso_#y-bRo_;2haL[;9RɑN;9 65[9#66-ƶŸ%LKr2-eZ`?e~=f1z3]vr== TrFQ9.J_-tv::ؕuvܽBa ރ |:%s8}es{2-t*; / k/va q8F=BG)7_Ɵ:>IDtɀK՝hu/WV0V}+KH'aW?i~v}R\GKG[Yl&9-!{Qޣl|;]]f{HV/YdD*442/y5Fټd[ұ/5;:8{^mpۀػs)?p̨l  +cQQnK(1 ?㩻hPo;Rqh"ܞQ`]g\ wU<1C[?6 w9i#UBu{Y*Uѻ; wǁn~Ȕ|Z<,V~ Ye E 폳ݴZv\2)LI~ Jnz}ƺF>n}j kkkk55k +s̱2ʜ*s̩2ʜ*s̩2ʜ*s̹2ʜ+s̹2ʜ+sDc3Ezfq*|J>stream xڼXn7}iT,7mIȃb+QE MgKiW/u"]r.9CĐV&|ă`ɁU H(+r, *drR"f=I+~0*iVsSY&'jGA6NFcHC F$/N`eӎ6xŃ hVVOZcdصce)k!Au2 ʒwqJY}!ٍd`#xAxEFkPe9@Hldg`#AI9]$2PdxD*Y-FHEniQK%^ ʑF &Bh /^9B`A?ѳ l',Sx ȉH3yѤ2@FVNe$"U"I,YAצ$g() xa $U^;u@L[#1&ӌPs$!Qk}lD(4Jó@ ۀ QϞ5iOV_7o9\=?I ?泋%渧>~V˾s=~d䟳^Ȯl!FLJ> s&%GlJLW|p}'dNQ}B;7w`tWde=$#MBPcHRN⑊D 5 b8"FqL:NQA՗g-vpO80 uOb^g׫ϳE_k'd@nV 9X}[7b\+=͋Ebv>fXan+[RqDS% T+HEԗcU nctGFJfBx82[VԎ8-.tiur ݤnW;l\.ӿf_b]*IrՒW<ѝtnV4>{6^Y?B6#d>Z{& N-BUW7nq3%.l݁3gW.Kɔ%]{2BZp7T:SnNrT{ݭǛ[-qcm8JE?NKuj;aWSC~o8JzzUAtRjX5ly׿>}"yvju>U[ڂhZ[PRUHU!UT'lS/.ffOۉ}wl5Tik؍\ CnwtJ6*z! Iλ} qwӗzr& `[xS`:&!A{H/R(x˭`C%ѥ)zQ[6$wL+Nx1 endstream endobj 546 0 obj<>stream xڬXnF ݴ F> ~PlH̐#HLrg\vvgW&Ǭ298L*%9|" .GI 2U J*Vv*[OU"`\;7eem&_] 0 (פhHj]+Q4Εv4 x@dh"ZDu咲hJAӨ`ɚ|&6kJ (Y gS3(WzbYL(JlEJq?{ef#U%IV7(HYiMok}XNVzC;x-c ڿmmu;ZMw`0LWo3}~^]U7z8n[ǻ#=_̦ ="? I՞Rq.){8`rf:4NED%lmafԇC+]]yKCo1Aӯ4 fzE3Df3CחԼWfײТhQT\ Ej3G= ^}ZQvIlC?'wN6OA:j>A4S#7'Ә~~/#jN#-$ ( sH%[B0 a,Ysf!DcoM&7t pH&ļuC2c7z騆a˱OCJCT0l;N*`f̬ANmѻuYat{}/!äo [g+z-tD?a]ݷpԲ7)wr{WK^!`dVrC6kFGX`% ֌5{w=%,/]Cz+99\~ t"MS6H㇫G3 M[ᤸSciAAyi1AZLDa9 s(Q0Gaœ9 s$I0'aNœ9 s,r-r-r-r-N;v"7 /nxa f/^0Br~[NMi]g(֓6U69~Ǐ;fljkf`ņơ.6:~lo@WhbT=fzhh$ lJ갤! 0"op endstream endobj 547 0 obj<>stream xXMo7+zi"~A;HFD>0ȅ#ͿVZҮ "qfڕ5b8oRI Q7H0>Y@4lu$:M +[d#drXٛxX=$8Aqcp"+^>Í"Q."n q⁒x4u9E,dD@)Ki_~er|M,Ύwu]]xWӁx4\X'p]Iٗ7KݲMd4@Wi4}{|9pVbukr6v|2]>5ǟͽGؐl$n~x7'iqC"lfW7k,9k"R^&cبB||]`m#d[iCM˿,MVmw+-oIzaQq^2~J7̸ƵԎj񍨚&)nѴ-o: !h Bmi9oVqT}wa?}ߥJ(]|wߠJ1cP3?Uj&l^(Gk{ڵGAes[FZv$0O[×~_ba:XYxY gGe,%T`~,n%խgR,㚫;.,yg}<1yW}Xf_߾oȐAz K--H---p-(G6 bmяEBL7wD>uo#b˷*hy{ծ^mZmU__t#-y_EhCˬڦ7~3c9NO:䕷}׵xcu笵  endstream endobj 548 0 obj<>stream xڼXMoG +5|AI FbTIA7Y2dH}ə+YҮ9ئw!qK>*P\A+(Th0.=66+;e! ^y :DBJ*ZZ%d*奈 ahkHJY -DH$%ؖ6ְE[ $2r"UwȇOG%!ے8D>#It,sAϫ"L-g Y"e KqCDf2 mr~@KqAz@Pޱ-T_oN20T4.)TY|Ƶ2mv)9,C:|tt%hO%| ?$|xgt~F[3!dBG)?#qD>98L Nh-䜚DR Y,2$edʚS Z>2gKuNbI!|WGȧ@o9It^%) $r%^Iʻ'+!?Kψ>.enxmyWIJ!煠<2i1#{>$ף FPn~Gץbw4.ː޼ɖx9ҞlN'[$=9jW_10ɗ(-K QTD"F+@/^ 0le15qu])#ߧfű󦛕;:/C 63fz;[ܑɛ-]&ByӟM7뻈&%50ZMSŕ7tZ.I/Ey%'OtA=n!<$li='b4^OW[qU3-Q7%x. Ă=_9O_U*f+ 5fG?xYg\M\>|hu/jBs#Ax pOHPmU)[Hy<wXD|OX5\gznq[1;wc,;;wbl+ʈ`Ep"xn6M[S5\62^u:Z_< (%~i8b#v;bj#1xĔwߧb!lLktqdv|R61'N>stream xڼXj\G wg4fB--ĴSCHM b\hG&`\ڽ:ґhu,PUDwъ]wfB|YJ_ٝGym Z6[dΓʘ<{lx7;KYZZ=`O 0oX N:bҸb1,tIi"cu!zkZ@akGEiSEeSEe%X-%-Fp7 񣆗.ìVE6gޑ]t ^-e9 phC!-kEW{͈۩&n᠃.)iǬ +B՘"TVefӵ?Nc8ӈpn ȱqAl$uy[a'![ X&A 2f tZ2ŊQXdp,-PS r ;2B~2&O;(~ ūG8j\C3\45V3hijE\T-."~ u 9x[tc ޝnNwonOϧۿJ_+5E98NdY_E8 \/8Hq-8 g¡I\ȳp^$ H/zl_(5Y_ hvZE}i^t&Ͻ^FV/52(952sD+2}z3/2zzŅ^f/325 l_Fee2B/+9G4B/+9GՋ^B/ ݯ0 0+lwY`Mk5 r_Ovlsr&݁)(ʡr((wyhMc>f\טGA02Www^ɓΓcwlZjL\wd{ݝWc؝;ם'>stream xڼъ\7 _O-ɒ BzhK\^f a',[h޾t}닙g;|;6K9|ty{/]?<}>?󇯮_3T?3KL7`-ge \ve gm 7'X;: Lgu ;1tfn;1t^&5lu Y-s7: ki:?j:u 3r9 ,k 6,wk>}5]Ze?pgצ"Mg;ӵ1t&Qů%tm ]-Mg;z3]= 6L'cN`9 6L'c(O೦lg:CGttt6L'chΚ֦x MYt3i:>k:^Nw1t>stream xڼXMk$7+\C*U>`YpMbicbOUi4c!B_{R=f&`λ8?y!)ɀE:v䣂( d9 %o\ l\A+r %**jFUC((z!L꬈CI HA͕7$93y (dH4 *EJ )[@YNP!6T*i ˤ  UBِh:*VKQjh:ZV!DQU] uT"HOOb_? V(՟?ECѨPT+$N՟?̎?i2w5D(JR(rJ)kωȑ劤$c/$yD6vA!edCrT cqDC!HLD!(!!zӈbMF0.ӈ"Fd4$L#&ir&=_Nr0\xۼ<>M7nho?/?~}zdҳlb@nܘ1sc̍37fnܘcc96ؘcc96ؘcc95ԘScN95ԘScN_K_x;P~upOۆo޻?rʯ_n/;{|xG$iIARFCX2$0$0$0$0$0$aHvÐ! Cd7 n0$f_ =t endstream endobj 552 0 obj<>stream xWMoA +zie=R Ҧm"@@-zDdm^7{k@jA6Kf (PV&A+``8fD,K.lT (-f`c?<ՄniK=&/@GK$@[|Dbh${i1m$dB*0i $amT%tB6!ZgQ%A$E-Li'EWUFx\8PT˺()IcfQ" faYXTѿ"uFdaYX\O,_hŰUu98YTx0'uxk1hA#M!r>+6yFʠ [i5iuJZ|NAIJ~lFճry1Yu@J}['qBX5 dZO'vnvqg?iܕxG՞W7/l6``iJHZ>`wHskF|CޯzΩ`ijF0P{^K9So+3N7z+e7[L/ endstream endobj 553 0 obj<>stream HWmo8B_h?lwY@mM⍝z KT#yeߐCYr6 "9< ߼ŲOf㋋Qp^UƦXy0ZU:)7fe#[ۦV)|:+8[yS5I#rE|(? dNvӺAjwIQZRݩuq>8 u_7%u{4;>5سOSX\qfeY5 MV8%8!$ubU4Α;5lai̓ hAU=_Weƾ=M6ww>\3pلAGH.Wy~e8cy]57 nae[>]5rUխAݎG3m.eBI5_neR-V5'^?oغnŋd(2Z:Kuzg9? /үgŦ)V+VO:'.bÚi!q/Sf]O/-La` Q>ҋ2N݀=>YMU2 酲f734:T>kfZ Jz-S&qzMRfeQlڪR~r ^E!m!xs6Nʦ8YF^=~bt`XrݚjnEj ݰMr-%QRRW0YV D` iX 8va-3W%u27)$mڲ]y?Nlώ%}[ٷo;^n >.}*2z=+^} aAy'8T2 7tSQCB+ ) yN[jdCPRJ:nK+}pO0'Y/I]SA!@'Ot=$%K^Z&jg^U?5NuwؒeEڰYjJ$2CqޖĵfmRMگ]&3 ;7fzwÁeӬy|p|Tw5\z mή.b<9L'sێȷ02@>L#eV6}kϰX2_|R>w^s\AŴ=h Lo.+lNA˳ҧH=($EرIʈmrbJY_ʸ6w_>3$ y$e|GGt[ų@$nBr(Z'7bI@eo:^o5KzXTV*U}<PПH[yu ZF6þS ȫ"}Ƃ8DQ8b/Ez@IDɬu?LP&R?2G.8Ij kE^lhL@t0637\Z9_h dX]r-cޞ\SC ޾AqM%fGnzNWuvc>?'U|,Wg'WJۃ+$s_cJ#^*zeO5U@M5^`&!onǗ@%L۳f*·f>GGGIОV{}LԁyY-lna3n'M {cیr4<ߺV C1fۋ]3It#s8"7*8Rwm"9=hOb9fOO_/aK3G![@ljScOp"/?+13W2a!&vGgojb24HM[ToD̓CaO>H9&Kډc|q{. }Fq37zw.R'kKXNTfB_I?\(Ğ?HU~os?dlļ˿1zoOHE}D0CvЋ 9r4YqÈr8ވ }ˑ 3ִ./)#} ?*t1?;W7XK;9ԭF.3m>bV}xqzꝚ!#Yk3A{Odը>D;Q[biGc 04bJ~Ayn/Rs3͘zgWuALHQl-Cߵ=o*g@5`{[ׯ|dl7CcOmIް=Vƨ =<.άQgC)[T}YscLTĜQb|gϝNj"m#Ĝqak!^GAN˺u!kW3O>8`c?RZ r}`gegPZY\ZTX[ecJ-)-S6:ADĂS3R 6)[X@)eɩ\c endstream endobj 554 0 obj<> endobj 555 0 obj<> endobj 556 0 obj<> endobj 557 0 obj<> endobj 558 0 obj<> endobj 559 0 obj<> endobj 560 0 obj<> endobj 561 0 obj<> endobj 562 0 obj<> endobj 563 0 obj<> endobj 564 0 obj<> endobj 565 0 obj<>/Type/Filespec>> endobj 566 0 obj<>stream 28 ManualJoe Chuma endstream endobj 567 0 obj<> endobj xref 0 2510 0000000000 65535 f 0000097118 00000 n 0000097367 00000 n 0000098063 00000 n 0000098211 00000 n 0000098359 00000 n 0000098507 00000 n 0000098655 00000 n 0000098803 00000 n 0000098951 00000 n 0000099099 00000 n 0000099248 00000 n 0000099397 00000 n 0000099546 00000 n 0000099694 00000 n 0000099843 00000 n 0000099992 00000 n 0000100141 00000 n 0000100289 00000 n 0000100438 00000 n 0000100586 00000 n 0000100733 00000 n 0000100882 00000 n 0000101031 00000 n 0000101180 00000 n 0000101329 00000 n 0000101478 00000 n 0000101627 00000 n 0000101771 00000 n 0000101920 00000 n 0000102068 00000 n 0000102217 00000 n 0000102365 00000 n 0000102513 00000 n 0000102662 00000 n 0000102811 00000 n 0000102960 00000 n 0000103109 00000 n 0000103258 00000 n 0000103407 00000 n 0000103556 00000 n 0000103705 00000 n 0000103854 00000 n 0000104003 00000 n 0000104150 00000 n 0000104299 00000 n 0000104446 00000 n 0000104595 00000 n 0000104743 00000 n 0000104892 00000 n 0000105040 00000 n 0000105189 00000 n 0000105332 00000 n 0000105476 00000 n 0000105620 00000 n 0000105763 00000 n 0000105907 00000 n 0000106051 00000 n 0000106200 00000 n 0000106349 00000 n 0000106498 00000 n 0000106647 00000 n 0000106796 00000 n 0000106945 00000 n 0000107094 00000 n 0000107243 00000 n 0000107392 00000 n 0000107541 00000 n 0000107690 00000 n 0000107838 00000 n 0000107986 00000 n 0000108134 00000 n 0000108283 00000 n 0000108432 00000 n 0000108580 00000 n 0000108729 00000 n 0000108878 00000 n 0000109027 00000 n 0000109176 00000 n 0000109324 00000 n 0000109473 00000 n 0000109622 00000 n 0000109771 00000 n 0000109920 00000 n 0000110069 00000 n 0000110218 00000 n 0000110366 00000 n 0000110515 00000 n 0000110664 00000 n 0000110813 00000 n 0000110962 00000 n 0000111111 00000 n 0000111260 00000 n 0000111409 00000 n 0000111558 00000 n 0000111707 00000 n 0000111856 00000 n 0000112004 00000 n 0000112153 00000 n 0000112302 00000 n 0000112451 00000 n 0000112601 00000 n 0000116328 00000 n 0000116382 00000 n 0000116436 00000 n 0000116490 00000 n 0000116544 00000 n 0000116598 00000 n 0000116652 00000 n 0000116706 00000 n 0000116760 00000 n 0000116814 00000 n 0000116868 00000 n 0000116922 00000 n 0000116976 00000 n 0000117030 00000 n 0000117084 00000 n 0000117138 00000 n 0000117192 00000 n 0000117246 00000 n 0000117300 00000 n 0000117354 00000 n 0000117408 00000 n 0000117462 00000 n 0000117516 00000 n 0000117570 00000 n 0000117624 00000 n 0000117678 00000 n 0000117732 00000 n 0000117786 00000 n 0000117840 00000 n 0000117894 00000 n 0000117948 00000 n 0000118002 00000 n 0000118056 00000 n 0000118110 00000 n 0000118164 00000 n 0000118218 00000 n 0000118272 00000 n 0000118326 00000 n 0000118380 00000 n 0000118434 00000 n 0000118488 00000 n 0000118542 00000 n 0000118596 00000 n 0000118650 00000 n 0000118704 00000 n 0000118758 00000 n 0000118812 00000 n 0000118866 00000 n 0000118920 00000 n 0000118974 00000 n 0000119028 00000 n 0000119082 00000 n 0000119136 00000 n 0000119190 00000 n 0000119244 00000 n 0000119298 00000 n 0000119352 00000 n 0000119406 00000 n 0000119460 00000 n 0000119514 00000 n 0000119568 00000 n 0000119622 00000 n 0000119676 00000 n 0000119730 00000 n 0000119784 00000 n 0000119838 00000 n 0000119892 00000 n 0000119946 00000 n 0000120000 00000 n 0000120054 00000 n 0000120108 00000 n 0000120162 00000 n 0000120216 00000 n 0000120270 00000 n 0000120324 00000 n 0000120378 00000 n 0000120432 00000 n 0000120486 00000 n 0000120540 00000 n 0000120594 00000 n 0000120648 00000 n 0000120702 00000 n 0000120756 00000 n 0000120810 00000 n 0000120864 00000 n 0000120918 00000 n 0000120972 00000 n 0000121026 00000 n 0000121080 00000 n 0000121134 00000 n 0000121188 00000 n 0000121242 00000 n 0000121296 00000 n 0000121350 00000 n 0000121404 00000 n 0000121458 00000 n 0000121512 00000 n 0000121566 00000 n 0000121620 00000 n 0000121885 00000 n 0000122079 00000 n 0000122229 00000 n 0000122379 00000 n 0000122529 00000 n 0000122679 00000 n 0000122829 00000 n 0000122979 00000 n 0000123128 00000 n 0000123277 00000 n 0000123426 00000 n 0000123576 00000 n 0000123726 00000 n 0000123876 00000 n 0000124026 00000 n 0000124176 00000 n 0000124326 00000 n 0000124476 00000 n 0000124626 00000 n 0000124774 00000 n 0000124924 00000 n 0000125074 00000 n 0000125223 00000 n 0000125373 00000 n 0000126438 00000 n 0000126492 00000 n 0000126546 00000 n 0000126600 00000 n 0000126654 00000 n 0000126708 00000 n 0000126762 00000 n 0000126816 00000 n 0000126870 00000 n 0000126924 00000 n 0000126978 00000 n 0000127032 00000 n 0000127086 00000 n 0000127140 00000 n 0000127194 00000 n 0000127248 00000 n 0000127302 00000 n 0000127356 00000 n 0000127410 00000 n 0000127464 00000 n 0000127518 00000 n 0000127572 00000 n 0000127626 00000 n 0000127956 00000 n 0000132293 00000 n 0000139011 00000 n 0000139243 00000 n 0000139417 00000 n 0000139719 00000 n 0000143543 00000 n 0000143833 00000 n 0000145628 00000 n 0000145956 00000 n 0000148753 00000 n 0000149081 00000 n 0000152815 00000 n 0000153119 00000 n 0000156674 00000 n 0000156992 00000 n 0000160033 00000 n 0000160339 00000 n 0000162318 00000 n 0000162657 00000 n 0000166032 00000 n 0000166402 00000 n 0000166465 00000 n 0000166835 00000 n 0000166898 00000 n 0000167268 00000 n 0000167331 00000 n 0000167677 00000 n 0000169491 00000 n 0000170369 00000 n 0000170739 00000 n 0000170802 00000 n 0000171172 00000 n 0000171235 00000 n 0000171570 00000 n 0000173333 00000 n 0000174563 00000 n 0000174884 00000 n 0000176337 00000 n 0000177494 00000 n 0000177844 00000 n 0000178698 00000 n 0000179105 00000 n 0000180552 00000 n 0000184539 00000 n 0000184860 00000 n 0000186435 00000 n 0000187988 00000 n 0000188323 00000 n 0000190735 00000 n 0000192941 00000 n 0000193308 00000 n 0000194370 00000 n 0000194499 00000 n 0000195128 00000 n 0000219595 00000 n 0000224582 00000 n 0000224925 00000 n 0000227449 00000 n 0000227564 00000 n 0000232935 00000 n 0000233278 00000 n 0000234845 00000 n 0000234944 00000 n 0000245075 00000 n 0000245396 00000 n 0000246853 00000 n 0000248342 00000 n 0000248722 00000 n 0000250844 00000 n 0000253636 00000 n 0000253979 00000 n 0000255349 00000 n 0000255448 00000 n 0000260268 00000 n 0000260611 00000 n 0000261497 00000 n 0000261882 00000 n 0000280368 00000 n 0000280658 00000 n 0000282694 00000 n 0000283003 00000 n 0000285018 00000 n 0000296740 00000 n 0000297044 00000 n 0000299262 00000 n 0000299593 00000 n 0000301204 00000 n 0000301546 00000 n 0000312239 00000 n 0000312561 00000 n 0000313782 00000 n 0000314491 00000 n 0000315974 00000 n 0000316283 00000 n 0000318431 00000 n 0000318912 00000 n 0000319221 00000 n 0000321496 00000 n 0000343318 00000 n 0000343597 00000 n 0000346104 00000 n 0000346401 00000 n 0000347850 00000 n 0000359970 00000 n 0000360248 00000 n 0000363382 00000 n 0000363673 00000 n 0000367349 00000 n 0000367731 00000 n 0000370759 00000 n 0000370858 00000 n 0000372043 00000 n 0000373216 00000 n 0000373550 00000 n 0000375386 00000 n 0000376666 00000 n 0000376956 00000 n 0000379711 00000 n 0000380015 00000 n 0000382869 00000 n 0000383212 00000 n 0000385753 00000 n 0000385852 00000 n 0000388058 00000 n 0000388413 00000 n 0000390971 00000 n 0000391070 00000 n 0000393186 00000 n 0000393476 00000 n 0000396778 00000 n 0000397135 00000 n 0000399407 00000 n 0000401276 00000 n 0000401604 00000 n 0000405240 00000 n 0000405600 00000 n 0000407324 00000 n 0000527399 00000 n 0000541607 00000 n 0000541954 00000 n 0000543744 00000 n 0000575526 00000 n 0000575816 00000 n 0000579019 00000 n 0000579309 00000 n 0000580933 00000 n 0000581211 00000 n 0000584099 00000 n 0000584403 00000 n 0000587313 00000 n 0000587605 00000 n 0000590165 00000 n 0000590469 00000 n 0000594057 00000 n 0000594347 00000 n 0000598190 00000 n 0000598480 00000 n 0000600909 00000 n 0000601199 00000 n 0000603562 00000 n 0000603840 00000 n 0000605450 00000 n 0000605847 00000 n 0000625931 00000 n 0000626184 00000 n 0000626558 00000 n 0000626823 00000 n 0000647258 00000 n 0000647524 00000 n 0000647954 00000 n 0000648422 00000 n 0000648546 00000 n 0000672865 00000 n 0000672910 00000 n 0000673151 00000 n 0000680567 00000 n 0000680682 00000 n 0000704779 00000 n 0000704996 00000 n 0000705265 00000 n 0000705636 00000 n 0000705894 00000 n 0000706195 00000 n 0000742574 00000 n 0000744106 00000 n 0000744699 00000 n 0000745069 00000 n 0000745249 00000 n 0000745298 00000 n 0000745347 00000 n 0000745396 00000 n 0000745445 00000 n 0000745493 00000 n 0000745541 00000 n 0000745640 00000 n 0000745779 00000 n 0000746121 00000 n 0000746363 00000 n 0000746614 00000 n 0000813950 00000 n 0000813998 00000 n 0000814047 00000 n 0000814096 00000 n 0000814401 00000 n 0000814655 00000 n 0000814857 00000 n 0000814990 00000 n 0000823900 00000 n 0000823948 00000 n 0000823996 00000 n 0000824044 00000 n 0000824101 00000 n 0000824256 00000 n 0000824421 00000 n 0000824512 00000 n 0000824635 00000 n 0000824801 00000 n 0000824961 00000 n 0000825153 00000 n 0000825244 00000 n 0000825367 00000 n 0000825601 00000 n 0000825743 00000 n 0000825874 00000 n 0000826003 00000 n 0000826134 00000 n 0000826257 00000 n 0000826419 00000 n 0000826528 00000 n 0000826643 00000 n 0000826793 00000 n 0000826934 00000 n 0000827130 00000 n 0000827249 00000 n 0000827368 00000 n 0000827524 00000 n 0000827648 00000 n 0000827773 00000 n 0000827896 00000 n 0000828005 00000 n 0000828126 00000 n 0000828245 00000 n 0000828378 00000 n 0000828526 00000 n 0000828643 00000 n 0000828827 00000 n 0000829042 00000 n 0000829250 00000 n 0000829434 00000 n 0000829570 00000 n 0000829750 00000 n 0000829895 00000 n 0000830033 00000 n 0000830178 00000 n 0000830354 00000 n 0000830467 00000 n 0000830633 00000 n 0000830761 00000 n 0000830943 00000 n 0000831073 00000 n 0000831247 00000 n 0000831409 00000 n 0000831540 00000 n 0000831677 00000 n 0000831779 00000 n 0000831889 00000 n 0000832008 00000 n 0000832107 00000 n 0000832213 00000 n 0000832337 00000 n 0000832436 00000 n 0000832550 00000 n 0000832664 00000 n 0000832879 00000 n 0000833035 00000 n 0000833203 00000 n 0000833299 00000 n 0000833415 00000 n 0000833548 00000 n 0000833665 00000 n 0000833759 00000 n 0000833855 00000 n 0000833972 00000 n 0000834098 00000 n 0000834233 00000 n 0000838648 00000 n 0000840053 00000 n 0000841601 00000 n 0000843172 00000 n 0000844775 00000 n 0000846247 00000 n 0000847871 00000 n 0000849287 00000 n 0000850828 00000 n 0000852349 00000 n 0000854093 00000 n 0000855691 00000 n 0000857372 00000 n 0000859105 00000 n 0000860452 00000 n 0000862349 00000 n 0000863624 00000 n 0000864804 00000 n 0000866081 00000 n 0000866826 00000 n 0000869924 00000 n 0000869961 00000 n 0000869986 00000 n 0000870081 00000 n 0000870222 00000 n 0000870364 00000 n 0000870506 00000 n 0000870648 00000 n 0000870790 00000 n 0000870907 00000 n 0000870942 00000 n 0000871137 00000 n 0000871216 00000 n 0000875250 00000 n 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f trailer <> startxref 116 %%EOF extrema-4.4.5/doc/Customizing_Graph_Presentation.doc0000644012702201742730000076000011274636625021651 0ustar spangspangࡱ> I7 MbjbjUU D7|7|Fl@!@!@!@!!!!$ "\?\?\?P?D? "@@@@@9BB,B;======$؛ a]!C5B9BCCaD@!@!@@gDDDC@!@!@;DC;D D'Pz4!6!ǒ@@ P(ӧ/ "<\?C^#jǒtԗ0:1DjǒD " "@!@!@!@!Extrema Tutorial Customizing Graph Presentation  Introduction Extrema has a large number of internal parameters used to control the drawing details. By altering these parameters you can vary the appearance of your drawing in a great variety of ways. The most commonly used parameters can be easily set from the GUI, simply by checking off the desired options from those that are presented. The more obscure parameters may not have any convenient checkboxes, however, and will have to be set manually using a typed command. Each drawing parameter has a name. To get the value of a parameter, use the function GET characteristicname This returns a value that can be viewed interactively, or stored in a variable. To set the value of a parameter, use SET characteristicname value Many drawing parameters refer to positions on the drawing, which can be expressed in various units, including percentages. To interactively determine which position you would prefer, simply move your mouse over the drawing in the visualization window and the positions will be displayed below in whatever units have been selected. Plot symbols The graph below shows the result of using the default values for all the characteristics. The commands to produce this graph are on the left below. The first line creates a vector X with values {1,2,3,,10} and the second line draws the graph. NoteIf you do not provide an independent variable to graph against, Extrema will use the vector index as the independent variable. X = [1:10] GRAPH X^2 The plotting symbol can be manually selected in the GRAPH window. In the command language, use: SET PLOTSYMBOL n where n is the symbol number. If n is positive, successive points are connected by lines. If n is negative, the absolute value is used, but points will not be connected. If n is zero, no plotting symbol is used (the data is drawn as a simple curve).  The default value of the PLOTSYMBOL characteristic is zero, which means to have no plot symbols. If you would prefer to have plot symbols drawn at the data locations, this is easily done by setting the PLOTSYMBOL characteristic, as in the example below. X = [1:10] SET PLOTSYMBOL 14 GRAPH X^2If you would like the plot symbols to be red, use the PLOTSYMBOLCOLOR characteristic. X = [1:10] SET PLOTSYMBOL 14 SET PLOTSYMBOLCOLOR RED GRAPH X^2 NoteThere are two groups of colors: a standard set of colors that are always defined, and a dynamically loaded colormap that can be changed at will. Dynamically loaded colors use color indexes starting at 1 and increasing to the number of colors in the colormap. Standard colors can be specified by name or by index number. The standard color indices start at 0 and decrease to 22 (since there are 23 standard colors).If you want the plot symbols to be larger, change the value of the PLOTSYMBOLSIZE characteristic, as in the example below. X = [1:10] SET PLOTSYMBOL 14 SET PLOTSYMBOLCOLOR RED SET %PLOTSYMBOLSIZE 4 GRAPH X^2 NoteCharacteristics which represent sizes or heights can be specified in either world units (inches) or as percentages of the height of the current graphics sub-window. Graphics sub-windows are chosen with the WINDOW command or with the SETUP ( Configure subwindow menu item on the visualization window. EMBED Word.Picture.8 In addition to the plotting symbol code, size, and color, you can also specify the angle (in degrees). If scalar values are used for these characteristics, the value will apply to every data point. If vector values are used, the corresponding values for each point are used to set the plotting style for that point. The vectors should be the length as the data vectors. In the GUI, you can simply enter the size, color, and angle in the appropriate fields. In the command language, use: SET PLOTSYMBOL symbol SET %PLOTSYMBOLSIZE size SET PLOTSYMBOLCOLOR color SET PLOTSYMBOLANGLE angle For example, to plot a vector field, we could select an arrow symbol where the arrow is centred at on the data value (#13), and then set the sizes and angles according to two vectors, magnitude and direction: SET PLOTSYMBOL 13 SET %PLOTSYMBOLSIZE magnitude SET PLOTSYMBOLCOLOR black SET PLOTSYMBOLANGLE direction GRAPH x y ! draw the vector field  It is also possible to have each data point marked with a different plot symbol. This is accomplished by entering a vector instead of a scalar for the plot symbol. See the example below. SET PLOTSYMBOL [1:10] SET %PLOTSYMBOLSIZE 6 SET %XNUMBERHEIGHT 6 SET %YNUMBERHEIGHT 6 SCALES 0 11 0 10.5 GRAPH [1:10]Sometimes you might want to have disconnected plot symbols. This is easily accomplished by using a negative value for the plot symbol. You can have a single negative scalar, in which case every symbol is the same, and they are all disconnected. It is also possible to specify different symbols by using a vector, as above. Any symbols with negative values will not be connected to the previous plot symbol. See the example below. PC= [1;-2;-3;4;-5;6;7;-8;-9;10] SET PLOTSYMBOL PC SET %PLOTSYMBOLSIZE 6 SET %XNUMBERHEIGHT 6 SET %YNUMBERHEIGHT 6 SCALE 0 11 0 10.5 GRAPH [1:10]You can also control the color and rotation angle of the plot symbols by changing the values for PLOTSYMBOLCOLOR and PLOTSYMBOLANGLE. These characteristics can be set as scalars or vectors, giving you complete control over each individual plot symbol. The following example puts it all together. PS=[1;-2;-3;4;-5;6;7;-8;-9;10] GENERATE\RANDOM PSS 2 10 10 PSC=-[1:10] GENERATE PSA 0,,90 10 SET PLOTSYMBOL PS SET %PLOTSYMBOSIZE PSS SET PLOTSYMBOLCOLOR PSC SET PLOTSYMBOLANGLE PSA SET %XNUMBERHEIGHT 6 SET %YNUMBERHEIGHT 6 SCALE 0 11 0 10.5 GRAPH [1:10]Histograms There are four types of 1D histogram available via the HISTOGRAMTYPE characteristic. To draw the standard type of histogram, i.e., horizontal with tails going to y=0, the simplest way is to use the \HISTOGRAM qualifier on the GRAPH command. X = [1:10] GRAPH\HISTOGRAM X^2 An equivalent way to draw the same graph:X = [1:10] SET HISTOGRAMTYPE 2 GRAPH X^2The other types of histogram are shown below, each with the appropriate value of HISTOGRAMTYPE.  If you want color solid filled histogram bars, use the SET AREAFILLCOLOR command, as in the following set of commands which produce the figure on the right. X = [1:10] SET AREAFILLCOLOR RED GRAPH\HISTOGRAM X^2You can also fill the individual bars of types 2 and 4 histograms with different colors by setting the AREAFILLCOLOR characteristic to a vector instead of a scalar.. See the example below. SET AREAFILLCOLOR [-10:-1:1] SET %XNUMBERHEIGHT 6 SET %YNUMBERHEIGHT 6 SCALES 0 11 0 10.5 GRAPH\HISTOGRAM [1:10]Data curves We have seen that if the plot symbol drawn at a data point is non-negative, it will be connected to the previous data point by a line segment. The collection of line segments connecting data points is the data curve. It is possible to control the color, line type, and line width for the data curve using the CURVECOLOR, CURVELINETYPE, and CURVELINEWIDTH characteristics. The example below shows a script which changes the color, line type, and line width for ten data curves. X[1:10]=1 COLORS=[1;2;3;4;5;7;8;9;10;11] SET PLOTSYMBOL 0 CURVELINEWIDTH 5 SCALES 0 11 0 11 GRAPH\AXESONLY DO I = [1:10] SET CURVECOLOR COLORS[I] SET CURVELINETYPE I GRAPH\OVERLAY X+I-1 ENDDOAxis labels Axis labels are a special case of text strings, since they have a standard placement and orientation. The x-axis text label is drawn, centred, below the x-axis. The y-axis text label is drawn, centred, to the left of the y-axis. The axis text labels are drawn only when the axes are drawn. The character string may contain format commands. The SET XLABEL command sets the automatic x-axis text label. Use the SET XLABELON command to toggle off/on drawing the x-axis text label. Change the sizes of the text label with SET XLABELHEIGHT or SET %XLABELHEIGHT. Change the font of the x-axis text label with the SET XLABELFONT command and change the color of the x-axis text label with the SET XLABELCOLOR command. The SET YLABEL command sets the automatic y-axis text label. Use the SET YLABELON command to toggle off/on drawing the y-axis text label. Change the sizes of the text label with SET YLABELHEIGHT or SET %YLABELHEIGHT. Change the font of the y-axis text label with the SET YLABELFONT command and change the color of the y-axis text label with the SET YLABELCOLOR command.  Graph legend Legends are boxes of descriptive text that describe certain details of the graph. Typically, they are used to label different point types, different line types or colors, contour elevations, fit parameters, and so on. The LEGEND characteristic is changed with the SET command and the current value is obtained with the GET command. If LEGEND `" 0, a legend entry is drawn into a legend frame box. A legend entry consists of a short line segment, with optional plotting symbol(s), and a text string. The legend entry is drawn when the GRAPH command is entered. The string portion of the legend entry is expected as the first parameter of the GRAPH command, for example: GRAPH 'legend entry' x y NoteIf LEGEND = 0, a string entered as a first parameter with the GRAPH command is ignored.Following is an example script using a graph legend and the picture that it produces. X=[1:10] SET LEGEND 1 LEGENDTITLECOLOR -16 LEGENDTITLEFONT 'IMPACT' LEGENDTITLE 'THE LEGEND TITLE' LEGENDFRAME 20 60 60 90 LINECODES = [1;0;1;0] SYMBOLSIZES = [2;2.5;3;2] SYMBOLS = [15;16;17;18] COLORS[1] = 'RED' COLORS[2] = 'BLUE' COLORS[3] = 'ORANGE' COLORS[4] = 'CYAN' WIDTHS = [1;1;1;1] DO I = [1:4] SET PLOTSYMBOL SYMBOLS[I] PLOTSYMBOLCOLOR COLORS[I] %PLOTSYMBOLSIZE SYMBOLSIZES[I] LEGENDSYMBOLS I LEGENDENTRYLINE LINECODES[I] CURVECOLOR COLORS[5-I] CURVELINETYPE I+2 CURVELINEWIDTH WIDTHS[I] GRAPH 'LEGEND ENTRY<^>'//RCHAR(I) X I*X^2 ENDDO REPLOT  Graph axes To graph only the axes for a particular set of data, use: GRAPH\AXESONLY x y To graph a set of data with no axes, use: GRAPH\OVERLAY x y These options are handy if you make multiple drawing passes over the same graph. In the GUI you can simply select the appropriate checkboxes to get the same behaviour. Scaling Axes can be manually or automatically scaled. Auto-scaling is the default, in which the axis will stretch or shrink to accommodate the full range of the plotted data. This is convenient for well-behaved data sets, but maybe not for data with spikes, infinities, or related problems. Autoscaling is also inconvenient when one is overlaying numerous similar graphs, where one requires that the scale be fixed. Manual axis scaling is done using the SCALES command: SCALES xmin xmax ymin ymax SCALES xmin xmax nxtics ymin ymax nytics SCALES The first form simply sets axis ranges. The second form also sets the number of large (numbered) tic marks that should be shown for each axis. The last form freezes the axis scales at whatever is their current value. Tic marks The parameters controlling x-axis tic marks are: XTICSONcontrols whether or not tic marks, both large and small, are drawn on the x-axis.XTICSBOTHSIDEScontrols whether or not tic marks, both large and small, are drawn on both sides of the x-axis.XTICANGLEcontrols the angle of the tic marks, both large and small, on the x-axis.XNLINCScontrols the number of large, labelled, tic marks to be displayed on the x-axisXNSINCScontrols the number of small, unlabeled, tic marks to be displayed between the large, labelled, tic marks on the x-axis.XLARGETICLENGTHcontrols the length of the large, labelled, tic marks on the x-axis.XSMALLTICLENGTHcontrols the length of the optional small tic marks on the x-axis. These are the unlabeled tic marks between the large, numbered, tic marks.XIMAGTICANGLEcontrols the angle, in degrees, measured counter clockwise, between the x-axis and a line joining the base of each large tic mark on the x-axis to the centre of the number labelling that tic mark.XIMAGTICLENGTHcontrols the distance, measured from the base of each large tic mark on the x-axis, to the centre of the number labelling that tic mark The parameters controlling y-axis tic marks are: YTICSONcontrols whether or not tic marks, both large and small, are drawn on the y-axis.YTICSBOTHSIDEScontrols whether or not tic marks, both large and small, are drawn on both sides of the y-axis.YTICANGLEcontrols the angle of the tic marks, both large and small, on the y-axis.YNLINCScontrols the number of large, labelled, tic marks to be displayed on the y-axisYNSINCScontrols the number of small, unlabeled, tic marks to be displayed between the large, labelled, tic marks on the y -axis.YLARGETICLENGTHcontrols the length of the large, labelled, tic marks on the y -axis.YSMALLTICLENGTHcontrols the length of the optional small tic marks on the y -axis. These are the unlabeled tic marks between the large, numbered, tic marks.YIMAGTICANGLEcontrols the angle, in degrees, measured counter clockwise, between the y -axis and a line joining the base of each large tic mark on the y-axis to the centre of the number labelling that tic mark.YIMAGTICLENGTHcontrols the distance, measured from the base of each large tic mark on the y-axis, to the centre of the number labelling that tic markLogarithmic axes To get logarithmic scaling on the x-axis, use SET XLOGBASE n, where: n > 1.0the x-axis will have a logarithmic scale. The base will be the integer part of XLOGBASE, except for the special case: 1.05*e > XLOGBASE > 0.95*e, where e is the base of the natural logarithms, e H" 2.718281828, in which case the base will be e.n d" 1.0the x-axis will have a linear scale If XLOGSTYLE = 0, and XLOGBASE > 1.0, then the numbers labelling the large tic marks on the x-axis are displayed in decimal format. If XLOGSTYLE ( 0, and XLOGBASE > 1.0, then the numbers labelling the large tic marks on the x-axis are displayed in exponential format. To get logarithmic scaling on the y-axis, use SET YLOGBASE n, where: n > 1.0the y-axis will have a logarithmic scale. The base will be the integer part of YLOGBASE, except for the special case: 1.05*e > YLOGBASE > 0.95*e, where e is the base of the natural logarithms, e H" 2.718281828, in which case the base will be e.n d" 1.0the y-axis will have a linear scale If YLOGSTYLE = 0, and YLOGBASE > 1.0, then the numbers labelling the large tic marks on the y-axis are displayed in decimal format. If YLOGSTYLE ( 0, and YLOGBASE > 1.0, then the numbers labelling the large tic marks on the y-axis are displayed in exponential format. Axis placement The placement of the axes can be precisely controlled by manipulating the axis location parameters: XLOWERAXIS, XUPPERAXIS, YLOWERAXIS, YUPPERAXIS The percentage versions specify positions as percentages of the current drawing window; otherwise the positions are in the drawing coordinates. By careful manipulation of these values, you can place one graph at any point on the drawing with respect to another. For instance, to adjoin two graphs along the x-axis so that there is an upper graph and a lower graph with a common edge: Set %YUPPERAXIS to a reduced value, e.g., 50. Plot the first graph. Set %YLOWERAXIS to the value of %YUPPERAXIS Set %YUPPERAXIS to 90. Turn off drawing of the x-axis labels with SET XAXIS 0. Plot the second graph.  In practice, there are some other parameters you may need to play with to keep the y-axis labelling clean, but the above will suffice in simple cases. Axis characteristics There are many characteristics of a graphs x- and y-axes which can be controlled by the user. These include such properties as the color of each axis, the color of the numbers on each axis, the location and length of each axis, the number of tic marks (both major and minor), the length and angle of the tic marks, and so on. SUMMARY Here are the characteristics you can change to achieve the effects you desire in your drawings. These may be looked up in the online help or in the Extrema Command Reference for more details on their use. Plot symbol characteristics PLOTSYMBOL, PLOTSYMBOLSIZE, PLOTSYMBOLANGLE, PLOTSYMBOLLINEWIDTH, PLOTSYMBOLCOLOR Data curve characteristics HISTOGRAMTYPE, CURVECOLOR, CURVELINETYPE, CURVELINEWIDTH General characteristics NHISTORY, TENSION, AUTOSCALE, COLOR, COLORMAP, COLORMAPFILE, COLORMAPNAME, COLORMAPSIZE, AREAFILLCOLOR, GRAPHBOX, ORIENTATION, WINDOWSIZE, LINETYPE, LINEWIDTH, FONT, CONTOURLABELHEIGHT, CONTOURLABELSEPARATION x-axis characteristics XAXISCOLOR, XLABELFONT, XLABELCOLOR, XNUMBERSFONT, XNUMBERSCOLOR, XLOWERAXIS, XUPPERAXIS, XNUMBERS, XNUMBEROFDIGITS, XNUMBEROFDECIMALS, XNUMBERHEIGHT, XIMAGTICLENGTH, XIMAGTICANGLE, XNUMBERANGLE, XPOWER, XPOWERAUTO, XLABEL, XLABELHEIGHT, XLABELON, XLARGETICLENGTH, XSMALLTICLENGTH, XTICANGLE, XFORCECROSS, XMIN, XMAX, XVIRTUALMIN, XVIRTUALMAX, XNLINCS, XNSINCS, XTICSON, XTICSBOTHSIDES, XAXIS, XGRID, XAXISANGLE, XLOGBASE, XLOGSTYLE, XZERO, XMOD, XLEADINGZEROS, XOFFSET, XDROPFIRSTNUMBER, XDROPLASTNUMBER y-axis characteristics YAXISCOLOR, YLABELFONT, YLABELCOLOR, YNUMBERSFONT, YNUMBERSCOLOR, YLOWERAXIS, YUPPERAXIS, YNUMBERS, YNUMBEROFDIGITS, YNUMBEROFDECIMALS, YNUMBERHEIGHT, YIMAGTICLENGTH, YIMAGTICANGLE, YNUMBERANGLE, YPOWER, YPOWERAUTO, YLABEL, YLABELHEIGHT, YLABELON, YLARGETICLENGTH, YSMALLTICLENGTH, YTICANGLE, YFORCECROSS, YMIN, YMAX, YVIRTUALMIN, YVIRTUALMAX, YNLINCS, YNSINCS, YTICSON, YTICSBOTHSIDES, YAXIS, YGRID, YAXISANGLE, YLOGBASE, YLOGSTYLE, YZERO, YMOD, YLEADINGZEROS, YOFFSET, YDROPFIRSTNUMBER, YDROPLASTNUMBER Text characteristics TEXTFONT, TEXTCOLOR, TEXTINTERACTIVE, TEXTALIGN, TEXTHEIGHT, TEXTANGLE, XTEXTLOCATION, YTEXTLOCATION Graph legend characteristics LEGEND, LEGENDUNITS, LEGENDENTRYLINE, LEGENDFRAMEON, LEGENDFRAME, LEGENDTRANSPARENCY, LEGENDSYMBOLS, LEGENDAUTOHEIGHT, LEGENDTITLEON, LEGENDTITLE, LEGENDTITLEHEIGHT, LEGENDTITLECOLOR, LEGENDTITLEFONT File related characteristics EXTENSION, COMMENT, ERRORFILL 01?G  ax    % 2 W [ + 0 X i o p  ׸מח{rgbggg B*phB*OJQJ^JphjUmH sH B*CJmH phsH 5B*\phOJQJmH sH  CJOJQJB*OJQJph!B*CJOJQJaJmH phsH B*mH phsH B*OJQJmH phsH B*mH phsH mH sH 5B*OJQJ\mH phsH  jU B*CJ0ph B*CJXph&02? ax UbW \ $IfxUZMMM yysZ$IfU$If$Ift$$Ifl    0,"  0    64 la  c e d e p U$If$IfZ$a$@ h@ hB$$Ifl0@ ," "4 la   c d e ~ 0 : e $ % & ) - . !LyǾǵǣꔉ{rjUmH sH  j9OJQJ^JmH sH OJQJ^JmH sH B*OJQJ^JmH phsH j%lUmH sH OJQJmH sH jd`UmH sH j6UUmH sH B*mH phsH B*CJmH phsH B*OJQJ^JmH phsH mH sH  j"UB*OJQJ^Jph*   % ' ( ) c_D$$IfTl0@ (# #4 laU$If$IfD$$IfTl0@ t" 4"4 la ) . KLWi}wooooowU$If$Ift$$Ifl    0,"    0    64 la xx$If :xu$$Ifl    0,"  0    "4 la$IfG$$Ifl0@ (# #4 laD e"#$QOPQ%/AFQoƽ֤֐xx֐oxgxx֤6]mH sH j˲UmH sH B*OJQJ^JmH phsH jߤUmH sH B*CJmH phsH jUmH sH B*CJmH phsH  jUB*OJQJphB*OJQJph B*phB*OJQJ^JphmH sH jUmH sH jsUmH sH #j<2B @CJUVaJmH sH (k*D(F`~}{www{{ssssUu$$Ifl    0,"  0    "4 la $$Ifa$ ~de{B$$Ifl0@ (# #4 laU$If$IfZ$a$U#%&PQp1C$IfB$$Ifl0\ $ 4$4 la$IfU$IfCPRS^PQ\prs]B$$Ifl0@ t" 4"4 la$IfB$$Ifl0\ $ 4$4 la$IfU$If opq&()argt01 v b!c!!!!!!!M"N"R"\"x"y"""""###%#?#@#Z#ݳݢ0JqB*OJQJ^JphPJ6]jUmH sH 5\mH sH jUmH sH j UmH sH jUmH sH B*OJQJ^JmH phsH B*CJmH phsH mH sH jUmH sH B*mH phsH 8st(*U$IfZ$a$D$$Ifl0,"LL64 laU$If$If023?gcB$$Ifl0\ $ 4$4 laU$If$IfB$$Ifl0@ t" 4"4 la ? * I M [ m o N"B$$Ifl0$|$4 laU$If$IfZ#h#########$$8$9$s$$$$$$$$%%%*%4%5%6%C%D&P&&&' '('4'Z(_(((((((())=)B)V)X))))**++++++,A,T,~,,// jCOU;B*PJ ph B*PJ phOJQJmH sH  B*phPJmH sH  jU0JqB*OJQJ^Jph6]B*OJQJ^JphFN"#4%6%C%<&(((W)X)))plhUt$$Ifl    0,"    0    64 la xx$IfUxZ$a$ )))))*.*/*E*_*w********+ +B+U+u++++++++UU++,A,T,~,,9-A-o-./,/U/\/70A0r0z00$IfUUZ$a$//\/\0]0r0y000004151=1F111111111d2e2m2|2222233a3n3333354C4444445Q5R5Z5h55555666&6p6q6x66666 7H7I7R7a77777G8H88888!9"9999999B*OJQJ^Jph0JqB*OJQJ^Jph6] B*phX000<1=1G1111111l2m2}222TdXx$Ifk$$Ifl0 Q  064 la22`3a3o34454D444445Y5Z5i55P`k$$Ifl0 Q  064 la$If55566'6w6x6666 7Q7R7b777Td \|T$Ifk$$Ifl0 Q  064 la77888]9^9o999`;`k$$Ifl0 Q  064 la$If 9999:&:d:n:p:v::::::::;Z;\;b;d;p;z;|;;;;;;<<=<c<h<q<r<s<{<<<<<<===+=4=5=;=@=A==============>>^>`>f>h>t>~>>>>>>PJ jB*OJQJ^Jph0JqOJQJ^J0Jq6OJQJ]0JqB*OJQJ^Jph6] 0JqOJQJM`;b;r;;;;<<4=<=d>f>v>>>>p@$Ifk$$Ifl0Q 064 la>>|?~???????@D@E@p@q@r@s@@ALBMBBBBBBC CC8C9CKCVCoCpCCCDIDJDPDQDfEp@r@t@u@@@AABBB C CXCoCqCD$a$$a$N & F>N & F>UD$$Ifl0W!^_64 la$IfDDeEfEnE3g̜d֛_wuUNuɌ"(=P:*:DɃz]8""E%D6'jN͈027=FEcNEݍXKe^/JAۢCIAiZ?] @ ZXC\J? fg~|M-ق'yT _(om_&e_!BWLnaRd{2(B> B~",!%䳄EB"!?Wȟ+Åp!?\@!O|o|o(Evgz' J!_)+|BE!Q?#R!_*KBq!/!(o7 !?G$!?Ig ,!%3|B>]ȧ Bl!&ӄ|$w oPdZRXȸ$]"^KC׋xz]#kD<4ZKEapa+Vr[!l%MJVz [i#ln+?V>'|Nv[yG;Vv [-lV(lIa+O [yXV6 [$lPJ["leeV [Y(leVr [$leV [ɌVָWjVf [XV["l/l/lVVV>򙰕w#lUa+ [)leVv[)R"le-V [UʭV [Y&leVf [-leVrV [%leLwˉx)qHCV* M@eE&_e&dyly 9Omy4IyTIy"oCe:Mih[Q_#^X-٨ߨ6j9zzcݘݠ';R~ =keg3=Ϡ8R~~&}TՁS]g71LoЛh)?zxx4 >C Zʟr=ke{ǘe/:R>zxx!JW-建\wok$@K6.׳]ƛ|Gg{'Y.M~wҠOr|~&gC@K/\g76i*9>ǁ.׳]ƛB{ z-ݮg7s>lh)v=ke_)1Ah)v=keyA8Ry5aYG>۠p~&yЏ|t-s523٠w9R~~&fn~ׁ[\g7A7L1h)zxx; >ӫ :Ɂw\wo{3Ԡ;;RfY.㗊nv}s7 Yfs7(s7WsF({~XG6Z9u;e!t^u599ThMjK*@B^s t]KCivֽ bnAzOP=`eh@v^~mNhuWUޗP{R78~Iq5ZUDn?(B?Պshej,x+vu9J&$Ǣ2Gg^u g0z^SКN|5^|P(!9 dr^ tb.KP/2@2z r^|6s>?C60u;i*\V6g'C"z 芾NԛAߏ~/?x^OZ?=Ddvz e$KQ?;{9/>Vg0F ;zP{9/+lz*>@>}>z ~ {9/>ySZ0oQ`_W^ΫV?Gg8{ڋ}_tz\UC3gYKz^MQ{ x }Rg'tB)4s<+}m+P=4X,{9/>Yz6y +ߍ{9wB8=Q}{z_*lnJu3-SFZ:z1_Q=?׃п oQ?7Ft Wj#W>DV~/gEYj=ߣs9؅|+o弒|VtWsߕSfSkԭkˤ7G8=_<=P^z|fϳ>8>[Byk 块x*g.<#X48o|Ǻ8.9KXc X}T(bY/r|0ݛqz6*]U4P{w_u/6t/F+^uo2toBk#z׹N?Lm*t'4|71&@1|=%Ƽ.%GHހz>ϫHk1ڈyпe#$7.BY2D(zy{_u-n]EZצp˪P]єK\ sM)t<+xd*CsCfp96 M13{^t>̞Wt>̞Wt>z̞Wt>z̞Wt>]/Ws ;j:>f W s Χ녃 8kMnjS 8?pJtp'^s'i:>f /|jBߦzx?wpA |͔oM刁~9/܀j|Aa/x#~0;F6<GH&_?VXXH8K;8`-94 8Hp``T_Cj,80@Q1` 9sP}C8؛+dW˲\YMhL# N{~`"atq?L %NX1P׮~P b^0 {4 z}p/x}}/^`_,F ^/{@G8 <F%3 tj 4B`p6gLSbDŽC&2 ?YƄ?ERE~6<9LXr:~yN1 V}>yK]qWs2ϓYYtGJwQ[$nF-> cT$(.Eˮ*!Z򈜅K;d\zrX,X|EKu˱@OgT&y#@^Jb2-Lvɝ-Ckda\zb2-LVhL@9[C dApM4>d.>\LMFg,.Z;p=`c 芽kaa/bO{4osbᰗV>xO;7$0ebZO4q{LhA\ǀQ}M\H9lqz<#'@h,qe3_B뜷6vUC~HS䍛6?7ΟS)6oZ =Y55O ΆVZ'7{\vd,sr)pb@81 N'F#‰pb@81 N'F#‰pb@81 N'F#‰pb@81 _t۶r\~=޽<kc`].1:{_Sae‰2ME4Ҿq=wF1:o{% &q**E5D21`bm[2>olfQ)&#$FI2"F)R@2ME@*31`bĬSQ)bd`U3+00TfJ#R`X1`b0R`81`b0R`d1,0RMF3Z=D#@bDpbTt&D#T1ЉT@VBN3='F kpbЈu]n>~6<@vB1:B}>zkphZ#3}&2l>n: ;aj^ .70 30}e:/Qb!!G> DuRh۶0d*/r@~@4!j#dI#‰ LEmBԞ< D}SQ?bp*FV`zp D1RMFI0#"DX#‰4SXC% XX'U,0'K1)d !Kh|bLMr#`ZBN)rI#+0|LErJ5<"Dy0!M'F@zHM F@ZB4.v?t|{!K_0{%F@B7Rr@0&!["DԐj2"D"FGxQo"Z#eBD+bDhIxH!U} XI)d!Dj2/ PJ1 e:@'F8!bb "F= !/!b$& aVGMɨ VP!bDcTo6=z 'Dy/}$G] Q !"1:vhK‡^aRBD&b"#DRh6BDfq=;&Ddj2&D d\IL !q"f$F1+1$yFV F00Hu DXIȎ*դ`BĊ"D*e:;XA0L~"# DAgBst9/UdeRLFBy"xA#BKu2&O"|e:Dsb|e:1T1rT14mD1 A[bO=1;LCЏ !K410 A.16K}yy4|?,ټ] ma$ZkƖruV8<ꬤcm( P,+3Un0 U{lǺ(ˍ,l*Uw³{n/M7\sxQ Ki'02ϊqk+Pbbw"+d894\ ^^ PW0Ӄ\݃gyzm=ώ4ywO6YMr=0]f8r.,IwCVq׽2NCV y$ۣOtl}ԥgQ:Q]rДߥϨ7Z%גmcz G9a$[a 4O7GY߾e~9ĨIT:,i^ɫ\f,rUgE1N%yqf¥TN^uX1P" nϒ?1_qfk\+PRdqFX^@_8;-4&+;,}֫sRƫTX$^1 NG|%o|fwI\)n} 3܇rՄ/-t}4{c0f`%SVID?M=(8v:!]6׃ioz`4pxx9,ǤBKo|˽bJ3|vHţ8v\%[S\lDÎ3 n"ֱ Og|lA, M@]oJ0Y!;2-k DJ3^(+,rl\Vpw֑In tEHe5fSdb |XdYΓG`(2 KQ&[zIK}y2||k0J1Bʩkcn0xE>FvC2tʃyνRIlaK9G&Bbm诃1H%7j0G42SѴ ȵboZD`3/):l}զ;O䮓d zZ%Ӱ;=5]8{4TxO~ǰSe5җ(#yۡ1-VB NOvkU~hACO7nOЍ-k$8A)#)Q+!|*txbQùVXDtrF=" d&XaӠ>"֭e8Α]b\4$%4UT4Q_Un>y l8$1IO㣌+Զ ن[x{ i'g\%H eV5xgh+ S$sλz\[ȗv٩aUC@Ő͇Ry}"1) T6`&] 64?9`^Och.eJOݮMPg{\뚧k /28 oF񠟪VsBX$=,5sl[ctOUR2 ,D\Bp*I v :Ws6qT2x1YQ}s @= }u-K(>͸eyZ'Y}xhRTDr=1aIy_$l$b=9aUֱ|^28eGM8ʰ()pw +@Y*T&˃aĭ/,5Ejf~uuV}j,oSbߜ`,-+r)D. ү)K^[;F ][Rrh1b[Az& FJ<ʼn  ^"J)Pb})tdD'2B< [., q#-jre7*iO-N?+(Uc3VA-f#3J; .:,B.;eYs2d9iEFjyHsɵ+z E,JӫX{°n*&QQVr(Ɣd\cIyTJ{(f$ɏM,J Rj$VImBj!a\!/#[wQ\>\sh<ƣLaDq4dOo7Ҵs:o$:RLbGvr>r$PQ1lS)׎ q:NL1Pf,%uy[\xzd䕣]J^\Fó\M  V\2 j9`Пec$rion72Dpt#~8Kri;Ai,}j]+ VAk&ʗЎgԪ؝C~vqUmrד||sDF^OT660!h&WL\ڼ)|ʦ~ePtv0P. Y15٩l}&S18p[8ɧpta~F$9iM(0~1B'{s/X jYGm5IWr%'m[[1WZkEv(ݦAWZkhkԼ;rbiW{ͧo`s{ɕ8i>w,Rs-eɯ%xůqa1rj f9Ȇ}+Bm[J&5ä9I"zfÔ`InGq\xʁK+r*wUjګ]3Kr]$Hu^UT22Rjdf4N2a` 4Walor6sB <,70ƾɊ&kd3ДՏ7(8r65vqbI7aλ]0*(pDRvLem5慣j];aFo5Y%.5"Rr@;a+cmfc*w &hds)Mb" h|b_qhhЮl=sVz̊IѐPaŠRP67w-'սb5N4M)R6}O^C1(l?Ŝ7ʕM%*k;Z0e>/Q*>r)/K,Vk9Z:+#?|D1D~|]GD|D"EtdjWOmjewG?I%&!wabG\'N~4:>';奨iq\nJ=iUoh9H2p(9MQ5%S7_(4}qNKe۟ $:'{t`6 {؅!4IJ@ocU7 .䍭-[$E~U밨9%7|g: RML_Ðh` ˰e7w>ۃ\}#UlZ+c(L8acH ;!'n^:SbNWO 'cE3;7he6|H,&# 'pŲ? >'h Oˇ^J:k)W.Xw} 5τ1u*x{/@Q328dwhlP.pU @=&O2ӌ%7K7Wpmx%ү88}q\ :0r5:VSj.  VKo"XfLxr+MXEcdd/Rnֶ u0DD\xYFex[6 sf^ar\iznejiUQm(&E,cLZfoFԨd5LPT$"V\&KO̻@LEa Y:Par*MPDE27 aNzlsoB8w{xb+ܕ#;'x 9>[tjEoAD(^ym1i deYaLl(Z]TIuG@Z7aȿVaZ>"ùÍe^㠛`n<\̄ 4PmSԓRE=f!lN;H >t #|w44V*K]DPa͐~hpÈsKR1v=nWY=< BpQbeO;غ}bR"vT[2l_1C(ɝߦ O3>1K~6Iwq}rv &rr/XvNgOocotI$QWPqk`"֗7w #Qo82Spk-xآv3-8Y3>dս([17,(%ˈi?c|͓r2k5V)riGܰPtɌF_@XFоWmD\P[Jd69ɖ/26IОBLeg̈l*9iU;yve(E,י lı}^)`+PhgDJN 1,C4 #H r?y؀lc.$pѿh ' ҹ\G:?t3[e/X;g‘! :Z,J %ӓaƏ ٢N@#Sgb 0RMT]@UĄ*|36ne520EI"Wy.,W j6W] 6HeLXvPI kafvNĻ$R_W"ΈɚTߛBIuF3[Vo䟇F*XCw X|ֱr;j$T+{؊Ao~NpFށ%`@0 lҶHe h(nV^%`WwEXz:qGҥNE\6ba.+F6B'ͧ+eXag'3NBlKxY:[e+d[EǵmK|M ?Z/Z 5uQhemnbKZM}^zep'\Z>?GQ9ň)r(c0E Sm秲M05HQjn"\+G~OY2pgւ9&x؜vL8 KGi͝ 0U4G]U%Y{?GpY#I\`'ƈ&\ݤ[zasa%E X5 " +ty`"E1Nĥ6iB#i;V6}_Ku#(?چ5'[9 4lWO) k O5aH>^~H ^؁8j`VzX-vltAh0WJ[^7W_SLPǠiLbmQN@gg_*E(a{8bJ, `NzcWo4˲ahHYNRzNWv9D OTactkV5xDzmo]:=AkzQ4+:tmC ÷S *7gbm FŇf m ۄ:[-7o ;|s;kݢoqIL \Y= Ђ ׼N)uG K[]‡C2WAߕNxF$buj-5=< $ |?(I3~8$L5gNrG&X l]H7wؚ\?ƲڰiZ7V:OhQ*5S$ӯv0*3:{DbQܛ=@*wn>s 䝛.>jbj:!TegmGMk~m"35@)"@9I|vs\܆5&m>aNJci- qS{5Dag`5oKr4:!O NƏ`W(ufԷI1 X峩㾼w" n>M>ل\+N$[o8ȴMo`Iw\ p fwFaDYu;MO2XS&JT&>o_w1Z ~eԙYd[^p4`Mn켾3c=|v?$Vx/%/~ޝoI+ `O%opkI>kEGV.g*LsroxKRS:9 PuKl#x#?mMC rhIM)g[e`͓6*Or:/ֶ^Ua+}!ϸ0 ەWw#A:55ȣ,+0 [Jkb1'?.iioXŁ5X?t1JH)2V:}1r^麶R v98>ș¢KRkEjK^!Zֳ`LMְ!nȇ;IENDB`. DdR  C .Agraph2.pngb yJZz,&oP`BFd zUn\ yJZz,&oP`BFPNG  IHDR?1 IDATxr6QeÊfH] ,8gӱ8#B$n[@D F#‰pb@81 N'F#‰pb@81 N'F#‰pb@81 N'F#‰ֲ,v5I^W%F˲o+0c/QnmCs)`]a19pb@vCZn{ٞShJ@21D"Ft@y**%YeRڝdJI6!*E%D@J#1bhSQ)bʈ!*E$1TTJف!* t d0ѧR@fJ#: Fe**E4SJ#R+31Ƭ!*%Yl0&t`橨dfQ)b@ ;1 0&F#LEK#;0 1;04"DRMFY cb@Tt=LF#‰ᚼg]GݞMrv;sg0Tg"`U:m{0e:y~.w–\$Dkr_<JLS5pb!SuBtT1ZzD:RMFI^d*G^ Du SQ}b!F'18 Dm=;0.dP(!DqQ41'DA'FLE#`JB1 \? \[>0 !S0b,. 8hN>\&DJ5N# QN"hN#)!Hفr"؁hBx$d$D<#F@UB+FxU8+'F#‰pbd; 1: 'Mj2V"FG+6!jbEA !&1"j#!!T1%DbRhChM_bO"F@)E%FN`rBDڽ^# y0@{BD/MF;Y-!'M&G` +<=!G&G_߳T*$h4D6J"2h"p+ J$=zUd@81 \-pz8RMFI )K֌$25Dd##HDAB"F'F9!bbdf#D"թG3T1Qe:1+1N3#1;1`Bb~"sj74"AC!8*F^Q.<*Fdd &dYX|G2pb@81 .Ueyz>Kuje"V#dI5A)@}b tpB1BmY A&1^}ĪrКī+GW{S!G}I/bOLCЧf'0xKyUİ j"[ ͲW$B+n'B1l @T1Z%rILg `L&#Ɣj2bnha\bD\3#f%EĈ.M%B@)bk.T1ĕGRňDxDεB3bD5!Ub˞ FGw!SbeD3 2OP;T1y[-J@-b$Bm?ގ?PKQǣ F B&$B@oh""J 1Ji?2~hdjoeY0TlH=:@Q g'M$021(bWeYqñs,,B.b sb%|/:Zg}}uۭn&7Z|Eq,ua~3˺&[nAx7F#") 4E+OXERm &h&y. Xb@81 \v;α/G z=.]ȖAwc0wŏ!q:Fx*BW%4 z[pb?%3ֳe9cb׏1p\ cd[ȝcq,q <#Xpb@81 N'F#‰pb@81 N'F#BDݩIENDB` DdR  C .Agraph3.pngb LR@ `Ugig `n LR@ `UgigPNG  IHDR?1 IDATxn8QeTZcyP,bTytv+1 N'F#‰pb@81 N'F#‰pb@81 N'F#‰pb@81 N_j=ۭMbTk-_6+cTEv84F\{ @~ƨu`N sHۡL-^S6J@L$m2b0!*E9DHZk2>lj3ds#fJ#f Q)b ٦R CT01Hb֩d1CT@`EOEVQ)b0UBT01JSQ)b0BT01ȊSQ)b0UCTJY`NSQ)&#R@ S1"DpbT71L%F }bd9YSѹT@VB.a:Ӯ3cb@81hT.&9{`^^0b&!A%FKZUz2]/r@hBF #F##'=1x@#‰ SQ?bp*FV`z#D1RMFI~3#"DX#‰4SXC% XX'U,0'K1)d !Kh|bLMrHu5;}R `2 S2*FV`^!D:g$$ .a:38HύAh] ?qxF\ϻ%h]&#`^B61 b"J# # 'F#;SGbt%Dܓ*FV`܄3V`"I59 ψД 1"^0 qD-x"~JK #RB;pbd9 9 0Z|.dM\EW#DŽ#BD bLhE-њ =/!+0w =>RMF@[ap!71J)!b9L'D@`aB(3:3dtO헛Y!b4]&e"F@!bT&G_ #k! "F1HvhCȠ{;"p+LJBɹZy LRdl&"Dd*FV !"Ts2K50'1f&_ClLF1#1DY$!D9#v131XEtV``%BJRMFvLV!D&d+"V$F0!bU\1a:%DE 71B#L_.`N\1RLV!x,Ud$DsFАk"x]t0e.TK)RJ""B>#Fp!ψRŨg9Ku5Ke!h#U u-1'LCО #Fpi#1 A 1LCKewǡ'kǡ';C]߻ "GsF^8r0n1.x˜]H![ -aa//d<ʔLCσ~G 1bd%Fg )O"B0T1!<#`{X_h #F yBka:bĐ\k#"B&1b"k#BPb&UG(Ux&BT1"'#!UbD)1uOք)Ĉ)1m>a \ɇ!d2' Jd'to[@#bD&N -Б-DQF'F2Q.d$F0ىQbVf*FA}Z60T1Z-Bg­"@1zDb@_&&Fzjlo7[m!Fq }b?q9~E?Z}+u~nv]g]g[Y=om!l2:p\s z *Ocƙ} 0藒Q| K0b\ PJdt.u Jqp_"oſ|ŞmޢQ1ʸdP+ſm0z]x^|-,em'OQwG7hb/ī2b/6{E,Os}9n:Fov=س|-˲]>6nz N'F#‰pb@81 N'F#‰ppg80IENDB`Dd)#R  C .Agraph4.emf"#Zьy*%.p"il@=Zьy*%.p"\(Y5WMmBx͚hG߬j՞1JP,Jh `&ؘF* CP*BkbB Zh c-RŔS{ܻ;[xٙl4ME+$uk ,y&ƉPTQ S3`2'(~= 3(^6V" l4MB'$Y'fSN?G38>/eڟ)|fw1Ìf;I<cیf1ƋPNm>;w2^x+:&ƛXmoc ? 1~n7d|,-S[9S{_g&D !ۣRVƷ0x㵌2^WOg|:ٌg3Ɨ#~5ƻf B)?xmd|':x=_rƗ3^x9L6>!6a[mu~e|u­:fUnRoMͿնx?7*jzjqj3FuF@3":#C9W]gd 4u3hbMXfMXۄՆ8k'#~|'QX;Li ha^9Ӌ^^0lGJC+Z)D!aL0e2C pi4~0Zuhy2~ub2,/cXr@9 Ю##TƧ}M;<+\gڑMi;,}X>>тր%'j=K)\h\QW5KgmWRkxG=AM1f߻6(o ̽?za4__MoΡ=^ zِu^{CЛΥ{I^Ǭt/ XW߿uc e>1~*q+7?m82|/ݙ1l[k~Ϥ?`SˤѾBRF mn~w0ħ ۯ7G١5c_ehM>cl cj풡V/?9oKznO::)5}-srl"}fMM{Qti?אu~Ǻ{(!/#hP4p$5P, ~ ?K{. 'W qji:f'K\ X@JҀi&50'Yh_>o50'Q t|Aqj4Е(I$j53_Z,@1 G3jiG<:bFS~y7:p$:~ Cϡ2XY%_jȻ}asXDri1sCMS5~P{qHtJ4"@C%Qt '3rB@l8 &K/Ԇ87:h:AqE髃y /KD5fȼ9,6):X& :)|O{V[Z5!Uk7{m!)w?An·kgz? G6hX_zC]EM֙q}_;dVy 觑L4o6n7]8Fn7Dd  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry  F@/ Data YWordDocument DObjectPoolp_§/@/_1110618940 Fp_§/p_§/1TableCompObjhObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font  @Vl,b$rWGBq|." @n(  6   AB S  ?` t@T4 @UnknownGz Times New Roman5Symbol3& z Arial"hs&s&!|!0~2Q Joe Chuma Joe Chuma  !"#$%&'()*+-  FMicrosoft Word Picture MSWordDocWord.Picture.89qOh+'0 (4 P \ h tUsing Colormaps and GradientsMisin Joe Chumarmoe oe  Normal.dObjectPool p_§/p_§/WordDocumentP+SummaryInformation( DocumentSummaryInformation87 bjbjUU P+7|7|l oooy{{{{{{$ NoM"oooyMyyyo yyoyyyyy ;yyy0yyyy jCJUmHnHsH u 1hN N!"#|!$|!%n&rWGBq|PNG  IHDRORSsRGB pHYs*fIDATx^ ՕǻgFPQP7oͮ!j%AF&jV71*lO/p0$A!*5YT| 3S}z.wnuUߪ~T2VW{9[ܪh:d W60y %bY#{PSPsp S l۶/:۸ ̝;QXHxq~]XdL@d]?3+ctƌ[IO0o?pWgWOOogWr׮.s S3 8q@.>q;~rˬѻyI?xm===f2B 4nhSÇ2>裋Vw֭_|/;zM|A|xwk7~UPN}w%~h^7dнWrժhkۺ} ϶oG)Ah~HxZ{Drݟ6=bRQ |8ֹu؂yߝ1)=jM}"T!h$O٨FvFj?mtѼe[hj:dH~ҒwP/8 ?ċa  PMV_0jgW۷vI[9h]9Lpȱ~LfO1xwOҒŗ־ձN9:3Odcj"bnE瞮89CI{|QQT ϥj)O:zT]nX:2䗛J~M&zzӯo1?`yUM,j :nˇTf'VYW;$(bai%Y커mm/AkO]}XzRYe 2X(gN:JBQS/1ys@r" #m+-PN)}8g/''.8Ow{QRq"=`dn:kf)/>s6{JNHqˉu͒T.҃43],Ζ8lL{ِ%EKԒc*e.'6R(ɢ먊$5Fkk*Cկ6駏0VM,pT\) hBYǃDGڣxG`)̙ojIX2ey1@ >'{wBÇVr"EwSNweK&n1 h ,{ޟXmܺB/42SHc[[dV3-{ul'Δڵh\Q-)57رo*}'1'oVDt "pH \KNcCXKF {oJgio"{w/8N|TYen>s6QvbOFIDfd"yBߞ~ܜQCdOd&9U-FuWx+ZEfӕEkgG^iӖ+ZW'J;-;@qkDQbGn+~ФJQٽMRR0plON<^i{UV@X {17QzKIZLFnzaķ]OdV7 %${je9DԌ0It4jHPl$T @kʜ+ݤ&c*ҟlAg>RɄlȲK&2f[|A[Ȱ=V{tblu}*ӋXtؑ#m%o;1ynK{_Jx>ryӗBP ;jmaOQY+J/t'O8Nog}پ<|^ll\bK'[rɥr91To52=?EwӤTM<MX?YرcsaS&fAN`Dq5蘒_GՏU":IG~rw~aރ+aN Ҡg;bm@t:vKg>h-gF7֮~ofO;[Ovg_K Zj>J_o6k0nhz`'D3M 9`?:H|Ouz\駟y7?3{ˈlYq?#>ǵ}ډ7דP,+ڻ@YBxGMx5,ESu6;k$aŧ͛o莝_̝{slB(R\Q㹥U(9 M*sUoywU=7(Ou|qT=[$%p{,C;M!U @0Tv<@ #"YG}8 pE?y%QqX 7',֜BF[p"Vʇ J8,P FCekZx ^&ъ_kP/yeN=jR{{(*r{܋M @dE_PPukUiR\? rɭ(61'K@&JV7yF-]nwvQCW+B0VQ<Z/NpH`*Y+䉳 #.KRF_ Pv>eWO7[nA~:W=Qpr_Rh PJUNM_A2ߢqٕWE@ XU`@x DWr#%璡FG PlU(F MX@<0THW# e"=w2Pnz2. &0}%p$0s,т,sQ p Y~ dѴjSdQ Wj vÆMx,mI;ldYFXpѿg0#MruW@nsp˵a[[PѼNq8GtW^9Ŏ^paN˷ޣѨ:rTioYxrv)6|{nqUF I1%ɓ0 ÷ZQtfPFސgK##x}NKڙ"ב Țu ߘ@+4wGlwR(9VG1MF])KQ9SڊKd2vϊ9uΕEfVrXNtHD1ֹؾZɃ|P6ağRS*NJ*F6+BiLWTTMT:TZJ!@&"!߉feRQ7mW&SQwcF HĢ/]etO_؄@eQ9H 5B, ocbǏ]^M&.t^ ]) ǹšqXLD6<쫛]F$%[WŕE. yI'0zEE)̗lT=e$~Ƌ1W3LQC~.k^};j2ľGi5d@3h}JU6-VDܓE;]J+e_"yC=\ 7#K8)o30;mV>a]%(YQnP4Q,0"5& , "-7·p5Tӧ_RHs{˅qB2ZHN-4.ricy4R@Nn9V;EU06{=d'#Y  E  L"@s@P-MDk) ~F? NݿA>ү~@P IG7&9b6n/&9dSwEx⥽͝lrRXC+f(L(f΢^f(묓 O`ɔQP&r6Hh {,qT *4q#Y,aJ1UkhbYA2WU&N07K JF5+#/.of3aI|T\|sJnM,~ ~NaYԄ#oux7d<ڀ,\T8@@E  j80Q,mŹQΞLAQ+B!~mV2jŪJ$  b0u|sɴXnlz n 'Mmpb,$ _{In%ˊM^D0)~iG~a'`gsonQn:x2qX6]n|&(3ѕ;p+8\CAEd'It90S5No@9r軪 @:Pưx"] *N*V)!*$`-CUdEڰ`Eŏ[.5?'_xS Z-z/lI|pA䵁pMEjl4k6d6]CB谌Tqb6](A DWieE:e!Y, ;4/w` &,{eRQ, у@Y @ˊQA 7bX ,.&bXqWb卉FDxGL@'ȢOpm&?΍cޫd1|cjKr@ P <8ڡ`FCO,@"Ybd8FY @ˊ?y@]Hh#gE  Џd'@q3T8;@@"@s@4 ` f ,2@@dQ@L!Y4e'&Ȣ&(BhH#OMEMP00dєF  ` ` Ȣ)#?@ABCDEFGHJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~` J  C A? "2?E:("$?vh2t`!?E:("$?vh >@9xmlWǮiVB!Ԋ/V|XiWH6-[MڴMYRQt.ݗjۂح.4[7 N؎b;ySb4i˙3c;ϣ_oΜ/̝{uO]U;Y_8Ο7]}Qg^hݦ]|noڼָ#-pܩ??kN/4mt][Չ|Wb؛/.kl"^fŜ>Ea۪1/V飰^;[^Ox/Z{1RċE)eTAxbNj<)EEȑ#?]]j::7E ؑC/b7c ^;/39^,]Y^ج/,-X‹x1/ 6^ *^ŭ[l^/ꪳb*"dŲNjmGzQJK[zQ-(9qth99֏΂E܋9/FNpI;ƋZ(nD5db޼嗼Wl{ݰB 8fZ5].dy0'ܿϨۇ/GIuEXbY?΋6W@s ]xƋx/Tlu>AFb +2^]/B%,&GX-^4_C,Xz\hX*//qPiNjz:e:?`uxE'Rxvm5D/ڸΘDcmλX|y9/}Jbx%֚DžiWT78Jwa\/luia%Xvwjdo&ȫr%ޕ"?_b=^R/^ċk x Ŀ[u-P^$dY"_3b~RؾmE'KjE x/Wg/gEY^$/V "!r^ KE' #9*CMdDnȒ"!yAl8m͆Nj,ŋҋeؚM^]r{1΅xXHex1|^ )EBrDE-8:ظebA YwI<0;9ew1ayBrŴC.{߲݉ltqqt).qt"!|{J !y ^$EHx+EM⻗.=S?޲B1BѼ8>>A! 3}D(IsCԭTIm;<+w?s%­TIćO<7{yv7!s.Ϲu]*ERcjds*Ket2hNIKE(5*ƈ=/^(G;;nK݋6 sTЯ%+$𮻤|'ϤZE:uQI_s-KV^QIOnŇʋǎ_b:. ͍͎ynL{oLR@fEK/oF2̈Dr[o[DZ5bI7g'͟%x줪=7hb`OtiQӑ "g&!nl(1?iug'I97E&EK;^闒8oxK_TmJyQ־PW:Q{mAu{`koOȭRITjKH|yÓ''ƧN/|ٍ;QBĸP7pڏCUs|@KԦm7/GO#{K|}W]NqЮm$m7F4NĜ@'?ʋۿܿ+CW2HZ(>x|GUt/Ȱiجon2d<}̭:EM)m/0}Ntbm"rZN᧝67[!YF4ۺSE4NJKND> ^m񋾯\;ǟ/mW^ &>xld8:<6:"W͑X%F9w I'#I`|S<4ߕi7ҰMkZĉߤչ/"(c7#Z:Izji R%qD.trK}kwG?JsdܕDjV|84xt`x\zQ(UZOKȖnJMwK =DѰ@m6Uo'!rf ̲͟ӈ7۴* wWXZ}-mk55U(wu)mTI/1#^|u_ ,P2jû,/C* mz65{(ħ+ҋ-{Ifw>->ܵ/6HԆ;QEt׭;twwjIi)Eejz^]_о*Q'# މNp^wvDLo[7Xo /:Q/6mob}~cB(w%RK* Ňܱ]f߹#.BAc %[ŽmmuբvwUn+mZEdzӣJ98jZ x1Iq{'6= R|Cnu)3j[J* Ňʋ^{*i2BrGz9VHTImd'wDܶi?&zxҗ9W^DÒ*iBrWiCÓ'i#UR[Nm9w}>5ӓ[Z$m*ž/$xѫ"3?L5晴*wWNmn#ӏzrܛuuIBCx=8PL(>~,r|_M3?uv%ڎN'SR=/ʍR~K^Tjҟ@.:@(:@(:@(:@(:@(:@(:@(:@(:@(:@u{&G-CĹÏ7+ X15ӹm<ϫF#Ot ,Jl$JZn$8 k|J碗W1apx[m|hH _}7m_y wZdQ6jτTcQ@~g: E,tH⤺oRZ)JCN$/IX$'tjTيzNol2JI[sy {9&?yvs<5`d;`sh$M}#.-ZbyUzdA*z,jyN'g{, |,jWu\6-],p*5]|:5;mn*=,5_-qnV[|K6j|o t CfK;'tiZJs~|Tj?7PFÁ%˔8O9D3B<\t&qQ*]^A)8}~G't22l(;.Jdd1uQ!ZG[dTiאVt 3jz*oZj(2=ScaBUths9|:te7 BNӇNndӛMb)Ð`ѡ0Lǣ-Xde`y;tb&M>+1η_5󒽧Xs/f,H S}Ngj&BY^0&}~Ơ ΨRJƜٍ|ջgB  B  Tˍà $kj|(y{Zd#y0j b$>$t^r'* :/{:6Dips0tXiNsqcydӇNٲY[o7CW#jjB'$NBZ+s1)@ *9kzݫtɎ{]@5nq>"t)&l$gMvl pL:^Xf&t2$+J&N:yd* ΪәJ{ę܏7*4U)viW^ל}87zsi: =r畒Rrn۸ c}F=ߘR^,qnC^esg{r7+ z#0H-Cъt4͕b2_d PU+9Cafw)tN'++8S]UJpћB ٱt{aƓYJW{$'%#U+٭pl$4Wm18:\{L־< ۠Cf> LvࢵB&w$,:ȝ09&a"yr'#ȼjFKiE1͹ Lv,T#q6Bg+TէQA^uvKaLBgzN6RMsnVI-qxEeIJN?B]_0͙s:0Ӓ8qN̝;g ˫%\!tײN"S~^h̶Ԛ+m謩KL+CgɶT3ap!e.{}h:6&6ԛŻ} !nz:k'1DMKshÏ&z#1 &tX e%2ѪՄcf.ىwD/ͯ͞N:D瞤e>ɁsxLLLs(-s [$ubj"A$od䜙O qOcy:@I>L s:@(+ B  B  B9rNey:JS0+V+N4>h?Z^ہXz]iY]1/ԫ[[^}\^啔N\{8K#hOe~ך 8 5]_َel噥l{ S,ƢC'7BVc3K".±<5fy )e] rEJ+s]]5WW1 $2Tu0'e+3 fwŗL'ǂn+('5漣$Nښ=,~{VWyzWnO@7}o@ ]sݗ0O /[LXWO T,PB%tPB%tPB%tPCV(MIENDB`Ddf  C BA*vectorplotsymbol.pngb #_}u,ƥ^ In #_}u,ƥ^PNG  IHDR?1 IDATxݒ8Pƾ+{/fئh0Rf1(~?gJ~@G 0;a@w #Ft'NН0;a@w #Ft'NН0;a@w #Ft'NН0;a@w #Ft'.LNs,L^L x߽|2~ ҦS[m6@M]*RU dvHqmZwV o:HE Sx*ZBd3G. ;`TI^FvJB # Z-TDigCh-L02gѼ:[{Vrgi[1#b-pmg"]t[;A"Z Ƒ|$|F=i_n>JGhWҩ^zDF߹0ء>DPy֧ܳ@z0ij~V'TV(Po$ U9QOδ>焪$|!K^/ M-ИTF@h\(AMHʹTF@ kjՇ0R,j)O7PaDZW*+#Ց޲ֲ0B4ֳ 1a:@n $rFY{kmbF 9HGWT a-TM9Dh-F[A\T5D%]tkO "yMDTWdP!K-/@$/'r@I HP0S_/cGӺݧBn]ds$\u\xdܜv#gtG#Ae^edg[mkVw|I|A5?xmS0ez>/:H!04$eZud|*U><3+Z_\#TeW8U8<#Te )|TD,km|HuF*jCQV^ˆRӶJ:2_Cf$h! gCc|j>fKByFnl[)TQš-*8Cqp\BPsv aTԷal6]A Ku6TDB6q4pPcFnכ?pPثp7aZ-* #oHƇ' #~ "lEP߮J7V$' #+0\k/& [1#טϖk:YBUF\~ paT߶pPcF0F"[L@FMo@$(!ADMնB6Y6fWf/~j F|NrȦ˘ Mhuc h"@k$ 嫭 " .cFYH1#7}1$ B>:F=2nazucȩ{~[m: t #Aۧ!캄 e$ n+0ő!0nTU dd} =D*$ P|%w2DTH@z="j +#> UEOHF7DB]~8t^ׅ|h]H#.Y/h\#ԘHuB(7Ap-mBUF="F5P Kn 0!'NН0Pa4-@.vLS݅j@NН0PaWBM`0 P9 #Ft%[bk,=F[āl8APۣ:)_JG??3Fۆ <[?]¬ep6 #Ft'0zho&uMg6t[Տ.`n^yì6/ξUq*г*n6/Uֵ̼?싿 _^u^71߶mP-d>skߜ3JsʽŰѓ6gmmgn}ku{'ÆQE;yDgֶ9wN6dUqCTcw7Q٫۷e-[ZՎ=F~ξ}{\jZ eQg߾=UfɘѠ*ݨX `A20PͰaTuٷonޮYkdwnWRqhU9aYJO6׿U2zno?[AН0;a@w #٢1RIENDB` Ddh  C DA,vectorplotsymbol2.png b0 .@3D?w* #n .@3D?w*PNG  IHDR?1 IDATxrH@Q1 mȪs"a^cI\UQ^8_b@81 N'F#‰pb@81 N'F#‰pb@81 N'F#‰pb@81 N'F#‰ẉNs{ ÿ #q&FFQ#2M7ݴ;p5@6.ё@vmln/xk ozzr&.Ns׌d~9odtYߙtuӫx@ˎDo]ȃnm16[W1~v`0gr# wA5z,oTZVxVW o$Dyb{<ħbp$,k7 6.4dd!D# !jNX|`/فxёQQv{U>/]HgN"1ZFikA}] '1 xt? 1'F*Fv`w90:btV藏1 \4w;bO#m !=1]ǣ1?qgrh"&ϑ7,` \H~|,J0:5>t*x|n­!Q] 7g;N?4uz^T5t62V# Dp 16:k٦g#F=A2{% FёCpbd.. >ϰAx5|ڪ8<|S?kׇbDFE{4#xOSw^bD)GG9B# DbW`:hOW1r'2rrAwcDn{t#' ylbDr]ňg1βK #b]!!FE}׆++hǯFHwĨA2"UaG$D]f$x)H{>KW##i$DĈaփ4M p71y\$Fe$!"F#2]#X#Ĉ? x1 mAUpO˷ [W1ep pbĵ*H]Ĩ;+p1*-~ ZWvs1Z"FX4pb@bdQ0YtLWǁQA" NUOS=>2 Tw$D@Vh~#O}BdrhyRuVeZ}eR,|),5'^'f32m!v@1ߖ׈ ,FBbA i՜  D?.$ GW-YS-RG#:@WUv6*FH@6 ȤQ*"FH@MWQǑwpb@]S:Fp]@j84pb@berjd@Nb@81 N'F#‰Ẋri;t\hi:‰p]M9uNi!U83Kh@n2Nj{td4EgD{WFu;w?w[3Z;  tkdk_/tC/P3M@81 Nh'VY iяQ@]!##`^צǬ1/^Ǽ|sU~{5MT<*Ǻvso͏M̏m+2?sk3?ΕGUm{4;2z&Zue~L綎S+i6FyD{֎s 9]LAV0dȨG ُoK -=&F~~|LrYG 5,:}br$,fԨJ'O\TT`!b$ Tl~D㛛O׬Md]]Iczni*OqV1*Mqrnّۣ0 e~n{=5V>zpb@81 N'F?5+v~IENDB`Ddh  C DA,vectorplotsymbol3.png bL\'w@PͮJUnL\'w@PͮJUPNG  IHDR?1IDATx_rHbc3>ͼel_f^g/߆y0*/±Z+~ʬ Opppppppppppppppppppppppppppph?蟠: ia@j¨T^uC5aT[ %iF{}#o?u}%] #?0׏% R*kTi]!Q)'uJfnG03'dhiA+hָ:Z -FF{cJhZ$R\3:v>J@s'RN(@.'pXY82|TENz5:dTA^F_nage%J)u 't4 Cw8Xwat>rআ-WׇB'y 霏t7R0Z:1VUh8l^h)aA<@ 6Z3W-%\\ {/7wRRRU݆;8D!4*mW%l=03#vFX>V<D]L00u-m: ^Om,b#]\ 8U *(C5D%RU' ٣ 5{0 e57DKJ\FD.6Ie!KiFF@;D19Ж$n01Hƹo*Qع7qжvC5#$''''WUفMU]\yFm2Mp!mu-8. &uie4q%4n3T/_?馁O)4|U1t*HUF0MwTx^4Ǫ3?sE0VA@QRMӮcI_C3B 0[iA.BK+RփgGQh)P @^nf]Tt**6UU&a@8a@8aᮄNXEA"}Y!0 0TE*xP;0@kCWvUwPUelחyRRaq*#`q4xm}l_WF\##H`mw Qs}T\EAcl%6WFИ h}W*_aqm] jU6ݍTF6sm9Ýu}DACւh).WѦ:ܣ"0im: *%h6Tߴ0"$;*L2kFPAD몪 i |FqЫH%$A4G=^^dsѸ0~4<WJCdsi-iA[vBts/6/@rvB`[ <ɭ/XZ^%W d\Kܑ[HM+uJ\$\-lz4 mFp6~yD0'akEƁ n3]#yJs\ަNЍo8 Hi }kpw ;S vFN 5# p,a;xt s#HyCpțG}/5!FUaM}R\03L+|Dp!a#C+[@2-" #(և 0b8 #RN1 00E4 \0r+g[`h5# # # # # # # #UF]׽@a;+4<RnFms: H WAp 0D 綌T*$тGcܪ$Qa;0\:0^m!mH=<ˮwJh C Tʨ6S=fXI{4WYޣJ*TUeԔ3TI@eQTF@%QFWD#U5MwW7Of _d`6 &w`6]s;0PJ2MpppppppUdUFgRqFE5#$'''WU9MUvhSUmFF aa2^sh@6M7D]Z 3>>2~_}wgZ81@LҥƟ`Z6 fZ~M@8a@8a@8a@Kh|Gt-lΨ6tKՏ H0v^yYc.1O֏9s{:xVxh{NFukiSct']eP2 ĉq;ir|.1,B#@,e:: Fĉqb@\.9˷v;10&1 N#81 N#J crqfFI#81 N#81 T0&Wjf81 N#81 N+#'0 ĕ0&1 N#R6{?~{=H.cZ{ кo0Rt~J0.6 ?Ol6v[;sn.4Xb@'FĕQkmfQ8 Tjf81 N#81 N+#'0 ĕ0&1 N#81 N#R1r@\c#81 N#81 M n~q9eeNb$B0E^#81 N#nڽ"߲:sy3>f@0&#._6+t;\,'Fĉqb@\ּ0nMwTjf81 N#81 N+#'0 ĕ0&1 N#81 nZ#Eo ,W*FSe(53`Lb@'Fĉqb@'FĕJ͌'Fĉqb@wm!۶ų-8?7떙1D<ϑ@}-궙O1:f z %8y}teq+#81 ێ϶QՁٕ1Etĉqb@'Fĉqb@W*F57 ĕ0&1 N#81 N#R1r@\c#81 N+v#X "L@\9`LK)\1qb@'Fĉqlߞ:s8?X$b*w |+z "@Z[C1";fSeN`0 ĉqeu]/M@  bqb@\`,Vu`,tZuRGX<`9|]</*ux'o ?r?QAU]9Q13i)TY51*7חv?l`<=`,^2.3^#81 N#81 N#81 N#+[|0IENDB`tDd\   C 8A  4histograms.png b]Vzn]VzPNG  IHDR?1NIDATxђP|/>ݠ!πco:|>_ b@8p#)FSx<}^KJv~=v9(9wG[R/ ZJn+gK{[}K)ޖqort\~n\v}yo#orawsWF%#eu7B֨rkd65T9ͿhY?Nڤ(Fjw6575յ܅bLrTmMMR2tެQjmq+ŕQ f揩Y_=Q{+^`f1j j{(ԗ A SW^Ko(eQ|+*FKw8 CV ZN1 ێCR2H I#@F@ ňnR֌ )b$֌ )b$ZN@t+Fv624 )b$֌k`:Oh>m^|0MF}W''FR]gQHǓ!fN&CM7M2oJ"DN:=bUl; sqHJ]!)b$֌nhF@v!F!FbpN`?:X֌ )b$֌k`:Oh>m^|vezs?5z EmFus,"CI#UO=Os@[BNS퀄P]fT6@8wzdص!FbpNb`bt".40@R2H40@R2H40Κiɱ)F@&ǥ!F!FT4!cw1r/h#CϮF{w +G4'G;>'7r`+|.Fԑ!f; 5(#Cq; R@tXDgp6Jd(!FbpC50ib4M>2I#I#@8p50۬U[1rh!l )b$֌k}N |.FyyW؎U6CӤ`qŨ4=#\Y A6MkF:栍 Av#!62kQxzI%ȐB؛nʀ+#¹8$%CĮݐ 1#>ޅub!Fb!FplIY3b$݊- 1 1[ENkDsh#s]tO |u;`F;q#9Gh{UylxglޘԨ)0}%"C\] u馋;\ 1[50pM׌I'!m`eeG>c/u}gu]:͚ÊQIjQ]:q#sı^F{]fKhYst]?^L#">F<._E"DhoǽDVWdg:nS2\DY]sis8 -E1z1p"޿2ˡQ]VsϺ3kБ2twEu"hQ؛2W@8pv톤dص!F挮+P`9 ;kF 1kF 1SfHvܜ7s!Fbpܥ|.FյW{4HxeK{!u240N1 \4,6d5<FU (t]Wfpv!FbnHJSNd9e֌ )b$֌ )b$ZN$e͈t+Fv#eg40@R2H=@.!gWCI^#dh#XS]JGsw OsRx9Cfςd>Uy`|k7$%Cyʊ(MI]q@gʑ@8p )b$v톤d ` Ph62~40N$%CD$%C4k`0MH#{TA .AR2HFoPOSu1'_:2ߪQih^#CÈPU5umzrET  ?AO5x<~m=$C[Q,!fo:Hʕ#Q +#kR\N 1vCR2HB֌x`K^40N$%CD$%C4Ic$݊H 1 kF 1kF}׭EM'@=O^Q:~s8Rp^ץyܬ9:uܥs879G{5aug=Gߵ;C(4)CjDA9]h.BԈf};@dyEv6(Jy%ۥ=NJ>3в[si o**+Ce591v)CwWcf͑g@8N1 )iIENDB`DdR   C .A graph6.png bSƿtj1o-./Qn'ƿtj1o-.PNG  IHDR?1IDATxn8Qr0ʚ`ŗHyj+P3]5,` Nd5ϐOX%1z˧`b@'FĕQȺ|iSs#81 N#81 T0''0Wjd81 N#81 N#Jq@srqFFI#81 N#R1r@\s#81 N+.S˳?]A]i^Kmx{7l0.> :>s04, .6MwݲShL01 N#JŨB :;90'1 N#81 N#J srqFFI#81 N#81 T0'Wjd81 N#81 N+u?}WSVT*F"k+]e81 N#81 }ٟc{ жm7s0[btHxdqb@tb㟮f7Xi:81 N+Stg`NFFI#81 N#R1r@\s#81 N#J-e)b|'k2M@\9`N0R##$Fĉqb@'Fĉqb@\9`NN` 9qb@'Fĉq.K{,Xm#?6떑s~<όfa+#bf#|vK")#81 N#81 TzvL ĕ0'1 N#81 N#R1r@\s#81 N+`қՙ T0RtN`Ss#81 N#nY}t\:k%FBOnYp}k.` Zqb@W׎,|û55gQIc](G#Jmz?#3B Fx :Fx :Fx :Fx :Fx w(YN_ ĉqim._M@ џ `b@7>#܋W3*y^|(Q1J4"~V>sŃ{ԙ"e0'OҨ_P AV#^V;ػXcbV~9T2{bT//}a~|<U/} ^#81 N#81 N#81 N#^kIENDB` DdX   C 4A areafill5.pngbm E7&<U[]ꝛ I JnA E7&<U[]ꝛ PNG  IHDR?1IDATxAvQ 7^MYL܋ɼWӽdC%{րHs=;0稃-M@tM@%bdy`nX(8B0Wdkp^czr+q&#z#81 N#81 T܁'w` d@Ob@W=zBcY N#Jz*z*5Г'Fĉqb@'Fĉqb =q&#z#bt~,6!ؘ01Eg۶_`SctKtEG*ao13H60< pe_/#>C:#q1 ĉqxnȹ".{Y;etLH|)ǎc+5Г'Fĉqb@'Fĉqb =q&#z#RglnĈVR{\t~e:R1r+@OR=qb@'Fĉqb@W*FГ;0Wj2'1 1r`xhe H"[X 3/zhoitu=`:5F<'<$+N[s#e+yl` h1`2 N9LFĕѺh(Lz*5Г'Fĉqb@'Fĕ^zr+q&#z#Rx@%b=uY N#Jz*z*5Г'Fĉqb@'Fĉqb =q&#z#"t{},udtN}pm}戜3z\D0۩D=3#s YX#ucycW:WC@_ pp/v!tۜ<\!CIENDB` DdR   C .A curve1.pngb ʿ׺#30i cn ʿ׺#30iPNG  IHDR?1 rIDATx]Psu)w2I&L'!GChhm]kI-)~l_vQ8F #q8a@0 N'F #q8a@0 N'F #q8a@0 N'F #q8a@0 NL ÐNLP0 NT @AM8w4UP0 N'F #qMI5 @\S5 #N{^[mڏn8>E*A'ё@VB_o^{[(8-^WvmatȠkU _kFdq8a@0 0ZOB}DH$MVt<3LFv<8F #q8a@0 NT ~vqMUFTek嶖Mnu&}:{u{Eeר.ZY㩱3#$UR'F5F&njj2&a@0 N'F # #^j2*#jFE閮uiMgǏGѼKN@ߚZJ}h}[Km]W>5W|q{瞓^?mvu~;sm}ajWaНPyFM@t a{o3!ٺtye8_;0nqh/{өjj2&a@0 N'F # #^j2*#jF C:Z},[phѓ?;[y߮ޝaldT0 02 NT PI5UP0 N'F #qjr⚪)VͻT=TFK}\ a q?~ЗKh-lt-rh)|@ `ờ_Һז?k?wُ;]p8_}"a6a+ڝbg^:ptދזmm+0^XLdm +=!7w` Nwi=Lvmv?n-OHOzɓ^k2&a@0 N'F # #^j2*#jF5MǷ6foֿ6|D~~g062*`R'F5FPSSC `q8a@0 N'k*LzɤW⚪Iw0ro0DDHxH q6}ٞ^CS󌖂Gʽ=۳~OxLiUڙ Pӥ׌},k.f6`AX+>.**#qIh2q(I'F #qȤWLz qMuӥ cשǿ^{^'ц'kd0  EF5F&h:׌jj2&a@0 N'F # #^j2*#jFE閮uiMgǏGѼKN@.fl؀wh;FmDŤ絢((~0L#"]Z=Cg>*wum\c~9sw[w; |707NY^~lfk+o( N'F]FkFP[l4<]MVSԝW=z4MU8jTl*Tߚ0hޥggQW?-n%nuRbܼ ̹ftS=}Qo͹=R "-zs0qՏoj]uSuֹݓ-MtrN牑=d8ݶm+&k|n{{0|­+# F #q8a@?ҟoIENDB`UDd(#f  C BA*axislabelexample.jpgRT F&= JX`a<TFT F&= JX`a<JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?>3:/, CiVןm֥$%G?{iݿO}+E|?>3>;K񎡢j~Fimo"hvc|5UtdZ76z&L@ЬRq vWோYt2Bn T%C*% X0ր ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *%ZmAu,.]NE$NyX# ![?4|YW ,K-$ oyw|`O+.-Fڲ 31VCX#Xy['y.vNײrbh­hѷ7S>k>Ov%֑o~/щ$Fg nڻCd+0|JnNVvѦ^i'up+1Q@Q@Q@Q@x>)xO!w$vWz+_>o-qkxMMw@)πze,|A ފWOwKupf-dm{Dk?:&xK*Z7* G5#/,ޯ. .$mui2_MYIO 5սO R$dB 1D$Jp-EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^/q"|7þ-ӆ<u|KsyRRi{3 [D`+ `ji;__L|H((((((((+ʼG'Ov^^fWx!<%F[%ԡh١qېۊUM&;t(;{I!Eh!P{lQKd.fM((((((((((((((((((((((((((((((((((((+ʼG'Ov^^g:i/g5\'I+_hYI4/40c"tK AZ*e6YZ\_jBI}v,h' @Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWؙ_.Ыk¾,=įKᾙ *b.c"%Hw1{SIlt *L,6bBhUUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEqM:Ķn}iq}oo xgݍk\0H'qw%w-_liEQEQEQEQEQEQEQEQE7x\Ҵ/5=u]O-Z;YolQA# E_:BjRO|TFuOx-)VRrC , m _1xE߉tI?oῆ>g۴}CLXtmNO*.cK]t!]O2ἵg~_ ?G/Im/)FFPX9ۜIjo8֠xowcP緼.LʴKibZtoi g`_1<3Ŀ]PA்%jUE Dm&H* FBtvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uKIoۻX/gg;Ub Hː2dWϏOB6x^d?m`W3XTuZ*p׆]fG('K_--Z}W;^,֠-޳qk ]JI,(UR5¨v(Q՜Jn$K$C++QY((((((c?ѡ |7\-ڼ?{Y ˱i#UOj|4-5oO Y|HZYT.5h8'Vttt!Z˛}o>k>O\t jwă׆M^x$  P~4]O]-UdmP| qq$ӥVU5kOT^hw]+ >&|+I|7<'x%HD9Sy!7w&T -R2GוxN% =+IQҬ,.4Idhkfe7t,v\#ۢ(((((((((((((((((((((((((((((((((+ļ'eo^=-Tt:?5,9 8~/پ?o|~h´ڿ->䧙nss3:'@kaLk'LIL3id_xI~r`S7ӿwmF'JRVZ]AEWx!^fVy é*v`y6 e_!bԢnLY('3v% *yp,{3|TGoeKXS(gZA&݇.9Pl^G:BKŠʶpҠtxU!>**pe7$[_/MQj-j޶Z[5(+¾,xo5CԇH\kzD-4<;rqCy6=ּt?L/hTZLwVQwBuqinC,FHܢ ]͌tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W/㶇[];mDlrQƥq+H>V܋jĮC [1rNN#vߒ_.J;EW1AEPEPEPEPEPEPEPEPEP^7keWesXmu-ӐpCPA5uxwFP{cV&MQ͞7>+]m,"[i <*cd,vGfaК8Fw[[5vg&խ%o)KyZG쉯7xH4y{kId[dD9.ve` o ZxK__ln?S7|g99y.xZm5}Cq/kMg$bɲFa$׺hW5ΡcMo>p޼>H88e$ִ]$(WY|Q^?'7 ux'нαj:wEjsɧۋY#UMӼI|7;b/ x_Dt @2KX8$eAy\5M3z~ۿ#֞v0}md|[\E̞oC@G'Ov@Un[B̗32呙l]سI$պ((((((((((((((((((((((( gzviy ]FEZ_<1hZd" [+pvI9,Iff%I'v+jTiʥI7&նml$QEŠ((((((((+_|-3QNDŽ:j77QĪ䝱lpe!΢|6IiE]^mz|K cO7ˡ+"- 9B9(T6?G t{dհ>Wg8+ [GN' ,6=lU_oxRxj('È!Kѯt]~V6-.1FW7 J6 GKu毉ƙ_ j?w-.L[M30Kpd+yMtk|Y{__}3U/\gEy J/45X 7c8b;Z?+o?t|%Kh5yM02Q Oc@ூ~+K Dѭx+ƊJD;s=vSIլu*S/m6exC$Hee "EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^%'OnjøB'I iW6iծ8FYI'+n>o_+soך9>hz.dV&&m)jQ]ǚ^#ybgBU mG¿{3znjn^$tIl572wqm@ra#${SIQҬ,.4Idhkfe7t,v\#۠(((((((((((((((((((((((((((((((((x.jv믋Z#x^lݣHoz_|`uEb5oBYlTȅKT36b}.KiwIvվO8jEG>ϳ>mwyDư/OضN{~]qqbx׿h{=kW3WZ׈P DGTn+޼K:Laaoj42FV3!.PX3aRoijҺtc"EGӎ&6+ʼG'Ov^^fVy߉ohLJksH_)qXm V+);VU=MӴH,48R5("E UVrsߖ_{tЯmB(QEQEQEQEQEQEQEQEQEQEQEY|Kxu+kmK}>]*+ymo*o$ڳ ($VU)53zU}mu%o?#3{վx[:E;i5$S1P2pNl);C}5FO i:?g,4K[w"B$FA"1V?& ˰Weoygqեk,3eYXpAG\O7~7Ӽ;m-\3_2e] T24`1I <)/>omh{1$Q;ʬ6nebpTqUBnۗ+08jRRI+-/S(*1?{Yg}`|}?ѷ}n>Wh?[:Ffi{ NRD$?SSJjR&i[ :泳qӺ5(9t?L/hU_~WW%LtixKė1v^B D$V=֊6:eiVve [ZDCHR4E*V((((((((((((((((ŤiwӤAk "Zq+*b(՞FQK$ S^Ӯd5.B]`%*Qn텾i `Ij?]|o⏊מ&x=ÓFK8´G *ԢݵsηV9eozZj%~.k6^c>?tM=΋.-'եs"8V*JC E|UG9:iD]. (aEPEPEPEPEPEPEPEPEPEPEPEPEPEP^%[o|"L<1[;aEP( _26WP@,AĪVw]')OI𭽯n㿞kĉH*dqZJ;_KZ׹߃M{r޽kk[K]k{}C\-gmD1ItR:P68tL#$hK' 3>o.iYUZ%厍am_i!D@y6/ vqX)JĞ%~]k7юnmW̗(# >8ӼI|75;mb_ xSD/uY 1ZE+OT(8>^U?:&xK*'SZҬ t.U0`򎡔"EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs2Ƈ/o/ y;[;|~^$ Ż3lݜgc5^(gWvS<P*H pk<C?h_U6l|7mv8S[P3V9*<7YEWqxWşj>xW>iU& ]gT;KX4IqR8#y(>4E|/:|}GL|+xk^kh!ⳗU JG;,Sڻ3s=w A֟;mo#{m2 p?`WxN% :x]-ާ+1xLKciQR$p*Nh ( ( ( ( ( ( ( ( ( ( *Ymޣa7wR,qA)gwv *NO?|Q,ӼI|7;b/ x_Dt @2KX8$eA^g~_ ?G/Im/)FFPX9ۜIhڴ2JK{HR7fUP3<˻cI$U4Z_Ҭ=2QoaK[IVXg2HVR`H *QEQEQEQEQEQEQEQEQEQE'V"м9mXx; ᶟo irLh8fXA#E}6GXI$;}ZWf5h­t.Dm4: >cB"(U@0U(mɶ6 (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWؙ_.Ыk¾,N%Py|%KuMDf o46i?9P{SIִ-B.#.#Ki-Ue "ŏ/&^2ݿۺ_hٷ۽3r種Wt?L/hUSڜ:%mB.#7#Ki-UkuxUxu A~x_/:x>'?hm"9u8gLek0 }AEyW#?5BMW#xKK64:.kV"N̈X *) 2^㏄|iďojV2yLc%KA#?5U馣}witdt+Sh*s?A& L$xky=GUf-0kT$p NIg׈>4$n<+>%נ73]_%&&F#Ew~7/GƥiT/o<[Idf, g9tRVûћjWGӠOt{_|o;\? 7^/5?M˝*[O,4N[X`+ gsZ+ʿEwύP}˚Z+¼3ujv<%lju4ooU !|H 's9s?A=V|&L>$xx5=;UV-ⱖȔd@*X?EwUύP}˚4[3OyU[ٯ%PWXhŒd(PI9$kռk}a¾+sYeo9ebTRJs?A߄oxO_iPDZ+m%ldk(@ W9 s\/~%xľ$x 7_.tm< x$S;!ma`H$dW9 sG#?4Wxg7 ^,>$xKi,+emf05BvNsA(z^8M-|H<6jzvm[c-7)-n2T9 s@EyW#?57h:f#[ϩ:5ρo^J%ÅPrHxG|!VM|?rks݀oe,$L?(s 0F|<5-+LҠ| yWRK#0`Q >A h*s?A_ 0J|!H<n\WRxfHvB\H#8=(h*s?AG>7C.hh o>ּY|H<%UY xV9V,`k#8$8 ύP}˚Z+¼q[m3PxmUZ[;o"R[X#i d`8#s?A=VG>7C.k?o>nt?G淟SuVk3 o/fA]` K 1A$u+VƏ B8ΛWgM5SJXI*#ύP}˚~|a>$xjZV}AhFa A|@^U(s|aCSx4LҮ-̑OD셵 FqzP^U(|o;\^ោ|+xSy.>f^y*Dc!BI \V[q[7U++y-Λjv U0F<#?4x_᧎?i~2?eEWGv߰ ~NU((((((cWfeo鷰՝K,3Ut`C+) H5n |?߰'wlLڹ+7Kb4n-Wq"8߲Ϙ#?A4#U飈[$KaXL-־u9o%ix^w97<7Ҧs(Ub-v;v~i'ˍ$TQEQEQEQEWKQg%1wKRSp7wiБoryDDWi%VC~L:;6ʹtlCyۗ PUռ}¾/[q^fo9emPR$ & 7v[ixjnGEⷶr#䕰 _|e+k־#⧊5~ WbҋJe{EO4_Y :q&;c((((47Kb4n-Wq"8߲Ϙ#?A43?K"ӟGC_gټ}?(((((f֫>?_n p4lR_>uYPlF-x6~0Ю {K+>m`dG*r;XddA]{n?_6 tSF:wG|Xn,s$ws;FJ7R àQ:~5O5i[%e"Xb D1Ɨ$vk= iڜjWz%3;*61 p&EPEPEPEP^U++E\ +R_/N.hL5HXw.Lk|3g HP۾M/R 6Oo$r*3FA$*_}CBWƺK۞5 bAl+w.GjtGP;D7LW0$6n&IB+jrɩ]zt _^dX$*(/k@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@đ^ůbFо`@w$'0:%?i?͛q?pW wojҚ΂lyJqc9 ޭxKu6~Z<@L>sT$I\7g9+$[vtm}X+qJ{rmG+έm/O[մb9XI|牢Mᑸr1Ckou̲#9ْy%jrFS3ir;wk\Yc ׳6{e{Ey|B4pK.e4%dVNW(A'vXc db>X;ՌeIu5]Ӟ>uw]ͩ=u+}++Z\ C⏈gioK;G,U& `|1=o% H"Y6 941*#*J &nUJ?ӨڌRO⊖[E__k>7nu^8ڭz=R=f[y5RKj'dHx9s??G%z.xN4%tں]=֨ЅLu*擶^=oEr2.⌛'X(Eˈ?-n; <]_{.kR''0/%pB qrq #*Աj?jW5c,: gc|P=9 xŽs^:ۧCkou̲#9ْy6z>$OiWmI-A)X9<8F<ȥsrvܭ蝯vKUʪF K=}k[o: Oo}Pf3f>~N~\Ga+W'U`i֬'{]h<}2=Ehk{nkee=}.MYߣ[:<(kɥmMZּ6LçZa+e3U?i>2|k$> I* S$x+|'Uܔ^dwt䞗٥|x{>UpV{٭<ľρ|CI#Vv4Nxx֣O_ {mNPXpsu'^EvVT+ƮP{5.[IJnNMf\1*Sm~ftrJڦSɼ!DivSx%Ӧ}n 6COY$쎣{#Xڗח7%K>1`ϩQXꔡBi]*JNJ:V8U?wG'-uwYNWu_iyv^O/wcg8ZX&gŢG[cTɺ/IwgA:8Ԍ5I8Ԧ7?-J7jVz;YṢe%v%n . oLV( A჎>43JFYD%vN{_E}9V5yceT<͆"֞HH<أfoQr@xG?tx~][+p:`fQgWVT^1Is?ݧ;iN[E%G3(Rۊhז07m崸meĖ\3X~PTgɨLm!-Ƒax/l|@ܓ@e# +yd*I[ʥͳvnœT%_yS5{[u}5t=*Z,WZfxn5yt2)34L1+g1]5/kZ;]]`ZV*0 6vzg!u#ԜiV/;oOӚdAEokӡ|/z(/}G ?77-m=iou`ۯ͒  $ס9*)؞]jϳ-ĹDa׫_uѭvñŬ=p`s6Kaa& ڭ߉vԄ 1A)5a   ^!)!!6B4B-*>5LGW} )Cv^`Z!bKGDH cmPPJCmp0712Hs]IDATx^{xTו'勞d2=&s/ЄGqr1`m0_l^1DCԉcgbZ AďM("D!=b"z'RvT (mR04p^KK=%RYN~=3gN>sܙs}3gb]ԍFT ܐuHOxוf^V;*foPZ9\ed܊wyߝs[ :عs}`lѾ;WD/ DH̎JHܹ;WfnŝyŊQ L<uC+s6m0No3@˙mt!NMhw$ܙӟt.v,y[7m:szbv&-4u;O"Nou N|/;sIg@?u;W#[q̊~ozs7O+6߻̽4B7Ʉ1Ĺ3f=b{7Km,MAV;Ž;ow[s6o&}d69Pгj썶ٚBe,= 3}gygЪn>;w=wnz79/-; )ܹ9?gmtȂnY,tsSKfq~}b`(ϛ/6d˽`iJ /6g#[f wYl֬ɼZTLdY'W1卭V(V{.f0?{ςm/ŇoM~_6t+NM´; '_ Llxښ+Cj3X^ʜN`A7<-X|&MU濝F~sP,,(4`gm3[}bdR+/D21,,? # (7 Cx7n~6Jܴ" b!+T :抿G'hi{ "ɲhݹ e\H6b3ԞiХ{7ݽW )S^У!' łuئ{, = t^ O):u'MxǮi? #u9Zw:™shޑyg78wNCt-AT8OC 9om_'Õc$trGG4N+3,,!KSpa 9r,HWxq9]17 끯r4Xo) z(}m(ˌ.dhjP>'믉)HVpC{6n84Ql J1_b2Lt8d ) Fωu5 ca\r˹*/?;f)ڟ-[nD1ɔٝLH5)rG^j B#Ȓ|HS笄a3.3$,g Qnc8ၥn[ _–ۇ`m KEZ :\Ϸ( d"gNZi(G(#dcNeq6ҩl}v1^k Kī, su٢1.vs1ol9;ݶ3]^x PEX_n'cI/NF" CÍ u\pӊhe)FUheaVbIOe+n[Ҿ(`oS z?3whjxخzam73cO'>yܱ^/b en"+$;`Y^؍{Q BEǫ I'Q%h+NcNTᨱݓx` 7(D&1u}waQIZ5< ؙ1P7Ί7;uyhVE%/M\dQe/Fi^: ,YF'NֶiGIX_f64v\ٽFIa#i0Oi^:,xX ؁ww6b{ٻ]/szu]uDFokΨky3=VdG! Ų+g| J) ^pe 6TvxWga/spD'KOP=q]=K&B7vN6bgӄ3\|`+Al^ Y,$Rmz<^_X_w`YU\掯 /Nx.271r^ٕ\VE4A *-:պ><2i?#n2orp',ՂAr!HV51JL$0EX 2k0ۅ1F5Qs+߽"(CBO\Gb58nA[0NÀ>⠊*W&B0v(֩TJtJ Fz &+M8hgzk!DZvM3u}xJ0Uu$in\8հcQ8 pe_yxyG~zx ǎ;@3qʙHNtKT,fOvJ IB襅R#Mv2mzeVtp6(€Jz_."8DY0 5J]xDG 5O^ ~/+4 &k58#nUvSmַ%OÙu\*.q}uݏWdv1g8݇ Ep;EǗᇖ&K .+N2ᆲP%`1xS6N;X1 D\'ww?΀ⴵ k"ap*C((c=GhkSF _lPpqӺZ*=K">XGFW-'+NPwy|Hk1QBxC'JMƫnM.qV3 \jP- k#&QS+7eT 20wFY+'4,/0Y'Ն,+;Xt/8o!^^xΣS&&Pi&h>Ɍ?X׳4JJ8jL[P~XT2Wv p.X%6x^&+dɖgVMc& pSO`Fr-͜6 db+ePj$,v-xs|@Sa2@|T($ZTb ŝn*f{wA+렩zhIYzDm {4^wU>$_1 +1e41 ̒,'}UN_ eO̒vƦaS;l,| (icXq_Dh5TQ }HrB܊Yi'+ FJ{]2ou,EN2]JpEjab[h4XEUSUfMpFv7sen1Dl2J%4^7-x\E'+ QVXLՓH( POz즲fqllV֢+7ׇv) Y#xtR,,ЫƠ4]ދM'zHk?s厦?Vugyiυd@ꦋ/+{΢{Up{I?:,fz[xoϻaV8('!y({eSɏug: LFN,=Y5Lg'' 6qisr'@SB^1kT,䀅*b'#eg!a%]Ԓ,WY\jhM>V3k֌(J ͬY5њYJY᫘_k,N,jJCs_'%»QؖU@EfE3gΘ9cƢihz'͘^fC+Ff&{~,E,gH0H`Wܯf%ˋ޿F}Q*St?n s1y6M?Fln-,+)?k77@KTY+X W,_ett+zfJ~L(O .#? >Ifr4\r~\;!φb H~9jh2g0BPA;Fţ19UE+lXsYWew!9* xD+U2b:DHn*]j,aÜUgC6C}E r47+իUcVr{f`Ԩ'5z< (nF,bJ~rY$L< EbKL7ViB6"̂|QNX"Cgj\#Ru޺Ly. Z @nx1 Z"Iu {h)zT\@L)S(D[QdT=/yOk[',{98}]Wv\Ӱ|Wd2))fM0QCC7M@h ,(+uD;Q8(5-I^\xex:$J"boR'unp6¥)Ŕ֭/ҔSqls9SkmVij;jnx߭5PD\/iV^k{ 5c،yxVäxŊ<4p+$"t n—o]tm|8Ҕ.k{B+@w˔J0=bZ/qBJQT˻crJ砩# ۶ō[_@$(z+O@de`| ӲqF*Kw(O*_ȣ,{& PAbv}>lٺq-Pj鎨lz:@ݔS t&NϐHehv|5(!d֪囗gv/j mc^Dl~}m{6Hu<'Ix&w.T+@$R%-!b̟ Da$KͦqP`׉w4Qvy̲֓DtÆmi&,rK2y؀{,~X:fa mJT̋r|s[Q엉E_: .$R(:E*cznBR Bj %[e?d ;}qiHS%I>P2];PQb&ASojTo+,rV=杻{__([̓͏=EB[("ѯs^-O{oM J8[z3pLQ%Zz2B1h婪6A)լY_]M.qC 7߁=$WOX5?_}$.0{O4=ԼwU{\dh뷛Z@v6U\y{W̜ҴuZlOvtKP@1;۲ʾ<5TQVIgMmwJm1dŗXˣO> 4i=B*cդJO<5A"/o۫i'i궬.2TU i^}m% Kށc0 P9 3=2\ȑ;eA~RXVBI^h&};b%c#l˨p@+``t=X> Uqwb5HDkz~+|x!{Z(Ty  G4#1D-RT҉8}2bه[(Û߁-44?Ő/?0[%lR]w}}`o@8Zī]joe+)%,FP6I?VRǒRaD;=@kL8VR+6DoZdD?sՇ|ӓrņ01Sۺݢ I ]cMO>N!H.oe,=|/dݫ|̐"KvŪAZ`A2[H{lG" uC*a[ؠa$_yyw$eo4"hk4=K8BԂ/dGky w< V*8Dz%r=# o=a,`d!"',.DP*C}dY;ֶxW\$d"VfOehMdJ Y{!~55Y(HG*k8!L0Y(9r `K3]J1I `(Ee__}<‘P(~n{N#ѓupHس{׳Uy44^PP}<\}[7q9۪D yWͻ1Kv)H&ʬr}'Njn媃'i kpVUPUmSP&m+i^zTcP @P P)CIf|K%GYM){gCD%dmX)串R~ڻk j%6 $2Hŕ4k?+SۆۓwG\D-LEe^Qn=l𴍁юR'cw!ؚhxH:A=5wW泫) 64JPkr»#: @B0P j#?0: KNgtK,u9f~`ΣM~;O&Kڶ65zP>YKF@[W25!IC*g q 89~JJiUJOd/G2'pZ4)wcVaBv@V@nUǰ=-Ydp @k3BPGs.hq!hױuN(u$0w3mY@^#zǀ%sq}Gk%sQ: "  J$0 p$s Fx 1gkಊɀ L(DpmC0r.a (cPۏ>s׮G[Ug \ľcRvawx0E\# Vn@W+MFtI|i2x*,$_pXbe ah=FS, yÁ.{ dAd͹qdk Eh뎣|\-ՔC(z'6ƛADP`q+=E%C6 VL0dM +F,wn榲 uvف2XXte\-Pt 7PN R:ܶEG` h;/?pЗ(ڣ'fmn:35o}uKMoDE3HtHEץz/KQnhwFq|\yֹex1tÑRϵL`q JQIM6{:|ՊsQUt\hM 7\;1;Ɯ dss_몳yL_EFYyA*cd6B٤b8Q๚+{y"gC*Y32r{,x]u6 }KI\K햎SDZqpaGXz}8ik a$ 0υ{;B;RZ)o\B~'OuY+m0+La9eyN59˹sjJ*I1BUAZ@&6P#`J$Zx=tNVH\IĽ"V׹t,%`DcifYv2~'mݴHM9QINm2f XMG#̃Ki aJ6Q,&̊$DBgumd"3St xuw>S]qPRD>>"Kod:I2͑:neҲs*wsŮ+:1}f$X'۠Xa8e=WXslf'"#p%vd"a0I/8 V3#.n'نzozi_=EBآ=MtG a`a/ ?TvWx1+\uLH`#ZXUBI5i-R1fؕ&ie!ȼX-cSy~2V7'礭ųډxA`$Xu"B'Ӗ+'\as!wƛ3B;APnJbQhA0# A8&OG2H6sT&K(PUlRv橑Oxb]CD_2*Y:KFFlG <WvjғRN-BHsbh]ÈLEn2" `)7f,#:VlZ\"D@E 7c·١ivFS`՚a J)YbZF-M˝J a4=8D=y֭OIm}`˗孵5ҮIG-oye'POPcP:>X{Pn$|ɍ 0L r $5H:-U%BY1k _x$hEwQ(FD3Wv Ô4^W9VK~n__qKauOҖ/Rc! 뗛9R#g[qD^g~L8~)"5̳q!`˅V7mǓP40(Gr:;wq-/ ֵ]v֔4ܶ/W[NV&vmXAC ۾/|q{p]K߶\:7wD,fHfُ\MOv,kh\:?MZ$& x8+p4\#xCOuY J&}!G,uC6nZ=Aa0NA}q/~ac/T݌JVyB%cD'2#d4 3X4A_B/_ojg-s̃H&rC)V8Ӵ3\OuY+3QT~o|p( >jkhP2Cjٶ>E{"u,[_g,clko :xtoۙ Y%@TDfYJ'X*T42JGw."D,4,u`}=J`Pmid}.0Go[C=3e!Rf2/-x 2rBfe),/b,)}M.#Uo*% ]{ Ůi:ӑ) ?5A0T?\8ӓ@pcc]q6n YIFSCu u\̢X$f#D/KR').O78bbg#5K;2vneDhl.lHn'Lt=44ShI:pȤ.C(NT(b0 7ЃsO~/ d-VV#}{>cebQcm*.wR?s@Jb"đEL°U[adyoXi6r2N"@w87HQlYt'j ysaHW /Kc5ev8B%>K2kũ3x+ .yHTA~ ~%,%<7k_PPohޥ!ѢA]A=^lqdZWJDtv2$ذAL@R;> B1st,EŨv&71*m]&z57(%D?2XJi\|YV/\NT/d~E,?4_ ^;(H)4$S$"[㠑]G9H9<OP,Bq =mPqUT($!)h*X/p7ٔdyB&J+ޏ T}oÞ+wzĶ[3T+&('3꬞&:&a w46lېBBwߥ¸hrFTyXcǎ팣6=lV.js{Ά^u}ׯeo:wH :?DӎcB_>臃;*0n\$2륳eq4K"DR8ADu\(?367f,=Uyl'BeY t;oFAJ|$61 1oio,ӀF"'ŒFhW#1UTdUU/iÑ `he MPBx5_\?}{Y_R\MLʲ >q2#إ\OXk o݂/^v>z/E8]>\Uu0QTLZ$9޸y mb;'-M: b'[-גŕ's9FsE6cЫx3! SbkE/5zwD1'}fVʶ'y,eY+zQ߽[ę3+Ae_h8!iPk/`̉EGhTU }pMtȥ+*NmtT |SEڄ#X+|eS߯>A2'dDX*6+ ̀Q'd1OE0,_iAM?>݁s1HhDsd幾L/wPci TYRKaI}m/L6-QaN` + *UΦ3 2#-r`iQE,ł3gy0?|ȑc 'VQX TGSa–{NSLR+jPhO$+ӓ&ﮁ%{6 o9'ϙЫbPIE GA 'ah===|"6bkxep ^|A'fq!Ɛd#X֝Qma Ulj*{kUP/ % 7$$\GXP7P!IU4 .gY L[&Vdi8˫Hu1Yo}1FEI䧤W욈z,Zf ?P ԷD8Hb 5 ߑ4$Ub`U(Gs2<_(v(TXM-]H=dZ9GD Wb+BuQ,]TδW}, |/e8Tw@d0/$Dhf)+Je0R<SD/{ِU 3PbSJCbSI"VEYDou.;$Cjwp*B; CEcTX! yI֕dAf! 'c-f y-v]R^XRTRIEDw|l9S?2}sXmKm, `Ǫ,;3]MZ@.,Uט v3EHVc:!#zP6bs IZ=w%R3@Mc}p.Q,,  0cYXb`tjaC=BV ,͡~u']noKGŕ:?oTjثƝ8x> 2Т`&%x9nTTj~%Q+IQx9UH(z_<JW&Օ{SUci5LKRv nRx'n+`q1\hz~Pߘ>d$^q_=O+`m)*FfOvisΞ(5 ɉ8d,*%*0BX}RCujZ{6 RNT!3Ȃrk7}w_?\BE@yLn1kVGkjaތ^9%nXY EU9<h RCj֍R!# cN2^sSsӏ^ٵkCpolݚۑ 3ѹϘ9g̜h.ͶًMbCLQ9<b:%rڭCp¥+xoY{WCJhl6)8 ŏIǻ]zNaO+]8Ē'Ue]&'Qnl2>޷@;5͓44c䅿}Nm_w , YV&5?F'rIdydϪ[[Wu IZ XIEU)+n@=pCY5:ioC/; Q4t2~x݇FYUU)igǶ1z"Ҕ E~3i+4Gq[b,d+m|-uLƛ-st3xH"XA]Zbi3tg`EayISqVFYh"N\ݏ;6RCk`^:۾˾ ldV;[bY#H{wAge܄JΑg'OvmHĹDk`IV .+@) G#ӊ/5Vͤ4GKII:S?/gˋlكN$hni`G=9fPKD[,tq<"gU0ht9fuGbWu>/Db8D_ߧD"%>jֶ# v¢@/v`ٝR#}@͉HGVPG%E %Tu*S@ R5 @jUL<؄^ߋFD|b476# W^Q e$\uǘA6eQ-de)d& а0x|<+;hgm ;!}6H6IЫ-T~g #댒&riL:z髙7@.Q9ȣxu=oD Ɲw< '(_YQc/4%-+HUdqDP9V N3n `1贏.:AiF< 1 .4'+Iz"K):[IGX|X uV/KNw ,"is͙4 Y1>d9&D;xX#U8SN{ ՝OT(b˜"$C2% *- Qù]7G͛9F+$ђdj+U\LHS\n)Tn%>&kUKGX%xp> GH|(H ݨiJ^/55W/^rWKҨCdY?b{l;GX%wȏK߳m+&"=WO~?}UmH)dGΕBOIGC~u9**VR".ذ㞍;Q~BvtVBǛv6{gzԟ0w|P\%lf:vlm8PϻJ\aaE*hX-[k7n3A"3l`8tٖv>~c?Zy,j6=,MipNƘAueJ|NXXf[x[eF .2б/>Ԍ"&5c$xK.3(ǎơJ&QND6[fL@+ --K Dk'O,)=ՅpQ0^`P.E ?]%q=Œri2dqT Vh90x)@BD$A?(H1h>JB2!ի}L j̘wia<+5M!WXc8\ThCЖJ-u# ȯ0 571Q$Bzk<tW9 Tkh6w *=cwI*eѦC.QSG+SiʖeZʿ/O_"tP^mlM?]z J1%N1>\_gČ.V<ϝܻN3Gf_^0a]S\Db9YՂm.(jKAƆlgڱZ`/qxyQ$"LL,Y sc{  $DN{S7VNv(;F|3Fg*ᧅ@U*dRԕyp͆^tI$\tHEಛ̀k-*%*webJX7hYEx҅z3*EqM^DYiL:?FlbyRzKכf@-N"G)YT`z5WZ*\0)\yQV@w}l@*"-DX! @"s%Ň,G2YIdرN(: \s!#FhlR.G,ZhR{>MҚ졅7%.OUVST". LԵ` /W QQeQF? Atk%G^{h/7Ў`XC(U:, ~#fzv;@v+81ⰪC/ 5=1R/a$Ac.0|F$6QV1`RR ~1O?1҇e4PXmj~{#HӯP6eݔ5J$'Uw]nB8X䔤tuTUt(?s@@vPDhGɦ窏$M-b eT=]4i6/wlu{;ҿKsY@To UtР"Ŷm<$GPdiq4f-H)~zbϪ#~Ġ7(%U _Z8D1YVmLtŐ++*mDwHNй}+o~ ޏCssկacBMդo!HfRR[ mj u-: `QPmR԰MMNTf0Hͬh)LlJcUܴڟ?s׷X Uvegʯի;}H&!J^Ga]akFW9äsEkܳW@* PՉP\X|{|o[VҦQ+* I"qHd9_LwR?( \&YilR!JT90549I<Bhd)Qӣo쾦]{Vu~j6g@zIH,f>2VE|qq.!vq'OrurRڔZ вLV12zẆ &"5LU7Pxw}anI½LaLf hƢhUߤ=MXh$I[^e kw-l^ax3z5rbaCNt 6H Y[Z=x5{驖M{[:8Dl d1VCzyoC%CXnE e_^q`qA3uq'@5)(Aw|a ;1$bA Χg<{uR+?:MGC,Fdh{a2'{ Z2\p-* ,jBȠ+||f}Pf aOk7>u˖kk7 R3 B"o[BPJXK9'Ӯ:G(NjM*+he_~p9׸(i( (np p`xG$n߲&`RV} a^:0JK޲32cE5ӧ0uk ;dyҝA9V+"˚mvJ.FPvfX}(LhD.q"d-29uCR4nok+4 <{e>ݨc%$< 0f3j)8Kr1j%KVʱnO<@<`hDѐU-˯}k_YV0hmˈWJ䴥KX"A\9l+^0485?P[m8_|VQDW7TxgiĢ^inL!37Tɲ(TX_yzZnx'ftXRSb?rSuC< rhY@7’HB_1R~&5Ьf~[n5yۭmC$!| q,+11 {?1sY]JG?Q!N>2+J.J@6l:~ׂvY),!J."RVym(%^ʬt]uu}޳q,şD%-<CFeɈ1λatdb3zR=Cղ`pQ* $Qq/۰}G;.ck@^?%ElN dVYI^^)ϣ0'{99/_(-!3|It'; K<Ҷ54M4;,Vjpo$ITgOp0;qkVTvl"r™TA% RcW%|w2P wbMJdH;_@Uig-;%xRᄎm )PCT!#qyPw(yO5r\IBޜt Vut8n\ߐR0"$JH*JhF2:00p>߽prrƲ6JiH!gٰaG}P?+&BV>eXSgOUΪiH`* eR@b,-zjw#\W!lݱJ{G놃)3w ?n,tw-U%dÚ߾ uCwFhLWUZXFt> ]W_d|Mp$ٱA/?oVlK)s*\VeJ#)15Og0C3Tt ;vc@7w-.F6m^`8L:{ KZC'Tg;2$dY@v&O`eE;|dcaBԒ+H3ay<NM4oLTQ+ jÆ*DQLJGT2:m VXU`)q%XB2ϪܞyDC%32`Jn#؏ٞ#.5mG_7< qP|dy$\Y`r CRm'Ӄjp[*%<(Ja7`Yvސ'C7yEF.z,n_R ⁉?U(TʅWįP?!W#x†6o,D=xNK!H$ihYkmIw{N$p1I:V9R v`~_CƼ4L'խyV2Q x>(_b4t|_K#unސhhj֖[uSxe DeI 6B#ԣ*s'-! i-{.rTVj!I"Y'RrҀE|kW#[y}aϋcj\yF*,qu|?tYR,`e //3fDK@IF\t'}YI_[oNaެEaɞPOU^a8(dIHݺ,44¸ F*2Z׹%_;dC:U`Rv5(n}Y}?Ʌo=)zLtf n`M4O@u`IA% c䘨p@!A0wis&h\CX,#+`y*crǟ4^q= 8@x:P>`?ۛ>Һ8M`hr5I PAO V -,u߾> &+.F XJ#9ΞH!(e2H, I`ǦG_e`]ʺ oشٳkf͚U371aijsYmZ CC70 HTuK< }b ٖ<{VU+/J'zz$ stmid0j,R!`~i!TpάQWj2.̞&JfB>*#B|Y"ѯ&2U6) ='+ňT]C ջ^:qB6T%qpqGI1w6|CX}\͙6}睧;Ԉ ~q5`-`j꾣"եs ! k/1E%Sj%Ħfp$tW͕euD8,\f|XWF/*9^S]y]7#?cqTG(z8_f v;B+/eY "䁹TȚtP#/mmL5O,q\(pa1x>zc> '+*U;ޓA=*#T]yұ>tGUq;H;0 uedF!\~ .υL΁mdVANխ-ZcV ɶ [>W &DRǓVUړ2d%Ľ DH0X=z榤VvȄ^#_c &ˠ9ȦR ng[yIz܉"5L.K<'Cku;& gXi J47#EdPQ;dKod3V !JPɠ~Ï(K}&:ܧ/V8bƐW) 2ݷAG,$nܶˀU};أ0-m\zYj&'W*,6=O' ʸ\:CcFQ]LM3roFćS*w S)g0tQuf:Z*'LO(p"x7֮(,3Y7o>z&PRѬL2;rZ?z:WTc:]Y4DL\IH;6M.X XyEWI ,K: NǖmPxՒ:>  )(r// UBʬ2A4CQhaAis jiKb]0> H CT?Y*WrCd u1fx3LjiAkkr: -ߍgB^',A̚&z˜ !I !bXkK2J lkB]<sX~<z1bZΚ~tQtՒ*Dh#_W3ugUpIRH0L^@E\̤̓dM8&&] 74?fko}=W?OWg ]>.lZ7ϙ>u7̚??=>Pߩi3$'zE^]«$l)~qj5uG^KħlX-kعOE%`$vA U[Tc/^kC~xp, B7̞:}9sfOYm#OA:b74eʸ AD@"=TK+ KL$\XT.zK>&ǜj;"!7D gخ'|Gugc?4 hWɈCk?7lFLf/YnEw. %Gx!+Kz LY߱n]_r3=?{ qM#>E@O#Y`P HB!{hk9FO*0©" H\}C:t|ǻ\؄.5fl]=HHZxI١ a##_ FX@ 鲏H7WűX{Ǟgҩe'jpP!9 pE K!u^Dr'D/)%FeUx3~8Z TO:n8 ZK|]JdIe7,E ^ ,0:@^>%,țo YW즏U\h9 ;=1Eۧ'=i UDVբ0>F葉B :de 8@sXt,;u aE]Z.aKc%/z#Sa:+z@x&f( 鸯{굇G"8>U0("pY.RQ(=  LU56|F&9l8Á0]KK(3eLk (TPIJmO`,Ha^[Mt t!QE"mk֬m{TUX bE8q  lֻt9IK6)U*ä(k SR^ Z+p ,GK .Vb( cXPdIի'OPO&@ =Q%'PB3h"AREjH箵 Ud%l܄k 4epHĂewq+M!7nUJQң,.T.-*:]ɄD6޳!0ܚ#!cDH VgI$UM[X E+ O]NTD,sa{nx,"QQ~3lSZ[dxY$:sj C(T5~ Z1I'QxzC(hZ+Rw/Alق(;,hd"p"JFT$M1\ :KRF"h |[nݸ~wR1@X)B-!KtZDus^AB(z n@)c2R N*$JvuVHPJup W?ן\f~+YbvB8 ۹@u~4P􇞳wƬ9f\M"rem$F$D .1p0rĶdnjA7&Q$ ٍE\ND :{]tԨ1E6>XXb03not\`k!B-{Ƭ͞uviuOE2^vS╅0`<#o;yh S\^yh+Fz O]+ $JdF;"G^}o%v* X'\,e! /΃Yy}nq Lee)P+ ϭtTTsAJo;2"',.='r2cstR6;dtQʹg0fO2UW$jVw"I#_ [!sHͥed`qq Oǻ5JӢ7R'r)Hb=Q.bW!`;U?X574?aŗT]f> i]Cz̺#by_0-˜Z"$%XlYdd @~ǎwZXW #+ rn yU @@oݺ[׎Uko o0>H(#, LQ7K8(?BPLB~ ḃݦ$OJ4 ik @fToNxUڻP2^b&kO,Ǒ|t P>|mc% )2miͦrxXR+YbX='`)\p3P4lf}f~*((0"^H5D<.T'CBtxOALOH:ϿRdzg&4He)3vA5n,;uYX`^oR{[j }xz]gH0*ϙM lAb^fu's tHF\|A~寿AK!'eN3(TJw~2@LY3ZХex_uݷ=e}[Zu8@I0,퀴 o?xБ5>7ftIpG-!L@B[;DuH@K@YOxrDOߊ78=^FȦQGz/d^!,͚QХ#X@MoukVqC'%scw#fT1Rܥ%^Sd }DH'QBܡ)%[*Iwgw _ hDnB H|q.] t :>?o}.z޶nݺvNdeuCntj+B24)͞5VꪻL$o׽Wwb~ d60է<E6`1i$Al$˄W yO`1)HD#{Z =@"4 nxm {7+˄>֎Ҁa g̻n\ ]R Yb mi~{PcADCY D_x Od*j*xF]Eb2#;΁ɷ03| H$vRO>>N\x|vW*EGێ^߃DR[Rl N//+^;;<, S)u5aEt+TIH,ď+8T HdQVNe Drv1jnYmvX'Kt*}P8+ĄVAb^;{/>h~36NUNjkoœ=A/*h<Ǘٲa|ÆA !UpDhhԼڥa7v:fʶe“o8+} w˃Ⱥ~W+WEFya$l'kRq]}:#7 K1^T,jԱ; qWg緅$β5^/ jڄx)r`$ʹ-MM-M۽uUۑn豠$Odp;u8O g<ZpWֲnɒzFPgN0zLQ>{S@,Ȉ[TO{V|?}zWȮ8y7_eUP]G"&MWߵu71yO׽$xf iĦu BPr[ e (AcrZ)XXBqQ>E0Q/k̿ӌ݌=v:3YqX+DuWxKpgΜ;7~-.4_v~޺7-BFҦ ↕=^d`ہ0D;~fД޸c׌@.^S;rˣrf 4oBFgCVQ?p|AUՊϜ;s䍰c_ݽdW,ČO~-}>YoyK.|ᛎpZH(TUb9dѹ ~lE+a\9a~F'm`cċK]!@_E[6%[;oGPJ]}w{7tܔ9?ތO~'#QhAL!da40ew (Doq :fD ;*J皲j9c4H*~u㟾}[oS'Xw{_vj𠾡=GjE?ɿo?9cEoPBaz]j6ez;߃~wW+v(S0Uat25d#҅m)>ⰲɈ#5hx~OF F>ͺm,4ƃS7/c+ hyO+Vي+N ;cO"X\*-{/=> %cV&sr8,S _Ǥ]K(ROq bЮ{#gb\y9F<|{*1vݷ~J8:~ RFU;4$qB֑9?/v>eo AjVcKjMcɫ%m98d{T-~|PDI >?}+ qyVFu ,RHI:)W_>HTP8ܽzr{Ք)2叮US{W_?]lz߿zզ{v +/j{#_]%UWG%S!{jE_؁B9D< F7uX!^bq|:W?F߿n]~u7-:L@֑ڝtz҉5d-B RBVBŠ0V_TvtAm j5gld҃`1e-)ÿ?;"ːQݴᆣ/b:ܻ5ƯԨrj`⹫zs@1=%2X{EqW$3#0S* <bZB9t8'*ugSZVAjMۜcXϠgѺicy#dG=LTY̱_ɏWugb}0Rф̅M3哤C4Ck򢘧m nF(Gń"rb}8U.6 6GX  k@"FzSt9LhXSDЯn9;?MūI)xdLvi&X)l ȱt?"L 6Aq%d&`%zP$}Z2A%6<W)(\٘KO3b&= S,N:b w! OHaҒr8?"P2s^zvfvVB޻Kt.Ocے ; `՜ >ں-'?@ FNnY[G)rC,i֓lWt#4(sa U6wA6]b9gV?,/F_l,P]w":I32B qϕ fjr=7 \Rrˍ~ DfbjVz|*܏`eXeafnخ@\L0r.ϋcXzn R쮳ߗ Xٻ.|΁%ȻpPپ e<=e*c)N]cK,k#/↓*=beUfVHAMʽ.fˈr" r5WWUm :n(2ʈ~2»b ꆲuCay2ϿAƺ2)r2S2s*Q`^SȚӡWP^B(I}&iy(/Xs18^2 PӲJl9qtr6Λ7OȄVW|v\DU8Ț*U_;yO^]N=yXw: :`M޵/+*NޓW5y׾#;yO^]N=yXw: :`M޵/+*NޓW5y׾#;yO^]N=yXw: :`M޵/+*NޓW5y׾#A6NVIENDB`?Dd Z  C 6Alogstyles1.pngb~mb.vI!\m?ne~mb.vI!\PNG  IHDR"ho,tEXtCreation TimeThu 24 Oct 2002 13:04:24 -0800ޓtIME $Z, pHYsodgAMA aIDATxr8QggaJ ^}+8T;ׯ •Sfhf2d6p231l|޲ ?$e6fy֜_B-m5 -#{TnAbDBҨJnyЎE2oudFgv]5UJf4GQm=PKՏec@cE#E 9YHfAߜS )̸OZɌX #3~`zNfV^27P2)h LZl քulXքـ [#X6Nf}3quAf)uYUz'FYDfͱ2"Qɬ>^ÓYvR.3uP̶شJ/'l̮3{xܾX7g[2K+-yloȧdխ_{dlW8!7/qO7A&1>"dv-*6ͦv]wcYnIo_Jjw|{l8#*[fVvDخúuS>l_m,j0պ@qq04hFfǚZ%vl|w\\vrƒفe]7ny% w?=7IfߴPh;/]ߛKf 0ݾPGz,#$-7;aH7F6F=&hP/'y3LU"%͸o1 .3Q\i*&Lc2Kf)2uƨn4F FLc4b4F;؍ŝu|U鹮F5`fc7<ݮɹ6qlǝ>?fEg'H~*[E\s]\74A^%hv:<6y>7^llS鯻~4KȒhYEU;loIY46N/'#2!e+2G=Dc/âV.tLe4FG>=їl۽`ߢTFw Yf2zYf#A2bS=e&3S&3 \Y1ҵ>2 u# 3 \Y123 53tf0A8Aҙ] 3Q43eNE33;1FͬITTJ_]`>,!~~01 e,?-Oh-yQc-ρeۇ8?:p@v-02 F9@ \GO>x~8鯮2!‹P} w-t#Zv鯮2!‹P} N ´w Z<|#3fҨxYx̛Ym}\bT{^ƤGM?9mihcmӵqiyFx{ UIENDB`ZDd Z  C 6Alogstyles2.pngb'r{B٦&<~n'r{B٦&??? 31h Ec-l`[4آ1h Ec-l糾{9]xy 0s3hSF-ovC(='J7K0A?hE;AR;&4"!6Zpdi꒾5qo ӊ1M]7Zq!K&yw5so 9Y7Z1&xJEWa,7Z3&yCWm@S46)&nhl:.F<7SnKAohlx,1e ÎphlZ7Ʊs9ottXFo 9И 5hbw 4f ɓ&6Bvc1"רdCԅ{4AYp^c%u<.Ԡ[WfiftL_Exـ~8Dfԅp-} /1cqV9܅X+А~A>}cN0}~1~(ܾC$ CЙ< $A`P1P Z#0;H`@ߘQ'Y 01+^1|`߽KlO~Wq~{nXxENiw_{ۆ.גGX#j~K<:뫨;Myl-%k#5z93#Nck].,u.gŐ^gJ}NJVONi~SGΏnk GR3?7F[{ ۵K5۵- rpkƘ0ƯksF_+>8H`Ƣo Mح"ofzLb1g15!aBq:/Rq;:y1T_V?e[錱V\RU9|M1<`q^[@yIvӯ/PlTbD?P+/K\Qۻ#B Z0:1X("׍-MAĦo;coc@ 4آ1CN 1X("xL]NJ7BX("kE ry`oHLH%kGV$*Ħo MVDlƀVDl8p`KcM`M??%4DEc-l`K1'"6}c@l4آ1h 1Xh /LЯ1 _v-'7ޚ1<5c=6C6M"?|NDxl`[`y }t{ג;Mדi:o]K޵ ǐ6k:]\@E :19y<5hh GyIENDB`)DdET  C 0A2yaxes2.pngbg@=.=a]nUg@=.=aPNG  IHDR |[,tEXtCreation TimeThu 24 Oct 2002 14:51:22 -0800WNtIME 4ү pHYsodgAMA a IDATxv8P2g{{`lY%{! q>J.lׯ_7 _7f&`H A @  0$`H A @  0$`H A @  0$`H A @???v}šB*K>+(`_3ZŲJ*;_{Nx)*dX7Zo+Xw]""Nt"E*]^XTPz!`,́6j~~ ^>hɠC+Of~#$`" !\RvT$K;MƖ6ZwƐF9n0{qPnD/;RlGF.E4#K  =MVRl 7{K֋cENf@+GNoW)ğe]ky=f~ޮ]dOIdMF-\4 GghrU&qjyx!+]YZu)"oV-FuM b: S]D/sKՀ.D^g73›dd19K%ZcD+3>Pq {DSFeZ8h $EиRO XR5H}>KGfUN-f y?,&boɋ)/Z}PW]揻?skqOchKI_D&RL R}mFx%Z `s9M•Y!c9#t\\CyNpqעM^>M!N~6Ǡ.+p'9!_ X Rl.q)6x.NI!R@Q(#`_(\\!`ץX.9!UX,]WEE/E])hiAp$E:v.BHq5.692Fh 0`Q.,s@hi—=#"b ]W9`e^1tKqH!6,"ũRA.h[RT'JIX0Hy'ES!]d3O& tS&.tV]t$SDi)_$7pF t1M]Db)v("Jc)`pF  g)_(EkQTH^n,v"VmWPT=O^49 |1`ruAU]Eo*ۯJhzAN9/.',vtwbq--ZO)_$du%Y\Eb2@*L&QO| sHQ/̈́0R)_L)K`JI0bVH A @_;,rvu]DfUXvP)X]e^;Oi]}`?|%N/kڛ"E杻U8UMa )&N$QT0VVɱh\ey}0!m4YṈۍ{^mG3Cl[mlhP7/qOuE$/*,!4QLT⍰|)RL'ۧp=">wAM)6kn]D8 ")*a#vס4éR_in[8xSp-ZYF. AM ,\F Cy>JLFRi0Qܶ:-L w.})t}"` Ǵ :E8,L"&p+nKLp{s1MOJ*tES*`(\չcZE59R@ՊPg􋯍׵; R~=U!]q: Lh@pqziuL\-ix䩼꡼ӵWNVd_m]W0'Dz䘜ia_63;wte"eZG V6)F lx WfcRT0]CH0,k㑮`dZ8h J`N8E!]C#EUHvxE׹5.Uظo1њFy]$]3¥qPi|ruVdްfUa XN{mEv̀HZAqrt-"Ec)ތr}pyypHU\L=?k5'+9kM!=N;7ZՀ}7ӝ9ܓ#t´fi8J$]jSii]"Zr|"`õ.JFqH`C0-pQFP0`_γ}eކhm(p1]ě~\7v[:b(O.&eS0$`r2]E591E+e9ir@ @=8{]f_rޞfKmBtoU v̈_r>s lC"t:X|]flH xyn_/=U}*ؕ2/[`lNhB_ZU 59#é-Batۣ\.m6B?s վd(_s@> Heading 4$$@&a$;@V@V Heading 5"$(&#$@&@CJOJQJ>@> Heading 6$&#$@&@ Heading 7t<&#$$d %d &d 'd -D/@&M N O P Q 6@CJ@ Heading 8L$$d<D&#$$d&d@&NPa$;@<CJOJQJ> @> Heading 9 $P<@& 56KH<A@< Default Paragraph Font8B@8 Body Text $a$@CJ6'@6 Comment ReferenceCJN@N Comment Text$ Ed$x^`EO Block Quotationq$XX$d %d &d 'd -D M N O P Q ]X^Xa$@CJO" Block Quotation Firsta$<$d%d'd-D M NOQ]^`<@CJOJQJO! Block Quotation Lastp$$$d%d&d'd-DM NOPQ]^a$6@CJOJQJ<C@R< Body Text Indent h`h4O4 Body Text Keep$*"@* Caption@^O^ Chapter Label$&dP;@FCJKHOJQJ\O\ Chapter Subtitle$$dh]6@CJKHhOh Chapter Title$$pdh]p@B*CJ,KHOJQJphFOF Company Named< ;CJ&KH$>L@> Date$a$5@CJOJQJHOH Document Label $h 5CJ$KH0X@0 EmphasisCJOJQJkH:*@: Endnote ReferenceCJH*R+@R Endnote Text$ Ed$x^`ECJN @N Footer'!$$ !$dNa$OJQJ*O"* Footer Even"HO2H Footer First# !$dN@0OB0 Footer Odd $ 6OR6 Footnote Base%CJ<&@< Footnote ReferenceCJH*2@Qr2 Footnote Text'xB@B Header($ !;@<CJOJQJ8O8 Header Base)$ !*O* Header Even*@O@ Header First + ! 5OJQJ6O6 Header Odd,$ a$LOL Heading Base -$x5CJ$KHOJQJpOp Icon 15.$d`<&`#$-D /M a$5@B*CJOJ QJ phL @L Index 1 / x 0d^`0 CJOJQJD @D Index 20 x d^ CJOJQJ< @< Index 31 x d^CJ< @"< Index 42 xd^CJ<@2< Index 53 xd^CJ:@: Index 64  `^``:@: Index 75  ``^```:@: Index 86  `^``:Or: Index Base7 xdCJL!@L Index Heading 8$d ;B*CJ$KHph8O8 Lead-in Emphasis;CJ6(@6 Line NumberCJOJQJkH,/@, List; h^h22@2 List 2< 88^823@2 List 3= ^24@2 List 4> ^25@2 List 5? pp^pB0@B List Bullet@ & F hh]h66@6 List Bullet 2 A8^867@"6 List Bullet 3 B^68@26 List Bullet 4 C^t9@Bt List Bullet 5CD & FdD&#$&d(dPRCJ\O\ List Bullet FirstE$P]a$@CJOJQJROR List Bullet LastF$]a$@CJOJQJD@r List ContinueqG & F >Th.Tf:E@q: List Continue 2 H8^8:F@q: List Continue 3 I^:G@q: List Continue 4 J^:H@q: List Continue 5 Kp^pVOV List First L$PP^`a$@CJOJQJLOL List LastM$^`a$@CJOJQJ1@ List NumberN & F h>T h.Tf]h^`6:@6 List Number 2 O8^86;@6 List Number 3 P^6<@6 List Number 4 Q^6=@"6 List Number 5 Rp^pO List Number FirstuS$P>Th.Tf]a$@CJOJQJO List Number LastmT$>Th.Tf]a$@CJOJQJ4-@R4 Macro TextUxOJQJ*)@* Page Number5zOz Part Label=W$d@&P#$-D./M a$B*CJOJQJphTOT Part SubtitleX$$hxa$6CJ KHOJQJvOrv Part Title?Y$$$d &P#$-D./M a$@CJ$OJQJ&Or& PictureZ$>O> Return Address[$a$@CJLOL Section Heading\d;@<CJOJQJVOV Section Label]dh@B*CJ0OJQJphHJ@H Subtitle^d5;@CJOJQJ`>@` Title'_$dd&dPa$5@B*CJ0OJQJphZOZ Subtitle Cover `$d $dN @CJ,KH.O. SuperscriptEHH*L,@"L Table of Authoritiesb !JCJL#@2L Table of Figuresc !J0^`0O Title Cover~d$$XXd`$d%d&d'd-D M NOPQ]X^Xa$5@CJOJQJ|.@| TOA Heading@e$ d<<$d(dNRa$5@CJOJQJ8@b8 TOC 1f Bd@ CJOJQJ@ar TOC 2g8@8 TOC 3h d@ CJOJQJR@R TOC 42i dh&d(dPRCJR@R TOC 52j dh&d(dPRCJ.@. TOC 6k   ^ .@. TOC 7l  ^.@. TOC 8m  `^`.@. TOC 9n  ^$Oq$ TOC BaseoT^@T Normal (Web)pdd[$\$B*OJPJQJ^Jph:b`: HTML CodeCJOJPJQJ^JaJFd>F"02? ax UbW\cedep  % ' ( ) . K L W i k*D(F`~de{#%&PQp1CPRS^PQ\prst(*023? *IM[moN4!6!C!"###W$X$$$$$$$%.%/%E%_%w%%%%%%%%& &B&U&u&&&&&&&&&'A'T'~''9(A(o()*,*U*\*7+A+r+z++++<,=,G,,,,,,,l-m-}----`.a.o.4/5/D/////0Y0Z0i000011'1w1x1111 2Q2R2b2222333]4^4o4445555556647<7081898]8^8_8n9p9r9s999::;;;<<V<m<o<==c>d>l>:?V????@@@B CEEEEdFFFFFFFF00Z00020202U0202U020200U0U0U0U0U0UU0UU0UZ0U0U0U0U @0U @0U @0UZ0U0U0UU0UU0UU0U0U0U0U0UU0UU0UU0UU0U0U0U0U0U0U0U0U0UU0UU0UU0UU0UU0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0UU0UU0UU0UU0UU0UZ0U0U0UU0UU0UU0UU0UU0UU0U0U0U0U0UU0UU0UU0UU0UU0UU0UU0U0U0U0U0UU0UU0UU0UU0UU0UU0UU0UU0UU0UU0UU0UU0U0U0U00S0SU0SU0S0S0S0S0SU0SU0SU0S0S0SZ0S0SU0SU0SU0SU0S0S0S0S0SU0SU0SU0SU0SU0S0S0S00303U03U03U03U03U03U03U03U03U03U03U03U03U0303030000Z0006!06!U06!06!06!06!06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!U06!Z06!00&U0&0&U0&0&(0&09(09(09(U09(U09(U09(09((0&07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+07+(0&0^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^40^4(0&0s9U0s90s90s9> N0s9> N0s9> N0s9> N0s9> N0s9> N0s90000`0Y00(0U0(0U0(0U0(0U0(0U0(0U0(0U0(0U000000 oZ#/9>M8=AFJNSU ) ~Cs?N")+0257`;p@DM9;<>?@BCDEGHIKLMOPQRTVWM: F:?b$aq9U0WDSɀ2$!;(+2$Q")v CM@0(  B S  ?F _1110618925 _Toc24275142 _Toc24275143 _Toc24275144 _Toc24275145 9(7+^4s9F@ @(@+n49Few (%*%^)i)***!*"*&*'*+*3*7*8*<*=*C*D*H*I*M*N*T*FF&&&&&&&&&=FFFFF&&&&&&&&&=FFFFFFF Joe Chuma~C:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Customizing Graph Presentation.asd Joe Chuma~C:\Documents and Settings\chuma.TRIUMF\Application Data\Microsoft\Word\AutoRecovery save of Customizing Graph Presentation.asd Joe ChumapC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc Joe ChumaC:\Documents and Settings\chuma.TRIUMF\My Documents\exambot\extrema\Tutorials\Customizing Graph Presentation\Customizing Graph Presentation.doc2||}d~v2 udJ*p.̧6qsDmov` !r 8  Vj v V|Z0=~4v%xwָ}Kנ8 V.V l|$.>Pf *tK"*v*vP-8:Tt1wd6v|@zzw)pE|Z0s(K9QL8GDD>O|Z0{aO9s}WvI WxwָrZaC_fq@ Tbxwָ.+cMVll {Pp 8ހrt:vWkx/|AB||Z0^`.^`.88^8`.^`. ^`OJQJo( ^`OJQJo( 88^8`OJQJo( ^`OJQJo(hh^h`. hh^h`OJQJo(*@h^`CJOJ QJ o(. hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@hhh^h`CJOJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h8^8`CJOJQJo(.hh^h`CJOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h@h^`CJOJ QJ o(.hh^h`CJOJ QJ o(" ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h ^`CJOJQJ. hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h^`CJOJQJo(.@h^`CJOJQJo(. hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(<^`B*OJPJQJ^Jo(ph pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(@ ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(! ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h^h`CJOJ QJ o(" ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJ QJ o(7 ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h@h^`. hh^h`OJ QJ o(@h@h^`.hh^h`CJOJ QJ o(1 ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h ^`CJOJQJ.@h^`CJOJ QJ o(. hh^h`OJ QJ o(@h ^`CJOJQJ.@hhh^h`CJOJ QJ o(" ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h@hhh^h`CJOJ QJ o( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(M ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h>~}|5L667x7%I W Tb7aC_D8QL8P.+c` rt{Pp)pE{aO{aO{aO{aOh{aO1/||@ l|$WkxP-r Vl}Kls}Wd6*j f **DrZ=~4>Os(K8  V8  AB|mo.5`@h h^h`CJOJ QJ 1X6`u@h h^h`CJOJ QJ !6`@h h^h`CJOJ QJ : 7 @h h^h`CJOJ QJ &7@h ^`CJOJQJ7@h^`CJOJ QJ o(P8@hh^h`CJOJQJo(1@ ^`CJOJ QJ o(\@h8^8`CJOJ QJ o(Ģ@h8^8`.@h^`.t@h^`.̣@hp^p`.22 .        LYº                         n        L        >       o`        x"        LzH        ę                F                 ),        z        j ֖        ^        W\d% ' ( ) . K d#%&PPRSPprst023##W$X$r+z++++<,=,G,,,,,,,l-m-}----`.a.o.4/5/D////0Y0Z0i000011'1w1x1111 2Q2R2b2222333]4^4445555547<7081898]8^8n9p9r9s9F@==LI==Q {X"#5678F@@@&@P@@:@x@@>@@UnknownGz Times New Roman5Symbol3& z ArialCGaramond-Bold9Garamond?5 z Courier New?& Arial Black?Wingdings 3I& ??Arial Unicode MSG5  hMS Mincho-3 fg;WingdingsA"GenevaArial="HelvArial9 WebdingsWTms RmnTimes New Roman"qhs&*u&Rs& 7 ;:|$0dGm<2QUsing Colormaps and Gradients Joe Chuma Joe Chumaextrema-4.4.5/doc/Customizing_Graph_Presentation.pdf0000644012702201742730000271325711274636625021673 0ustar spangspang%PDF-1.3 % 2440 0 obj << /Linearized 1 /O 2443 /H [ 1877 1164 ] /L 759471 /E 154158 /N 19 /T 710551 >> endobj xref 2440 50 0000000016 00000 n 0000001355 00000 n 0000001718 00000 n 0000003041 00000 n 0000003517 00000 n 0000003560 00000 n 0000003591 00000 n 0000003825 00000 n 0000004281 00000 n 0000004304 00000 n 0000005242 00000 n 0000005265 00000 n 0000006197 00000 n 0000006221 00000 n 0000007330 00000 n 0000007354 00000 n 0000008527 00000 n 0000008982 00000 n 0000009193 00000 n 0000009216 00000 n 0000010274 00000 n 0000010433 00000 n 0000010736 00000 n 0000010759 00000 n 0000011535 00000 n 0000011934 00000 n 0000012170 00000 n 0000012402 00000 n 0000012970 00000 n 0000013186 00000 n 0000013419 00000 n 0000013824 00000 n 0000014414 00000 n 0000014437 00000 n 0000015238 00000 n 0000015262 00000 n 0000016390 00000 n 0000023477 00000 n 0000026156 00000 n 0000046399 00000 n 0000058645 00000 n 0000058853 00000 n 0000058933 00000 n 0000059142 00000 n 0000072285 00000 n 0000086912 00000 n 0000122407 00000 n 0000122638 00000 n 0000001877 00000 n 0000003017 00000 n trailer << /Size 2490 /Info 2435 0 R /Root 2441 0 R /Prev 710539 /ID[<8b6d0422a4955b8b6b8aab14a8d15afa>] >> startxref 0 %%EOF 2441 0 obj << /Type /Catalog /Pages 2438 0 R /Metadata 2436 0 R /Outlines 1560 0 R /OpenAction [ 2443 0 R /XYZ null null null ] /PageMode /UseNone /PageLabels 2434 0 R /StructTreeRoot 2442 0 R /PieceInfo << /MarkedPDF << /LastModified (D:20030505124707)>> >> /LastModified (D:20030505124707) /MarkInfo << /Marked true /LetterspaceFlags 0 >> >> endobj 2442 0 obj << /Type /StructTreeRoot /RoleMap 1584 0 R /ClassMap 1587 0 R /K [ 2057 0 R 2058 0 R ] /ParentTree 2371 0 R /ParentTreeNextKey 19 >> endobj 2488 0 obj << /S 974 /O 1375 /L 1391 /C 1407 /Filter /FlateDecode /Length 2489 0 R >> stream HT]pU>ww&0MfC˺6MHK[JKCi)-h( -c 6BA2: :8>83M7|ݳ{/0x roˁt0\ӭC'3~ٞ[s C<0tԛӘBkO^Ms>RgsX=fjl%ۃ'O1xVFzJ ]UdCVpt;C )nMQyas|¢NR%YSSO4EE}4iXup*4*+Dw͞UQ,.*,-Y_xɲ+-_S[pQTŵMߺ <Ν$D3ѵ֪`ۺ5M6nXESKV{z}!۵Wruַ6Y]vUKtWٗM^]{/ǰQ{sV{G,1QTPTVD5&iDC"jLt glouޒ#þǦ=Ҥbx!uHQ: Ei%RLVg`Gg4  -WXǘMN"ɀN.a[2ɸ)|Ҍ@FD|"󥦰` %eSOpw$R {FH; #x3R 6<{A(=@"l0@8p7[E6u~۱?Oa JSu`uaA|Rp18W`xP3C?*ֹ%~8sNP?B aT! (( DO݅8^d,!dyp[ YKbߐIpZ:'@^ȼk| ݏq'Gư~ k`[RW endstream endobj 2489 0 obj 1027 endobj 2443 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS2 2444 0 R /CS3 2445 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT6 2447 0 R /TT7 2456 0 R /C2_1 2460 0 R /TT8 2467 0 R /TT9 2464 0 R /TT10 2470 0 R /TT11 2471 0 R >> /ProcSet [ /PDF /Text ] >> /Contents [ 2449 0 R 2451 0 R 2453 0 R 2455 0 R 2459 0 R 2463 0 R 2473 0 R 2475 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 0 >> endobj 2444 0 obj [ /ICCBased 2477 0 R ] endobj 2445 0 obj /DeviceGray endobj 2446 0 obj << /Type /FontDescriptor /Ascent 1100 /CapHeight 718 /Descent -309 /Flags 32 /FontBBox [ -194 -307 1688 1083 ] /FontName /PDKOIF+Arial-Black /ItalicAngle 0 /StemV 222 /XHeight 515 /FontFile2 2479 0 R >> endobj 2447 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 122 /Widths [ 333 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 0 778 778 722 667 833 833 389 0 0 667 944 833 0 722 0 778 722 722 833 0 0 0 778 0 0 0 0 0 0 0 667 667 667 667 667 0 667 667 333 0 667 333 1000 667 667 667 0 444 611 444 667 611 0 667 611 556 ] /Encoding /WinAnsiEncoding /BaseFont /PDKOIF+Arial-Black /FontDescriptor 2446 0 R >> endobj 2448 0 obj 856 endobj 2449 0 obj << /Filter /FlateDecode /Length 2448 0 R >> stream HtMo8<= .X؃ )bw_ߡѼRCl=y^pLsQzݾzm({rwUp_x:\;0vwtKf6Uty1A ?UdմbTLVY ߺus)=jx.EdztH1cJU -Fje[4|jd쭫wam}4vxr?/Tɺt,دB9PZUWObO;\[M^%P0:y/CyQx>r:lnzQj@N*k-ǨOa=թ )kvXWtH3HGs:E@3. ڈ~fdM3ɠYhFz=fi&%fd]@36i&ImlnoD3XFوMI'٨`bi4c7^;Ќ|7}"hFqsb{Eu /GqN |4g+!`6 j$IauE ?3z#g 0%_|2I^=sU {O\o%Oö^z |O5C, cO_yVS|[gF/l.ya ${O[ ]{KJ^ {_pvO}Xa`an!OF/䵉w]=<> stream HVKr* UxH7~76OoKJU*j 6I%m% 君3 ,!BioRp`X&C AR{ % Iˁ4X"[+#Yo-+N|'I Y6F? [jmc'*,™B\PKbU"0bkQڸP VFr  8D䦛8EDEN" ۗƭ>={ݮj]SLUONU3\)n^TYo}5?Ue$2ڗ̥ަZɗ̂S{CUʗCܬ-*XEtMwsL*ȡnx6u uHqqZSC^/ͽ~gݜe3Us\TnxAI;ɎW#w$n]ԝ$j.-YXKsc7z_q"Y%XRJ6E+v4ic|N.5OaU׆}y|LO\"4=#?ꗌs?qQdc(״h^duwDN//{bDwp]y^(| 'k!?|oOw? qծ}~aߓ3z`ϸgF{ݚOy`^?:{~ߓ㝓TIĊ/{js&',NЫo1o=3<''ت0!G?W* endstream endobj 2452 0 obj 1027 endobj 2453 0 obj << /Filter /FlateDecode /Length 2452 0 R >> stream HV;F ;ht7ٿԛ;yGpM|UdS#KX k$|=ùT(#b 6B$6[hBQ_2.<xHEppfvML>tu1g 88(m&0;Nkӵ8nE~Ci:rfdA93Sb)^[މ/פrH-  j8nVA1C+ ءܕ Iʘ&T ?8wd ՛x9-f/ ӜU*?g(u 4d|c6N۔KX ;&dyP^7Sw3[ە> stream HTV;%) *n?ɢ nrY` ~,4?k!= z {:࿟~d)+{9VRO8[jk_[i2ӸÍ/<Қ/֒:*096X9E\#8 RUOo,> ɾ-y{ʨY;c3PZn9kR/Ұdž|a5]aO+^zi99j"汏" T9=N|$TCV'V4p?_zInP8ТE3pĉg̩Hlс/t p69A{٥o_C*1omѪ8q9}Z.sœރE7߉sh;jX9 `(9 vV"\0,:lư+n|;DD BOEB W31AhPO3"Y &z aڝI,aUǐC98&BL/VqCSJL|ܟ(6#ı+;]9̙ i6 &‰U81n1 Шd7Y ⠮p\p'^rPbI@=p}S1QbjzN9vӀ,CY?60yمVKgy>Xs:H0EQa}b' {ɴyqewK.}h8 9O ~̨W4܄`bjtyP7 crڝ/{([˜Jȗ!x((6:ddF~cU{8qn\0Vib BOb)s|7O/;s(fLIܜ|> endobj 2457 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 718 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2028 1006 ] /FontName /PDKOJL+Arial /ItalicAngle 0 /StemV 0 /FontFile2 2478 0 R >> endobj 2458 0 obj 976 endobj 2459 0 obj << /Filter /FlateDecode /Length 2458 0 R >> stream HV,7 +&v@>R;w>aoWPb,Ħ(=\R׳&=?ڜ2p7뎇dǟ<Sy>{{QFy|RƳ&ijuW}a&m\nY c0\D?Wì##X#L6@NFc~Hu-m/R66}GαFdu\vpZݓAWSj9̻Ґ)4rٜ?EOrf5\AH;=8K;@z`r_q ׳Co,vh\Szj<BX3a:bX:C,lV}=[]3oj}k`Lی[^hC} yi7c<-“%e~cFO߂zd^쏼/Gozmd br3pr\Y N tLF endstream endobj 2460 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PDKOKG+SymbolMT /Encoding /Identity-H /DescendantFonts [ 2486 0 R ] /ToUnicode 2461 0 R >> endobj 2461 0 obj << /Filter /FlateDecode /Length 227 >> stream HTP=o [uk%]2CMڝNrȐ_Qg.`zL0:o A<$XgҎj4ߖsM{N.6˝J)3337P ,:W9lAV|gKI rV{ y&U|ibGFʇv*]ʆ+e V1<!Im endstream endobj 2462 0 obj 694 endobj 2463 0 obj << /Filter /FlateDecode /Length 2462 0 R >> stream HVn1 +T&)h^)iRC(nTps9HQ g(@2W-eyX~ &`h^" ,I@z(q3#8@5# 6oA2<8coIvu)@vi)AZ@ AAnv5ϝ('hZYtyBu@C%ðL5ctTgе;Ur$k,L%5t]{UK ma$z:V-ak+U55(Hw WvPrvZ<5 W%sªguj)t\uhF.~!f< R禲 ڞVf}3wϗ/OƛǧKrr8cm)fukXȲNM@\e\${ %[v>gGH>޲);#dG喎|9dx)s(-#ղ p8G3%4E'/@*z< Oܟ%ģsz.lp@\)x+t~dOFߠ3Cfs.K_U(Ig[E6=[8͛ށ=~zfT %꥘"DY~ |͂t uS}SZ`g endstream endobj 2464 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 120 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 444 556 444 0 0 0 0 0 0 0 833 0 0 0 0 444 0 333 556 500 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /PDKPAE+TimesNewRoman,Bold /FontDescriptor 2465 0 R >> endobj 2465 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 34 /FontBBox [ -558 -307 2034 1026 ] /FontName /PDKPAE+TimesNewRoman,Bold /ItalicAngle 0 /StemV 133 /XHeight 0 /FontFile2 2483 0 R >> endobj 2466 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 34 /FontBBox [ -568 -307 2028 1007 ] /FontName /PDKONK+TimesNewRoman /ItalicAngle 0 /StemV 94 /XHeight 0 /FontFile2 2485 0 R >> endobj 2467 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 250 333 0 500 0 0 0 0 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 0 0 500 278 278 0 564 564 0 0 722 667 667 722 611 556 722 722 333 0 0 611 889 0 722 556 0 667 556 611 722 0 944 0 722 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /PDKONK+TimesNewRoman /FontDescriptor 2466 0 R >> endobj 2468 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 34 /FontBBox [ -139 -307 1063 986 ] /FontName /PDKPHO+Garamond /ItalicAngle 0 /StemV 81.108 /FontFile2 2484 0 R >> endobj 2469 0 obj << /Type /FontDescriptor /Ascent 832 /CapHeight 578 /Descent -300 /Flags 34 /FontBBox [ -21 -680 638 1021 ] /FontName /PDKPMG+CourierNewPSMT /ItalicAngle 0 /StemV 42 /XHeight 421 /FontFile2 2487 0 R >> endobj 2470 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 117 /Widths [ 250 0 0 0 0 0 0 0 0 0 427 0 219 0 219 0 469 469 469 0 0 469 0 469 469 469 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 354 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 406 0 0 0 417 323 0 0 0 0 0 0 771 0 510 510 0 333 365 292 490 ] /Encoding /WinAnsiEncoding /BaseFont /PDKPHO+Garamond /FontDescriptor 2468 0 R >> endobj 2471 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 600 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 600 600 600 600 600 600 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 600 600 600 600 600 0 600 600 600 0 600 600 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 0 600 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 ] /Encoding /WinAnsiEncoding /BaseFont /PDKPMG+CourierNewPSMT /FontDescriptor 2469 0 R >> endobj 2472 0 obj 719 endobj 2473 0 obj << /Filter /FlateDecode /Length 2472 0 R >> stream HMk0 >l,˒e:F2t/maO56#XYѱLߏ0BZCKS\HCD qt!ה8@z1V@0]-CD ̆-Kl3kr apg@ղ#TO{CRAYDZ'K .V~isMMAiX P &`Op>ZH~q3{{.N_{D\99xgڠ4`#dY[A2߶fO<֚M{i_ 6fQGq.7M%n)CbbZALis{Kp:EQoUH _~:0\~AFL~tXLO'-V5zaU:[_տ8E{´ı*#c[g&k΁A>x#23F*$0 -aOD!H 115bkM3g_$Yۈ<ԯ$)=0\>4')[g,/=</A7rgX5)e I 8*-PjdKLNT,ּOR-%0)}`s[~RLW"d+3(aw) pdVLyMIh`?iW endstream endobj 2474 0 obj 1046 endobj 2475 0 obj << /Filter /FlateDecode /Length 2474 0 R >> stream H|Vn:+f " ]$ , ܅2֦ IvrV,"$gμ gaP?1R!*Zb%P_~GSx}$|qP/zP7W)Έ2&P8aSe*T LRCδaL8̨ݭv`s0,Єs\=.fUlHHRѳ?cw.DXR2/2ƍ/aҽpƉžeKC6n {׻N } pS#қ2S*Ư\0046¸k^`Gn+7vTk)1WAϥ̌l| BfrPJq?~8jWV8ZU MBR6`_z)BޜYe7Ww [ pDa ?3pJE1ﲮ, ̋UBHSHeꂺ6WSF_}=GR}[J.l./컉gViQ,5n6sVWJ *2CfSNe2nBIr>G{nC">hS6kcb=SCy4ƶkj endstream endobj 2476 0 obj << /Filter /FlateDecode /Length 6995 /Length1 10700 >> stream HW Tg<.(U 0(/kDžIhk2Z-U'\l]<>PZY[j9gΜs'AR/L ;Ե7!mϱG"c.̮mOjG0L>/ۦZ }D[r"H)(mP ұP~fQOAAˢeg8uОx`w{‚qFM?A| Kpu r=JǗ>d1k\+Pu`H׸}3LAsy\dkh:* (Gz4Ā 1#8B1Q?ϲW[x&?qyMp2Rvd풲ȁ͚Q\lHt dBCX֑GR@S6LPԏ^FTMXh(NXswFm6J: C@ &OR0d W(Ze0F/@zFFet4 )PFDJ\?8 r.y/g:H1%N]ui::E:Q?]xZ_;-=(Yݴ09cW~=uBuӪ=bߜ[y:H7q!g~[S'\-suҦ +g4n:!no^d~$XW'trӽ">7xKK 򧢅14֕ۻ_DɊ9Abv)nǐBŝCRq[Ǭ{ʓl._m_6G5~G +*"V/zO`C]sNq++I79"p_7H!}9_b~xȏ/MO 1+;8:Qҋ.,K^qےӈbCW3XLSwΚrqQoE{\k^9q:GVܪMk+J-7ٞΪ ,ܾj#s%com:_~ֺ?MN0'ӳ`JA[wEpCp@"=|8ͩ 2]uG{T8߲fULwO?;1)Ԙ-߉DqwX6KZ;b<^& {rTxŽr{X4uylûd0>Uy;0^V75⹃3aA%ޡHTڷa+BaXpЛƖM8H3 ҄;Ht4 E$-FDʢeSP8 ig_PP ɇ$4mH9 G*5t .BƳ%"%)DcѸ>?D"`@,(z@ R FB <2f"KO6+ȏQڞ+`fhԗIzeJ}PT,͚% @i K7^9n /"zw@+N9~YiǶVo4".2MփQՍc?fT<0tMn-3CrV7])sΪolC|Gislj"3X`^ ,0s,nuuCuJՙ8.UtCԔnXѕqDyд{ﰆhkvt%ex7x78Pl%`3Qӯl6ɩAe`;Kй%>EU?1iqk| 8FUL 3PT_~_vCXL6\C]AmbCВ&1#Gt&FAلQO=0t$}jx6F\,@P$#!$ GfF P6L8HsyIwakp n$i4@*Aa|=a4 ,ޫKV- Asp"ǽ9x|qOE B Q;<T[CV^ [G"y9 D4::%wf$!"aOƳ$@Tk嘊7IVUZLF"R@JԇST a F0Ur ЎW %WLKr@QUc mdHTh66e*T ]-Wh1AJҦC`MijȅORӿ`?sVJ?<{}O9.IB*L{K.r("a;]E:Ք$5SH6jf"f*ViMbe[1n1;dgϾ}^ MK<<=${<=>h$Tp]V睱[h7Y(rЮ(Y d!s? ]7UXB%QQڰ  VIX̌8L qHw2".DZ8HUp"JD&Cc"{rFZ \S7in<":,*,$ |?J}C)6+xλAsU'"WZI"b1K:JgJEXOߣvKi]yܙ2㈚=Fb8$i6kКsu20C;]20/\ܭb44S;F;;v p̣XԱ 6{6fN4ªltۓf&K` Хq4DoH<{g}xpc>9vz9n0;5jxL2{ܽ#R!!"@7 bKƦF`|DSlL\Hlii4K WvT:9anApАs-z{qέyZkt_mQ?[%t{>fn]cV4(1sC@38(vk\̣Lץv32s~᳎-i͙w _0ֺ4c}+ asŹf!+EWAp`4ZVAjn 5Kp?<5&6ĖoC6%Hlc `ɬujOM%$ 9'BX AB2u(^J%Y=܀;(pJx(&P(6d.G|oIQ|rԐZrtt*3'at5V:zVbrb vcWX+늟{/v8Mxv q&vbKHlHL-L)b(̔ȨB4U*:MCb[I tӴlURs_thڳ|sϹ{'>x•4ϑ㡾ޗ=݁m[;Z->q׫u.RVm7o*+5KdI4v ި:R'E:4cFEz"ET nCM3=}ghgh'1+AJTUUɓ# /FԤBt~ ](CB%j((<9"8^dP>/&dMjxT᪣92̊H֨$ID#+R20SPfMz*PḬ%]̼7xJ+T'O'Yr FhmE283QیLB?IXL˹SA .V16`4l2AY YoJ2MBK~u:s$kcP;뚷C {`*}5lUBfR+m\dJ3Sk6ӻ3.weA 3I8.LuAf $E'qEfh@*cfzO nd?6jE6edm}FpM1^]saYAam:\l/C0=3XwCȯ%)bUK+rfղRq' ʞf":MVQ56?D3bmcc{ךъu+nʃk('󒌻ReSC+mrNgK'݊inmܳAސ^iDŽ۟ۀM6=v߳ȯe\FOUv}j 7 -I1CЍ1m-K\P@.g/b In#\~A(7* Exv4:0By4TJ̧7wnO5w }{ g@[ ŃXq_%G2DP tWCgs?H8p"*< 7Hpg; DD"XM#R ?S,8aWpXczKTd(\Ĺ+e\|KzDZu\4= 8^SD1"LhEy&$'o c{mbc]ë.hF:}cstJ ;4o)[WW(PK–pXy8#V;><2#&$!} 60:syZ>⣆v`mqe֯ZXñ{9V\eKʓ^,,oC)k){]RRvPn-RVn)[/U,oKe,ˢ,Ȝ rep/R43" ṯ$c\lviTK;$r%QKyc<)0Y;ً"M&I.N@l\G<1ʠjAl֓}>Koy`0&UlM[ņg`_=iGQյYZ[-MkIΘBm\ b)5:H 'm̸B7/4)zSАQrS/0bX"w*4Q5I.@6jh&=b!Y "1sEcXx(GΌp"'C^LF\Õ췚㲽-Lx{]|a_p0&W4q9n&3~Nh_^cآ3dȝ8۵$;g8vƸh=Diuahy^" j.7/< ͏{O|dhkuކ' $d㉳v> >xJש)~Ј/:{&I"uj5hs7՛LyxN8ZV1b2AmbsG+F䪡|ON}`мd~h^Ɔ%%s0,,-m{J*;;DQlZ8~j$J*r'C۵PZ~bg|3/_ie-;[bp2[s{$.?{kI^!V[ `v8sp03 222D,B|<||BB,"y ,+,?,?/HT_@AT\\ՎARDA\S]D }oF82 [i i9b~AEacfEQE0VV4U_̒E*g3)]8o5]sdΨn1*3hHCԄ.B '+ demrr{ћ|<sn ֺt endstream endobj 2477 0 obj << /N 3 /Alternate /DeviceRGB /Length 2575 /Filter /FlateDecode >> stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 2478 0 obj << /Filter /FlateDecode /Length 20150 /Length1 36028 >> stream H\T |Lgw&J(*!%A;Qj&ITdG=Qd+UذaV%bVWEEv?-w=w7V>qE.wুm+WջOcioXMA` fzf錚i]fYr:0Uru[61kEw8`-ӽ* oQY"jfz[gpf*J~-==]9s'w.qy\bg@D)̋^%߱uhĻTw'|@l ؈ZC,ĜǠ2E-SNe,R)[-NbrPU4֜hWcb&ܴt͵6l~yAFCyU<Æ:hcRhrRbBG~[i#&:*2{v )jQ)Iv=˩NCGNѺNCcVփ:ijL~O´auhԵ`|U^Wx_C@Gej955cwf =$09 MA1fD&H#?""CB8)#ZϴQz/C]FNÞc$'QG*1,F+UZSaʖ0:bd!]]9nk~i#5i\R[P>Ve9=Yz%7qLAK9W՝Jt㜮zg&c ƶ'::}yv3ی1z+GS8q+u?0b7^4KSh'kŘPN&8Sj0׿?o ¾\z9 d{0,9RԿmAu "sLrqxmj׿g818&3灩0&1ñ)wMƬr?3`'F*c:cqXwǽc*8{bDl96y8|q\19~X>yQZ3kDivW:"Λ,56" ]DLF3 ֋w9OV6Xg M$ѭzNyE}\JUHO%9|O6MI>^%Hq@;]V( +C"@YzNyg&>mQPD*6iϥ^JޚGbK;fvLM8lcc#Ok TYj^y:ħ+N+\9nw sNa>g9q@|U#7U#琌yMkz#Z>j[|X!׾LX9v/n1 {EtZnTP-t:$n }?ۄA}-o>/% iS0.5hq{~C/ml R~FYj>zL35YqwhE"ͦqb4~BQ^BE;հ,hWֆ%/ҽW_\Gab=mZ{~5?DLF1 m kE8[U(bvr6!VPij { {<^ӱumaZDd^XܟR Pr} *=[|sL1v<k%6`g.y:unOL(P} w{y'ßb žGw@tɘgx6ePP.R@ \NfnB}`w_'r&E#9rO bD?Yz حw}JVp OnF{-{n^,C LwjM$c%ɰuSÈqn+Z$C.t3BDy4t?Ct#ۂdߕkW`ך(ag"DÛrĿ&;;>;$>HBqL|X4jJ?461Mk^(s~Lɔ[1 tcQ" v};{Y6y6ߌ},%d,#+߿3߿~\`yuzZJLY@ 2l N݀0pݨQԛ+ U]bv~6M9>ɖKr\$N_Pl+ DJr`,e'vJL 03]v &B&Peqb]c6.v#ϰ/{0 /q^eW>5C 0pl_/}Nj0)>g|2,cJS֧vlC).#OR~ ٗwJ$aED:/h:C%xt71CY@ )taS9R>b$Կ?!{?? c2 ,kP_~rو cxd 4;S ^ىFWW%uc)׬ӭt?}En'߄Ǎqx?ǍL7Ur9D(F(F(F(1$&OScΪEemjCTLIcT;NzZj.RmPhT}Z-ޥZj~VE5 ^aP̠tWvz0=xaYBT ܜ+Ӌù5l1+ hh;l S@0C]O[`6ҙ9O=#|ҍFqV0Z!Q8v7mtg,DJQ@ёE}_X#Vv"xoTjBПrd>1q0j>*/yy%qk \p=_"b~U<횐re)ME>AMFDdȟŐV8q꓿ ?2*:s;(vyMވݲD}rصCϩVkeH!s#E.Shpk(CK,-FSec-r<)Jb8GhM"8/Wyf×K[c]"#}g- 4!݊~{7Cmmz84%Y⺥[=L 3fh^*ם[ ^/ RVr$\vsF1#oG t|K늄N"Eio7Xhћ<.& fBo@sЉnpQDwNw6z8AgYD'YTUR$ MTw͘ДhdЌh\3$.$n!O!q' ɶ '>ԸrYM84lh.=uxc@}e[Qz$x {qթ'Q}7Ե?Wy==ӮvFSuj]̻+Hoh =׉}6=&X-kC1!^}x_ F_ĘM="iHoq0_;=:cyʎia 6Ez2dWUUe<W* a'ط_B]l tuW4EH\_%Z{,D;-kfcLv$\B15/8[4Uݴ$0,-mlC2LMζaMr>;y/?]y]K)W8b! N-vFK LYL,LbˉKIY@]ҭMItf2`U$aZ@4—4OɹVU۱f:-$e4.]g߿=)ݞD?atAS?sԆ 0[pΗ(6 nZofZ|<<:g![(1Miغ vGq&{WV8wzvÙ-*2vmŬg>G>\/qVq()-/i PCm4qzu+m߽Y~L֘H!Y䀕MzfMa[0ٶM'륉zRs e>gDZ/6 ̾vf׾rkzi@m)a-'7ŢĦׄBbJ&@I D*C 86>lƅbTEFHIUFGJgEٛoFp ;ڲSTΙܧEA2a ALVsu`!:$J\zԁ*ݮc`cQ Y:ŚS^QUꚋ+&LmObqúpfZ dGŰd^a;M;lqvN9jdVc\4+DXu#ƻy;5da⟼&\ 1g+@wjHawP@QU=TglgD6`ݹg].MID)+a:-KOyr\w N" ODyWWJuOɯM-Nt^}Ln7]x"mwZEr'FN$ήBYnk" e\ۓ';{Ody,Ul;>rVe'|U fuۀB0k "XRDMv :S2%$֒,?(UZDQUT/z,{e羽7!K7_SjTF%M;,'3|(d5bn1&B`,!f!FTeֳvh.#/y^rz42-˥{Ic=05E,~jl=U8(/JcFeUivoѷx_/##~/M5}$"L8b#0qDbj49 ëO`6:$F&RzD֓“ xw!O1 {i]}v<5 Yh:ݳKӡ)ԢNq(QWWWUmS]=%Je NݑO~nQ|G|?_e;7nni}n>{n'v=5|I\!̨Z\U1dox$&qU 3)#)%DsLGzL= eҫzeoN_6E'h9ٷS{9zRyRT7/aX3X, ^ErZk:D)@d7bL6I ۛ%h@cl$5+Ƶ=</6zV3 Sew3/p?ǘ;A(iIdsv)xѓ`97,WE+:6E#X>r%mKH*1ݶ*\Uarp|yW{sU$w˅'s@[x/~@}6iUbUb@WK&]Ѓ qptaXUᨊ ņO Qv5!=/hWpr+s#C2d*KR Ya<_VYjvF3;c77dOkBlۆzEq h,ʥ*8x 眊?j-Mk6nBA"]3eV>\ jn⺢G]-YrAv![!C`ƴiC]̷1e҆OBCc ?)NICSBm׽I23z$J{sνM09#! *bR#!jWp)d43 DAL RJ>8͛R_Ĵ'u A?˯yq`Bϟ^Ǝ%wsS Blk?ex)uDm zDԠ[,#rf2sfIJ II9m,㳉Mr} N2ӭI_X2viHQ5hV(L5 v9uFl0j~W N|ڊiTB J`KF`>HØi -ALF\@7uD˦L';_6%tQG#ynĔڈ)ԙR\܃_&7ɲ.*g.z҇K-k1 AƹHUzo.ͨ/BŞh ^ǭKJzՓ{60@#MC.0Op&ɰxXӕHM׀;6l ݅ަ}`e9M!K]}쐥 ܿxl1z8Ҵ:[؈q8<89Υ&walN<ᅫGݨ_ж޸sqgs+lܺUW.\M??}F:20>q̼֟ԶNm/Mˊ)/K0U|;Yo)Z7ThwhAI'%'TԫҒ^5/"mLkZc:FZptl2DEbTD ib~ Qыr6whT)Ǫ_K^<[rOe_p/Յ|kݻ|G|7W;16w8{&f!7K3irk idI|"!]d8$PdѶڞGtȴ:%UW=rjI;Sb8V씏3G+0U!Sȸ(:KT6W]ݏ/Ǘ,z[0w.с]K_ǕZq쭪Ǘ̸i|n|([o:\  WÌ) +VB] Cԧ Q :qymW4SR$UL2OڧܒoYnY͜Y8++y AX4FmHd'|İ,"X+sŠ50 u Ӌ% e =/߭p8\ƺT!.le^ gf"0F_Ab|yk?sP-3?D0M]kHBK-j@-5Ў6{؝lt9p+Z5`GrQZ-U鮪y|}`}}3ɺ9tYȉ|SqȍR!Uls~GPfAάmOezšEFL>Ko$6t_xMN*W0d/s 9&g\N;=u1wWƹ-{7O\yظg\]2//~xOӣbwk퀹`\B.EA@,rb/a4 pf kkad@ ]+=I%/G=d,؂"sӿĶ K'9 |&%4Xn:\ӳH$q4A c rf2=G&K!i֤ i H$B~X$Ch6$"rr/IՉY4@%!;i,.?ܗa7zGVE ^X.Q/uFE0F(lw: PBQꄧ0Hxo+)N\5-Z7˹eK- O/AVG>v*Ns9%vy'3Z@W7aLSk3=5*tZ&FI=(]aM!=)_ dV#H{%R=^ e"u|-I MB&ZC%o(O@S 9p R)ūӸtO}|}ßsx~턱%cw3biqr : /:=;29K$+x ahiܢƫH ל}Ln,ʍ,lEXe)*J/1@AVb@*%" fXRT=}{c2q/@,@I3qXuy+V[0}{sڊf/&/LzȊ]`ƃ*<Ѷh̿o&?8|nJ#-q=yl]F 9~c 3v=Dw,b2c7壊Q $]LܢQu޵dk:}T-#gnC1vdu=i'Ϻpf({ypf"B+kzYw pТC|7;kc[eǔt,:~GdSړO{s c|{Jy}XO:W D-5Sp Olh 72%<.:ʹtR&W,D%#Q2%#U2*h( Fd$K 9J)iJ W+&#ȱ@Z(v(kՕFo"mUW7;NoP*xLl4I2L:H.zupK &4:J =E"G9/.gCg[8fu%#AE9V$ VLv࡫SM*vE']!ĩaœmI&MHvqi_:P{"I7o|.}S6{ :rm"вSD:+u, *!C(/k FjEeSBb$;_{s};G}{}qC#}o_>M.y;{ǎW47vAĆYVzuzW|Hpv([LI`#pPlێGb#l G8_%P9(=XEI]*č)idG\ I$ՂRkBƖ|PK\nZs޴' [V^ChQd*ebq2{I%}g fCHcl.֮]2miR2f'S:^B&ک<~9/ʳ!:䮶P# jV # h)u:`~fٙ ֞;*qbƞ')7ƯNz ~}p $ ie؀1w'LM~k|djsMU@UZJýUrRj]UUK? 야6)eʣgU{:V#8:jqhE/31gM':33ڝY|t=jn z}/4ͦC5r]~A2';182:KƉ*vN,* \c Y`ׇ8Gz:)qS+<Nd82$d,Y<0sF],bdu\zW^c٨*L˹rN\H(Ӛb݈! u& [28ϴ^waU.)uR5e1= $(J_hjL!YR4ףIN 0kyONش<0nC%oټ]'Cgv/dxc_naGF¾z_϶ٓo{ڷF +Cje[ĮYFƎNedNq=ePCвQqdYM 9iӾX`]$WhK KeW+?F1F )LQڅ…7Sʼ2h!voHvDuwQu4RT(D!>1k01|%X4"9D>JZ4]-70‹PJ{čP!*0⟯ P &>xp Lh7BT,oiS B R-gzdP@īLEy@u<@T?cɅlcǏVU_osϑ:x@e*U{ҤQ^ALYǻC/;Xq{6s*Bo\=uAsI1ece.}{FzI})J~_\Wpowۻݽ..H ,"~PB2FÈ-:ghk0PJH?:t-8:tKB~%qG>X} ;/|f&0= Dk)AM*#˅bkIq1i-]c5F9\n8_ph"ZfU{P sruvE=o ^CFz%EonFqSyk6&PDf1CQՔY&7⦟Usl?1O)=%eD! L-uZmEK >JhBj8e']v})4+gZ b 8{<+מy oooOo߿wnh/f !p>{ ìTt,-q(z1#ehwQDz=A6k]V]4d ɴдȬH]`UhqdugՑ0k ,fta[cԬu7{W˭ư`g%drSZ8 {Slbc6vQœScHC*‘,19^xM$-06ݵt}\pS>BqS T6n&!*>r2ykwn`볋؏o_UfpP\3oe΁.;_(8rr=~u@ErVH zhj辐 MJPwX=JTG}zDA!aQFj8qD̼i)uh hr5 x.(幠%G7Y,VOh|o>`1arC(r8Y1nB^ ֟a! ʄZ)SEC2h 81yN4Ee,r1U c9[W9}==5mL,ViɾܩFL@&땬7nαdOz'Zɢ*oZ %K/d^I[#T*&U'k59ƖNzBY[31ٚ-^ttl9xB8UQ$1 9Ҋyl'wˆOe25{:NCPr>eܕ5˚csFVU2ʚLì-:h)G$W aqa^εMڦ-1&of$Ƕ<5Pr`9B79n[ZO~K=uhC-~W[98k{zAqsϞfsBU8 tR"-^I8G<~hJ9gZ˫-HPMg2h) roG:8:Z ݗ.t͸*R-l;N{&`9_]a@\FQ *[giVzحeP"RsApQs14"? **Ȳ/_aD@NƉKYdr堹mvmݸ4Xo^|cQa2G^ NSGh{vNM/ i+m=tP5Jc)D,>,DH; \&r7 "<B=[7FTvW•)a&Ռ0dk1#}X77%r˂"TeoWWVLY+v䬇+keS,KStl-{5֋OB@.ȉ<BJR$~ LDt.VWRVɸH=Ur%j A^4CzN>kʷ`@U%Q$,+z`zڍMB@j4&Zf6Zn]*TEQ7x ݢ>93_a5%-:jrЂ:vn'Ո(c]&BbD;tyc/z6|wz-gk<"r_ϙf09Gx&MUQՒY#d0 Zu# [j_V2UsrpNiҠF(YPSFeXgj+$eK wZAey7ƍI'#$+\XuP)!Uy4A$&؄i|8L,J5<ؙKjP&|QDD@K]JI>Xa3Ӆq:Ӆ `Є LL?‰0Mel R)4J,8 89%O gg-.燢xRVˮP~{э~RHELdHJPO-Lފ!b6Sppl yܠ5ڳpɳ܂=6.ys݆/:?b޻ЉKlqK_Ǯ7]ΧiD[lA+{}/n!OX Rg* _::mEO͢ɦ|V"Jr D6# ʶXX^%v?%lt3j[h:ԥFs 5+fKltY!{׺*n[Ud5*x?@G-`՛CB4PHOdDˆ]kT#CձL}qFA{rV0_שZ g ,37iqΜڟOe@8ZگmI+~ā7-BT 3J ݷImMgH5^}/6jh/ j̕str$ep+' in-yuM2.7T<3T{MшNt6Ξq/ZY9\w螃Bt%ScԊ`SF5ke+}ޚH\N+kX?Zܾ~`OFO\g*4.I_WE;W̐e6,ɇXVm$s礜䔜#=;JSx*~ϼy+U55;~PrC '_+L=4jK~-R/ V ⥠O6PݺƝJ(2$+80{2akv{>ek ~}j٬M'BU%JF)h$hdݧeb*+D^R+p#Cٞ neaTrPR{ĎH;l[@-f::\eh:AAu!|ԬT]f}H#޸mT !qr\\Ye1  ďm~<G۞ ީNy4ЉBʜ{:6>hט:'/Խ1>XԀ.!ꍄV ^zҏ|0y=rԦ$YHsaF7H;t]zϞ=Le@7[ GdRl93ecA:Y:l?c˯,_x_K+wF;lٸ0yx˻}j,|y9h "~"NC؅P-%ӗ_`Btm$_mLZ'qn(D7*(S4`=^Pa28=}F(k ؒ  b[J1)%$nT@2,0&9,%`DufEylߔw);yowEAZEzQdڥjww!#w?J;xI!0G@^Pf+j9pP{@fFIDTmD!1Ōv Pbz:s)QǸp:jTtخ>GnU* 1sN'q)5vH",HnIE * jjQ<)ҒDjoB %I11A0$Z!ars-j,FO%DQxm4 P÷-۠o{uAOsGjU嶩{T^M+Vm{(OY-hIi+ >rxr᝛3uIaGKe?Y6ox[fgϰ+Uxd)=Eo2#23j媽&_сG22i(HuZGjc4'&̅JTC&&x/yfFNQ1 c vl@ՠDkpՃkp塬yU!H'BK=;tN,?vʧM=V8sk~;Wݧ p ҈Qb?FA~&5zE/9 >S>u17Y'G"]^AF'^8"-IBe`2*jp >Qg >|Ç>|Ç>|xA`a"xϠiQLɍy3`&=gn9TΫxh\id ,k]rճa_N E5 0j`!,66xvf28.ơ_ؿ@\}iQEt.o4'e3 lF> stream HW TSWYD&^@/@P@,!I$AI^{lEEji ҞCGDž*S\ 393gμwy/peTH+ES#eZk)E0V (8g!ٖc5Ia8\Sq΂&'0ۀkx?8 7 ~oTQ_̍L(מ1]\@oY[d4r}6C֌U0% /$)Bzjí{hėنt~z8t bvA)bRg.BkLC :09eqy\adӰTLƫad L/clS>x.bxρz[ق?S(j>چ_K\T:U +(FpYl3U\ TI &T!a)y@X"&|-f(jBn+0qF$ @&D,VT er"Uzq5C#aRI6CW&#$!(_b*_^,/'a(H\s#;Owz'Oyx~_e7rFѷy}54k}A:wMWk^iMBμj67'M~;gk9ޫL-h^~)dsJ& %+)B"W}șxzYOM[{9K|7z"8s}CY}=3t)6|~^Zh bWp6rL(3n&tik՚Kl몀\x(G'dOՂَo;14™k巼{5Z+n xd 7x?lߢ,>_s'J ,8"SOtVE ݧ/Ju\ɱğUF\?}nkCQfף^"e/߂io r#1yjGRڦNi#/;Re파߉DvnԬ?_h% ݷ`JBzkwd|ḭwTI|k 7L$Or~~yO[YW2?$KS3y?:*/m?$0'\m]J;?Z x|Xxe  zdZnoxRҌȘZ+Q bxrlmzUDU05_g2FB?%cap {*Fdbv{qx,n(P\ Id(`ԁ H`y^YPW kq:pDl€i1HqPnҒ$ A0ɨ$0#Ck2fk)#a!>DstDӂ7MKPQE↹ ! 6lHְ̋#awly`jv4W1o7=?5Rx6oTC/2Eڧ|N%G>wj:ŶlEfM3r\)zVon<땇Ļ) 4(^kZ.@7swXoZݖڳ5NҌ]XECcIO!)mݟe*#rͩs9f݅:\o1_اy\9ϝp~qՖ橏l޽ҥ&̾,X=Dm1;\+brJZb˰9en%=.3,yQKO|Zf3*ļi&l){(&//;Oӡ F!ãMl_U_6@QV228_Z;koլ6Im1ǨR84 l8IW mE֒  I#!IٌzT#u3p=)B)/]/6"jMn-MHZ@k4iu&7T$uY+ AB IyGx `4"uHYID"VFPFaat 6c$""wL&F#HCDg\)ydiidRqJBi6Ho6_zm,ze4#'tf5e*)*P* Fk*`5+ lTuJ7F*dV# M$ T*uI R5ixe|ª Z̡Ʉ:ա`Vٯ-+K*!-8ʈںZ6+eFAP6(YHX\p/W/svں&ASbo$쥥<';3F@h}cW-K^RY.o9f)wlksA ` D@*dȘ$/ɓ/GDɇrxI?6rs Q]i/I&,98._??~1q O @{[Nȣ4O1bc)\;#|E(_М=~QۻUE)tNqHP%jDQ)zrTjQ[q)l\yê⪩aie#eߊQĎR"NƲ <|ѭ_ 7 3.sﲤ j\9 ڠo'y_߻Ӯ_N||{SjuQgfKq^;ݾ-Kå}mY]I>}h>򋁏S*QzFQ7JcUg#왗M ͺ}v$]{G֮un럿ӜVPwꔌ',<ѹci?OTsj}70+V|H=lt"ɐ7J4WymSpۘʣFGh bP(䩊4S?5}g{qƒ1g|;6Zwf{f2 71ts㶔o^URtc׊۹]8s#|,Bx]S6y>Px_Y0D⁋6t~1d&$ C(VSc"oBo fBk B<֡Q%e#b'G1x@hK,WЋQO@Q !-sZV>t\9wrAU ֟*8 ox60H]!*p>h%j$OCǍ ݀wFj[mlBqZ}t/`-G\o|ԆvpqXw 8 =~A'N6kfB<#I6}ZԄ8r\ldRtȈA"<1JLIRu,ŋ2(T"%Cfǎ hHB0( ba0W*"J&ZUf~ gWK$T*pFr E.92]<<# 1xULv R 6vf!Aa3*&d j#\I}t{dAed}16_IxVēP}.3QpM8G2b#PY$s8}F2hų06 C?d-Bg6>m vr*]>=o=ᚓ r\4nҀX+6(>,ht# b؈B(4:FyoQ"b(E*1*&v&ig42u:/L_3vN yY3-sr{yv: @ "`X&}50|G@{Zޏ?$s`ަ33K0濄b.Þi oƭ8XK|vYoJLoa}{c6c 眴7f_[f/hcT;ǚema6El_®c)[0JN{;R^i݁ΤMj3i?` .4Ҫ4+W>?3]G1e..}L `۱_N+i5vqs{3U'W,9%YY4E[C#_x4str.|G@|9'#sٗhTE~4ED~-sy^ևc,|j}ݰy/n6`azk|Ηyef>7c uYu+&5Sz]{}Ű3/9hmSz OzgR+Si~G6BK+ھv))rd tkA)~>we8l>QաdӑG/̱8ʓfժp?8~ʷ|l^>3oGNLi.?ĸ])@.ܺlEy5.(B#ϔڙ'2uvȑ~NOL¤E8 sLJ 5ʹGYJaDSDBT ց|~PSPp0+3+[YYftdwM:MjQM~~k[7kkjZrJ7v{Zv{|'[Dܾnt߈ݸwC5v_8 8@?t(~'}Ab,x/4GL?h 'Axm"N 84}  6x^hwWw4@i]6#F3hw ^lۘflM5<ً= k=rV*<б|ysJ F//?-;'7͓MseԴT{ʬTMʊvlqt9s(kiV}Kli!mUڌu!sQ݆LX_Y bu q 1بoZبZQ}><6Yɟ;XBc=)VŅSM_Gǫ'm+Ÿ(%G[|x4dXv,=&:\w_?B"NT,r9z\(=Q_Tﱅ&5$(0Q^Q u1- 2ORrM]|"E}FnOdWޣnMS$Ȋ[h|&^lWRN h$TE>*h$Re,NMh\coe{N  e".o8xrΰ_-Gof&fUF2/)ҋ͒ǫ'˥y/Ҽɹ矫>Z%$Xm?WMT[ڟ*9(CddxRQF[Y!53#pPT6)'j7쭒?CTH8txəAEW;T5;+\'ouWbߜlx[eoNpW)ZE?70Un\. [~sI#/ͯI"1暧 wT$GWZv^kA>`pyܒkE ._޹k~C[ĭWj:{޻w7W޻dd@ D%A@EQHa KcD2v: U/ltdvZ:&{$Jq>lr{=%-4u2ozȩ;Yź!z+DF-IEl v (qiEN /mvK-U*Tx-#$t]D~^zFߥ,翀,hQ Y-b(Y,؆VU|GZR BKÈz]6|>-Ȱ"(qtz|NҢctt\;Ɍ=QQX5 ԁ>+ H=䩩$z/tC|b1H3?w qeU+Zڰ_{G*gM&P[6UƋqK y/J:Szg5*KC|FJ' aA[R'YU pU4?amAl 0Ოt"S(ۡ ;(G !NH\fUK_"onzOg$L"ae%V\^34X(8r|7a5ّDI:F8'!cHfcX$]$ .(Ch#r=>=`9W} fUYC-ڨ0;XO~=MF C;_ pFfcb#1S#.*$OEjE[Ebe E+Lp6HUՂ*0P"U6] X>?!gta}ƅOzzrJLMAy]nNyS%(ϐFģKB?޹e0}Ũ)Ǎ6]5SU(:e&Wvx׋ S5}_NJM3b eAFrceS7 H:G"fR O]NpS~.Xg)jLk '{] 3+7(WYAyKJo">O x>_X:sZgU4a*h%l^5";_ > L, mW$o '%WJ:q4 /tF ,"_RՈyP7H`Yݼ7C SJ塁HB! 2Qz!O6- 'D ¬/c`=ԀO:B3vl%k#~hQ6]nXm%oz޾F>ܟZ.ZZZ<Ʒ3V=<"a$ز6cu,4ADঠqQ(X'O}mpJZE'*h=&,NËʌ=q3tJJ:R8od63D4~x7oXc/vmqD2wEOܲ)&_B$'σ"ɉ$ ykO,XdLJ%!^ U]9ZS.·\zXMGR ih~H0--(TjЎHmY+a R knQ 3zYpw[sU$[]lnh@M:"]2FmEBbN)-gzN p "6k"}`*L#Dmsk/>YtqMp)s*34oOM%k6K+lpjI[:Ν,+̝]ˠ?bsXbP/ ȰMr4;:Y3Ʊ5>mvI$#!VKV@)1 #>1J0A}.?;%7w{lɴF6\r|(o9Q[+ԨE*߁Y.[Uu-Q\\ pǭ$+!5_B-uDGg&2N{݂ ~^ZZ[j Ԗ7m_Ѵ8~o;w膦x^eӓd`6jj7cWXE"*ru)Yݢd RV#2M=!څ:Mȹc'J1^ PI?Rhn0Pp&.^?<J]I8,!"&Mj`b!eL0W A!HILitR0).v(3)fh&& Zނ 3l8Pk;骚uB ՟c {5 ߽e립;6o ۄv<(~?wkp;\@/BG{>lN[,4 N^5ZUPc,7Gݠ@PCF1 >, %/8}XjW4_>)d'VN/p}s?֮JǦ/]FYDRԮ,8/Ht'Et99ƺ#y6[.5%d,7A[ };:HG؎{ RFRĖZCqteZ(HdiQHq$;C&cNgl,n)n?OM^{a񴺧\K'{ shXSSwՒ'זu,.xt`~r]afJ[!| uHLJ'ox x,u 2BjɘUs`Grv`q<5:n`S l]O[YzjX!ۿOgrkb^PDpXnR ~eRdZE~DAt?.l۷7.,j8ٹ3蛀e2D4G. xq0p$ޙDܯ0޼|?"o9;Hɪ h2|hE S.}]E ُH _d\?9=,~=]@x-LJ·iZ|8'ɅQc]\;Q`JrP(ſ uE_/{ if8zLA&h *},|b> 9.,q,qe< 1Oo"OvGY#B9٧V/V{̗zt4hD9!{YF4B\"Z4:t -dNCZ-v0SgFW#QEV&B!,}f+ x[ߞ[iȮKh|{߿pyx_(Y=kҖTrɞy݋hx"a'\-j{ju;lnMTn5r)!G)+IFYlSA jk +W9' cx9=rxɏWuiUE\?"1 X/"A6#6$B,H3]UN 2?'I!Ͼ&mvS@˽%IJ4"h@dB(<0e n zȉ|>Oֻpv9 [Aի~+zF"UIVd J4-Ɇ"S9&V g 2tD3lH*;/AB@:~4`:f"@P[! wz'ީ.g|XGt1{/"cR<迡R]&e^)cǍ*l U1{)[QrN0QX79Fq:F ҏgy<v`4hp?#u>M[Y {Vt%}5 {06Fْl-A=K2+G7A'v Wj^w_ra!ln29s8?J-%( s1Z,UI+.Jsy$ym"&3ocJ (# UM 5I#UK4XCHD .B7bo"nDBiA4NAĐ9s%sfi*PPmRyCISϓezM{}髕L`5WOd#upmwϢV@B[ E$v(:̉{Po{X0fA5C>U^Y?Wɢ/{[ݑ&=r-Z`=hJ[ixh:m)D#GC@Hn>v:~,%F0L/`4:800Q0 MA =ff1J[?5M5wv:u N#{j -Y1jzb*HǃC|ӅDC $XAzS_YNܦ2֨*S13kxUv$_Uu endstream endobj 2480 0 obj << /Type /ExtGState /SA false /OP false /op false /OPM 0 /BG2 /Default /UCR2 /Default /TR2 /Default /HT /Default /CA 1 /ca 1 /SMask /None /AIS false /BM /Normal /TK true >> endobj 2481 0 obj << /Type /ExtGState /SA false /SM 0.02 /TR2 /Default >> endobj 2482 0 obj << /Type /FontDescriptor /Ascent 1005 /CapHeight 0 /Descent -219 /Flags 4 /FontBBox [ 0 -220 1113 1005 ] /FontName /PDKOKG+SymbolMT /ItalicAngle 0 /StemV 0 /FontFile2 2476 0 R >> endobj 2483 0 obj << /Filter /FlateDecode /Length 13050 /Length1 25828 >> stream H\U PW =8A "%áx`P)@M"ꆬh4YfZwTnFյRTbhmdmƭwU_Hۨ[L^M)pV;-,(8mkZO Y5uc} Ro`y|^նC E\u@qbn%`2./p.*͠[8 r3J*V7?ٛ[+U:ں]]ft=~np&5 VL]'[O  ()Ly!Wc4#+F# H 7Uq؎HE$]접V*> c(Yx|0CwMV}=[87#)&.9X-؉P: <2SEb ԍVY} l>}$-lh0HsF0e>!ܦ`C 5P!#c2qlh)UH?] BVQQ738FZr|3xޒh,pT>i _8sYR QsC= AE(VͫAs61 1)l4n rB㩎g`Bc/uWWbKv}K7zЅDf,kP! pyw#x5L̦Y'Ert)R mrQ=5 ֢Ko1PLQ,&-2A.+XES3S9̫i[73em:hbp`s., 9GK8ۙ9%j8o6vt̞hA / Lg˰cȖǒ/@6=kUʌ`ޒ74[#nǶe\/a/K9=Us9M7<%;Rj_鍯NMrҐ1ϒ4M"8_9?νtCZhhi5)l@Qqmi<>W 5qF1kb86lT5PzJosk?z[BxUl`>lZr=pGr·zU RH0MSOOilAIZRq?8RGi8_+Vݒ{̅Nj}XSil|9;N^ |81@3sK򫓼؟cwl7k}U <7ᘜXaQR̽$8B=6 WCn`+<š5c~07C͝LHr,f~8 oTœob8-yVyw"s\W}gRd>:LRS!sH&pdO~#, [e.&%)")gR\? ߿EjTvJTgnh#Ò38#==A=t(;\b]!ڈ(.Y8N 'l,V@\vh8+?T>GB?Şrӥ 7=} xa*Ն)8AQ8EXs~T%O%.#_>$\$2hsIJ3ڛ|˖7!Cd\8G|uxY@!yjsyyK.صswSfΏ8Gr猟() /an]@vA|iuZ{k^nBndM~;Z*Jsꨫuw)QGeԗÏmПPc% 4E+ERuk%lC՛E{º>Ne\M[8\u2\'Բr=Wcsk;|Ѩ@4JY|z'sr_Z!9qHzgڣϥz[șN ΋Ufס֩;(HZYkcbލ DG\GI~O{yV1~@~DKQ $$N~p~/)]c>ޅ ]$c[LAmi ѯ(^ǽ+X ~hrR񋫲(ΉVRrlZ.:LTh_'֨69G0gl`/C{oSD}\9 @}ԧ{NxБ쫃I}9Oo-?>Ny<% %X8Ng3MʓD Iy8e״ZwxP6vNC@~ Mmbq^|AOHQ?R{MOWw-"o>4-վ\ߒ60i]/o¼ }W!=ϝ&3-ka2ghUMiTOݏxE=A+\y@mD=ڏ2{SK}vs_mUW~8NN6%iij6]4~ѱMh_tM&!k hZiF-u$hM@5nC BФ5 ʀd݀#~>'3Y;s=md$r-UNi{f록4NDY6oIG\ߔqjקjU5$hS#Uu+c^ߏ!ճyf}OMz^rv\/=2p= 'uΪ[x2&QB.cUL^ _#8O%¹}S0L̓^?FY w[M{w?}mUaE_ y`3{.kC|ǿ}Dy?mγx.q Vu(ܛ޾s;'u5pLhygy~fuo~P*<;+y!Wn]k9p2"8,;DcY7hb^!bժbXzc,.s%a{^fLMR*[e7I[iq.FA4~@,'R8>HlV<--WDV,|->|~_'A_/M̷d ۉ~?Hjq9.#^~~/iO"Sk2wo17^gU{6,fde<̡,:rWI.g< ]d.YGC=!J$Y]X]?Wê]ix-  E= 44G1 @/]'IA@/tB> PJ |'߁JP;-GfCTT*Vh#FV|k?%kͯ(\e(ww;.U`RSXeFofn`pk3ýx 9izH2@&b21O=cx!KRUp?YIliiiG(K/5̻X&Eӕre\<2]m.s],w%/@fDh:l(^F0p2D}||PXx J%||~~fv4M:V::xOܡ(oZptSܦ}ne}~w=.wS gQәrfYgөG[Mc"Ad J<䰲L)ۄlSZ2&5 .qN` ' dL@[q cX 1_b$D'Bt8t*CǛ٨rY,G1rT=Ѐ Q~#Q~#ڵ:!SJ3!۔I`7^C^` $ t)K1HX7-529#j6-i"j#e=ك="-h֕<koŦ憱x>2nܥF^E![v@xg~SJKA͌P9=yvn7݌iTTBϱDl╌}__*٫ϔ^.A-^n#!4O(yNɻLOH{; iB!m&thVOP@{6 hڦ &~R-J.0eg_{ů=׾ךppב%jFmavag /q 0Fo'/=]؍"@$"Z$U=b^z'ye" nJDd HD>蔈ADr!H.}($HN aDr/wHXoZ8'>dN_ -t11eyAr HMDD=.@{Er"y#x$<lP!ӴGO5QiN GneYziXzI2߲}lԦ7,6_6kO g,SA4',#Zm0Pb6F_Ѽ-Ek4~:74ֿ59hlpC02Y(-Vجu|6|#ų:PQ\\aetC1 E;h=^DY/YiEj\*[[}MMul~o^.Բg!b Ap/}-.ϛ4YY@vn&*M7Mmut"Q'Tnߪ(?55UZ]5C`kNj+ǽKMW<:sEߡgA+PB' (x۩|qڗ ^ EO#?u;_d̶Ul[i[>8|^X j##W-WoyZ{BR: &V~e # gEM.I7$Z#uJ)[itYzOWiA_.lf] ;j(6ngɞd/߰bUfisKբ*pd[Z(^iDm?+M4+5\O UU$44E4MƮZ<ТkXP@)}P8E>!S/SZȵx{%;#εS ikm_Ѯ×a$qlY.͎D{YQ ƹx{܂FTRSH>Ej"EpvyOlu}׸ظmhM!nagh$=uu_8, fjO>uX9Bu?t]glKd5\1eZcjj$c5$M:Y{l݀!*z;fhĺu'OsJI٦U5HIyjtBBQr2JvUAض"r8, K;~b@+8/INT&*+K% 9NH.yвMHqĕLsNeSٛٻYϒW^3]epT_)ϖɉtnLud|8 kfg(ڿk c?@{fU kDYnI5Z(ӕ$qJuGM+6Ji1=fVOB3"JeB΄Sw?Am>NW =m'E][jq3zْqՏC4[s UG7]>(74e [C.b,Gw l=ek_j[`y!Hc%x[&&QR 4RU FXж23,CmN, ̨J qlu3Fbf4ހ> ʟ3/aWYOT9lx+_cLM@>[u5&MՌ jgrs~q&!g}YOl)u_kJiO;HIP!l OY8cǝcXC Y~J8B":ƶK;,IՐۈZkpY,g5 c~pK>!4#(٩ = yj "2Qs}';\31y (ڧr)5iC_,,^ܱpsc.#0cr STKKRA$jٝ؞w]ܵw6^ljfN!Kkh-8QB8T,&H@'M@CQZ)""R*? GP ܻ()"~}{՝{bzϢkZ-}-[[-'S/^OWh׬:A \RȪBłl=jfr)1d`){[#mF \ z# \.|Q 2ydy+w_? b_}WK`"p"z٢uZQTpa\Gp{g^$m95bk4IKdJXoayu[U}"tm?9̓F%Lw=ru6^]B|pⱾ\SI+ݻekEŚn~ 9wwfc,5Qsk9u)= a4bSZe󺩘< Exw9/ʒX2bu ۍ6IqoL2Ӎ0v]CIKiiW+F $S#ӓ1:c 7o^%x rcH$R;;[pT1Gf04P: |]KwˉRG\wPksq0|dByދ^7kR5U!\^ ?uO6$R*vKHT*oetj8+ۭ d]+f;rfnib?Qb=4Kǖx\B=mo',)åMGpe0vrR9d(FȈ@<RVaJUw"'bwΰU?ITNΕ@ivZccꊊHwU19ϲ.-+){'7mNH_ptG ]zHORzLwѰB#Fd͹R /,~SHX G i#9r#/ &MCUz e:vnKW?\;AdH9iƆgghi5~4^>ZºyΣu/ T74FK.qNIjt^4oMvή?Q]Q$# =ygy2o_V0/MH=vwzzDB"`53$u Qa4tg&&ҙϏr(ٿOOlr j@7D7\8Q#gFnYg6r9V Pݲnߠ!4P't5ֿD~[G>|Ç>|Ç>|@oQD:2ܵIwcF`lgr/COuE H`R(L 샃-8so+w>hх`g[ HIcG |게:Y s YrՑ}3~'P}#*l$#C ax`C?lBy/Dy/'/d HAGsC%OL(䰓[`H/s!T5L~zDH}JqW} c4T.׻X8ۙ endstream endobj 2484 0 obj << /Filter /FlateDecode /Length 14534 /Length1 23312 >> stream HV TgrILKJaBX.I% "3\EDţ^xous׃ ūk+VQ TQ[wv߾yߛ@ 9 yRĹ?0M^|JrT:ړu'NhuE$UHng7L` Do,{8"j?aj|W ld<D;zYR{`L5Zt.)%1iJN9̛Ь1*ښ\Z]gQr z Aģ =ѓ:p|%rBWtM솽vY,9!lC13tL{O77p- Hޣn r{D[^cz ZAt>䂫t0EU#[O1XiLɾJ<{drx^*fPPi+$HLpL@)pynPn։B,xP?di0PAjLV9*p[A CR`\/O+'CT*KW0P=35z )`Fd8+ TԯީknT[W9$

Vύ;Z>Y+; ,lJY.^x|xQz%>xfW+6- _W7zQE+.Ho>NTϫnM +&(,`б?מ߂,>_sN<DxJeJ<%Ȑ*2L+y,JR^9"*OM 2D*W 'ʥ "R̐Kɓ"3~L4ʄe|FEud[^?VA * n@@AB 4J ."\@QQqEQѸOFJ]"̯9S;two*x){ˣ|t4,V&C;`LTj/UFF ..xhfJxAP)Yz{,&,]^FX<Kh)b S+1|:&:J%>/W(xeTx)H ,JMQ#xT!BP2d\=ٴi^|z.K05^Ή5sXϹxR[ؾ@}#7ҭy$ˆ[6dqg|9%<`}`fD~q-U'C g cQ{e5[orgea3;ҔЧ `㍰7S}bN;U u$hwOn7+ n0{mq/JוRݮ^po{Ƣr;[kUvgnn~(^kuCԁ/.B1hˡGsq^Nf{y,I(\)%Ok܉K#Yǧųvc\B0 `.(䟐BGbЫMRFA(o ݡN(u[A0ƇBín V7? h`էA%I(p@& X8H#(* T 7{/D`'Q{f(0a74w`Uze^(1gSvrDK!&Bֱ9nat8= >f<$bC ,5 E‘X/P#7+pCx ` Ndq&A$DX$;!59ERGI4lh=m)dnެ T,8$8~64 6\MG\p уPGԸqDą1b/3ބA=4 w E.ă)c%d:I&0#vr\!׌sF)^Ћ!ԃ AOp {}ɸ2Ȅ3L19S9>El{me;BP3s\oao.e}ymsg"ntxxJlh;s`Mjgp.v$g9CCh0gx֛+-ʁ ̍t2čZ0ad%fhA~AZaN56n%KK) G6b9:4pL`D)dHnBg~Æ: qtѤƿ)}4C;5C5I>=EL]j:y + ւ4,D@", q 4*ic3CҙN~̔N3tI"aIf:ʨi0AG;&zw2H;r|=-f԰I}ԵUߏFhفz1#d5=uf]2^"hV3, ( 5 yradևFMP{ 2K7;,27Xy91rc6R/u9fgG%kYomee#g;"ւA;"Ɏ7룘PCķ^^ּ-=f`Em.d\2C;dX ġ0aѶdaS}BFbG[h{{)ƠxHyٰwIyY%'w5;&595X("o X1-)/*A0Kx0z4Wl^=*"V9f nVi)ǀeGfkX͠Z#X]|Gԁodu%):0ĝ1zoQY5?ϻЁ5Xo2H1ʼnȪUD_WӀ$K$L!KDO(4bqjZ^ !=uHf4HּlnFlDwsR:Ѳ)tj?]ԤJtSW=vS ƿ;8m<QS PUA ],{qLQv۾MQ^@QWAzHS }*QPikc zNTi6eQ1]`OPBiq|X i 7!z o hcS \~|?7d)xr![~hSԀ}aU_M7:D˱=EFbvo >;>lӿlogsl Үc:G x]pݣ7C1i1W#g\id·8&%3֭ks@= |,Eqm`VGLZ7 a,8F\w^yS؄_:sM&sE߉~Z ,_1k=j.f% o2ֲ` 3_ʐ0! <𒖦|^YOAl;1qM;T\%?X9qv8q$8p&<菳_2lߐrZc9c?I6WFڷfpx9+vF"sloG$`r]ܜ+gOdr^̗3ۨUo d"cwtu$:.Xo[;H8Ĺu+Mm8\M{=vCq}=RL?t.sse}Ǽ325W*j>R_Nkxw"Po]zܯ vZՏa1>SP=!s2sP#}L>E+uԱ U7QGȿ{~8Uh Kx&e?>Yg6*1w6s?F \1_v}i-T >rWG^/y}ž,Wn݌׺JC=|+ʑ}\3r|/!\Kxؽc3iw>iɵge>y"N96pb{Q"."G\Eu oIyC߈\~w+J_ýuzh_V`oF 8(=jI++!/ }ʌd_(f"Cyv37D`8,@)m8߆7oU vNG ߰F`'У]K/\?&+>z^v؉ c;$ބچ CAOUt | BmE8⟪&ms]K;=^Uj^Wt'JBzQuY7f27og[nTgVT 33Z=sqOh"eIKaȡ\Ǡ$=th 1MDݠPS ڵ 6Un"NGu:SNN::ttbu2,|0(nfFÀC< }!uɥ]'I'NN^,~x)6`;.2_09D ge\FU!·IUR&äp^ r&sq g笜3s&q8Cڲ({[Wbd͢N.,,DKHb|%E5хuG= 4.\߯D 1wrx> #d^4QR(\x~ e^t/ $eN.:w CJ0փUN2^^vp鸃H,iKǖ 6dv_}|Y2G"h(/XHdgNN1>11YɉI4> AXx)c%`*Mz&w&&tU;[iMX3i?*>ESLU1b<\q7>|i(cO>z⥗ ' ok3`VtCVЀ|bH 1:I'x+!43?/bq(֕Cn3A2_}XoM]-]Uh EBAJk^eoފYI{h5+ bbHEzZ*[SU˪Uv5 .vh>.\AN?ٙTc̖H`H{Iřh%B .aaw&%,QC/ zSqP [6L kyC܌1XBҾq͕0cJ mba75堷fO޺ c}̉iǠ/O6I}{5՘KUb?޳qGQzU" |"WU )#ʴRPVFYgTyD^)&R4($VGF)VWɚ)TA)Wv3ރMds#=ō or8Eed_ە>3O?Pۼ/jF'16aDJ5ƒMT&x# Gf\n8hLQ#ˌ[r B)% i&*y+' @Q<$TAϼ;4eL_71LZ~=??XYcN u*$@ekp6 n%CMIQF7z#͵FE}pVbn3څJPszW>}c#_ryWHY08L]0cB'w~hUBT1WKP/b29Ձoo]țLS++RDj/_(7 5@0+Qc\y7LUs1 'ɰbR4Ė5͑? mOD"R 4URdNM$5đQzBJOіx͍0@Jp}KmwՃo矬 B1UkYH_㻇f ON$:P%'rҳl@:ۊs;{Yvawלp,5@a`'4utlYz/Ffov/{4ZZWS,Cԩ y6Pj_v 4 _")5u)é)`$lj xz1I=YvaTxu2J= bєDWURT|fx2@MjDC^M茬1@!K&[3n1ɔYD$  T]"z16Oz־h7kfLibΥt"lJ M90$<)aN*czbs i v/<Q5Y>ϲIwhT6yF _YFȪܪ׌ J.+R]@z.=cO"h֛ ͦ 9=ovc&+MSQ?c hTU~Z)ٸrڔLjK?6h˃ű?~~*YUԶCE%!&vWξ '߽z~Ѡ;.߽5*>y{oՅ̾ѰޗN#?@HT@j>1!xd(dq]S `Fh;YV%lkg#Q5:(eDi+]|BN2ܗK@Lkj. O0 s`9&H5Su\Vezk!+=)86Kzw nYMhKxCbw箓?Yb.AyAóWzVǛTd7Ukcv&e9b<!bļN0,8 Dđ.FC^"')ZI ^ * `}]|܂G&i3^"ɞQ 7[_;ݽyV8'=>FyMifZ<\C7Ý7ǥS҃d@"I "'5dhl,!L,)A|-Btrr`H మF=)'2BrֈhSC=c|]/vn.K+r'尜gMɧ\z#9AO|t״Q0h-!^p6kerǵ|{LtF8EPHmq}fmӆ6hq_5]ܐ]m˟d0)SsWkؗO}| >/:܎;v;>t ǧ%Im`3 銶N^ @`-zӛo9Pq rTl*ҶīN ΐ!Z9DJ3h?,Km= (Ĩ*F9Ե^Ȯ {(I{ J,`^ A|h} &ZU=h*1!rXVrT M= #>ۿgXMBwĚ5Do /`˟VYdPlyk,%9i!i"}[FԐnd0{ Rh⪺3y_Ib;deh4<0{vo (Zg@0ןɔlZ\)$K4@.-ҜyS='M.uaK! )z|LG2^B.ʆdH*M;Ы xvJ')1"GPsxdڐ`Z e((#1'uuϩX~w]l~ pW7Z{}oMmہsQ)'lj$MQO\ t5[Œi=赡QA5l)m'=4V  *D cl\"9-6vj;???61a,0- t!'x]օy"0 ( J@($6|WLhkYjo }#!Oz|"+{~܇S:j>sZ dNqGGϚj=ûUI(w~Ϳ\{)dRZ[ۙ_؈Iy|%:_qgЮ@(Yze% AC49 )k^ ~Wmumη>A Z\8Qx2Q?2@kiHdוFj3а TȈVk暜`b7R|NpM~:TG10RR?ҨWO[\+!ISsJxHy,IJYм]\͹5OuQHT7i~[wi7&B$&Ƅ$=C2M4_0p+~N\ݖ₴ ?>;f6(H"ITM E#ЙJT^AR\q;l[{_ :mG4s 08mLf UtSNY#$ (]LTLf$3IL+)5I%t&^YL*3ק2aD 07 "(2)N*ܧ/eoe- fR33W|Qt yǕJϻhtjᮦ?OoL[ҋXA{p}hڈo8k( ?aiC}_2uU=VUQG.A%]&ֵjsǐ?wsgӃ2HfRN{2\VOMPX2~&OA)xzI{wj&mrxƣ r/^I <mL(Qfy?[hȫcQ?K\xw /Ry!xGozf3o3XKsq|]lYnhGcmD%TpIYtI,FI_` X,*W{) |߅!w{{eNȏk G**?]k^ܧ1E.@Buje/zobrjɈG`t ?2~Ϛ= ". hƕ4t@s8,*TpVϙ 8J۽/s6bNx1QXa{b6h Og̘HqpDN[[ZY7!GuF2(RsN)d`^!]HMYwWk =֦{Cj.nyu/^ɲ endstream endobj 2485 0 obj << /Filter /FlateDecode /Length 35402 /Length1 55540 >> stream H\U PG^3Dȡ a$2\h&jGW\h f5h ]5ǮkL-azlv+z{_  :qJDtVJ{'d9ǛF.Y:]C)*pQ;.{֞ʛuf9ûS-XXTlW@n_Xqo(Z hdJu_xmY2ykh%sm:{u?zJMnw=V9 ͳ?Qc^B**1g):a$XHae6n )Nx;a`>^H^BEu,ѧuv6uHf{tE0tC-mDjh ݃?2Qazc?.Q [H5u؏B,Ԡ jf bLP;aE^8xB%uqo Pq\G(`&bg#y APn ^b|EQ",- #֣ (2jk}Gk @:3|Gx'> ݺ#8:G<MTO{m? $@1J:S=Oz&:YZ鍜 b{ ]F+Y94&S.TOW0 1Oܗ.yR^3+cy0y|or7r{p 'ȇ(#j?"[ hQ+7s?0s<8 ̡?|odiKr̐eSۜ y# 149%X(:؉ZK%| s>^U1t I?A0B`1R$$+V0*9(2[.Ub0 ɪB՘NC,S-Zf^wf=M/b@fYnf|ĕxq ۹>&A+ޗl\ a|j#i4aI4tpP12zmZKڱcs:ĸD=ݧǂXH@,"04AdF(f8E(Qz@.r&ʣ!0#aL3r2qh2)?eWyJ52ŘLOMwM-f9՜e^bhV㗿Y E3 _T(3fSe\'Q9HZ*|9GI,iK ~*V` 4Պ≸cTqBwsQ,mu1]@\Fx1Y&YU77V[x/*nĨgrj /U-mzDY5NXxU ZVV4Nڄxz54N<ǧi?B?]hHA‡R#&AD`1Iύ|*E0kE[X)jR\gd&#q!Ո[D/YY?jianK!X gOYfOx|b1LYx[۱Ѵ_]D]U~ # 2˜yNFُDOo>ßAGk:Rww,I vlVTLO; m46=vk@w@֠bv7캟S"n[˄Ulv, <~b-M&5ζ74 m1$HŶeTͶ/LR%6 D^S[wFdCG >1Y$vII5۞+K;<^Xi4%@; Xs/%nwKɬ]_4>ʽzhhiK&njEqY%QM&V32&cMO}q,bV j Zgh{BڞؠX{ZbBIJxtb2 )`-+ NEE!neՕBht^Ga|N@ۺX&WP#ZO4j2\qh\–uԣջkQ#l-LPG! ch c8%p%J(To\|sT*G2T=k]b;ڕv跙a_@g?A/8gyj]EyX'QZQ^ D|#6(}>>v>um1o.dŘeV›-4 X7Y>DٿL)o:9WZsIlS@ӰxZ]<Խd0)[E𦓖0̳noTwzo=pa:54MD(^?` È/Ya0 gk#h{'`{чc>Oq`sTO(L& EgCw Ɲ&󃹡>)>nFlcxJ|Jmy}d,-#a/y]u22Ts3ʐe}2P&h>s֎#>|&SHE8vtbG)J[>V7v\Qg=@ Q%KY 3mxCe~^RrXÚk]vm8L mȶdd[qK7װeJk#rovۥ xV<-'s~ƮֻhI|='W1w/}Vc18O0x|Mies\R$\G3UcALX# |?@nwT*od3\~l^fȱ,S%93s _ݏ<{~}L?AQs@oΙvV\ac?vf3tN Ҝ]VRhNgAΧqp;S/4uMms| Vޛ<^@$%F^ ;wmG aE&}Hm YuzԱWν{E GhsB54nE^X *UU⽠;0#ܼt7)>s[a^?檧Zo Z+]Q@ɳ4K(*F*CG~*W+iT~9jZls4wdl `'[(jY}{繡'N~AU|o؟CۛD1p AMCSyu <R UZ=qZ.~ʷؿmo 7.B_Xb(@؆S^D9mBs].䫴X6!.VG: k?.qY/[/*C޼ꛂ|ގUf>?UF)zrQ^xm@۵xv 8^>gl0SG?v\ y8iЃ@rS!ϐrlτF_nv'#cb"L3;ͳ$}̪c9n ڛ4KF^x5޽xTp͡y*ll[ ԫP;ԮkOWHrg׳nuq o 8olH3~ |GnT3Q@-n%r:Gȿ~ĮD* Oؽ'w }u"8ڷ? ! N;Q_?(' /w9R8uuH_2qbTRѢ~$sg&-vm jfMΣhy,Y71̮**f\d00$V/u, k,j%,K4b 䯀®k +Vp`,@RI7(!>v|Cvd3H>{>N'=ci3$B00 *ifovPArz1wC@um؟m%{&/Cg߀=:t]IX'B >䣰g@JRoWN+{9%C0ZtEMI69 8ޞ`,W-@7 K߆kʵTLk"fkEL+bZӊU)a;1NI!=@.;FN[h9c!fm 86ٖr3:ǞR@9MlDpZ"vn9 XfvL8m"*dY foWYnSKi uxs  y$HK-Nq:Kikf1ΊYղ'-% sbIu F\6hژfJ4SӚm֩ukNӮ4Z\]uLW;m&Ht*8{.{ nDOJ@#hm܈s# V7Rx&%&=>"~LxQ- M#jD =@mLJ&@1򙢯2n~}p!BYH`(0!#ވ)fG=j2B[l ^{Ԏ 5WjHMsM{ +ŭYE%@;'PJ"]5Y f@U k?6H {+w.Z6\Wnr'iBJ{m2[9d Q5Z6k2CrTֈAǿOc~S_<ٳQ0pxe:"[cR2$LoV鿪_03]aTX a"yDWfI I"R͌<<<<<}G;+4"G3|{ /nuWp?m-^Ll( UFm19~/yYVzb_\L9zqWN+gNmk+Kl<{#q9;9͡:qd'FM(<4UHU=⭯Pg':U+kh4T+UOFUGu_G Тʾ8%AioV4!BiރY[lhMzcnZ\Ǵ5QllhN(WG4%eѝߜ9#kog7D1P]6kC|HiP?DWvT<)0 K",FEɧ1V#ðM+AJ ڒU'aJ\>%Ga?$&N[&sO'2<4h"d@Q*ݽw^#1bq 7Uu߳9?3p #ω(&,&>wJTӚM ԂVd: ?ulHCZ6Ж*ٹNT?9sys޽?9 QW0ﹹ/~@*)^wzMfi0۷@,;N=A=4oczx'u~j5W:򄇍2[S'L=l%5Ml%D{t\Zuxʧ!lԮlQ%k0UU*TPLeuY3^V -HEJ|t:=̐ɨ@3JA6 EHdoޙd#񬖊uaک#7"d02LDFL Ķ~~)vv^"iV++v;I 4`ɜQ[;~] ;*$z@Cீt@ <*ZWǘ.5֝ٳ;/%)5Vxc4 }|h+<RI>4K{qރ-qPRоKr#Bi;fK} H 7DE5fFȨ5gQwws9TC͹f!ٗN_DXѱo>;-;gpdž|}+~_71uiDYm0*Z-tR"/"qABDZ a޶y̏ڷbQH"5jC(\$av[}_Vl>܈*c߸dzGN|)ФU6pK xu,q'pR;]NCDpc-ܰT?q6;q]>οOkgL1H{B.꤂+M:`ClZI(s:cWm%Vrl[H›5ajb!\~ zS^6زw<v,؅{FN80QԬy 7bw62K)""n)|O1gp;hTm;BŨ&>p {kЅdBV4D5A[p'W!UeVr@5Za\)=.ΑuQBsAØգP;!6t2eKC4EIz>C>0yP(j 0YwOW?;ź"͞1xr3تلbԂD [A]PbbK7D#hMW]1K!mCwrˬ&\(` (z(/v I/v E0*^1^6),%V) Dxepr5n`--!S'zͫPyӪmщk/ߞ~/q7!:' GwCĜfה2RtHzKTqr;668 x?rip `N0f=fXYGGV%xn9jMN)dWbӄ>=ğj %zt:f`oɑyZ4++Zt`;|Ϲ`eٽrwE@eA140 b$ &BBb QS$iZh|dF f868cK;N߹Ki;瞽9}aWcZ0, c5^g+߉ *X..ўXX^p~VO]O_~ns p*Q3To'J^]>M{3U*8XK[s$aDl1|fՓ*Vb(ܾa$'pZW6)] $Hd4uklаCgDHz=ބp؂1^?O:n9JĚk-j>' U 3uTLdeeXNrSݧڴ2y1"muXfz Ô*A Θ AĢ>t{8Z Ճ?ƍ52?zliwLs<U'Ϲh(cj{DRRzغȶ4*ht~W/"GRWxhXƧ˹iؗXIw8/Ofxbhvay9e$/hC x'b[ ~@rٓtD.g.{XI%?8ރgrAZLd3Yz`@z'*&&35(:9!G鹺soV"0mFd ٍ(j#8X|L1`RSs ,}()bj:7E5b~}V=HOf]=[Ձ9#O}(e+yAS;P ׀q0 r2;%N#Xg9X'nђ. ˉd;z| "۹sh ł6$9Y4Ȟd1D_0D WN)j}j-7*/2ueE]e.0; 98tsL6 B.#~-vN;s{TJCN&˭x2t8yYZ*Ñizf}w5MW@I|Bo:1 ѿCB8="ㄎt'D҈挡Mbu r.TL OUf0r1GJh 6^MšB:pjbk6n7Z0Y.r>5ӼлĶnEkv<|{ǦPfh-C{!eG"$[F#Vz|kIs5`1c$EzѺ5Wf4 &Nx˕[ yjd(v97cxjN%#e21$Kc\LM1hl(JB5zϢ91QLAMAѽZ Y6K1oH?ǂp ) !g52zrFwkLkBEÔ IcůuzWܝ[ZO7g_ޡҕ=@L]q/^Tf+pT]O{|0 GWO=sUUEq Q ;)s-5s|CjhWj{,?T/lC"#+πM&H b=2{&reܲ[s$z0hw%цh":墈"kzj޷T|2%S^#+LY E,+ⲇez#pRhf ct#c2KμTϛp!D!@lu+_zo?^z<.vW/Qme}ނrO>}=>ߖ'fѬY=YT j$h*W`y #ڡ"IxCd[~LlL1}!B?P4FwVQeRɢrJJͪ(CfKCd/\Msݑxd>u'$;H|nR6D,ySֻuV(KͥM6H0q2BZ0ʜYS!Z;sCf )}N&yiH!+\=2xe#p 0_ufJ8Ayľ׎?;;Sx9(E&H02B48vhj *P14:Ej MXtV2-B# k]|{N>;|A 6A rSRl ֬zZ{S )PL"|;'N|7C׬ @R\ G5JKʹ;6:uJ8"Hڎq<<7 ܼQ.ϵD6rqpBfĸ 汍'2nÄ]_Zw'a&B\z6Oq AؾF)PB NM)0tbS}P*bc/ίwYuo;>OM*B: XQrc]#ZAEaC>A~8E8+OLDB'K!_}_%H(ȇ0f=~߯tNpʨ*9eA+4r5U\a! <1s$ӕl3Hm٭herz-cVgr%O_OkgUzU% #*aAPXBvgjO"*y]ջNijPz\}.좲Y"LC9MWdiX+3b:۝7U[* X: (3Urye i1:(@twO,I?p%*Zc$nSsS36pYZpOkiWsb\KSkI~uˏHȁ~]%|C~vQ B`H l,AKhحZ7]SVij6zcOnPg9\ݹd/O+,+B5YfͿzYÌԲf, ΏOlV ㄣr^AU>PbeaQ6ҟoǃݒh U_4fġԣ\Js53f\CM2f$~iHL>kC֯go~c|QΎܪG6~{tًn?;|U6%c0%MsfwZHD@mkU{J=>K kC&$%AWQFUG4 χP͍qnX-íp_@REV5j[UQFr s jVS _Lݴ6勒k_b!E4P'V]z'VϤTLO^* ::^ u3:$Wyoo輊sc@9:=!R2}ӗO}:`?a'[q7fnehmhoHxRN }i}Pa=hMBWSјdHQSBe1J.bil =s~J id(i5iBRH˪-,Ri˴LTK/u6RT:?,i~&fJ{yy}"?m93$(Bh6!΅ka=n ˸Wo]s[CfSIՃu*8eNޜ d&2\(*R(*A)FHQ5g_G'A0QVP3"uMp)R FWa&#|j+ GL*-ƠPpd qea[Hj Vh5Z,k>1.ܰ,SXZx-^$=Գ3&I]=7 ށ\@T *}op{R܏7̷wǂ=P1<G+F?Ƽnb]]aEd'^!;}w6(rGfW9`@`"Q X,ʮiL2qĭ;⧜NŅ]w.",(I$}ZC 0%OOV~x? 4W' d1F":S[[}iG?߫({mGmZoX[ף@RpFz{t@/m{OsGwF6nFy{DZ!Ɇbu+HBUvvWvBMS)i*TH Ul.>x1uTq߭ry"} H 7[^h%Is͜THh$ Z `%y"tF+T@ gv#Eeg?wl"Yʤ(5`5=G( +jY%Ӫx݈cM1YFď됪I0շqǜ TLZgNGF (b;Y؉ uжmk% 8-#-O>zYopSϖsv۾_~CkeZܖ?P>3q4֟,w7/_.k#m@tR{ѱDZM腥["zh2Ms?MlW#hhk6->0Ih#Gn8:`Ƭdl2):Y^MzB)Ғ/Ws2e{poooQ7^ogsd!*)r=ҊZ"waUdT+#88QNDJL$e>X>ԐYڀ6hS+]'>׫k\zWMod>(1S1(vNiSW WDdZmw?r9X~c@Lb BlY_[RղDF=eaWUXsf1m`!s!L0m#»{"X9"#q+rGj^ $kB<ɒ(?sK<1f _X.,Jvųp4,2 E?xxY@)%q]!:* =%5Pk!e*ʨֶ1z^}]BZ}nnei`!B#:5" 8**c161l}xfd vjnVzh}!+؉:S;ChdjD:^H-YnH^#`qY)kI+&E-)UXșLZ+KPno< I##,s:̚hj}G(M~ /ʹΉKf[o1o[Ft!CoI.K,_XSkIE68"PG9j)Ġ$؋v$JI0.օB"y[_ 1=23 >3{ chu=rNԡp)e]Mwٱ}>w|>%6\xN Q01Q*h AkҗX& /%mGEe/hjUQmyiٖ}eMqn2LSG H{)3b0Yv vh.]ֲCzB@`pC>qzrB9.hA;a- .[ PJuQ+z"~6pi/??@_ֶRWouծ.NY;{;J \&Mt9b?4dN':YUsf0dA$ 6;AҎSC"%@mKLig*e42^7yLMBňƠ g~$oA f8 ѷOĿ@Ugxdq ]Z3(>&#v.ϾMC(_!gig~-;|Sܕ{J˴Z*9NƷ:ZBU>?=u['hQVk攘J-4Ip>>J].e9Vp"%9'p)R\lfrE\5"5 f0vpmKn(2$ƢA/X ' ]ݬ q8if43z1|ja[PH}OS|Wlwݯ$9>۹;l'WʏSi ׆@m۪ *mJ0M@bI„: ?-N}猡i9$f f%ߘ_C3 lL9$KZ2Y>A0 XȢ#xYa #gݹg†Tkl{G?z 'kZboWo/&ִbj:Ě <nI #9ӞnjmZΒD ,ee(frzȴ-m:,~K8:y+ {;+UNy~6z} <=P׌;q_N;q7 %VTl|x}V1)-fҞ#p3 N7FI})~b K4R[r-҅nSxX/g)T($ ]6$Eeݱ{dgvayYمnbU 娢9'jP&-ɲLX6t퐤H{xe1S69h27 ]OھV{wm־[/G*E+Exo~珃?vVkV$XILG t33]?ybvi&Joq K.^>bP 'jAHB`@f B|m쁓% zzl貭'MW R/Ħ}~ؓEMC jm TO!ZCZ6%WĿp8il;\ėCuP{H5A[VLF;H^uBBW'ϔ%ugÇc:hehj͆j [@Vj4%RSiYO"ZFc}{ 0SxʨtT;A?>YQfO>ih9VetT㑘O#0&G̲$'=#XH DH [f>@ =<Ȅ< ']=2<>O.HuEUtWY&VPs(TR4XK|LrOkbb- ,a汬=tNScۻ042; ,̹q Gm0,=#z* yJm yY_Ga\GF/gN})Mk!XW\禯T[4'KxMfS[/t*V;c_QKe{j%]v4˸Scިy4Qb+H1B@SO5#{s"ucS9Hg۳VAt9RэHo 78$#F#ތHPROʡfIfVq\C&t<|_2+l+݂r'2 :E>x Pvzk,xgoxLCd2f ;|"䀙yU>-YYT4SjJ 5$l 8 TT,TP}^HlӢ.am@& xse 5h`J!#pVa5Bs[! C rFa_BwWW7ژ- [Z仛=;e[ϔ4m5o>E Ag݋~]bSԋ/?o8)ulg2\Zm:ٞX9:Wp]+NRkvz+ ዅ[ߥZx 8HhEu6us\Ǝ;'q( Đ.%[MJ],@8thT0b t#۴vH#HikHC&m Owj97@f+wxM WIptC$ta.w]K9 8. h.,"_ N=E*)v3!ɩnwnCWzW<FW:@MpMJ#R E?]҄<. y(Ef^i=wKEMEݦ%!t_?QP 00YȍJG|U;;<4#b)S1i3#KJHI#hĕI*z * S PAaue>n"&W^3k@e7<^'ʕ[ڑ??ү&~ GY 蝓DPM5@1^[#`L!80drC\>_*}s](3!Zm^IY6H򀲁 Eb9y\$Ek2zޜ5d C7ck|lGx4o<.=*=Eߧ?mV^fvLsĄ+A p@,2~ 5n&5kYz6~K f;Yؤ˺hv@NZMd R"sā9zO_MUT %Jb+H]5ZX_΍ t\.p_ 1@|k|{\~0 A;h!!GO=@V,AGf,\M 3]pAd`=oɽ?[ڴ窭ܶǾ|dl˗Vѧ>s`}* Hn9r^wN7$*A'؈%AVF̸ pHK>ē!L>zfgĿ8 5 ?Ra0$IxqMM"w\ø }}ES; ep3$$,XaKSz./iicAEɴpVIW-]I.r3]e`6 8i_:Ӗ|-yYzY'3'2 3Ō@2Fc(=(ү3Q3|Cq +eӂiz|31u>od"cl]ht@_Xc55 撚BM)!ei& (o0 ЯZOշay]nUGp ΅N{r,#=&SiIK%ճI&NBD8@G 9gPA2cEv_)~:feD]oQ:f4>vyڳ9Q޻v'-^]3Dr@ A_YDtji^ j 5BtAqĊF\Ѥ38qvqL:{C>*`4HK].N A\.a r)=xH&g'U|!3M0<LbߓޖNJ">0S`0Q*`&x5,x\.~Vp#\$OE9bŲ&pU65o-mQ% gtMAt`('kG_bEc::ϪS EœvTg%l ,&^RshWPzH (Y -j:(7®F}45 .!J[qUhUUQWmvNs$2l{D=GPg^t._(m)(QhFRQ"/kCz Csr{hR!T <9wӄ\YnκRQq곬R GVZo-g嬴e{ِFL_ ϸR>hEբQЁ1ݶmS6'Bx'߼D#[V]yŭҏnQc+tػ"$F҂fW6NMSݣP@UlS?Mۏ"QPINuIo,+*tKzk+TB;}Ns>isL ʒ3]m[WW(փzXlZmROSlRh[R9ĉhNeɆXf mb ˀGSWibin i!xٹWr%y|%H]M^z A#H}p(={7M\b8Zm] y:o;L_1^Xe5˚*wuCr 33 `q+]0i $DC\*s + xuOۣ1v+N'p~hr^J^ Zu ge]}|D3QA7rz B(辘\TFr;lCq/,e_T"^I@MTCE *jnխ$TL _k+.ȣGwƢ7^>1 `8 O;חz$)?k8u`䵏l@`ow; ImUvx5CS W2?jL9zȘ)- K+ӥ+G/_̛mo3u㇦Z[Ddn~Qi=iLduP>:#:(9v[ kz<^eYFn쳚xH-{ݒ[ߕȴ\GWoH,؂uwDZl!=,aW ЃS(z,gт.Zp6Y@u:׏epMS#02fat91 @;HM)=ȥbj%S<ה C" &Y4f%g5<:k (lkWWh&Zލޏ<aȃ/ݍF\*kM%Th%[hË&!rʾ{Ͼ]xφ yG_p[P.H#h?S%=J2O>B?]ǾHlcX@.ߪc+Qy%Mb{ ZnI ;_`q[za2Dh|EY{eT0\PB='057_҄6r_?if,<NqyV@p@5r!j)'PEeZ$fC(O XdN@::`z0u0] !=,PGcC " $5|CyLvKt6Aj{0 觓( (;8gGFTS uB_ #;fOm^DŽfL3Ư )W~?\jqi3jb^ʫŃg75w~qg&@yox j/Yz\_qt/\\X;5O)i3SvHN5143cr%D b`G:Qx)lĎjFpL${ P[^0kx@Ot'!e@@ndpE(שVXehZXʦ$E+>n#l@xNPi6[",_P.Kh剋'.x>;D[$nNd00%;dmBM{]p .+756uSvլFn~N0]ȖKϢ\uکX Rbc-:ГZ$9< E29%U.yZe 92c,NRBR2b `,r_1* Ar۸ĕN^H0 o`0rGX0d;1=h A/Uy+)1!j_8dDo ň_;T8ؔ;ڪt0JRh^r9{ao\$)[{ՙ]t2(I6{P#И/-Tb>$ Nn; wHy٢ $@< ƧV;g G{p{p-T͈EERހb

9=lHIF 1{`@$-ާ654` k?Bbك x*u v|x |j@H~ p39OH TIO%SH*J7&̾>١F}Lz=oW B=p,"P@6O2HQ]6V:9x}BÝiwm6.zbǾ̐ZQG |_^~-ޭF G` G<@5N7qM:ױp<>2Czlwb"a5څyMox|xW m88H:%zEʒ-RrlIVVTXi,%^bV7-P`EQ|mif*F > CYތC]"﹣|x;I3! 5#FPpW6|5eEW 5hA[>mmK٭7vlʆtHsB2A)ZR7Rԭp%KB$[P\q AD.2nr"dy" X'ZnGs(a KB$ aYE:aeI4-k6 l\4à]P1B0M99XP+RuV!>bg+Loku 22&yi}ދ"0Ԯ_ M@9"Z>!R(//~iq4 /Ezαä4}އb=nqa`UGo(ST{9-KAv40ʎ*OFh` SG-<`F)0`0Y7T\f6'I4-5)H;%-40ľ"ρ h;h!4 څLގ- Bd 1ܤF-pM'l]޺ԓޓz׺^6\zMBIc1MzR?w݋lz=[-GV?,@Q0iyMܙcL'Є"(5tD3:bZo)+k?$W>]*{!'G{C [tC|B3q>e>n'\ð H@ i44aȈW^%"AP%/]J"MJHvKq.𝸡 :a>xdpE ^% 8NkV%rI(? H4^n071Sv!!=6\Oȩl͡494Kk0bhWoy 0g TFyf>:\;Y{ K,8E)іoW;g–z'ŪLD8We)^5:X!9am$WbW%vUo>a[bws A|V*Qw r|X 䞙[|޹O >@ 0aaw\YXח7mԑi$#J.rW~5ϕIF JLC`=%Hm3ZP'' `% N<=hRSQѴVKo4PƒsI'9s_](+:[׫U*U ?^]^7 gh?`H"RC x}*l ]e !<\ G}q,bqE3  AuԯGlk8퉏6+14{͟9qvը-emQM'3ߨ|h%rFGg3G 4'{Bs2qypgfj{O7;ox\Sb,ieHsE!+Qo$y!Ó5#m8ddiã#c88~|r}$8`š@!I!JRZ FI kNG;i0mtS.A+t+RQw?Z̞^~޼g}h+^%Ё⑄%RITD%)N(s.Ot>S\a"(BX*naQl UhS9 ͅwXL D!qie/4^( WgDTKr9ȉn`ZCFUcU6bj/i _ߛiRT5D!)")JЕ:8jB1UgJt5Й3E;hgb㿳8R(N -J], X*rQ˜ZV41*ZQi0q#73:M-LE8{II8E(8%x}[]DFF kykKX ޚPMbNJ1KPW9O6sM-APzCOË'0?5/y=E~C"+ovI|0qX~s'*v-OMDƕDږKjg, ęZ C\nh5c'cp薓L53R~):qixs %.葩}.G==`TpA.67BʯߓwoGw Vfeg4yC E^Zu2 OGςy?O"/<6LڞsPGv8zőw]D.wx.1<\%La4L+ܔoa@QRM\I! &B4(Ne9hB&inZA 7:?jGq7#q| !(~lg+ ~]x*v4 B(G&!sɃO^~xpSn܅z }gO>~n+ɔkVZpe% J.50j@\YkTw ;.󒠽ڄ%؏3&8L UaTpiJUviIš֥ S%B&U\tȀQ#;L͚҂d2Yø4x2bxTs9Tt"%y@-?ϴ޶ޡmOh;,k{Z)v6vvu^j>se36lFM?IXY y5b'\s`v0FbS1v.F[-Vb uoՊ2Uř24ex_SI)"'(Fh)O3Yt kc`UtA(gƙq@Kv ʡY70]ʚ{RCU0kF%Zj3+=BSib41!9U)}mǁcv\io={Ά핛{$QNU2_7+ޮefSeg%XRT*S!BqD EHXDHԇHԇ?B翗i XQ< ֘퐪25{]VY gPB0A5}DH;܆jv\ON3֗Ym͎ gfG#Xt$+/;)&3'im6:͞־}R2g?S^~jrN'ٌ~8y8|vǎi%+0[xXFu.Y+ ÌK]DL"}::xB"skNeR4lN&gZ \8n{'N  VxQοhpN3=3 3U'|؂fm)agȾ Qhx&nƆTĸ_А 9${gTb D3$dΘ7XƐB\2Vczo %K.ϔ}Z< ;H!4w:ZUs"Cڝ C흁ƍT6nH[x6gs[xPh=_hA{+wƶu{e;vrNUBOJ@d+( ƆւJDYOX۔5"B+ѕ *R=*-9vUyϽ{>3S&x){XHt|HL NJH?&!/ 8GJ͢YJdJd6Ѥ9eҦ*R˵hD5 Q }+Vkm&}pXR-t`=aW٧Y%їLɜ*"=EC&&.QqpP1q4T\*t0tzypiU-zb͋U=2|gN>ez'Sz/C^.{w3s3OWTGݚcIt>ԣun'OChྑc3%^˝g9TTVT W(?Ll-f< &E:Q Ѩ bLOӓƢ4M$6|9i,pgZU$U, Rw Co2۽H?,z%N_)&d"8%IiJ6ycnqnAΔSwphdSC~qۚ^#hS6^- ڠ @]6mɅ+PlHBp>&/|{UFrknfD/m>4LIN{mYT{8\d 8H{Zr7鬒i *4A7\h&:cX3O3 :L)Cw.;粵q,mTQEPX`!慪!T%:qrު`T jk\ KZum=O`Te!X'c )To3Nҕ0YW(e@TdJ Tz&'>x*J|t#?eEV 8w:sl6)hdz?tu3K "Mo],aBKx8AAW0!V#M-7ȹR,k"kB~`+rn/}4?]ALC1RG?ԆS nMH,=A",amB,1,i%,%S/+%_ Wk%yE^ñZ/S!`uMhbV5.F/ƚ-#H&N~=;: \EiVcWXz@R\NP|l6_Cu QӖ56͉ koڡyb 5SnA*:O4t(DS(&r>dۊ~<^ߥ{޾z*OfF*Μr@U1:\~daz1&hqde r\Mg1{`X. SU=P+@% Q!bW0V]`~8ő6kr>W߿tS#t0F[QSꏼxRPh/RZ۷GK%8Vu8Owb$7O7pmҰ<+TcK7VXy3A9y,H1"fO )Vmf*lVzlvۄ1}e~0_Sg_g3Y5< ,WW[~oa m;q1iGE!>JMiz=jr2o憅aj޿z @87uNkz$QTAI-xsyӰu ifyZ\|H2MDMCԛiB@‚pM`cA,{ܟ'WEaH8?TBBK`ₜFtk($m8!p0vq9^ff׻;ݹyfg8h i@V"$l Q;%&q V+)/4V`";g.)0s̜OX5/+8%I \̕]=TPۊ \6}6] O@ꠗ,J!|gU)P"1qp LTS B5nAʽwKb;ngkK浼YW4] oR˻50ZWc-NZjYLU¼l*YݮI>޸ #FP=''"'@~/\2ËvCА?a"3޿4UA\Iu{^x31t[-^Hdv;y {=ν~}j rL'JsҜIrI|R&kj@2VkղJYNTY(r@Ț 2,-3kY&f,rN\ײ$,ߵe#?.)gٛf Ufmh8I .՟4C!mb33L~Fz9ϊ% X+bűxKxo>H@~0;VGK/=DiZ(Pѵ)]2Z;10tD0[l//s ehJ|e>h3a VKx. PETe7@F\ 1~!vU)W(?)JLj,#Tbз.v\`j.Sc ڽ5a53}-HͰ="BcCrth$Arڟ;xGj~ w cX<KV S)Փ$L~Ηr 'sĤrb7qW&0 1Hn,Hǻ ƈheT?^|Y.'aG2 0'@2"bľd(&} /@&ic9AY!iR s~FA&珰94\xo"$ ,C#_-ߨi(/yIEg[0|^U;M2k1)j-=;t4{͉ ^{~d_%w;l!WZwLۼzzg^Ϧ$ Q6z=-|;+ݑ{LMz3:")%p 21YBLb$Ô&i3LẄ́f߁_׻ۦ-(s6UʊKMԤ@=lEQg 9|{PŇ):U(l/9 +ejљnK [lAzAGHS|"};WYxx9ŞO+' -rgש׹^jIlQ"於YU),v(!8eEyց`k[ kx5$%P\ч:O?ÿ]wp`lSAɾ%HPϪpAuhGiQ}\PW{~Duq?YvY=,]X`YV KWdY)^PQIR/-7kVR6iҴ/5ihmD$rwnK3ߜ3s7|33F+dlQ&'o'É:Z0޷rU -.33ۭٶ^\;ΆVl+] 5oir,dӆfUYƱV2卼S/i) 0Qq`,m{Vbqi$H!Uf{eI9$y9yv{+VKҙ|3ɲ_NQY2 KL Y-&!&_M M UgUƭ,dZwYEkvҬt(b4!0V>H.!c7bqrv:29بex,fE;1XN4-ۦ/DMe\uX+ 9<2}e*/;#|CGR/.&OML􅙯P:Հ'n0O\6O]mc,MggU/*TT=mvg6XM%Ǘ,O18o>q^-#~%&ب<43%ɉak)Ҝe@y,>‚힜/Y>\d }K:O2Э΋´tv9 ّh*?ALT- d98:dw(iPaꟈ/ bo@ `>Xl@>1C3FI2\;y ? xCJ~W$_$$ 7o /*z~%`y(zv'8ـWƁã:y&'DUl€9ȡ2[ٞtJˇKJe *kZ-^t'V^{ =8LUr?8|(Bjр&,C;X53xG^4R*B`:Щꝩ5}}sS1waĖTk"/RvT@yn;`Ó)-椏xk[GkkbO,qsw#+]؊~$  P;I%Ї}A~Q#I jHe2;BU6+2_L QFF'5Z;9'$71zZΪבg;y^oQQ??D @ endstream endobj 2486 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PDKOKG+SymbolMT /FontDescriptor 2482 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 83 [ 548 ] 122 [ 548 ] ] >> endobj 2487 0 obj << /Filter /FlateDecode /Length 30526 /Length1 50560 >> stream HVyTG9 ؊jsLfPp 4CewGLvqQPJ"ꋮQ񌨸hԍ&<Ȋl5,|?vzf~ `@F&I)M|,h&m6CCu2rDC̳w R$O5p,JvE)h]nxqf lLV#u6ޟbېOXH3]~=>Ӽʶb4aH T_o,NreIeO<0SDa]ګE"ŒIbL9cpLXP6@2r]`H3@`8N$zn{zhb.!y:qO* | =pDK0 S媵pc8EYC|Za(n^j6S&Mޚ EsL4[@1,V@?e4J&rRF)}u@"m4ê 4dՔ'N;KmO-C* Gs6L)kYǞTyg'~meܳɍ¿8_TC匋+rqL}o/X|Ju譱IIT/ExE[ܼQag_La{u3Kևο _rZRwn3~x]<`U&Դڻ:q 1{D?;ғ gikk0dGsZyx7^c8.>o ;WP1b0j e!$h8i}c`,GR\ϫn/yU'*WfsF[ =FY<*zѓRӈdmm0PՉD6(cC\.}qhzuggnTUTTV@,pTG,Yp]gelaDN dR!:puT//u};S{vo*$9K]e4S9uW̠l';5-{OtƶC|#R$dyS̐cz(dEK [d SO9 kpO;&M>GbNJoyTeEU]ѿ`O*uʎ[|hiuY,]ݒ쨨YXӓ]Nvx;]Q\0${-, +J\0 F>Yq6vrxB1caB|!i͡j5D,A)B?,Dm ¯{zW/ -@倳ZphQ\Ւ+#{Oy5hez^/Ũ/ī&lٜYbaݺ?mLƕZ\=;>ػqȸǶwͬ׻rC(G\\ MGܓB4)D'Tm]ruVFk78lMwdI݌cN.Y='R LT :_9s jŶX:ݜk!/_𬄨*7/?_R б#D(|@W8a_!"k=`f #ptm$9{w:PyCY -ͱE0`96r ky2rg\Es|ܦ3j[e,HM} IDx&o ɒWm4gjFf@_eyv؄8+#A>`E2yD\UH!AnH*d|Ur!ԫVː+/#Dx 5Fu6U2CөR D=*mJPj\d{@5u͠<&/&@.BkZR-B+nںBq"HgpCvRxo\L$Gx(wPy&gyS?j]`B8d1Z8`y=mh^C> ۱o2q=Nc" F"oijр㣢#f̺hdZB#赑pQ9m`F>kh bԚ#5F.l6tEbHNo#tN#E Zޤ{݌yMd yրZpMf43tr*N:46,2XLL2K:ʚlljJM:fFB&2=3~jqjK,$NMv O֔V[Z3g3>R`: ߓ-SmVvwSv[ ?\_,k\:Yl*TZ|ϫ{UbOV_Ǭ_Tm(^UTťc[e]s1(j o8ɱ˥菪(xS~U4x􎽡Ǖ']:bUEJ+%.MF2L3;9^s{+#dkM#JWO}YPƵ!見T^3-  ,@Yx*fǧ뜞OO˰ϙfܱz߫[WJs'^¤|vx UOXM`=VYNM댉LϢ ƅ?9/:k?ti'Ա9Kn uvuo5N5J&*PH[gҦx njhʙ>)̙0h6juјz@N_`|2hn,v32U''dp*(XTǽ+%ƍfLj,Οyޟvy6SfuË/jVot/n)3D߻&(ێ>_^\ˏw:WKYqOtۦLʴ dK& .Y^\vh&~ku-+(S{&y;DkYƅKݢC,MVD~n%Y~'-}6= ګ*|2seھh#Ew{me:wCUX3 rzýon|Ѕm ?k:[ErA +a׷ăzdӞReY񈲥`8pR{]RB$1^Ƕ|$T.;b$sH,4ߕΧ@0@ |X9%r'?  }}.HD yPP&%SJ0 @5J/ɱPkR''6ɂ#- O ~a|%\fuh."Ȃ5PE0zDZbN؉ F~| P ?"4V/%H6a=,%}1q6\䇲 !C.9ʩ@60fb*PG\I0Jd `/`B!ڴv@|DѦ J'Ȼd2€e&do5\*Jp]5z&"џUpO0= a;6b4JZ }#^i uD=rT"okem^HL$Ql#wI#UBTa*6޸WwwEI*vJIո=0 :U k5A}Q~ipri0&9veE"{`) c dq(ێ[3{0zj&~DIx2Ē$42dh"5(JSSb:9SÒ8"<:Xɤ`hω0i\#v(#x\9T LY)P Wwi;zuqc/UIDjYkiP^9v-⹖ۭ nBoL_ݫ~U}ist^_ |yAXsΞ䈅auTSihidj8yC?(2ThO"C=M΀t>?;D];%yu5\j\H~^yEH{\8b"[N~'Z#ִxWVX^K/ZSZ2y縵ٟ+|U0kf9ӜS23ҧ8TE0@X3æZ{d_o>DԀ Lcja{6y#k76қN<_̑:]֦ _C9fvn7&huaovtpE3}/)hzh(W,(eu~s^'50"[׹d_n^kfCg1S|f-F둫~-ZzrR{$Sl41r7fy/~K13{45}y)x?-x`( D {!R+/%&I3z) &~};l]fuҥN'cSoj&Sɘ8&ydSI2@O͒s|">:VeCGQ#lXC^jGm NwAIaI9䭑%9=#D@g' gr$FohZm2'i *.o bSe'iEA91Lg> !rwoZ\MdrrRzbjh@е6چv]s0 bc?ueBXD7W ZFukz58$Z'Qµ\Ђ\+Xd~$D6Uvcƥ%pLC"s8<{P=X  uDM9B~C\;zA%sM.G!d+SCyclƌAT4ʨa7IEȈtY?s8Ȝ} Y&䡒9Z/!wJc*C3;mItļ{*Jnw}L %[k,WBNt NtJ&&*}Z'n[X!Dl9t77PLp|*m- FIzSPT(J뭅aX2*k/Aޛ;p{\ex{N Qq2 kC/8' v 1O<"V-l؃[}}z˅ ޕE#U E */Gg?O$x]S&54U gC)k}"4h{^ClH%,RR("~D<Iq3i!ޥOsq R:⫊}&eK!>Nsy;So]=@$^wi֐{Eqs:t@B!Q`~ֱJTz6u]sMb'Ǣ4@q  KB`;Ɉ&@ `&NeZʘV:6U5dBi`2mT4D٪w_>Ĥwνwy{{Z&*ŋz#+{O\֋@nИ_2ӢxG%GD(E#7\m<{\VR%~1{:I^GpOz:ެ0:yr'(UNŠ$vhA+@'$ZX[>D>@m7Y:-3Q(M88c&EG0:A /%im8igQ>|+2 Z-;K1_KŦO)u#'ۗM\/3;eXUXwEÛ&5 ϛV(y,Gޒ I)"tR'_}9#bPO8\ z:ʟ ShǗ3:3y7JH%s3#7cH^#s꽦(7Q8Ǖ_jٿXe +zk,tnOm ^P1.@c.jQ Du~W~bVj2P-+xH Z'ad-lׂ{Kݣ V.B\<.2 UT 4 ~p]* eb9*,¦^!-ZBj=BǛR#xjN7vҶhn40ɝܚ[4h "]:rU(Y2)/H*2D)TJKr)nug4& @&܁d8 nЁ*M"r6j P>NjԖ@S^ )m 7Y]!>`+R\m9[2-(g&_^F jf/++D#nâR@6X>1P/(;pjU{NW UMTZ@-ɠ<<`r͋YZ IT|,  +a Oa<'Sԏ;N}SrNԩ{9HwQB" x[\ lfT<;Fm?|nKprؖ0Cf o\ÁN ZclOpgb(TvMU@,q{pXSS0SRudq,68FeGz2S7DyuO=E ;vIA`|A(V!S2i~ߘV-E(8qH[$|Y;B#ʎҎjnIBeWxZ7lM۬U6ku.e˰IM)6`6sV/?×.ۀHgءVujHR%]Ǻp7L]p-H]˲{{aze-q"-s >dxPɹ\r:OKU=L5pRh2PŶPM^u[g-Dv2aQ6]m\uw?|g_wv>GIצsmVi& GS ڠ2/V*DB k@c9I;G>nad\Y~уCP+h9Qacm 'bFT6e>W) RF"WUj8,YZQsރwboRA9 P{[if"a!cL+Pʬ7dYΊR e2i)|zx 2&u>c;籲P*2@JZE*UԆƪf =#_vgFNuk"hi$;4Y@>hw}fA{6Hpq 󦑁A1 ۵ču!_H6Y,+ z}v`ڋ,aǒ}k{}x5k9ny<6?sɍ8qΝcdKup'ā'`$fɓML5> J$W5Ƀc8TS ]pSP^& u(I!P+=86ݶh  X3vXVM!!{9y SHC1>c{sP) N0m.>Mˮxu\RI$܏RQ?᠚,%^1L#q_uJkgjKS~Ԗȑ"f,jS8:@ (|zV.|gp qGRm49?k/$ l/--M6B,=Dai3?YϨqW~` m1,Q-vrle2f ӄ `(`z4DA05U450!M9Y0&fX(ˍ: Yh!e`Akq\ixrmO!MҴ26Wq\*_*69[~6?8m[cה_;jm(6ͫD!V=(zRDrGcTjI>׫Qu7.n-O1F!!ZDч Aq3X_‡gg;<)N)$(._0aT<* u1s*jeb'K%|0k}V}L I~erMP^4dvA3{xgqƧwS?ZHAoé,ʂLPo3?wx+#rL! u!c8)0䭩sHߟ<$g U8_hrRt*I?5zN9>l ˧dk-.) 9$g1մP'`v>a e;j :,I@=mpE%|aaȫZ>V߳,)= *!J&@1a͕8AlԬӨ_ DADo5޻ZIZcezY ؊뭷CItBJQt<.1(dHC2t(.!$ @2` 1@gΐImI z&t! wwGssG.}Ռxw!sǨeȃv wSceOܭo}!Z+BvW& n5% nM6qwEFeLPנ.%qࠁ>#5#Xf] AEڋ9Rs8uQ 7=`{7 ďZ&V0;3֖%|I{/-)˜+cLLR Z0 1d2yGqt ΙKK-E)p['QC후krcx\F`$g$uȒb߮b! ֮-P璏6e7hhe0H=O7g0on_6Z|dKϔQ#&=ʍ|0=d4oh]|E]o_P?FTq qxFdzSȰZmBe  ww\\ů\C"}0O{'aqU:rd ?z`Uy8 Μ]Zڰ#|ɸC;H+L*ڀmqNwr74/FS &Ĺur5sXF'* !j銧7'~m-$KuxB]7ڕnU/>-ʀΡruԘMñ^IM=oKb7D.P80_ An(hp'땗gٞjTxqۡ Y.BA$\/4N-l|{Tȧխ 4~UN MA_'_V2Lzc@kP3fzyΠ-wunV/+hA nHW2tqep  ".qfZ DLr߲ϣ4Ӯ Kc!X-Jm˅W]8@D+8@wG5Z~}8*|2U-3DPCaotݰմבLMvRzK-T٥ vf?#gJ0u\$ŕxL5SlyBCДwx& D,X"  ɘʄxUD}b`CyOǝ\T]Vڝ:)gƀ]SL,Dh@%8ՠN5yCʬ$"PY31kE=o(l\pIF)ߖ cXl&?T;%*c c)gLS%2Y)bf\ fՆtYw JvZ&̘q"̒s L&FlaGOA} 0bcx|EmأܫF ϸ0L?=(טZIA޾I`VYJ ߀6Vұ8s9 :E oN̋eevnvLЯ )IFZ 7fC 9+U}p5+iҳ93]Yp"KJ[,a͊NMlFfvXkفq*ooCKU mդGBK/@ӆ!ZE훟)egd+bEf*[*FaʲcM ^Qmؖl6^KҨ*JJ ԌַLF]rTVv[J$E!'[B(s!bRP D}^oFU>඲Xx`˅rT.gP2=נ 9Uŧq20 13o4PUēx>&όlY<𿜀)M _f$&4x/L(@#TPAnocj28;sZOׁ"}ñZr|@1>qi$ë؁7"wS|C~XW9^cIӖozdUrh-%Q?:>Ϟ=C/0m?؜jvr% Sl?/%e]vc(sq yƜ/S}'SwGLKrD14!lcb8H)RRa`XJbb ekku Rx3Ep]0 ަd}GuBK R&ڗ&Mn2un?~7`<#:YCI'Tg6l,3b*%]m@7BllhGXjD,>)F_?t'+Gps|:b/r 'гrz9:wޖiCljEmY'Σ2DQrIJsR縛-[HKZ]}/6g \ňf쒻T ǂ Ѣ%v<-&J`"] TlW"SB/ 68eD?MLI䧢 (t |aAw$ ^wl\Rjzj$}ionʸjˁWi=I?o.QJƮE=;?h%|z|+;֦C ?UKOKu1ߢ:j/Tg"ϲ-O\C3=!jprf~!9e·o yp3Y7Shn JR fA 2T\@pa⼹L0À6웸 3n1Ei&;8kBSXe]vY9 g0)d>JL)RHBe9vr8s8*rV!*(W<0>DnuwP Zzex\g*GSm';/B߉n9~O|ߊjEWlb'w;߽;{g_Hlס>ꭈMDi#RVMbS2U:Z!1:V&j3$`[Xڊ2AV .R&{wNҤ?&%/}Xz~~|w>/oS۟|۶aN2[  75 "ݖ HVիVlK֤]-b F A#*0  ꂊ`0,{=^dl0ʠėPi(bP Dcpڦq\%d1m6#u!5i,=+-k}2p#0iQl%b~fi_*Ed7X|9Pu^tle;5}]G J J; JOw ب(Z5@PUANX "*Z9CB@&2bÕB`Ms|JZAʳ)χ{ci~73\}ђx j HW0r a)!X{s ~ *p- ]+AX:`7Qh@íO?Fэ-ȑEY&ד3f<UJX\?쯕2vu/P둈Y-S}<Ԯ_䢃(0N!ġQ4Ut|l'<:I4#mФyBqu\qqZB,CͤKoERm0O;\:n<6Gyc_ t2?j+I}J9s:-9L9tQm}p K4զ9؊q7q:y(G_ֽZU}/!{!I !%ݐC2œaBcC<)iQ Zיno'|j7=3?+~/c_2[ɽe['J ?bP#UGQXȦi gwLMe" 9s\J8in?2+;z;ԧio_u $rytoF8ރQOY0 gqgԌ/W3 <஭z Չ-'8{ƒpeF6[0xWk؉:YeBc(;LϕV߿\`q8. +Ÿ7e$L'eR:Px?t?'tH&%nV <>}=|}.z"t"~ (;W?Ϋ=댟s_?˾ϛ8ā%Pd"h֔uju aMj`h%F71 b; Fi*;(}ߏ)a֙)6MRl' [uE*qqqGa8.Y9frb>+f_uowKVw+ʷ nG7g;ju\muYEVg9JݥpR n݈,mgPEET D-Ҩw:NPMC@h cx/ͮQXKlfJƭ4F,JFFF4z>nKҾVDQU:aW{7zI5n}U%(1Ō̈́\b <(Q#!t(uXVU-b[/Kar0 d`0;(j<7T_qHg֦kp?mq\9tam= lȝßV ,.Y.Nq{oEo3OM e璫Kbv=L *_~%/~ yF;~9R&[նM?VR8o#9QjFsc≠9TQV+Q&yIWURWRWVZXX)U:TA3vgSQiXw[e B#4:2(#q83,boW<g/e/e)kJM4R@(h"W;GG ]K Gwwx~3pnt)v_0<.d⏥5f^[DА24pY)X|#bXϙD&0y+U6T8,gt^cҚhpdJ4ko]'~o'Ija-[;3Ť7ƱiDziZw0tY ٛk(i i9҅|/аK]6ٸeoߴ8ef[!zL,]HVkaE&VSCڹ%tv#F%:'` r+Y^$+!e(I!_R3wTQ=Agudy]!sC=C}3bO4܀nA%߁ơcHңo<K%ez4V?0hƾbuo ډc9¥$%. \CH;f1v{8caB4:X5THs9L"cZzygI^պaVH')YXQqrB?Yz^/1I|%678a(=r%1{nyog@ '2YjPlO*?a*w;!4.JX6űSl#(+54VjFM%4-PB Tl/}차> (X D)&8('%%*$*AQ@?!hXA(q-$iAf3hš`f+&[?Nhb8,UUq= ~4/`axrvomJ u"ʴOUմ1+=> j?L *AǷVbԣNɾչc{ %nMٌ?(z`#foV`ƽm[ڙ9lj]0 Fp $}%}>_ܧoNNzL/ugfyV(T_jI-H"te|0$"v'b6aYG{`)=G"l#r2r6bl+DJ˔`W2`.2י<$6ØMd x+GJZRjq1k=xޝ5덝ۋy(0Zh#CiQK[46JEmQ "%B1BR% h"(%<"Bkݴsϝs|_T #C+hT9'(PCbaUU =CL{ PVO@ӠA9瀡kn%]<TRaKyQŽ*VjeGD:jYհDobKbOb2q q1q'L&R`bႥB ^XFc|4x^'# #VWX6D#~/Fq,FT!Do5M%ke#UVU[UK`4,F|$Ze'`_vm b1bvL-)Z>()D#Pq")*qASsq3dy>zy[{kCgU[?K 3sQs&F3B5iiE^rx犖wLKȯnQJR/HKO;j0n:Rd:aȄ_hfAB@#' bL)n\v4'7VBRSFe`oNb3{l#~Nq B_XAֈXpa,F r`M'}ZO"#c#hEm[W|A~'z>k_Q?}?ݣrXgg,7Uxfֻ|Qd&tfߧ8o^¯ϊ!柅7S(ָ1-*V.îT㪹-tl6+["uΩ7J@"N+8l)M($H$G4=ϔ© 1Sa34Q[Z"V CBɇ9WK>6'3 #X 1?ˌd.ICS kLlVȹ_%ƤIJjf6?NCdEmd?h, qte JVXXBa8HX*կ_unx)|7&:qs:2 K: TFkn(;eQ7M: \B/ yRct%IQs}&j^ӳ]lݵzJg}qT G߰ w!> -:%\Q7u[JɛB[)b t*OƗfȾry•Y@On\k;||corV1ˋ6Φ}wYt|t _@VPvLc|V ʇ1cVtNރ#\̾ͯD?TBF[\3+9>'uy\]M"\].O&dB@A8 ἮxR"#8jA>:>x\Mk0pƙВ_Z4עi &pg㰣)43,?5!D}b* { zq[G'P৬NQw.m ڛ]joOtkz.nALE#?Jmԇ×?v&bKH@hшFaF*K wFġCth27!HFѨnAt E?ӯN]ˇ&l|qqq9Ńq]g9_fT *$w5]^at@K%%󠸅,ϡ(۸rp)ər @Qa04){l\9Zf*\ֈǺZ6Fv&R JYLןk^^olb⩣Qr޿&;~y>?l{N|1#Kx60 bRF6F-LQ:Z UeUa (T DuN I}$ۺ[k'ɼ2ijݴaݩ}7wP^=s?z2-x*2 } ǐzO^tCP1v`!el^sW np7[-\./XWO8jՓ"YZ^#.7,+?~Et+Eeәla:^D7D3e-ɽ?rK8"\dgDa ;' VںA@1fgkUn 3 6"qD6/KXDw2h/n|w !@vIg "{sns1Y;f@Esȇ@bDʠ-*zC90+ɘ0ء7@*vE֍gx:H 0^ W `ϘfY}]t`V)8 *d5%͏HwʮITy醏?zwٳggC됷Ʀ^ۂc d㱿dxx >_Wg 557wMU44/ <ŭv͡F`y>x>d4<@O&@EL jrf+iaz4s Zaۓ(ZO@`QxdZ=Z±Åh Ĝ`&fxk[?S>*yg[uXW.K9XJ9'nDX,BL- B<$ kuEՉfKJ]jҐگfƗGasc3u|iŋu1L:I)ؐ-j*FNo6r阡tc7ʹW18ScO֔x<ʒ$U6|"ʱUZR:QNW^F!ܥDY^e4LO'/%d|6u3T{z_iJ;z}-FÍVگ‘vYqrV} &0 a[ض 29apv1 +~ƻt>ko{/|+s,ˍY7VH]MB5Vh]sfbKd|{㺧77=t0emDͲ j+ed`2Z'  {0k9xhZ0p aT]S54C-]0>V0O| zu{_Lih: <:0鱕)9xf9[$˞u;Ucb#JLG2. |U!yH5O5!d % 9bADc8*C,W)q(A +JizI&&)U,R4}=aIHZu853>+AsRV,iIUq9]<&1&at1H@LSx'3N3gnaРCO/N- wljjRS|ӅaN迵DSO$rb#rm9׎}}~;ĉرophn,jafVCtkD BQ; VDm@?6ѴUI,%iwuhDsIr~_Y| !7Rڌ d937@V]<.Lzhl|d#_gr$JR=-jq&Z!M4AF좎5_~F bvg2 ߜV%$0 #!<8^9zu+-pk}y'QO";("ǎUY&W8!H\K$f*͒+p=Ydw΂$PİK ka3Ś6b P-q8ndfx,bzO;GoS@%yNؓiػ쪽gbv)xcjPfnδ(}L2ȘdNܙvvveINn^/Y) F$*M춰 hQ| p77[V5nϫtzz\j*3uI5t] &\-rf瘓rޏU1rQYe gegMe-, NQ'#hz|UaAqJtes5XSpV5Vp1%9 AgHB Vsb߃£0 YzRɓì=.2 gk,EtDh"`áԮ'׬!zym9G} ா|/vS4fm}gCer1U/%>,"4eQvY_#vqSjkj[zO[Wq;>e㵑*+6FvDKsnY 28<鮮#MS`#n/J=Bif#4ҿo{kJTC;kq11.dҘ:ɝsW;Y #_ޱ\.3Ak Ƽdv!H&vPtU֐"7N_R}=kB WW)ŤLRh ` Et'C:;(7C825 hUd8k g P $D xASGbT>w|Ux3sg<;;c v׵$(UHQ JD*TT) ?RpOJ*?*TEny**kΝ I*{Ssw3v`GuI1%3cŜeɽ-{ʒ}WgK =n~/"Y[ms1|>d;K=R,xve뵤O:xU0dqCR fXm9 9|R0}LQ/2?ϭF-(G cb4am$BֹQ(TKZJ-4:ixaXrθ#,o?迗zǢ;sjOn˖ǾΎ;_H[tl!Vç> ;udbcxF2 sDD$EKC$ED&E2RXЦp4a >4elrN5pn}BM5M(US,%%P̥PQƅuVy<'")N2E81\&g޾6\C/a?zPtI5o~?!J}-/x/vDoOޏ܏lqOEO2zʕZ,{Ctڝk=+WWKK-9KLrIҖx6pPŁ@-J6tmp!r.BZCaVB?‘Qk~V6w y=봎5yx3*y5y`pLNn|?V=Xu_ot_$8o Pf.X-n_0X_2邵h* lmtELe[Hm0{tbФ˗ k=5f93{t;S蔸N1+{e >V"|Lbc)Ug2~ UMIn / ڄV☚+QEj[W8QE0b2N6ش lhPhI-(7 L4dXPXEX GK;z}N'v '8.`#^!0nR7ud؉TnH6>w_V.ӘOϵS}նdm<>Q-).i^h3cHI/%]ddP~*N*IV,f/bVpi%0#N)*|i۴L9v{׋IZ–$կdɳ`?ٶ<p<[[BjC7h9.fNAx/c-+@ YZ0PaUuZހiAK $k 4HTCŒVpppػlaMy "8›;BZ(p09Z5IalmP89??wʭ3Ye<; ^7}hѶ>md3p7طʖז8VA^R_.&܏ѴEBb4#5i}"S::ɤxO4٤eMSdrԫKRz<)`=uz"LBYl"/ZEcr:yӉ$w;HuS \aoø.Xh{KQt8a >p;1㎀HKOrc K{dD6n[ė/o.=&/!nK g_{\I'6#'WTea͞p3''qıHr-9%TPM\굊:XU y3Aji& q\PH^%Z,D3mh hد@c}KҶpk`CâipԨf-l*U9y XpӦ%`jxwv-#kFxC >m>wȤ4/vca#mGW?y VYabzqPfCymɬuqb)S.Vvd]=9O@j] s3-\Qp.2Ov v.դ`@hvH ]ͭRPjl'Qjo>#1F9^@hD&/_IMӤ'D[r|߬ΖJ }:LFt=4}Uy86tұf$ejN5fi%Y"ֈYP 7EDDmz j"(z""ZIi "ιs{w˹9 C|%;IU_W(*̵V'8~_vFYuf;<jͮ/!_kzNO`lT1Gz|Ji,q`vp|^Tڲ[g~̲-dF JB Gѽ#1q$u@iHzI6'Ex ק2_Cv9+>i_" h1,9%I({叠q&}iBug!eܰט4IN-2ߖg&S\v G;eWKڻ\-y4쑜{ߋ$rW /5Fh4Fh4P%lŴŮظĤ)f{2̝ 9޼||((,*^BɲҲ+WWCu5@}C Z6mֶmtX\~k'Jj N'=!3̩,ĄĪm.^vRڬa.|;fHUo/3}ZC a.W Dz:#፡o!?"#F;(}Y1#Fszme%DpZ"2&1u9,۞xបbnU߸ǝ_N߿r^ endstream endobj 1 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS4 2444 0 R /CS5 2445 0 R /CS6 1429 0 R /CS7 1430 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT5 2467 0 R /TT6 2470 0 R /TT7 2471 0 R /TT8 2447 0 R /TT9 2464 0 R /C2_1 1428 0 R >> /XObject << /Im35 4 0 R /Im36 5 0 R /Im37 6 0 R /Im38 7 0 R /Im39 8 0 R /Im40 9 0 R /Im41 10 0 R /Im42 11 0 R /Im43 12 0 R /Im44 13 0 R /Im45 14 0 R /Im46 15 0 R /Im47 16 0 R /Im48 17 0 R /Im49 18 0 R /Im50 19 0 R /Im51 20 0 R /Im52 21 0 R /Im53 22 0 R /Im54 23 0 R /Im55 24 0 R /Im56 25 0 R /Im57 26 0 R /Im58 27 0 R /Im59 28 0 R /Im60 29 0 R /Im61 30 0 R /Im62 31 0 R /Im63 32 0 R /Im64 33 0 R /Im65 34 0 R /Im66 35 0 R /Im67 36 0 R /Im68 37 0 R /Im69 38 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 2 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 1 >> endobj 2 0 obj << /Filter /FlateDecode /Length 3 0 R >> stream HWko@|L"k~5'N@]m%GZ!Z+E{>g!p3w=u|y͇$ ^~fsZirHN6W"i{*:3m7W9m6wNFv7 XLv) $3aBDZ!oHmS]6$!Iq2=$-I d$/[S'wt1ÖT5iڪ:OdWƴpOElD]"pPSn $/OmXQ}cR'@tgm}p> CGp4f||\8pIpf GM%]}ZR;Hwa>s8;(w$q>ZT ^L9/o;ɞŒ0RW7\ vcjVX5yW QVqHn\Ŕi*|zO| \X7ГT@P4 wGVʼmbԔmrkDt$܅i%P"TđQ^rg:su*2ҝE,_3Ԣ GK4NɑpF5c"bµ z\֜Hbk }xJ1mi>oNIXMVIRf堊 S\J=EX$);C4U 9$p1%@g|f9E])iCe㝸Ds>*%ݾ* B:G9AG1*T}퀻:97XF!NEK6OGZ{G.)= O%As+[ujEʵ<TCqjnǺ0XW5dVNĈV~:Aӡr|M˱c8%rMʬuSmf.I ePan&Edb@#>(tuӒkYZ;p@f`3|S `@68'}aQJ*Lc_q>a ^7ugP>$}RV: _[e;tqK@Z orI+xc2ƙ΋e/"FDLCrMm67.M zqC6GǪ]f `2w wO u:raBP>ݛo~J _q4۟Hy1W ˝OZؓ3Y*a/Pxf2~PGHƇ;d)C:癁.])3Gʅ T1 xױL6˦0'GJWv{ĻmmWNkkG׶I,ĉؔ12088t J.gftէz 9?6+)aT<ʇVMd ٻ^8e=qhiZXɘ&]VXS C^Fv>'vN~&&`߳_d!,Ac/J>;Jׇh&aϼz-mC~pai@ÐT p`Ry[m~8ƌxVpx SO!Gco- z0Fشxz#2Q VxtC5h!pޚ@CÝ+8@<)q0c1s(Jvrc)2 Jttc-4JttChpD[ Z "ɏ `DPZ9)[ "n@^Dɍp- +AXG?7V| KC]7-p) `HN+qDKqt%ݽRᡷ]˙}(OЋ8?53ʟL,5N{>y"x,[̤<%E[T`ōVFB[gvVX\(. eV)yV2Ю NBC̓bؠ"l6m_^S5$T s: ^_Iy{JnGϬW *Cػ,O|$r!@<⏼;LDzJ/%f\4wȣ\ "edfP|T:{SKI,gIdcaQ2ۉWp{{(@D׸^\W3 ?VM 攦i1/ۆ$5\Yvb@po.2,0~>v wBCvKstȓ}S֐8|%"ے(?hjd99XL yxo c,3}lȗo1pY&OYK@f&[0AysL {ܦP{;'`K+7 endstream endobj 3 0 obj 2388 endobj 4 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 17 /Filter /FlateDecode >> stream Hb`  endstream endobj 5 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 18 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 34 /Filter /FlateDecode >> stream H nH@&2 endstream endobj 6 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 10 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 30 /Filter /FlateDecode >> stream H1 Om ` endstream endobj 7 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 9 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 87 /Filter /FlateDecode >> stream HA DQC Z$`<ȵ7ԞIXkIXa ޓ&\ $N-r:`< endstream endobj 8 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rxC  endstream endobj 9 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 110 /Filter /FlateDecode >> stream Hѱ 0Kg`\jW9[^: ,ȘhwAhyA~h{Ab?8c}9BgA3H ]]e+ endstream endobj 10 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r # endstream endobj 11 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 117 /Filter /FlateDecode >> stream H1 1 H`Nm\hϹ5חC3H -ht QfAvf3H\ BfAbd3& A/3H !eH;'&+ endstream endobj 12 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r0\0 endstream endobj 13 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 141 /Filter /FlateDecode >> stream HA P8C$ cMG؛ :W/A&O:)Zb ˘DZ%% 1Oi"BA" R$"GKVA:†ADo6O endstream endobj 14 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rDj@@ endstream endobj 15 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 120 /Filter /FlateDecode >> stream HA 0xKwo5dykA֩81A6q"LA1G --c5Aj.dnTU R G1II26|&vd"IA`=+ endstream endobj 16 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rd@O endstream endobj 17 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 148 /Filter /FlateDecode >> stream H1 0/-&&;`g1e!:s $PPpbT D BHaX %> stream Hb` 0rXzy ` endstream endobj 19 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 126 /Filter /FlateDecode >> stream Hϱ0 1k R5 9zG`=xi/~Bv3fjZS_ml7{v59ZV#GZf\> stream Hb` 0r8-@q endstream endobj 21 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 126 /Filter /FlateDecode >> stream HԱ1ҿWBj|NJ [FaRhQBL%#:tL'@j)RrB5R=D˶Vޣjp}^^9bBO}'8, endstream endobj 22 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r1 endstream endobj 23 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 146 /Filter /FlateDecode >> stream H Q:TR {r&u؇lXJH N4z:*3g&͞d<֗#Iӏ½!(QG}s5F@0Ý¢@&,.v8- D(K^O endstream endobj 24 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r! endstream endobj 25 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 132 /Filter /FlateDecode >> stream H9 Av1 %$h-U |p׿*Ӈ&yOpSjM]Yfi&nqmW @lZ9. endstream endobj 26 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r!X` endstream endobj 27 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 160 /Filter /FlateDecode >> stream HA 0PE<K'< iJ #1]&".9]<1Hj!D0~Xa*!|!pЉCBnepCw`r94wy6ӪW!>|J ;8xI endstream endobj 28 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`a# A endstream endobj 29 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 136 /Filter /FlateDecode >> stream H 0 8PPWK`Pu8%lRM`R`#!1X #8)  *"9n6#9^Fc$9PV-5ErX9v6A endstream endobj 30 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0 &` endstream endobj 31 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 127 /Filter /FlateDecode >> stream H 1 Ú H@AS)Ҧ/gȡq*'ȡseǮ"GMeqXF)A\5<8R#B"HH.ŒI OzH endstream endobj 32 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0]#w endstream endobj 33 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 12 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 119 /Filter /FlateDecode >> stream HA 0?f5)lej%bK45Śr8iǠ1,VCԙ{WBRN9(`B (ہ U.` endstream endobj 34 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 4 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 25 /Filter /FlateDecode >> stream Hb``Q0 D endstream endobj 35 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 3 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 69 /Filter /FlateDecode >> stream Hb` 022F xWPn#Ŧ0B2`]A&F0RTJޔ'B r@0 endstream endobj 36 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` 0B1eR jx   endstream endobj 37 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 3 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 66 /Filter /FlateDecode >> stream Hb` 0B1Erb7PA)Ԉ a4eB7f0P!YP*nS h/ endstream endobj 38 0 obj << /Type /XObject /Subtype /Image /Width 401 /Height 16 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 32 /Filter /FlateDecode >> stream H  Om 0 endstream endobj 39 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS5 1433 0 R /CS6 2444 0 R /CS7 2445 0 R /CS8 1429 0 R /CS9 1430 0 R >> /XObject << /Im36 42 0 R /Im37 43 0 R /Im38 44 0 R /Im39 45 0 R /Im40 46 0 R /Im41 47 0 R /Im42 48 0 R /Im43 49 0 R /Im44 50 0 R /Im45 51 0 R /Im46 52 0 R /Im47 53 0 R /Im48 54 0 R /Im49 55 0 R /Im50 56 0 R /Im51 57 0 R /Im52 58 0 R /Im53 59 0 R /Im54 60 0 R /Im55 61 0 R /Im56 62 0 R /Im57 63 0 R /Im58 64 0 R /Im59 65 0 R /Im60 66 0 R /Im61 67 0 R /Im62 68 0 R /Im63 69 0 R /Im64 70 0 R /Im65 71 0 R /Im66 72 0 R /Im67 73 0 R /Im68 74 0 R /Im69 75 0 R /Im70 76 0 R /Im71 77 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT2 2467 0 R /TT3 2471 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 40 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 2 >> endobj 40 0 obj << /Filter /FlateDecode /Length 41 0 R >> stream HWnF}Wc8sjp ذk!ER#RVݯ,)^Mgz3gg׻,&yv~}>}:_j ޠ Bb4(]=XnVhȃ߂y0oi؉f6_hX (A fI>ytk}}̮y#Qep$L6m.~0yO ex 0*yDAINBEu䐕d JBVaUܜ ]-@3k4hD&'Ӣ¦g7r[\-&6ɳ]OY^V׊t*w5"rPɢڥeшC `yV58lO{VI%DW+iȑ( X }rARVn2,_b? ag"^z) }^FLYH|g [ˏv #"$CV354$zE;j3HJ7y( Z# Y~$o,M14D*MHV4<[뫸era@jIc~?F|#$p 0͊'3TV:iz#iW uCD<_q j!pCw Oqh L=ߢD&!VRbn%K6 .VD=Jt5έaF;̫jv2&3բ}~ct2,S(OyLإ3Q`㙦zcw:|& &Հ=& dLy(Z>6yLtNDl&OLӡ&TOLtLM-cv2L48|5`|E2;7$Rwp6)#eQ)s E:!0#nzS}=H1tyo0[f?nSeoFnAzW#vud',a~ws[:Jgv{% endstream endobj 41 0 obj 1058 endobj 42 0 obj << /Type /XObject /Subtype /Image /Width 235 /Height 205 /BitsPerComponent 8 /ColorSpace 1433 0 R /Length 8168 /Filter /FlateDecode >> stream HWˎef$H2E7z0<ȋ*~9Q/JjR@rM-o iVoW.{ ]ݍn+>R#z+pN܏bBsޅ(FeYRQ^/6s+-uMwR‡ '6U" 5qH5&(2hlp[$+bһq5]@_N ZyOXÖn.mK1D yCSD{XP^1%acm"Hw:mH`m?eq' f&dK:! R(2xhM|-;ɟ&XR8 ]E"# ?RTkD/UA8č0 %9rh&)]*9/q!d(JlOns8?>`92L[ j/ ͅIGTeAO@h(XgMkIn$O -y,*0Nty ,{ߞ,n ^zd+n;9 Q#yUe604s@9F } 2DkUVbm\wYI*-Ih9۵?[X"Ztu`.|Bcd̆u%?PfUzaXr{*̰b/cb>$0{dJ;HLƖIa0 | &u 7N0 yi+圏-݇% !5Z P57h'f ~4['mT;)iGyذ+.a))Uȃ3O؂h< e#DUӅ2 *nO ?F*q߸h`^bݡU4STkNvzh MyyȻ r;8u<|EY>$~|Ǻ/:Mm\ՉTj|A7])[bqZ얹YTҘy#\<s0F5aI7~^ )M#`/x{Vt5G%6XH>MB3z{Y}7&B:mXSU={ DZظЗ'f2hIu84`c9мt!4 k q1l]horZHm; D^hu^_A=^߭%m21_vań &xuV&8o[zڐe>-&oRGu_=˹U4[z܊;̳a Hy7afUR`aG38rހ%XvΑͦ0[^!r4͠61ʆPLgc[ηxXaZJ6|ra5MA`X%?> >IXZǷtu*%M6"ĸ]:Nfi 9Hgsi 7 !)"Pws,؈W&8:G "! {C )zB/Cm6!Eb3֎"@#>Gaih_83bFq#7(@$6FW`踀= t!_9C)&{lUWk4x5ƂZ7ۑz N`<@puj&rO\* Pyf 4qeN|ٜVh跿}@80eO6g] || %(xGI=2aNRX,d!6v5q20`5Yŝ.gME#\^MjU >}Ub6p4`],GnlB#.LwN4vtY]9@Ue=qqKƪmWV/tJV2lJ" h3ћzjDM@Qd@ AK!jre>hФX:6S-2A~o^h*UplUrj Mej46d BV+4%U<)E{t~#4;նk8LT#8:+%!0@f/+U-mx~PGcnuYj$*OG;*,i"ˍIC\5m*U7^/G&NTjCM0nOXJ>Zwg$&!#w g`*Js )BR1Uݨq*O W= |BNF/t%ڙ.r] t&Wy}{Êmes`*P45feҏkz"G1 G-VIu6u } mbuA(id<, Zd7M[HuuOΈ tx /msg A[!Kִv"OQ\af}!61'N2Iں3uyܟ>鰇~ksLW3eXB,Wcƥ=e$ZNo -᠀3%ZJz-ҵ$hA.x5U[%P?ߔ) d ,% Q6?gr{^m9pJA-Կ`[s0~yiRuXфW%+P[E2|9Y+:}r-0/HȒ2fK)hELAxKXv[^PS74Fm,>VtEmV9Hƛ3w ɴ$qR/܌c-hRfBw>0KQ{Ĝw2h1 w/Vl,t) ڸ%4BppyP*}(v{h2YW7;GB,sV2!ckͱPHk$d2ߋj6Ckx ǩ`a 5Ș*s!G6q(O\ |26 %{է.m.@sv`p2WyKAχinTHS޾HMǿF95&yz&b2Bϛ^دFn%EH`mOe~ ˩-3"[^flˏ.ԩSv9;*s/gNÚ8 зoCD8i;3bcZ91 _ y-/7&I 2sʹbyv G4M%74b!Ɣ6+ta ?vf >CXvTc)Manr03o~E;pyR%S~ s:Tc<7 p)]J]͒j\f`zϸCJ;a$܊VG,{U>NES&^rAPa]Bfiq$/j:}.ʨ6`~ #V~ hҾa԰fN1l1_f{}5EXF^7ƧvLwKἉ*`]37%Z(bQmq=WxCJ2 s}'uMUPwd[ݬsH漣RrXf+LqfV@JMcޣQ3IJ,ZzL^mT/=ol˰&,س[]&mP&6Ĺ P^¸E0{MeOj)GC&T'+Ēf`(P+t s_W% 2w6rxMPCt\цXŰ'ՕKz jfI-AYc^BeҐ-Y6&+/K75sQAW*| &p"ZUSj’βA֭1ęB/5pEqe(N%\rT"`VfC zA审$ir/-)EHnM'=j `:\S`TXr0&x>TВjрx8N/5ُ2綹ǟ88:=Iuq̝8Pn:FcT7:3G$, ϭJ &/Ӆ BVaN']p_F $_aOC[Փn 4e*bGj_\Y!@8Pu\@c6&NvT_ ÷T@r{_' 4V7ݵ{G@x}Pd;5 L'vt:)c̑50,1rO翼{U4N@L™ &zy<#2{jy!`GpPw  "PXpqfR/SV?fON 0Jt$h'蜇BxAJ삆H@Sꅟ>%RjuԟKFL"䏶WwQ Q2ԣnp$_~yyy m-/2-aُν<+*ˆahMӸ9 w!r#z#L_/Uyb P+BBswN'g+[Wla.}aن^Mδ#V͆:˶m2IQ=_'{]rhĨ3H6͊DFpf$nθE_790vT՝,iİu>ف&I.EAoL R(o-3l;;MI0}l&eL֢#M3(궹Vorirjܳj,@.d\GZܼE#M NkL2[`zrl[6c{C!%KJKpV {-% xzhmcep%wll*U֍˻1Z(?j e> zm*8x_7||ڧ}ڧ}ڧ}ڝ\~ endstream endobj 43 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 17 /Filter /FlateDecode >> stream Hb` endstream endobj 44 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 18 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 35 /Filter /FlateDecode >> stream H1 Om O& endstream endobj 45 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 9 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 30 /Filter /FlateDecode >> stream HàS_Uk F endstream endobj 46 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 10 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 92 /Filter /FlateDecode >> stream H EQeƔL/MgaEɍph,\#"UtK2GXJ}**Q%#*:U:e`lj endstream endobj 47 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rC $ endstream endobj 48 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 115 /Filter /FlateDecode >> stream H @ sMpAkdmОsk/\*t *cw *zEJ!~C&J*6Kde>Rhg?dRhi>DRz+ endstream endobj 49 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r` 1 endstream endobj 50 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 121 /Filter /FlateDecode >> stream H1! AO\EE|rɻ-])UlJ.'iFU FGz582P|42P~3.E Ѥc1 F"O˭#O_e 0T9 endstream endobj 51 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF(  endstream endobj 52 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 137 /Filter /FlateDecode >> stream H zτ`IָgCjթlDU(E$U|P ɚ*ɶD4^ET1JANAT1P%{r endstream endobj 53 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rdj@N endstream endobj 54 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 123 /Filter /FlateDecode >> stream H A6oނao[uKPrB*X2dYVd Y& 0Yv*-8KVie! ?R/N11ܠ0`+ endstream endobj 55 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rdZ@^ endstream endobj 56 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 143 /Filter /FlateDecode >> stream H1 11UfB,km|r}8R#.+ 4.+t b$VĊU0 \i0d5@-6jN%zA~+y}x27+2@z endstream endobj 57 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rXz o endstream endobj 58 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 129 /Filter /FlateDecode >> stream Hϱ0 h Ss#^uZg]ϸpZ\.sAv. ZGfẂ䙂z>8嚒ܒK}$+ endstream endobj 59 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rHF(PG endstream endobj 60 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 127 /Filter /FlateDecode >> stream H10AN>ŞV \JGs0G6-Vj%H.$q؜B$}fu:Vvns?0U endstream endobj 61 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r3 endstream endobj 62 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 143 /Filter /FlateDecode >> stream HA ?=憃AxP K_@bfzܴ]ФRޭTfFMCR4@ GH4n,6F!a[Y]+ ]+ a" Cdz endstream endobj 63 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r endstream endobj 64 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 131 /Filter /FlateDecode >> stream H1 A63@ȦcKT/뀄M|@ë_0yEOqsl;<Ʃ3h:;e晫sd9zx7zvyMX$6wim . endstream endobj 65 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rPr,` endstream endobj 66 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 149 /Filter /FlateDecode >> stream HA 0 ZK)؃kF9x Uv'N{|ajU!RUT"UH*J-|o *`f@F)!'i.OI9DMZJ#gNHѫ /x endstream endobj 67 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`a#`AF endstream endobj 68 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 134 /Filter /FlateDecode >> stream H ]Zmy" 8z}<7i0dYY`$i$@ĘЃ&V)J!@U 2Re52ZIŏc5`d $?79k endstream endobj 69 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0* .` endstream endobj 70 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 19 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 133 /Filter /FlateDecode >> stream HA 0 DvQm̄ a>ڮ'bm?f)^4)BoiTUnd^Su}Jo-J3-Gx$i2G64nq]rU[NwQ8U0p endstream endobj 71 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0]#@)k endstream endobj 72 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 12 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 133 /Filter /FlateDecode >> stream HA M/J)ZcvNh٠W֛naz]tfH*Hb?sbo؄P!O"E Tۙ> stream Hb``Q0  X endstream endobj 74 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 3 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 68 /Filter /FlateDecode >> stream Hb` 022F xWPn#kȀwFA 3( R*%t +t40 endstream endobj 75 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` 0B1eR jx  ( endstream endobj 76 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 3 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 65 /Filter /FlateDecode >> stream Hb` 0B1Erb7PAA$V(MЄN36(w‚)j/ endstream endobj 77 0 obj << /Type /XObject /Subtype /Image /Width 406 /Height 16 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 34 /Filter /FlateDecode >> stream H1 OmxL` endstream endobj 78 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS6 2444 0 R /CS7 2445 0 R /CS8 1429 0 R /CS9 1446 0 R /CS10 1447 0 R /CS11 1430 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT3 2467 0 R /TT4 2471 0 R /TT5 2447 0 R >> /XObject << /Im245 1435 0 R /Im246 81 0 R /Im247 82 0 R /Im248 83 0 R /Im249 84 0 R /Im250 85 0 R /Im251 86 0 R /Im252 87 0 R /Im253 88 0 R /Im254 89 0 R /Im255 90 0 R /Im256 91 0 R /Im257 92 0 R /Im258 93 0 R /Im259 94 0 R /Im260 95 0 R /Im261 96 0 R /Im262 97 0 R /Im263 98 0 R /Im264 99 0 R /Im265 100 0 R /Im266 101 0 R /Im267 102 0 R /Im268 103 0 R /Im269 104 0 R /Im270 105 0 R /Im271 106 0 R /Im272 107 0 R /Im273 108 0 R /Im274 109 0 R /Im275 110 0 R /Im276 111 0 R /Im277 112 0 R /Im278 113 0 R /Im279 114 0 R /Im280 115 0 R /Im281 116 0 R /Im282 1436 0 R /Im283 117 0 R /Im284 118 0 R /Im285 119 0 R /Im286 120 0 R /Im287 121 0 R /Im288 122 0 R /Im289 123 0 R /Im290 124 0 R /Im291 125 0 R /Im292 126 0 R /Im293 127 0 R /Im294 128 0 R /Im295 129 0 R /Im296 130 0 R /Im297 1438 0 R /Im298 1437 0 R /Im299 131 0 R /Im300 132 0 R /Im301 1439 0 R /Im302 1440 0 R /Im303 133 0 R /Im304 134 0 R /Im305 135 0 R /Im306 136 0 R /Im307 137 0 R /Im308 138 0 R /Im309 139 0 R /Im310 140 0 R /Im311 141 0 R /Im312 142 0 R /Im313 143 0 R /Im314 144 0 R /Im315 145 0 R /Im316 146 0 R /Im317 147 0 R /Im318 148 0 R /Im319 149 0 R /Im320 150 0 R /Im321 151 0 R /Im322 152 0 R /Im323 153 0 R /Im324 154 0 R /Im325 155 0 R /Im326 156 0 R /Im327 1441 0 R /Im328 157 0 R /Im329 158 0 R /Im330 159 0 R /Im331 160 0 R /Im332 161 0 R /Im333 162 0 R /Im334 163 0 R /Im335 164 0 R /Im336 165 0 R /Im337 166 0 R /Im338 167 0 R /Im339 168 0 R /Im340 169 0 R /Im341 170 0 R /Im342 171 0 R /Im343 172 0 R /Im344 173 0 R /Im345 174 0 R /Im346 175 0 R /Im347 176 0 R /Im348 177 0 R /Im349 178 0 R /Im350 179 0 R /Im351 180 0 R /Im352 181 0 R /Im353 182 0 R /Im354 183 0 R /Im355 184 0 R /Im356 185 0 R /Im357 186 0 R /Im358 187 0 R /Im359 1442 0 R /Im360 1443 0 R /Im361 188 0 R /Im362 189 0 R /Im363 1444 0 R /Im364 190 0 R /Im365 191 0 R /Im366 192 0 R /Im367 193 0 R /Im368 194 0 R /Im369 195 0 R /Im370 196 0 R /Im371 197 0 R /Im372 198 0 R /Im373 199 0 R /Im374 200 0 R /Im375 201 0 R /Im376 202 0 R /Im377 203 0 R /Im378 204 0 R /Im379 205 0 R /Im380 206 0 R /Im381 207 0 R /Im382 208 0 R /Im383 209 0 R /Im384 210 0 R /Im385 211 0 R /Im386 212 0 R /Im387 213 0 R /Im388 214 0 R /Im389 215 0 R /Im390 216 0 R /Im391 217 0 R /Im392 218 0 R /Im393 219 0 R /Im394 220 0 R /Im395 221 0 R /Im396 222 0 R /Im397 223 0 R /Im398 224 0 R /Im399 225 0 R /Im400 226 0 R /Im401 227 0 R /Im402 228 0 R /Im403 229 0 R /Im404 230 0 R /Im405 231 0 R /Im406 232 0 R /Im407 233 0 R /Im408 234 0 R /Im409 235 0 R /Im410 236 0 R /Im411 237 0 R /Im412 238 0 R /Im413 239 0 R /Im414 240 0 R /Im415 241 0 R /Im416 242 0 R /Im417 243 0 R /Im418 244 0 R /Im419 245 0 R /Im420 246 0 R /Im421 247 0 R /Im422 248 0 R /Im423 249 0 R /Im424 250 0 R /Im425 251 0 R /Im426 252 0 R /Im427 253 0 R /Im428 254 0 R /Im429 255 0 R /Im430 256 0 R /Im431 257 0 R /Im432 258 0 R /Im433 259 0 R /Im434 260 0 R /Im435 261 0 R /Im436 262 0 R /Im437 263 0 R /Im438 264 0 R /Im439 265 0 R /Im440 266 0 R /Im441 267 0 R /Im442 268 0 R /Im443 269 0 R /Im444 270 0 R /Im445 271 0 R /Im446 272 0 R /Im447 273 0 R /Im448 274 0 R /Im449 275 0 R /Im450 276 0 R /Im451 277 0 R /Im452 278 0 R /Im453 279 0 R /Im454 280 0 R /Im455 281 0 R /Im456 282 0 R /Im457 283 0 R /Im458 284 0 R /Im459 285 0 R /Im460 286 0 R /Im461 287 0 R /Im462 288 0 R /Im463 289 0 R /Im464 290 0 R /Im465 291 0 R /Im466 292 0 R /Im467 293 0 R /Im468 294 0 R /Im469 295 0 R /Im470 296 0 R /Im471 297 0 R /Im472 298 0 R /Im473 299 0 R /Im474 300 0 R /Im475 301 0 R /Im476 302 0 R /Im477 303 0 R /Im478 304 0 R /Im479 305 0 R /Im480 306 0 R /Im481 307 0 R /Im482 308 0 R /Im483 309 0 R /Im484 310 0 R /Im485 311 0 R /Im486 312 0 R /Im487 313 0 R /Im488 314 0 R /Im489 1445 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 79 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 3 >> endobj 79 0 obj << /Filter /FlateDecode /Length 80 0 R >> stream HmoﯘIQ[% `׎E)̀"RYRԞ9^i9w9{??{sŋUP]Oƨjwf.orՕUwYs69e1vڨNmjv~\Κ7eays[e nVگoCfƯ/_'=_ZQZ'^]ԻogW|kedZD߾W//F_ě6ZzwS]~?2η^z\wW査 WWLqZVӷεFE>miskūMKsZSz6M[=w'q$n&qIfĭp/=g'YM}9V=F_z@yї<>/y}F_Myї<>/9}B_eB_eB_eB_FeB_FeB_FeB_FeB_FeB_F%2,їf,ˈ,ˈL,ˈL,ˈL,ˈL,ˈL,ˈL,ˈL,ˈL,ˈL4KeY/ǪL\Wܙe&.}23ef.\З8/3y꫁eY|)f M_YjfY,Ker,}DnͲK1,KòK1,Kòiii--- -K\,K zfc$g6ޘНXR}h$֥Eՙ{uTB[.mn>uN?w_7vNmnblw?wB~X\YޕXn>W_v꺻Y?5_P*2ԕG!ZU<-~ W-7̯Ioc?n1_Z|?|]Vx Y^[]Cޚr7s7_Ǟ7DïTunG[?!]v^lݦlI_NwZ /~ePNim6<rxl<96m:5Ѷٔn1_>nlT9c_5Y>|SqjsRݝԔcTɱtG[N;e[fNTb_U[/\! }3 u' Va0*>nGu\|P蠹lw+$麾dmmϰK.[?ŵO Xwޮ`~w&ʜ}M@"h W8@!Iٓ{F!!p B#$0".9zi\1 d`ALw B> stream Hb`E 1 endstream endobj 82 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb`AA*&"`  endstream endobj 83 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb`@ (6`,2  endstream endobj 84 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@BS( 0A endstream endobj 85 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb`!$\pP 0A  endstream endobj 86 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`AAGu0 = endstream endobj 87 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 88 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rx  endstream endobj 89 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rB  endstream endobj 90 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rx  endstream endobj 91 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022vC  endstream endobj 92 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 93 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rB  endstream endobj 94 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 95 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 96 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rD!@ endstream endobj 97 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r`Ą @ endstream endobj 98 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022v`D@ endstream endobj 99 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r`D @ endstream endobj 100 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r`ą@ endstream endobj 101 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r`D@ endstream endobj 102 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r`bC  endstream endobj 103 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r`  endstream endobj 104 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r   endstream endobj 105 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r ! endstream endobj 106 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rRB " endstream endobj 107 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v R  endstream endobj 108 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r # endstream endobj 109 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  $ endstream endobj 110 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  % endstream endobj 111 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r `& endstream endobj 112 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rɁ`' endstream endobj 113 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0ra`( endstream endobj 114 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@A`) endstream endobj 115 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v` endstream endobj 116 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@9!`* endstream endobj 117 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r&0`d"G/@H endstream endobj 118 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r&`db"G/@G endstream endobj 119 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r& `brF endstream endobj 120 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb`$DQ0 endstream endobj 121 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb`b@G!0 J endstream endobj 122 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0A9z 9 endstream endobj 123 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb`3 ѣ`r  endstream endobj 124 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`b@G!@IH endstream endobj 125 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`b@G@Q@ endstream endobj 126 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`$DQ ( ( endstream endobj 127 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rd 4 endstream endobj 128 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rD 5 endstream endobj 129 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r$JC 6 endstream endobj 130 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r 7 endstream endobj 131 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rj@: endstream endobj 132 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@; endstream endobj 133 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r$j@> endstream endobj 134 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@? endstream endobj 135 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v @  endstream endobj 136 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r* @A endstream endobj 137 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rj @B endstream endobj 138 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r @C endstream endobj 139 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rd @D endstream endobj 140 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rD* @E endstream endobj 141 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r$j @F endstream endobj 142 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r @G endstream endobj 143 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r @H endstream endobj 144 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v@ endstream endobj 145 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r @I endstream endobj 146 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rZ@J endstream endobj 147 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@K endstream endobj 148 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rdڄ@L endstream endobj 149 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rD@M endstream endobj 150 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r&`d endstream endobj 151 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r& `db endstream endobj 152 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 022vX&&&F  Q endstream endobj 153 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r& endstream endobj 154 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@S endstream endobj 155 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rxچ@T endstream endobj 156 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rX@U endstream endobj 157 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`$Dʑh endstream endobj 158 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`b@G2} $ endstream endobj 159 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`H2@0L{ endstream endobj 160 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`b@G.G & endstream endobj 161 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`b@G,K ' endstream endobj 162 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`$D  endstream endobj 163 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rX:y ] endstream endobj 164 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r8z ^ endstream endobj 165 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0ry _ endstream endobj 166 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r ` endstream endobj 167 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r:z a endstream endobj 168 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 022v:z * endstream endobj 169 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rz b endstream endobj 170 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rz c endstream endobj 171 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rx d endstream endobj 172 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rX:{ e endstream endobj 173 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r8z f endstream endobj 174 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r{ g endstream endobj 175 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r h endstream endobj 176 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r؀2@i endstream endobj 177 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022vx/@3 endstream endobj 178 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r0@k endstream endobj 179 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rx/@l endstream endobj 180 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rX.@m endstream endobj 181 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r8-@n endstream endobj 182 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rH&( 6 endstream endobj 183 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rH&0`d  5 endstream endobj 184 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rH&`db  4 endstream endobj 185 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rH& ` 3 endstream endobj 186 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rH&(   endstream endobj 187 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022v&(  w endstream endobj 188 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r$@w endstream endobj 189 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r肁#@x endstream endobj 190 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rCz endstream endobj 191 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rAA{ endstream endobj 192 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rh?| endstream endobj 193 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rHA=} endstream endobj 194 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v7G endstream endobj 195 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rA9 endstream endobj 196 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r7 endstream endobj 197 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rA5  endstream endobj 198 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rA1 endstream endobj 199 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rh/ endstream endobj 200 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rHA- endstream endobj 201 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r(+ endstream endobj 202 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` AŭrA)  endstream endobj 203 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` R endstream endobj 204 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`A€.C BC endstream endobj 205 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`b@>0 V endstream endobj 206 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`!ĂP9d@, endstream endobj 207 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`   endstream endobj 208 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 7 @ Q endstream endobj 209 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r( endstream endobj 210 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rA endstream endobj 211 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r0&0~0  endstream endobj 212 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0r0&`dhg  endstream endobj 213 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0r0& `dbhg  endstream endobj 214 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022v&&&F hg  endstream endobj 215 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r0&hg  endstream endobj 216 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rF&hw - endstream endobj 217 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r endstream endobj 218 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rЂ! endstream endobj 219 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r endstream endobj 220 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r! endstream endobj 221 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rPơ~C endstream endobj 222 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r0z endstream endobj 223 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022vЁ!th endstream endobj 224 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rv endstream endobj 225 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rЁ!t endstream endobj 226 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rr endstream endobj 227 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rp!pQ endstream endobj 228 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rP!l endstream endobj 229 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r0j endstream endobj 230 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r!h endstream endobj 231 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rf endstream endobj 232 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rЀ!d endstream endobj 233 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r!b 0_ endstream endobj 234 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022v0Z0u endstream endobj 235 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rP!\0 endstream endobj 236 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r0Z0 endstream endobj 237 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r!Xd` endstream endobj 238 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r0b endstream endobj 239 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0r02 ;" endstream endobj 240 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0r021 ;! endstream endobj 241 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0r0@|`  endstream endobj 242 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r ; endstream endobj 243 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 022v# Cj endstream endobj 244 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rw!a` endstream endobj 245 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r``w Q  endstream endobj 246 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r@ w  endstream endobj 247 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rv  endstream endobj 248 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`04` endstream endobj 249 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0ހq:d` endstream endobj 250 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`:` endstream endobj 251 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`$Dʁ]d E endstream endobj 252 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`b@"  endstream endobj 253 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` <0| `s  endstream endobj 254 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` A( endstream endobj 255 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`0=xs   endstream endobj 256 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`a# AT endstream endobj 257 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`ALEp 0ȜC-`k endstream endobj 258 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0qP  endstream endobj 259 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`0  endstream endobj 260 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0f Sh  endstream endobj 261 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0f Ch Y endstream endobj 262 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0f  y endstream endobj 263 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022F endstream endobj 264 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0f 6 endstream endobj 265 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0V  endstream endobj 266 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 06 !4 endstream endobj 267 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0q`0 endstream endobj 268 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0q -+0 endstream endobj 269 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0ڀqଦ;0 endstream endobj 270 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0q,` endstream endobj 271 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0q`0` endstream endobj 272 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`@,H` endstream endobj 273 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022J680 endstream endobj 274 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0J6` endstream endobj 275 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0* ` endstream endobj 276 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0 "` endstream endobj 277 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0bHG0 endstream endobj 278 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0L4i endstream endobj 279 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0L4gP endstream endobj 280 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0LLLgP  endstream endobj 281 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0LLgP  endstream endobj 282 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0LgP endstream endobj 283 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 04g# endstream endobj 284 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 022T6 hfP endstream endobj 285 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0DH30 endstream endobj 286 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0$H#s(0 endstream endobj 287 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0xH S20) endstream endobj 288 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0Xn2 endstream endobj 289 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 08l0# endstream endobj 290 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0ipA endstream endobj 291 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0;`I5@ endstream endobj 292 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0;`FFJ  : endstream endobj 293 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0;`FJM  endstream endobj 294 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 022`bbbddbȌ d endstream endobj 295 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0fFF&Ĕ X endstream endobj 296 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0]#)& ה  endstream endobj 297 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0Y@L@)# endstream endobj 298 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0e$ @ B endstream endobj 299 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0eZ *b`1 endstream endobj 300 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0e: *b`A endstream endobj 301 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0eF *b`K endstream endobj 302 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 42 /Filter /FlateDecode >> stream Hb` Lq4P-)b8I # )+ endstream endobj 303 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 37 /Filter /FlateDecode >> stream Hb`xLPEyR0,- endstream endobj 304 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` QC [ endstream endobj 305 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 27 /Filter /FlateDecode >> stream Hb`0`  endstream endobj 306 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 21 /Filter /FlateDecode >> stream Hb`x p endstream endobj 307 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` + endstream endobj 308 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 022F xWPn#NS 4 endstream endobj 309 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0B1 F xWPn##NS  endstream endobj 310 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0B1R#)6(we`)  endstream endobj 311 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` 0B1eR jx   endstream endobj 312 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0B1Erb7P  endstream endobj 313 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0B1%RT1 8L0 endstream endobj 314 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 022 2rgP) endstream endobj 315 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS3 2444 0 R /CS4 2445 0 R /CS5 1451 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT4 2467 0 R /TT5 2471 0 R /TT6 2456 0 R /TT7 2447 0 R /C2_1 1450 0 R >> /XObject << /Im2 318 0 R /Im3 319 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 316 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 4 >> endobj 316 0 obj << /Filter /FlateDecode /Length 317 0 R >> stream HWm6n_ FW,r."CMcKz֮Ux%ײ!)&g8!;KB/^g dGU3c&ն<ԟym}u+gur) #v92Tg&'rv׿]s1u i&4+WG9ڤB 02-4 mTM4>3I샼 C~5\g:'錑2{q;F{LI {{Ca]dbMd{Xf9joMpbX- Na/Xt`%2^ 0*K{1lbX؋6ls/43C.hIf"Ar!{1Rg@IA'y~y~t`Qibj DH5CSp!21',\N+>NNpF1j$AQHS㞜f:uNjK`#ZLq3NNpa8^.wrs$^8cL 180a)]78aĝqes0Nx2Oϋ t"5ewrĵʊ#n(FĝG^CAl?*h"i>γSgiWsJL݂k+R$THdvö*(X44v}5{=lacQ=*LX@XT:+`󒧆R $A#KdDw& s}^QT0T8޲@#bT$,,5w)E" m(f9hA \iDWA\6; 7an `'6t2{퐑&YQl*L7 q) G9= H[T_Pa]1ÌvVS~X(\2Eez9n, \ "\rl M<,6(nS\0 Ԣqg=T[gP0)%iK> stream HkoDyU*7U?@K*IC@)ViHD4 -i -*(iBxle׷5f}6vty'wљs9g3?T544&0LB)oN/_h0 #*JT$2l5ݙܸqVBġ濚 naJƃ`? 1zv9Y B. Ci%ZQ$2 @ _<<|c;o3gK=/B ",'VZBHd&B}ZW E6m;E`{;ÉcGIP7`H# Ȋ-mCWմVմ;H2#oRj۪Zf֘2/"Ƴ@.y[nKULYf) Nbӱ]:җQ>X*+N+EjMlSS8p\ABh"Y%!k:>x84Z,\[ >ҭ[~ }-Me< Rٕ؛=E|'`@)N}}~Ar"^1-S*xrV@݃)R^"ca9J]ߥKθ\sk?S Z~H7 !9e)ȍ]}ȧDYē7CX7z+5[uJ4SepQ{]ÔјOXg'`B N{^!j\N9aARkmv~YfVTYH/mhv(.<|l +QH# LCX1?5]eŲp JeɊDѿ^iPȲ=;9+uY +䫯jAzL_)y/2ZS2KEH_d?)/'d%VAGb8)FJ ʐ2`& Y } bgo)/Vˊ2#?{r8S0o~1\w=HY:4,:MgELl;:Y%d1bZ3bc#cw hÊV`d-̎Ҹ #NbE/Y{XE.kN#8-0R2kjPYqZYd!׶S>+ umy5WvhӷTF#Gr!8<|gr:19g (D4 DNY}(}yiPeHRioQGFIq|jJMLAfR]}+Ɋ4,=pʨE,A/o'_#I)aő̜\ʵAQbba:wfU݊(Sr5Ey VPR߶ZGp[nv)4t ȿ> n\E_Yco޲wkH3޲⊻‡#07ȗجy0)]{R_ܼ,fk6@")sG!/.=]Zzɒyd옷OD(De "Sp ~ArT^nnz=y+⑅\k'CXqb|"L.'/''2@{n^t 3gH̰l2̹ 4 )4/B.aESܸqMMNOW8,l"Ab\nJ'\D!C#*3 0!Yz0 #x_0L Ɋ'fÕFQ(3 a0yuKa+2:VdFVdF&k+Bo>G؊ dbhu0+*s! Vf5q"Ô^hR'Gt+z1[aJ,8)GPSG\mdVdBgEݙ^p9+ʃ*^#+؊ rbfbEq"Ô*ybvgEw`agE 9Z1.WIc|Yi݊r>ئV`+2"KΊ$C"lJ؊lEatJ؊Y +f0"[a"[a[(qAb*H1b8J)V, 7Vw)y~V,nq[X!HV⍭mc5"nsiص~OJGmW[[nY7uRD~ jP(22j p Tbdvz("?i~Z.xtR| Z_njV 97m?:lE<@y]^0[[F+>Y~Rپ֩s~TFo,=qznʯ(݊gvTEMIam>1m.9},\+4P UU|lUŻTqEWM|Xᅋż#* H0Uq4~뫊e᰿~[balV"*F׊1U1=os 1sU1[/6V1}aaUd]S!+Hg5UVVWrSs۽Vk4*2اz ĝV3q/5>SNjC4Y+?*VӰJL Aҝo4;'m[EbȫYw0^ciX@~վ,~VREAl.ǰu簢˥*rݷ],׊51?Pų_KPSŚ$޾㩊\wO Z+숟TV|7kEgyvSųZQŧ"T^׊~.AM/T^UVEWWU*׬mК ?Uw;uj<뾗r ZA'm[ش⵪ZYVTqGW~Kl ?U|v 1<|Tp-~׊_4ӹA 5~WsΏd|QR>]mmۨcs3WŚ떯IWS-Sx=tW_?m{\+}pre O?]P๵K_MUWSōxݞ°>Ԝ*jsUa n*~o,;y^ÞUL̯j4#WT11zѐ*&W\5RꑫFC_=rhHG bb~U!UL̯j4oǩm=tHCl_ cU_s+| TT12Ɠg6ZR~OQGPEREUM-){&\G5mWERukŴ'M*>u)X8FiHݪXxmiY1HCl_!j۴1HCl_R+1OIiHG bb~U!UL̯j4#WT11zѐ*&t`;ULb?;o+bm+brTҖPE^AU Vd6;mTWPdc5U+]*&[8t/&ӹɹ'09|& c"FUY=IQx^sUrțSŤ*=KϧF.\ws"C~xn |ULTqr_Ź<5Nas{*QT1X3wU\ݓx? * * * U}ylI+VqzjULz_ ~B{jULmثoJOfne +FhBOP?ax2 #,RœOtDO&FoxPOO&PaU> stream HA 0ʟs'1 dB֞k' qƱjqƱjqƱjqƱjcW(Z endstream endobj 320 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS3 2444 0 R /CS4 2445 0 R /CS5 1430 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT3 2471 0 R /TT4 2467 0 R /TT5 2470 0 R >> /XObject << /Im1 323 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 321 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 5 >> endobj 321 0 obj << /Filter /FlateDecode /Length 322 0 R >> stream HVoF~篘t',餋"%M*/6= .ҿmZj67;3'i0 ?_Lt. w sA YgQieuPvaU9ס3 C¥3%S 1px?}|`/g: x,p/kXG_~A2}wltL(O;[6Ր*hc1L<lt\e v+I]SPA|GKBRʲA>HB2F\E.5k]LPlʦœ]z D5yD5ʊW /~dfmc{ 2J zy[y 5] fG~FIx>Uv0c8JQ`~.?ΐleImߟr[zbX˳4uՇgޢg*%k@9;' ps6 n cUGJE=(uR;:w`N6w1(ЩJ裸`ћvo4a`8-S\t\K@yޭ:.hI\a!]cs%G#t7Q xFk::kf C\8~8BZ;]:XW(*nTF~:׭?E\cxmr%Zؑ~+s endstream endobj 322 0 obj 952 endobj 323 0 obj << /Type /XObject /Subtype /Image /Width 380 /Height 288 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 1967 /Filter /FlateDecode >> stream Hۖ8ELc ~HZeqّrB!B!B!B!ApQd =j!mދpr#ړyt {tq{t{4q=A8{t{Ӵզeҳ5ޏ-߾N{%#pBkopX|]U>^:(i_?/^Rvdy'm};s eɽyZA{/}dpE~w4h {m#'V^hk"_[\'~r4:g;q_~v|u\Փx}{1_PSGz+'u~;p"?;G>7`wީXG&ߙgv:?H~`nL[rɏczj3u2i&ǭ[Nų]ڇ9,Տ!sdV+7OiK-D2a;-\U>}H(:w,E; LO][Flã6ʝ_>Խ߭yM-R.7gs^ח/Vʳ;_:0N;o}M^|g.l?*p ~&$hk i7r3hT%Px-5tuŧi'c;S yn^W0򤍵nn?W\THy:s,%<)w%:jF 5Th(tcɉ^}GU:t@8zT~p.=J?GqLY¥mkO6:Ը*+%tz 6՟gϠ{4nNA=^$嬩ٿA8{ kA8.tF!?!=C?8%ppijС;=ݢ}z~TeQy{;OJ$^f.DUwL M8kH<1Hm4YX}d|2%՛;%Z}$襾׀<4Ye;kt:UE#r/ߜw ?#P_YfR%W:k}~^3^GEҮi4c7/+%- g協?^Qn?5'ʉ(*Ok^~x.*Q/R|2a#|au/~m>4#[ԔEȃ)7v9eG .NAF'?Cﯕ;淄?w8' Gz?8mӽGOdJ{J5sVO_FlŖCgm/~~oX!x˟Cw\Zq OsO뾧{;s-"WjPnޏˢJMqu'<&Mcˑ op_SC %> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT2 2467 0 R /TT3 2471 0 R >> /XObject << /Im470 1435 0 R /Im471 1436 0 R /Im472 327 0 R /Im473 328 0 R /Im474 329 0 R /Im475 330 0 R /Im476 331 0 R /Im477 332 0 R /Im478 333 0 R /Im479 334 0 R /Im480 335 0 R /Im481 336 0 R /Im482 337 0 R /Im483 338 0 R /Im484 339 0 R /Im485 340 0 R /Im486 341 0 R /Im487 342 0 R /Im488 343 0 R /Im489 344 0 R /Im490 345 0 R /Im491 1438 0 R /Im492 1437 0 R /Im493 346 0 R /Im494 1439 0 R /Im495 1440 0 R /Im496 347 0 R /Im497 348 0 R /Im498 349 0 R /Im499 350 0 R /Im500 351 0 R /Im501 352 0 R /Im502 353 0 R /Im503 354 0 R /Im504 355 0 R /Im505 356 0 R /Im506 357 0 R /Im507 358 0 R /Im508 359 0 R /Im509 360 0 R /Im510 361 0 R /Im511 362 0 R /Im512 363 0 R /Im513 364 0 R /Im514 365 0 R /Im515 1441 0 R /Im516 366 0 R /Im517 367 0 R /Im518 368 0 R /Im519 369 0 R /Im520 370 0 R /Im521 371 0 R /Im522 372 0 R /Im523 373 0 R /Im524 374 0 R /Im525 375 0 R /Im526 376 0 R /Im527 377 0 R /Im528 378 0 R /Im529 379 0 R /Im530 380 0 R /Im531 381 0 R /Im532 382 0 R /Im533 383 0 R /Im534 384 0 R /Im535 385 0 R /Im536 386 0 R /Im537 387 0 R /Im538 388 0 R /Im539 389 0 R /Im540 1442 0 R /Im541 1443 0 R /Im542 390 0 R /Im543 1444 0 R /Im544 391 0 R /Im545 392 0 R /Im546 393 0 R /Im547 394 0 R /Im548 395 0 R /Im549 396 0 R /Im550 397 0 R /Im551 398 0 R /Im552 399 0 R /Im553 400 0 R /Im554 401 0 R /Im555 402 0 R /Im556 403 0 R /Im557 404 0 R /Im558 405 0 R /Im559 406 0 R /Im560 407 0 R /Im561 408 0 R /Im562 409 0 R /Im563 410 0 R /Im564 411 0 R /Im565 412 0 R /Im566 413 0 R /Im567 414 0 R /Im568 415 0 R /Im569 416 0 R /Im570 417 0 R /Im571 418 0 R /Im572 419 0 R /Im573 420 0 R /Im574 421 0 R /Im575 422 0 R /Im576 423 0 R /Im577 424 0 R /Im578 425 0 R /Im579 426 0 R /Im580 427 0 R /Im581 428 0 R /Im582 429 0 R /Im583 430 0 R /Im584 431 0 R /Im585 432 0 R /Im586 433 0 R /Im587 434 0 R /Im588 435 0 R /Im589 436 0 R /Im590 437 0 R /Im591 438 0 R /Im592 439 0 R /Im593 440 0 R /Im594 441 0 R /Im595 442 0 R /Im596 443 0 R /Im597 444 0 R /Im598 445 0 R /Im599 446 0 R /Im600 447 0 R /Im601 448 0 R /Im602 449 0 R /Im603 450 0 R /Im604 451 0 R /Im605 452 0 R /Im606 453 0 R /Im607 454 0 R /Im608 455 0 R /Im609 456 0 R /Im610 457 0 R /Im611 458 0 R /Im612 459 0 R /Im613 460 0 R /Im614 461 0 R /Im615 462 0 R /Im616 463 0 R /Im617 464 0 R /Im618 465 0 R /Im619 466 0 R /Im620 467 0 R /Im621 468 0 R /Im622 469 0 R /Im623 470 0 R /Im624 471 0 R /Im625 472 0 R /Im626 473 0 R /Im627 474 0 R /Im628 475 0 R /Im629 476 0 R /Im630 477 0 R /Im631 478 0 R /Im632 479 0 R /Im633 480 0 R /Im634 481 0 R /Im635 482 0 R /Im636 483 0 R /Im637 484 0 R /Im638 485 0 R /Im639 486 0 R /Im640 487 0 R /Im641 488 0 R /Im642 489 0 R /Im643 490 0 R /Im644 491 0 R /Im645 492 0 R /Im646 493 0 R /Im647 494 0 R /Im648 495 0 R /Im649 496 0 R /Im650 497 0 R /Im651 498 0 R /Im652 499 0 R /Im653 500 0 R /Im654 501 0 R /Im655 502 0 R /Im656 503 0 R /Im657 504 0 R /Im658 505 0 R /Im659 506 0 R /Im660 507 0 R /Im661 508 0 R /Im662 509 0 R /Im663 510 0 R /Im664 511 0 R /Im665 512 0 R /Im666 513 0 R /Im667 514 0 R /Im668 515 0 R /Im669 516 0 R /Im670 517 0 R /Im671 518 0 R /Im672 519 0 R /Im673 520 0 R /Im674 521 0 R /Im675 522 0 R /Im676 523 0 R /Im677 524 0 R /Im678 525 0 R /Im679 526 0 R /Im680 527 0 R /Im681 528 0 R /Im682 529 0 R /Im683 530 0 R /Im684 531 0 R /Im685 532 0 R /Im686 533 0 R /Im687 534 0 R /Im688 535 0 R /Im689 536 0 R /Im690 537 0 R /Im691 538 0 R /Im692 539 0 R /Im693 540 0 R /Im694 541 0 R /Im695 542 0 R /Im696 543 0 R /Im697 544 0 R /Im698 545 0 R /Im699 546 0 R /Im700 547 0 R /Im701 548 0 R /Im702 549 0 R /Im703 550 0 R /Im704 551 0 R /Im705 552 0 R /Im706 553 0 R /Im707 554 0 R /Im708 555 0 R /Im709 556 0 R /Im710 557 0 R /Im711 558 0 R /Im712 559 0 R /Im713 560 0 R /Im714 561 0 R /Im715 562 0 R /Im716 563 0 R /Im717 564 0 R /Im718 565 0 R /Im719 566 0 R /Im720 567 0 R /Im721 568 0 R /Im722 569 0 R /Im723 570 0 R /Im724 571 0 R /Im725 572 0 R /Im726 573 0 R /Im727 1445 0 R /Im728 1453 0 R /Im729 574 0 R /Im730 575 0 R /Im731 576 0 R /Im732 577 0 R /Im733 578 0 R /Im734 579 0 R /Im735 580 0 R /Im736 581 0 R /Im737 582 0 R /Im738 583 0 R /Im739 584 0 R /Im740 585 0 R /Im741 586 0 R /Im742 587 0 R /Im743 588 0 R /Im744 589 0 R /Im745 590 0 R /Im746 591 0 R /Im747 592 0 R /Im748 593 0 R /Im749 594 0 R /Im750 595 0 R /Im751 596 0 R /Im752 597 0 R /Im753 598 0 R /Im754 599 0 R /Im755 600 0 R /Im756 601 0 R /Im757 602 0 R /Im758 603 0 R /Im759 604 0 R /Im760 605 0 R /Im761 606 0 R /Im762 607 0 R /Im763 608 0 R /Im764 609 0 R /Im765 610 0 R /Im766 611 0 R /Im767 612 0 R /Im768 613 0 R /Im769 614 0 R /Im770 615 0 R /Im771 1454 0 R /Im772 616 0 R /Im773 617 0 R /Im774 618 0 R /Im775 619 0 R /Im776 620 0 R /Im777 621 0 R /Im778 622 0 R /Im779 623 0 R /Im780 624 0 R /Im781 625 0 R /Im782 626 0 R /Im783 627 0 R /Im784 628 0 R /Im785 629 0 R /Im786 630 0 R /Im787 631 0 R /Im788 632 0 R /Im789 633 0 R /Im790 1455 0 R /Im791 634 0 R /Im792 635 0 R /Im793 636 0 R /Im794 637 0 R /Im795 638 0 R /Im796 639 0 R /Im797 640 0 R /Im798 641 0 R /Im799 642 0 R /Im800 643 0 R /Im801 644 0 R /Im802 645 0 R /Im803 646 0 R /Im804 647 0 R /Im805 648 0 R /Im806 649 0 R /Im807 650 0 R /Im808 651 0 R /Im809 652 0 R /Im810 653 0 R /Im811 654 0 R /Im812 655 0 R /Im813 656 0 R /Im814 657 0 R /Im815 658 0 R /Im816 659 0 R /Im817 660 0 R /Im818 661 0 R /Im819 662 0 R /Im820 663 0 R /Im821 664 0 R /Im822 665 0 R /Im823 666 0 R /Im824 667 0 R /Im825 668 0 R /Im826 669 0 R /Im827 670 0 R /Im828 671 0 R /Im829 672 0 R /Im830 673 0 R /Im831 674 0 R /Im832 675 0 R /Im833 676 0 R /Im834 677 0 R /Im835 678 0 R /Im836 679 0 R /Im837 680 0 R /Im838 681 0 R /Im839 682 0 R /Im840 683 0 R /Im841 684 0 R /Im842 685 0 R /Im843 686 0 R /Im844 687 0 R /Im845 688 0 R /Im846 689 0 R /Im847 690 0 R /Im848 691 0 R /Im849 692 0 R /Im850 693 0 R /Im851 694 0 R /Im852 695 0 R /Im853 696 0 R /Im854 697 0 R /Im855 698 0 R /Im856 699 0 R /Im857 700 0 R /Im858 701 0 R /Im859 702 0 R /Im860 703 0 R /Im861 704 0 R /Im862 705 0 R /Im863 706 0 R /Im864 707 0 R /Im865 708 0 R /Im866 709 0 R /Im867 710 0 R /Im868 711 0 R /Im869 712 0 R /Im870 713 0 R /Im871 714 0 R /Im872 715 0 R /Im873 716 0 R /Im874 717 0 R /Im875 718 0 R /Im876 719 0 R /Im877 720 0 R /Im878 721 0 R /Im879 722 0 R /Im880 723 0 R /Im881 724 0 R /Im882 725 0 R /Im883 726 0 R /Im884 727 0 R /Im885 728 0 R /Im886 729 0 R /Im887 730 0 R /Im888 731 0 R /Im889 732 0 R /Im890 733 0 R /Im891 734 0 R /Im892 735 0 R /Im893 736 0 R /Im894 737 0 R /Im895 738 0 R /Im896 739 0 R /Im897 740 0 R /Im898 741 0 R /Im899 742 0 R /Im900 743 0 R /Im901 744 0 R /Im902 745 0 R /Im903 746 0 R /Im904 747 0 R /Im905 748 0 R /Im906 749 0 R /Im907 750 0 R /Im908 751 0 R /Im909 752 0 R /Im910 753 0 R /Im911 754 0 R /Im912 755 0 R /Im913 756 0 R /Im914 757 0 R /Im915 758 0 R /Im916 759 0 R /Im917 760 0 R /Im918 761 0 R /Im919 762 0 R /Im920 1457 0 R /Im921 1456 0 R /Im922 1458 0 R /Im923 1459 0 R /Im924 1460 0 R /Im925 1462 0 R /Im926 1461 0 R /Im927 1463 0 R /Im928 1464 0 R /Im929 1465 0 R /Im930 1466 0 R /Im931 1467 0 R /Im932 1468 0 R /Im933 1469 0 R /Im934 1470 0 R /Im935 1471 0 R /Im936 1472 0 R /Im937 1473 0 R /Im938 1474 0 R /Im939 1475 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 325 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 6 >> endobj 325 0 obj << /Filter /FlateDecode /Length 326 0 R >> stream H]o+xS`XzQbH 4V^(8B\K_d{  'C ?WO*^>~{2::|waշx2:L2jr92vG*4AMG_'N'2S7y|ݤ8;cmŪL]Cf;D}FgZ8m5&~켖 pqSz&p/ :wIoiqu_//z쒉7N/61ғ^nX{ӛl/MIؗ|}zwؗ|\&\&D]b_&2QؗؗؗؗؗؗؗؗؗؗؗM]B_./E3R4s2r34 ə6&3! ;fgFf40zS uj+vCdVuNjdgV%̪$dgV%̪@eV%TYhP̪2⑝YW3bZ55;jZ5;I1>UYХU+vǬ̪Y̪5;3*vVMUlUϬ:lUϜ:lUϜ:gFvgF]@naz r3TMPa u PTK4Tz?gی=柳-#rO0{wp c =lJ1`tzt{w؟4M]b{R#7si;si*4؜4p \\An`kFxf. vfd.En3Rx M%eb.5eb.5eb.5eb.5eb.5eb.5eb.5eb.5eb.5ef.5e./3u}KL]b_fR2e&.%c_f @n eA#l˲,eЗeӰleHM]. rS˔LЗeЗxfЗgЗX 7s䑛LdM]B_, }Y^Hv,$;B_T(\Fe,0 }Y.,\6Y6eȲlԥFn2df.CBn2Df.CDn2`_z2`_z2`_z2`_z2`_z2`_zSؗľ̥`_zR/Ka.RKR/Ka.RKR/ľ2Pؗؗؗؗؗؗؗm_xfccfӷ٥GcgFV֌Ԩ٩SȜ\332.̪̪ {bVgbV?\ά:lDZMԪٙU-U*̬Z̬XgfbffJάZ̬Z_343*iVMKFVMYCI5ۑ&b vi:j=ߎ. fwmz(iȚ rE rE{`4pE]C˶N.mfzУBy4F!vtmnM|/}& d h!7>[&َnO|ht;% F%gU;eJ\e \&heː3_:dAܖqo+iv|ߧ'Ïի󓳷*ׯߞ3)-G.OFUFM.GMy .ɽ*vN[2埯G\9۔궦|5CJ7`qfS.2⪔zX}W/Ǒ!gu]mtQ5|=[-l|U7Frmy Ü/zjVw3]j:fjΛ|}UkGEK]!NA}_ϗT-oͼpMuU&3ǽբ#[ZMtG>Met,t1M͗j>z7vg,o fuǧ(;f\ ?u2ۉ֕MM_Ģ}S |ϲ=3.t~UYWmK5}śOignsu~zxWˍkܮ@8ooq\X׶ɃW^}yMǷmnS_{tS_, I}s{s}tfȏ۵aתԮ#>ǃvr#Oh.O*T=n@o{u[w#ܭz;wCaq!n!n7Fce;V=wC~[e[室w=p{an];wܞ;֗>֗>֗>֗I Ͻ/Bso˰Soo}X2,e`Yz֗e/[_ ,Ko}Y2,/#2,/#2,2,2,2,2,2,2,2,2,2,rzm}WSmX_&6'b}؜ebs"͉֗X_f6'b}ٜR;3ϋe^R2D/3˥2/Lj2,>/T܅͠,lW9Y_6'9q͉֗,l8,dhtܧ^k7\_ɬh߭i??y'{+:'RH-ɖOdSjIOG_ٖ_٘Z/L-dkz'{S ?ٜZݩ"?ٞ3 7'oN/,|G~oOU |+|(7|SF~oM Y)"?7g,-||||cE~o,Y1#?7&gFo`Fo`Fo`Fo`Foh ~+W?{?/,_Ef3WѿLEf/7|ѿ+oa |[X-,_A Wп+ߥz5(/ 9%͏CV6?[84vqqDž.ޗʞ/rʞ/dJEV?# u#/[O+#?W"?W BVa ?K)CGJ?R#GJ_'Y w^M WU u?y?A4 @~o:/ݿi퓺}R=螇n>{dCa^eswtw^ofH¸F.YvRհ+;]gλ'd;VM36AD*3ћyW63-ŲyXe=wа=w~lfB6.ճY)[=K5R hVR ji VS?0{ٽ*U߻0n9:|>I?>=Z8ћuVū >VՋZ'V߸U#r135Ԅ-NBj)[}ntuy;]n{3ڴow/zjn?|u`_/ Zf~wf{?}oov?Oo?n ˵75 >/xd뵟ϩ_ [|cSG8p҄e?ovON?i;fٖo{<4?mvzw}ʹO_x endstream endobj 326 0 obj 4756 endobj 327 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022vY` endstream endobj 328 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r#Y`a endstream endobj 329 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r#Y!`` endstream endobj 330 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` FQ0b endstream endobj 331 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`a4@9T\0f endstream endobj 332 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`0XT 0 endstream endobj 333 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@ eP*Ghl"@ endstream endobj 334 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@ e!S*G6P@z endstream endobj 335 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QT,%I 7 D endstream endobj 336 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`R M(@`"9 p endstream endobj 337 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QT^@ L endstream endobj 338 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QTh@ endstream endobj 339 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QTX$@ O endstream endobj 340 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`QTFh K endstream endobj 341 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`h8Q@0  endstream endobj 342 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`a4@9TL *ph12j@ endstream endobj 343 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` FQA$0. endstream endobj 344 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0rD`012"Š`0E endstream endobj 345 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rFP(` endstream endobj 346 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rFj@ endstream endobj 347 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rdF@pd*@+ endstream endobj 348 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0r$FFj endstream endobj 349 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rFF&  endstream endobj 350 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rԠ`f endstream endobj 351 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vn endstream endobj 352 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF45C  endstream endobj 353 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF465C  endstream endobj 354 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r`dDA endstream endobj 355 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF   endstream endobj 356 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF @ endstream endobj 357 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF4A` endstream endobj 358 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rH@02PK endstream endobj 359 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFРf endstream endobj 360 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rFf endstream endobj 361 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vԐj endstream endobj 362 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF<< @ endstream endobj 363 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFFBQ endstream endobj 364 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rxH80P endstream endobj 365 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rXx00Ս0 endstream endobj 366 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r@W endstream endobj 367 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0r4?3>  - endstream endobj 368 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rFTO# > endstream endobj 369 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rFO% ? endstream endobj 370 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022vxF(Fh   endstream endobj 371 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rF$_A endstream endobj 372 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFd^0 endstream endobj 373 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFI?D endstream endobj 374 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`ArFMG z endstream endobj 375 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` !ãrws] endstream endobj 376 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` $[pXXt endstream endobj 377 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` )F*!}z { endstream endobj 378 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` )F*!`Ds  endstream endobj 379 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` $[(4` endstream endobj 380 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !G08hR endstream endobj 381 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !ãrF~0d endstream endobj 382 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` $[p22 i endstream endobj 383 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` )F*`("  endstream endobj 384 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` )F*`hbt  endstream endobj 385 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` !$#[00 endstream endobj 386 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !ãrXF>K endstream endobj 387 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`Arx*@  endstream endobj 388 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r)@r endstream endobj 389 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v(&@ endstream endobj 390 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r$@ endstream endobj 391 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF  endstream endobj 392 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0r$O1  endstream endobj 393 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF, endstream endobj 394 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r(F4j 1 endstream endobj 395 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rHFrx 2 endstream endobj 396 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022v(F1|` endstream endobj 397 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFL>05 endstream endobj 398 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFT06 endstream endobj 399 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF\07 endstream endobj 400 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF+ endstream endobj 401 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFL0N  endstream endobj 402 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFF-= endstream endobj 403 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFF > endstream endobj 404 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rhF`x? endstream endobj 405 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022vo   endstream endobj 406 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rFFwA  endstream endobj 407 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF `! endstream endobj 408 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF,A " endstream endobj 409 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF # endstream endobj 410 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rpA1 endstream endobj 411 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rPA  endstream endobj 412 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r0  endstream endobj 413 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rA  endstream endobj 414 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r; endstream endobj 415 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vFA   endstream endobj 416 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r0FF  endstream endobj 417 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rF020 endstream endobj 418 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rF;q8 S endstream endobj 419 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`ƫrPFfB0 o endstream endobj 420 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`rpF:n0P endstream endobj 421 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` #G0q endstream endobj 422 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` ![P聡v endstream endobj 423 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` QUJu/C endstream endobj 424 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` HȼA@H` endstream endobj 425 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` ŭrP{20@ endstream endobj 426 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` $[ C=d` endstream endobj 427 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` )F*'`;a( { endstream endobj 428 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` )F*)`C endstream endobj 429 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` )F*'`;qh } endstream endobj 430 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` #G А endstream endobj 431 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` !ãrF8` endstream endobj 432 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`ƫrF88`  endstream endobj 433 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0r­C  endstream endobj 434 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022v`C  endstream endobj 435 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rq(6` endstream endobj 436 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r`Pq'v` endstream endobj 437 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r@q&.` endstream endobj 438 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r p%n` endstream endobj 439 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0]ՑDG endstream endobj 440 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0aԉU endstream endobj 441 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0AB@U endstream endobj 442 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0@@W endstream endobj 443 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0N2J   endstream endobj 444 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022^N> # endstream endobj 445 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0~1@ endstream endobj 446 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0n# [ endstream endobj 447 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0^"F:@) endstream endobj 448 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0^|# ^ endstream endobj 449 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0N|# _ endstream endobj 450 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0^N0 F ` endstream endobj 451 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0n 2 endstream endobj 452 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0nA8@d endstream endobj 453 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022NA2@. endstream endobj 454 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0^6r@e endstream endobj 455 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0> 1<@< endstream endobj 456 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0.A 2Q i endstream endobj 457 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0\j endstream endobj 458 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0+s endstream endobj 459 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0q  endstream endobj 460 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`  endstream endobj 461 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`8  endstream endobj 462 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`6  endstream endobj 463 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022v`P8 ~ endstream endobj 464 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0ڀ+sx endstream endobj 465 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0ڀ k endstream endobj 466 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0ڀ1|@ endstream endobj 467 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 1tP endstream endobj 468 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`,*i~z endstream endobj 469 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` L*iz  endstream endobj 470 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`ƫq@m/0  endstream endobj 471 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`A y endstream endobj 472 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`Aqଦ;0  endstream endobj 473 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` !<ʩ 1m `!/ endstream endobj 474 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` a[%m<  endstream endobj 475 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`$S%Md endstream endobj 476 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`ǩql`A endstream endobj 477 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`ǩql `B endstream endobj 478 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`,*i  endstream endobj 479 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,*  endstream endobj 480 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,* endstream endobj 481 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0: k endstream endobj 482 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0:<  endstream endobj 483 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022b@G0 endstream endobj 484 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r@O0 endstream endobj 485 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0RH?0 endstream endobj 486 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0B@7#0 endstream endobj 487 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 02@/{'0 endstream endobj 488 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0h[3@ endstream endobj 489 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0h1i   endstream endobj 490 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0xdd%C " endstream endobj 491 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0Q ed%C # endstream endobj 492 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 022Hn wd endstream endobj 493 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0$F*0  endstream endobj 494 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 04pF.0  endstream endobj 495 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0DA##) endstream endobj 496 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0TфF,0* endstream endobj 497 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0d1F*0  endstream endobj 498 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0TхF,0, endstream endobj 499 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 04Sߒ! ; endstream endobj 500 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0$a,b / endstream endobj 501 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0a2Ȓ! 0 endstream endobj 502 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 022HA@m+0 endstream endobj 503 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0hMe%C  E endstream endobj 504 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0G"0  endstream endobj 505 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0Xy 5 endstream endobj 506 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0X1i 6 endstream endobj 507 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0(APՒ!  endstream endobj 508 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0ކ '` endstream endobj 509 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0f /` endstream endobj 510 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0F 7` endstream endobj 511 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0AT3i/ endstream endobj 512 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0229T1e endstream endobj 513 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0FA h endstream endobj 514 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0&FLA i endstream endobj 515 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0.FF A  endstream endobj 516 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`AƑgH endstream endobj 517 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` !ãc$ׄ  endstream endobj 518 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` $[%~O#  endstream endobj 519 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` )F* FdcF^` 3 endstream endobj 520 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 4AH$ endstream endobj 521 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` a4T׌Q@ endstream endobj 522 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` a B*1d& endstream endobj 523 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,*A T endstream endobj 524 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` L* A W endstream endobj 525 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`xU6\#  Z endstream endobj 526 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`9Tc,` ] endstream endobj 527 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` QxxT1IY&0`  endstream endobj 528 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` aŭ1bt endstream endobj 529 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` aŭ 0cu endstream endobj 530 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0C醌0`} endstream endobj 531 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022y } endstream endobj 532 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0 - endstream endobj 533 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0tգ . endstream endobj 534 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0Tţ / endstream endobj 535 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 040 endstream endobj 536 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0bD: @ endstream endobj 537 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0)ȈU(  endstream endobj 538 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0)U(  endstream endobj 539 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0'ȈU(  endstream endobj 540 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0#Ȉ](  endstream endobj 541 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022bbQ5   endstream endobj 542 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0dĩn   endstream endobj 543 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0dĭn   endstream endobj 544 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0ddģn   endstream endobj 545 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0dīn   endstream endobj 546 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0dįn   endstream endobj 547 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022b$Jh  N endstream endobj 548 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0b6q` endstream endobj 549 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 550 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 022v   endstream endobj 551 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`AL$0 endstream endobj 552 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` !ã L$0x endstream endobj 553 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` aG%A0H` % endstream endobj 554 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` )Fd)"$k `! endstream endobj 555 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` ) = p:@TT endstream endobj 556 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` Q@`T endstream endobj 557 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` a(0T endstream endobj 558 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` !Q@m`  endstream endobj 559 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb`AQ@m` endstream endobj 560 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0jl:pm$` endstream endobj 561 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0Bqb:0]`?' endstream endobj 562 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 02#T3y)J8`0\ endstream endobj 563 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 02"S$45f; #  endstream endobj 564 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 02"Sr5Q|@& endstream endobj 565 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 02"Sr5Q|͌p 1)@ endstream endobj 566 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 02"Sdr(MV,Q  endstream endobj 567 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 02"SrNLE endstream endobj 568 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 02"SdruBQL`mdiF#  endstream endobj 569 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 02"S 4_3^R0k endstream endobj 570 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 02"S$rt_3^R0m endstream endobj 571 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 022(7lCt`0" endstream endobj 572 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 0Bq%S75R`1aH7 !C* endstream endobj 573 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0ji%_; |Gõl@&! endstream endobj 574 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r` endstream endobj 575 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v` endstream endobj 576 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r#`1 endstream endobj 577 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r#!`0 endstream endobj 578 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` FQ0b  endstream endobj 579 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`a4@9T\0 endstream endobj 580 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`0XT 0 endstream endobj 581 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`@ eP*Ghl<  endstream endobj 582 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`@ e!S*G6P  endstream endobj 583 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QT,% @ endstream endobj 584 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`R M(@`"*  endstream endobj 585 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QT^ą@ endstream endobj 586 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QThą@ endstream endobj 587 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QTXD@ endstream endobj 588 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`QTFh endstream endobj 589 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`h8Q@0 L endstream endobj 590 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`a4@9TL *ph12jt endstream endobj 591 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` FQAD0  endstream endobj 592 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0rD`012"Š`0 endstream endobj 593 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rFP(` endstream endobj 594 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 022vB  endstream endobj 595 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r2  endstream endobj 596 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rFrC O endstream endobj 597 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rd  endstream endobj 598 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0rD   endstream endobj 599 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rdF@p(0  endstream endobj 600 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0r$FF" < endstream endobj 601 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rFF&A`= endstream endobj 602 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rԠ`4d  endstream endobj 603 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022v> stream Hb` 0rF4!` endstream endobj 605 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF46!` endstream endobj 606 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r`dD! endstream endobj 607 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF A` endstream endobj 608 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF @ endstream endobj 609 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r̀0h n endstream endobj 610 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r4d n endstream endobj 611 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vF<<2@ endstream endobj 612 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF<<2@n endstream endobj 613 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rFFlLr@ endstream endobj 614 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r$FFd2` endstream endobj 615 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rdFIF endstream endobj 616 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` 0r D endstream endobj 617 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rFx  endstream endobj 618 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022vxF(50[ endstream endobj 619 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rF  endstream endobj 620 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rF$  endstream endobj 621 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`ArF4v endstream endobj 622 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !ãrF,, m endstream endobj 623 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` $[pXX4  endstream endobj 624 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` )F*!`0 > endstream endobj 625 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` $[xxT  endstream endobj 626 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !G0ޤ   endstream endobj 627 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !ãrt m endstream endobj 628 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` $[p^  endstream endobj 629 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` )F**M=` > endstream endobj 630 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` )F*SZ > endstream endobj 631 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` !$#[0|JK endstream endobj 632 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !ãrXFv endstream endobj 633 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`ArP  endstream endobj 634 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rA)c endstream endobj 635 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r(Flm endstream endobj 636 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rHF r@m endstream endobj 637 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022v(FTb@ endstream endobj 638 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rF$< m endstream endobj 639 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rF``m endstream endobj 640 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rF0p`m endstream endobj 641 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF+m endstream endobj 642 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFL0p0  endstream endobj 643 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFF- endstream endobj 644 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rFF_ endstream endobj 645 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rhF`x@@ endstream endobj 646 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022vo endstream endobj 647 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rFFw endstream endobj 648 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF @ endstream endobj 649 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF, endstream endobj 650 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rF́ endstream endobj 651 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rpA endstream endobj 652 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rPA q endstream endobj 653 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r0 r endstream endobj 654 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rA s endstream endobj 655 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 656 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vFA  endstream endobj 657 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r0FF ` endstream endobj 658 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rF02+0a endstream endobj 659 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rF;q;  endstream endobj 660 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`ƫrPFf0 endstream endobj 661 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`rpFn0 endstream endobj 662 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` #G0qp [ endstream endobj 663 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` ![Pv  endstream endobj 664 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` QUJu/; endstream endobj 665 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` HȼA@0, endstream endobj 666 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` ŭrP{Ԏ0 endstream endobj 667 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` $[ C=`p endstream endobj 668 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` )F*'`;a  endstream endobj 669 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` )F*)` \ endstream endobj 670 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` )F*'`;q  endstream endobj 671 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` #G Р  endstream endobj 672 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` !ãrF8`6 endstream endobj 673 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`ƫrF88 `  endstream endobj 674 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r­u endstream endobj 675 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022v`C  endstream endobj 676 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rq(  endstream endobj 677 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r`Pq' endstream endobj 678 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r@q&20 endstream endobj 679 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r p%*0 endstream endobj 680 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0]Ցx@  endstream endobj 681 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0aԉ@ endstream endobj 682 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0AB  endstream endobj 683 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0@"@ endstream endobj 684 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0N2J  endstream endobj 685 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022^N>  endstream endobj 686 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0~1@a endstream endobj 687 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0n# endstream endobj 688 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0^"F:@ endstream endobj 689 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0^|#" endstream endobj 690 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0N|## endstream endobj 691 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0^'gha endstream endobj 692 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0n+sa endstream endobj 693 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0n kb endstream endobj 694 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022^  endstream endobj 695 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0 a endstream endobj 696 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0N ]`a endstream endobj 697 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0ax`b endstream endobj 698 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0q:x`b endstream endobj 699 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`x` endstream endobj 700 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0`l0 endstream endobj 701 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 1tg3}@! endstream endobj 702 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,*if endstream endobj 703 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` L*if endstream endobj 704 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`ƫ`l0 P endstream endobj 705 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`A`l0 R endstream endobj 706 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` !<ʩ 1m#0 endstream endobj 707 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` a[%mL'` 7 endstream endobj 708 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`$S%Md3@  endstream endobj 709 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`ǩql0 endstream endobj 710 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`ǩql#0 endstream endobj 711 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`,*itR endstream endobj 712 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,*  m endstream endobj 713 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,*f:n endstream endobj 714 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0: kx endstream endobj 715 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0:L` endstream endobj 716 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022b@G| endstream endobj 717 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r@O endstream endobj 718 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0RH?0 endstream endobj 719 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0B@7 0 endstream endobj 720 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 02@/{0 endstream endobj 721 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0h[3@ endstream endobj 722 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0h1  endstream endobj 723 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0xdd%C endstream endobj 724 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0Q ed%C endstream endobj 725 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 022Hn w endstream endobj 726 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0$F0 endstream endobj 727 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 04pF0 endstream endobj 728 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0DA## endstream endobj 729 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0TфF0 endstream endobj 730 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0d1F0 endstream endobj 731 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0TQ# endstream endobj 732 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0D#  endstream endobj 733 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022H&o$  endstream endobj 734 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0qrG0 endstream endobj 735 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0G 0 endstream endobj 736 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0x  ` endstream endobj 737 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0h[2@ endstream endobj 738 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r   endstream endobj 739 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0&  endstream endobj 740 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0.  endstream endobj 741 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`AX   endstream endobj 742 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !ã``T` endstream endobj 743 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` $[%~@a w endstream endobj 744 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` )F* Fʴ{`  endstream endobj 745 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 4AH endstream endobj 746 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` a4T׌Q  endstream endobj 747 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` a B*1d` endstream endobj 748 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`,*Ba  endstream endobj 749 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` L*Ba  endstream endobj 750 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`xU3B endstream endobj 751 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`9T3R=0 endstream endobj 752 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` QxxT3b=0 endstream endobj 753 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` aŭ`0` endstream endobj 754 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` aŭx   endstream endobj 755 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022(  endstream endobj 756 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0b6q@@ endstream endobj 757 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0)U( U endstream endobj 758 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022b$Jh endstream endobj 759 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`AՌ  endstream endobj 760 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` !ã Ռ endstream endobj 761 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` aG%A00 endstream endobj 762 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` )Fd)"$k 00! endstream endobj 763 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS17 2444 0 R /CS18 2445 0 R /CS19 1429 0 R /CS20 1491 0 R /CS21 1492 0 R /CS22 1430 0 R /CS23 1493 0 R /CS24 1494 0 R /CS25 1495 0 R /CS26 1496 0 R /CS27 1497 0 R /CS28 1498 0 R /CS29 1499 0 R /CS30 1500 0 R /CS31 1501 0 R /CS32 1502 0 R /CS33 1447 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT4 2467 0 R /TT5 2471 0 R /TT6 2447 0 R /TT7 1476 0 R >> /XObject << /Im244 1477 0 R /Im245 1478 0 R /Im246 766 0 R /Im247 767 0 R /Im248 768 0 R /Im249 769 0 R /Im250 770 0 R /Im251 771 0 R /Im252 772 0 R /Im253 773 0 R /Im254 774 0 R /Im255 775 0 R /Im256 776 0 R /Im257 777 0 R /Im258 778 0 R /Im259 779 0 R /Im260 780 0 R /Im261 781 0 R /Im262 782 0 R /Im263 783 0 R /Im264 784 0 R /Im265 785 0 R /Im266 786 0 R /Im267 787 0 R /Im268 788 0 R /Im269 789 0 R /Im270 790 0 R /Im271 791 0 R /Im272 792 0 R /Im273 793 0 R /Im274 794 0 R /Im275 795 0 R /Im276 796 0 R /Im277 797 0 R /Im278 798 0 R /Im279 799 0 R /Im280 800 0 R /Im281 801 0 R /Im282 802 0 R /Im283 803 0 R /Im284 804 0 R /Im285 805 0 R /Im286 806 0 R /Im287 807 0 R /Im288 808 0 R /Im289 809 0 R /Im290 810 0 R /Im291 811 0 R /Im292 812 0 R /Im293 813 0 R /Im294 814 0 R /Im295 815 0 R /Im296 816 0 R /Im297 817 0 R /Im298 818 0 R /Im299 819 0 R /Im300 820 0 R /Im301 821 0 R /Im302 822 0 R /Im303 823 0 R /Im304 824 0 R /Im305 825 0 R /Im306 826 0 R /Im307 827 0 R /Im308 828 0 R /Im309 829 0 R /Im310 830 0 R /Im311 831 0 R /Im312 832 0 R /Im313 833 0 R /Im314 834 0 R /Im315 835 0 R /Im316 836 0 R /Im317 837 0 R /Im318 838 0 R /Im319 839 0 R /Im320 840 0 R /Im321 841 0 R /Im322 842 0 R /Im323 843 0 R /Im324 844 0 R /Im325 845 0 R /Im326 846 0 R /Im327 847 0 R /Im328 848 0 R /Im329 849 0 R /Im330 850 0 R /Im331 851 0 R /Im332 852 0 R /Im333 853 0 R /Im334 854 0 R /Im335 855 0 R /Im336 856 0 R /Im337 857 0 R /Im338 858 0 R /Im339 859 0 R /Im340 860 0 R /Im341 861 0 R /Im342 862 0 R /Im343 863 0 R /Im344 864 0 R /Im345 865 0 R /Im346 866 0 R /Im347 867 0 R /Im348 868 0 R /Im349 869 0 R /Im350 870 0 R /Im351 871 0 R /Im352 872 0 R /Im353 873 0 R /Im354 874 0 R /Im355 875 0 R /Im356 876 0 R /Im357 877 0 R /Im358 878 0 R /Im359 879 0 R /Im360 880 0 R /Im361 881 0 R /Im362 882 0 R /Im363 883 0 R /Im364 884 0 R /Im365 885 0 R /Im366 886 0 R /Im367 887 0 R /Im368 888 0 R /Im369 889 0 R /Im370 890 0 R /Im371 891 0 R /Im372 892 0 R /Im373 893 0 R /Im374 894 0 R /Im375 895 0 R /Im376 896 0 R /Im377 897 0 R /Im378 898 0 R /Im379 899 0 R /Im380 900 0 R /Im381 901 0 R /Im382 902 0 R /Im383 903 0 R /Im384 904 0 R /Im385 905 0 R /Im386 906 0 R /Im387 907 0 R /Im388 908 0 R /Im389 909 0 R /Im390 910 0 R /Im391 911 0 R /Im392 912 0 R /Im393 913 0 R /Im394 914 0 R /Im395 915 0 R /Im396 916 0 R /Im397 917 0 R /Im398 918 0 R /Im399 919 0 R /Im400 920 0 R /Im401 921 0 R /Im402 922 0 R /Im403 923 0 R /Im404 924 0 R /Im405 925 0 R /Im406 926 0 R /Im407 927 0 R /Im408 928 0 R /Im409 929 0 R /Im410 930 0 R /Im411 931 0 R /Im412 932 0 R /Im413 933 0 R /Im414 934 0 R /Im415 935 0 R /Im416 936 0 R /Im417 937 0 R /Im418 938 0 R /Im419 939 0 R /Im420 940 0 R /Im421 941 0 R /Im422 1453 0 R /Im423 1479 0 R /Im424 1480 0 R /Im425 942 0 R /Im426 943 0 R /Im427 944 0 R /Im428 945 0 R /Im429 946 0 R /Im430 947 0 R /Im431 948 0 R /Im432 949 0 R /Im433 950 0 R /Im434 951 0 R /Im435 952 0 R /Im436 953 0 R /Im437 954 0 R /Im438 955 0 R /Im439 956 0 R /Im440 957 0 R /Im441 958 0 R /Im442 959 0 R /Im443 960 0 R /Im444 961 0 R /Im445 962 0 R /Im446 963 0 R /Im447 964 0 R /Im448 965 0 R /Im449 966 0 R /Im450 967 0 R /Im451 968 0 R /Im452 969 0 R /Im453 970 0 R /Im454 971 0 R /Im455 972 0 R /Im456 973 0 R /Im457 974 0 R /Im458 975 0 R /Im459 976 0 R /Im460 977 0 R /Im461 978 0 R /Im462 979 0 R /Im463 980 0 R /Im464 981 0 R /Im465 982 0 R /Im466 983 0 R /Im467 984 0 R /Im468 985 0 R /Im469 986 0 R /Im470 987 0 R /Im471 988 0 R /Im472 989 0 R /Im473 990 0 R /Im474 991 0 R /Im475 992 0 R /Im476 993 0 R /Im477 1481 0 R /Im478 1482 0 R /Im479 1483 0 R /Im480 1484 0 R /Im481 1485 0 R /Im482 1486 0 R /Im483 1487 0 R /Im484 1488 0 R /Im485 1489 0 R /Im486 1490 0 R /Im487 1475 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 764 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 7 >> endobj 764 0 obj << /Filter /FlateDecode /Length 765 0 R >> stream HW]oG|篘WG(B`Y:q/%#ig)K5$-tUw^o/BwNNX1]/?b=h1b?Άr5mVXgc#nփfp4Nh|(t2 %V4_6-'/)Tɋnz:YLVk\t\߈F|[~߃Zzex5d1̐~sNZI)W˅X>Vb6ފ_X__& XnwU? )Ds;%(~O W}rX~ͭo7ZxYFL Y6l_:j (Smc~, r[i_6>z/c6nOt\3l|;y*gbLs[Z#/ ᚜!n}qsP?MtŎKxjHJ#Wopy__}?$_zvцb{ikj =J~Mq8;F[cYc]mϱ#=m C=&{m\1xR%P!S+]HñomTњl(3 Lg8U-d 0p:J<'gt;~ctmVWD:cCO5ΉjhxNUDwߧj+{NWr>UigL"S5t&GHT͗1Sըن&ta)H>u  ;~~(u ~+]N 80L-9ODvFqvFEY]q9+/mi;Gn)W=rѤhDn)HIqضct`fAJHs;iLF4HIF؃t/f7K@WH4 cnjV"CB 1xEM*:cJIrZ&W3 U%!F;0gH*ΐKf@*N؈q@+DVq"Zj8YcVAf Vs"8jBI9UC>rN@jNғknXCVs[쮙PŁ՜7C0#pJjuM'a` ) Y53;NS_Ł5<9pzSp,xF[NTuu`NQ 1`-( Beuibum^r؉d9E!@$L(bt 2.`JZ㇖/a.Jg{pU79:]`Tpܥus?_ .HkpVm7~[_wsk=pxjw NXD+E9am k5UuNXޘ: D Ft5W=q}ސ8VNVSgeRƳV`='N'td9 {]@nVLSUri&NVDɪXץ֊\~+*FBwR6[UI ]%T0 ? :0~Uɩy2 \tTVRС9mJ3.3 u.Rp3:˿322tNL䈳K8;16UQ%#]MVS]%ݗMLY$FbG, yݐeڿ/;4\Nq֎Xjndz,.jrxc{SXmzW|Emܿl n+SѽoTܦ۩ Z)_;#d;տv`^DӲ}YNq#tqP4dRē-o Vn=NshuPsQugnٲU1̍$m)2[}\ABmOm-P̽K {w {]Mv e5ϗ;b88o^ OZݻ}X~px66f=8iMb6=v']\fO8m1qxՋsF& @^ #X"CG'O'˕ci 0A|l5Jl=bY-^\B_qE۶U]{͡#*dDlng+'Tk(g2xu%X9p qsyv}||=3v o'K5 cтdlvۺ(SpIAE"@8*\ӗWRE΍NGsݜ/Yݴ.cMԳoK9]ܮyw^o/Z/Zgqtl'f\>1on7l~s&f{e ЅY3}n=ױwT}5,/]OaڒJ(kVTw /ww~k~,֖A1aew#Gnmai 7oxlbl|\ޚBs}{oѕ/ nn3w\}M9>En^T:XdzVy:Q' !9JEusҿj3j͏xKzm o1~WG?ҿ:;߁ @~ [}ҿ~>GwA~_=߁ O i_|)c1~J O }$o++JZ~o6?6bc#6?6ҿa/|Q}˗| [JdJzT"@~{g@~-Ɵ ƟGz?'? _ҿAT/-_7(gSS@G_7(%ߨ?L=TJҿQy$+IFI,ČOLK}/;]=Aҿz>o1P0 9d?$? /9H&~ҿ/)K`>c^WϏ A~K&Ϳ^7iҿ/KN7iշ|_=_7 /4:ߤ?N7iշ|_=_7 Ö/˃y]}?oҿj>K,痥v?oV|S6,훵ɾjmف]?Y&c-NaSF)b {=4vZxo_.ޙO޾|0_z1lvjUӂϦX˲~׫} @} endstream endobj 765 0 obj 4308 endobj 766 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1491 0 R /Length 20 /Filter /FlateDecode >> stream Hb`4  endstream endobj 767 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1491 0 R /Length 21 /Filter /FlateDecode >> stream Hb`T4 < endstream endobj 768 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r0!@L endstream endobj 769 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022v&009 endstream endobj 770 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 0r0 J(" e1`1 endstream endobj 771 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0r00A1d endstream endobj 772 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 36 /Filter /FlateDecode >> stream Hb` FQ0A0G>0 endstream endobj 773 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 35 /Filter /FlateDecode >> stream Hb`a4@9T L0!q endstream endobj 774 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 51 /Filter /FlateDecode >> stream Hb`0XT :Ehm )Z(!55 endstream endobj 775 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 34 /Filter /FlateDecode >> stream Hb`@ e!S*G6(|J 0b endstream endobj 776 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 47 /Filter /FlateDecode >> stream Hb`QTB {m,#zC@$ endstream endobj 777 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 36 /Filter /FlateDecode >> stream Hb`QT064p% endstream endobj 778 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 33 /Filter /FlateDecode >> stream Hb`QT @)5  endstream endobj 779 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 31 /Filter /FlateDecode >> stream Hb`QT Ma  endstream endobj 780 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 54 /Filter /FlateDecode >> stream Hb`QT ÄS%60"p-lbhaFq`0\ endstream endobj 781 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 40 /Filter /FlateDecode >> stream Hb`a4@9TL (&fb1<@X endstream endobj 782 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 53 /Filter /FlateDecode >> stream Hb` FQ@ Ƣգr011QG6f" endstream endobj 783 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0rFH(101aUM0 endstream endobj 784 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022vX1@ endstream endobj 785 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rx1!@ endstream endobj 786 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0rFD11 ֡ÇQ` endstream endobj 787 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rDa endstream endobj 788 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0rA:4l 5 endstream endobj 789 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rD&0i4T endstream endobj 790 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r$&$!` endstream endobj 791 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022v&&`  endstream endobj 792 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0r&s0`rb­:  endstream endobj 793 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r&8K` endstream endobj 794 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 40 /Filter /FlateDecode >> stream Hb` 0r&;`4`'\Z endstream endobj 795 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r&\ endstream endobj 796 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r&Z endstream endobj 797 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 0r&LL,0 endstream endobj 798 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r$&  endstream endobj 799 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0rD&0hW( ` Y endstream endobj 800 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` 0rP endstream endobj 801 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 802 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022v  endstream endobj 803 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`Ar  endstream endobj 804 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 39 /Filter /FlateDecode >> stream Hb` !ãr > stream Hb` )F*)` 90Z endstream endobj 806 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 47 /Filter /FlateDecode >> stream Hb` )F*#`bb9#4`q3Q`0 endstream endobj 807 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 29 /Filter /FlateDecode >> stream Hb` !GpLH@ endstream endobj 808 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 28 /Filter /FlateDecode >> stream Hb` !ãrx&(`` endstream endobj 809 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 30 /Filter /FlateDecode >> stream Hb` $[0LP< H endstream endobj 810 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 38 /Filter /FlateDecode >> stream Hb` )F*+`A Fi0@%7 endstream endobj 811 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 31 /Filter /FlateDecode >> stream Hb` !$#[L 0 endstream endobj 812 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` !ãr @((`% endstream endobj 813 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 022vP  endstream endobj 814 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rvq j endstream endobj 815 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r&4z endstream endobj 816 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0r&$r8( ` endstream endobj 817 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0r&81@ endstream endobj 818 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 43 /Filter /FlateDecode >> stream Hb` 022v&$i B]0|" 4b ! endstream endobj 819 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0rH&&F pj0 endstream endobj 820 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0r&&11x@ 6 endstream endobj 821 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r&hg  endstream endobj 822 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0r&&v5p"&(hw endstream endobj 823 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 0r&&&iC } endstream endobj 824 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 45 /Filter /FlateDecode >> stream Hb` 0r&&aQ#,y$+9 endstream endobj 825 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 022vg x I endstream endobj 826 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0rFo`Ġ endstream endobj 827 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r_`] endstream endobj 828 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 0rWOd@= endstream endobj 829 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rpơ} endstream endobj 830 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0rPa `xm  endstream endobj 831 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 832 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r! endstream endobj 833 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022vp!~ endstream endobj 834 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0r!`pȺ  endstream endobj 835 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r0ơ| endstream endobj 836 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 47 /Filter /FlateDecode >> stream Hb`ƫr&$0O4`dDK`YC( `^/ endstream endobj 837 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 38 /Filter /FlateDecode >> stream Hb` #G`L LLP#"` endstream endobj 838 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 36 /Filter /FlateDecode >> stream Hb` ![L`@` endstream endobj 839 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 31 /Filter /FlateDecode >> stream Hb` QUNP ~ endstream endobj 840 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 49 /Filter /FlateDecode >> stream Hb` Hȼ!#9 ##J H  MB% endstream endobj 841 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 35 /Filter /FlateDecode >> stream Hb` $[L@73Ah0   endstream endobj 842 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 51 /Filter /FlateDecode >> stream Hb` )F*'`b`d2-4C=&E7 endstream endobj 843 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 34 /Filter /FlateDecode >> stream Hb` )F*'`dbC endstream endobj 844 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1496 0 R /Length 35 /Filter /FlateDecode >> stream Hb` #G @g3!v # endstream endobj 845 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` !ãrZ  endstream endobj 846 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`ƫr!XV  endstream endobj 847 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 022v`q(q  endstream endobj 848 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0rq(PPq'  endstream endobj 849 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r@q&  endstream endobj 850 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0r p%I  endstream endobj 851 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rPp$  endstream endobj 852 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0rp"Mw!Y + endstream endobj 853 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0rw  endstream endobj 854 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0r@ w=` &&(cZ , endstream endobj 855 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0  endstream endobj 856 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0 BJQ } endstream endobj 857 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0 D022 ;h  [ endstream endobj 858 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 00v5y endstream endobj 859 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 0   endstream endobj 860 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 40 /Filter /FlateDecode >> stream Hb` 0 B 3 Q$`4 (0 endstream endobj 861 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022΀i]@K`  endstream endobj 862 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022Z6B` endstream endobj 863 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0zi` h4 3 endstream endobj 864 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0$  endstream endobj 865 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 1tL(&\F2`(BA# endstream endobj 866 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 29 /Filter /FlateDecode >> stream Hb` L*i0#  endstream endobj 867 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 32 /Filter /FlateDecode >> stream Hb`ƫv B2   endstream endobj 868 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 33 /Filter /FlateDecode >> stream Hb`A   endstream endobj 869 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 45 /Filter /FlateDecode >> stream Hb`Ai=HQA3 endstream endobj 870 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 34 /Filter /FlateDecode >> stream Hb` a[%-#> stream Hb`$S% Lap (0= endstream endobj 872 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 33 /Filter /FlateDecode >> stream Hb`ǩV f)D a endstream endobj 873 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 33 /Filter /FlateDecode >> stream Hb`,* 3A H endstream endobj 874 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 31 /Filter /FlateDecode >> stream Hb`,*ld  endstream endobj 875 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1499 0 R /Length 41 /Filter /FlateDecode >> stream Hb`,*P,dC>q7  endstream endobj 876 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1500 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 0,du̴~ endstream endobj 877 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1500 0 R /Length 53 /Filter /FlateDecode >> stream Hb` 022T"a(a, ÀEq`B! endstream endobj 878 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0g&X5T@_ endstream endobj 879 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0hĄ̃bX4@b endstream endobj 880 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 08ĄʇԶgw endstream endobj 881 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 0Ą!֌0@ŰÌx a - endstream endobj 882 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0 `b`bہ!>   endstream endobj 883 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 53 /Filter /FlateDecode >> stream Hb` 00`"&tLԏ##" (.5 @6 endstream endobj 884 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 00`RLH"(R  endstream endobj 885 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0`|FtQv endstream endobj 886 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0`XFS endstream endobj 887 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 0dB5 ]( ,F3 (u endstream endobj 888 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0ab!5  < endstream endobj 889 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0(fb*5  0 endstream endobj 890 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0(db” * endstream endobj 891 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 46 /Filter /FlateDecode >> stream Hb` 0(Ą.5 Hԍ$& ,F1* endstream endobj 892 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 08EF:0 endstream endobj 893 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 080FQQ,4EH + endstream endobj 894 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0/`Q(03 endstream endobj 895 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0/`H 0 endstream endobj 896 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0`Bb3 33(@ endstream endobj 897 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 47 /Filter /FlateDecode >> stream Hb` 0`B0C1̌zEEhF" endstream endobj 898 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 0 rL33b endstream endobj 899 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 54 /Filter /FlateDecode >> stream Hb` 022cBfffRILk8B T' endstream endobj 900 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1502 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0I6t endstream endobj 901 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0F  endstream endobj 902 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb`A`bBb@4 endstream endobj 903 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 46 /Filter /FlateDecode >> stream Hb` !ã7`؁yQ": endstream endobj 904 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` )F*&81 " endstream endobj 905 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 4A{(`!@. endstream endobj 906 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` a B*&& 4t`  endstream endobj 907 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb`,*& b"_ endstream endobj 908 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` L*&81 H  endstream endobj 909 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 44 /Filter /FlateDecode >> stream Hb`xULPlF.CG( 'O endstream endobj 910 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` QxxTLHL&F` { endstream endobj 911 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 39 /Filter /FlateDecode >> stream Hb` aŭ/`Dz B: endstream endobj 912 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 00a` b endstream endobj 913 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0228@  endstream endobj 914 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0 0a.<  Z endstream endobj 915 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0HF(  endstream endobj 916 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0H2 0@ endstream endobj 917 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0H1 (Q4@ = endstream endobj 918 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0F&@T endstream endobj 919 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0%C(  endstream endobj 920 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022b84h   endstream endobj 921 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0%C( endstream endobj 922 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022b endstream endobj 923 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0%C(Eh #~ endstream endobj 924 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`ALȈGCԯCT301 endstream endobj 925 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` aG%A0|` endstream endobj 926 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 40 /Filter /FlateDecode >> stream Hb` )Fd)"$k h (0rFA endstream endobj 927 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` ) = p;:0T endstream endobj 928 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` Q0P  endstream endobj 929 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` Q0h ` endstream endobj 930 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` a(#~ endstream endobj 931 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb`AQ@` 7 endstream endobj 932 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 0jl:pm  endstream endobj 933 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 61 /Filter /FlateDecode >> stream Hb` 0Bqb:0]T;ɴp&[')p6#"(I``zF endstream endobj 934 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 40 /Filter /FlateDecode >> stream Hb` 02"S$45f;RC@ endstream endobj 935 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 58 /Filter /FlateDecode >> stream Hb` 02"Sr5Q|@F`+v L12Na1&E.0R_5 endstream endobj 936 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 02"Sdr(MV, P endstream endobj 937 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb` 02"SrNLEA@ endstream endobj 938 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb` 02"SdruBQL`mdiF` endstream endobj 939 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 02"S 4_3^}Oj'Khf= endstream endobj 940 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 022(7lCt` endstream endobj 941 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 58 /Filter /FlateDecode >> stream Hb` 0Bq%S75R`1a(8RՁ"%7URlJ endstream endobj 942 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@BS( 0$9a endstream endobj 943 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`!$\p @  endstream endobj 944 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`AAG_ endstream endobj 945 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r`|` endstream endobj 946 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 022v|a` endstream endobj 947 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFf$ endstream endobj 948 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`$DQ@DS` endstream endobj 949 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`b@G@0p)0 endstream endobj 950 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`# |   endstream endobj 951 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`3 ѣ 8 = endstream endobj 952 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rO@7 endstream endobj 953 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vAO@ endstream endobj 954 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022vF€x U( endstream endobj 955 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r^' endstream endobj 956 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`$D{ |  endstream endobj 957 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`b@G u*)0 2 endstream endobj 958 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb`H2@0L  |   endstream endobj 959 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022v'G endstream endobj 960 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rF(0& endstream endobj 961 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r>#u0 endstream endobj 962 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022vh"q0 endstream endobj 963 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` Aŭr>#u0  endstream endobj 964 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`)2 endstream endobj 965 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`A€.Ca_Sd@d endstream endobj 966 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`b@ 3^ endstream endobj 967 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`!ĂP9A:EFW endstream endobj 968 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` )2 F endstream endobj 969 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 7LA:EF endstream endobj 970 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022v0F€-D@* endstream endobj 971 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0rp&F endstream endobj 972 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022v0®&Fi endstream endobj 973 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0 l (3 ( endstream endobj 974 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0{0{ endstream endobj 975 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022z0, endstream endobj 976 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`$DʁEm@  endstream endobj 977 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`b@ ,h#  endstream endobj 978 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` <0|`Av@`^ endstream endobj 979 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` A: endstream endobj 980 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`0=Agv@` endstream endobj 981 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`a#Em@ endstream endobj 982 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`ALEp`@Y=F endstream endobj 983 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022j0 haK$e, endstream endobj 984 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0U ~# ` endstream endobj 985 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022jU ~#  endstream endobj 986 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0xHPo@&* endstream endobj 987 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0x@L–# f endstream endobj 988 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022h3)V00  endstream endobj 989 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 022 haK/6. endstream endobj 990 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0xU#  endstream endobj 991 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0# c endstream endobj 992 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` LqM)FCiF endstream endobj 993 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`Ɛ"MѨ0f' endstream endobj 994 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS5 2444 0 R /CS6 2445 0 R /CS7 1429 0 R /CS8 1430 0 R /CS9 1447 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT2 2467 0 R /TT3 2471 0 R >> /XObject << /Im248 1478 0 R /Im249 997 0 R /Im250 998 0 R /Im251 999 0 R /Im252 1000 0 R /Im253 1001 0 R /Im254 1002 0 R /Im255 1003 0 R /Im256 1004 0 R /Im257 1005 0 R /Im258 1006 0 R /Im259 1007 0 R /Im260 1008 0 R /Im261 1009 0 R /Im262 1010 0 R /Im263 1011 0 R /Im264 1012 0 R /Im265 1013 0 R /Im266 1014 0 R /Im267 1015 0 R /Im268 1016 0 R /Im269 1017 0 R /Im270 1018 0 R /Im271 1019 0 R /Im272 1020 0 R /Im273 1021 0 R /Im274 1022 0 R /Im275 1023 0 R /Im276 1024 0 R /Im277 1025 0 R /Im278 1026 0 R /Im279 1027 0 R /Im280 1028 0 R /Im281 1029 0 R /Im282 1030 0 R /Im283 1031 0 R /Im284 1032 0 R /Im285 1033 0 R /Im286 1034 0 R /Im287 1035 0 R /Im288 1036 0 R /Im289 1037 0 R /Im290 1038 0 R /Im291 1039 0 R /Im292 1040 0 R /Im293 1041 0 R /Im294 1042 0 R /Im295 1043 0 R /Im296 1044 0 R /Im297 1045 0 R /Im298 1046 0 R /Im299 1047 0 R /Im300 1048 0 R /Im301 1049 0 R /Im302 1050 0 R /Im303 1051 0 R /Im304 1052 0 R /Im305 1053 0 R /Im306 1054 0 R /Im307 1055 0 R /Im308 1056 0 R /Im309 1057 0 R /Im310 1058 0 R /Im311 1059 0 R /Im312 1060 0 R /Im313 1061 0 R /Im314 1062 0 R /Im315 1063 0 R /Im316 1064 0 R /Im317 1065 0 R /Im318 1066 0 R /Im319 1067 0 R /Im320 1068 0 R /Im321 1069 0 R /Im322 1070 0 R /Im323 1071 0 R /Im324 1072 0 R /Im325 1073 0 R /Im326 1074 0 R /Im327 1075 0 R /Im328 1076 0 R /Im329 1077 0 R /Im330 1078 0 R /Im331 1079 0 R /Im332 1080 0 R /Im333 1081 0 R /Im334 1082 0 R /Im335 1083 0 R /Im336 1084 0 R /Im337 1085 0 R /Im338 1086 0 R /Im339 1087 0 R /Im340 1088 0 R /Im341 1089 0 R /Im342 1090 0 R /Im343 1091 0 R /Im344 1092 0 R /Im345 1093 0 R /Im346 1094 0 R /Im347 1095 0 R /Im348 1096 0 R /Im349 1097 0 R /Im350 1098 0 R /Im351 1099 0 R /Im352 1100 0 R /Im353 1101 0 R /Im354 1102 0 R /Im355 1103 0 R /Im356 1104 0 R /Im357 1105 0 R /Im358 1106 0 R /Im359 1107 0 R /Im360 1108 0 R /Im361 1109 0 R /Im362 1110 0 R /Im363 1111 0 R /Im364 1112 0 R /Im365 1113 0 R /Im366 1114 0 R /Im367 1115 0 R /Im368 1116 0 R /Im369 1117 0 R /Im370 1118 0 R /Im371 1119 0 R /Im372 1120 0 R /Im373 1121 0 R /Im374 1122 0 R /Im375 1123 0 R /Im376 1124 0 R /Im377 1125 0 R /Im378 1126 0 R /Im379 1127 0 R /Im380 1128 0 R /Im381 1129 0 R /Im382 1130 0 R /Im383 1131 0 R /Im384 1132 0 R /Im385 1133 0 R /Im386 1134 0 R /Im387 1135 0 R /Im388 1136 0 R /Im389 1137 0 R /Im390 1138 0 R /Im391 1139 0 R /Im392 1140 0 R /Im393 1141 0 R /Im394 1142 0 R /Im395 1143 0 R /Im396 1144 0 R /Im397 1145 0 R /Im398 1146 0 R /Im399 1147 0 R /Im400 1148 0 R /Im401 1149 0 R /Im402 1150 0 R /Im403 1151 0 R /Im404 1152 0 R /Im405 1153 0 R /Im406 1154 0 R /Im407 1155 0 R /Im408 1156 0 R /Im409 1157 0 R /Im410 1158 0 R /Im411 1159 0 R /Im412 1160 0 R /Im413 1161 0 R /Im414 1162 0 R /Im415 1163 0 R /Im416 1164 0 R /Im417 1165 0 R /Im418 1166 0 R /Im419 1167 0 R /Im420 1168 0 R /Im421 1169 0 R /Im422 1170 0 R /Im423 1171 0 R /Im424 1172 0 R /Im425 1173 0 R /Im426 1174 0 R /Im427 1175 0 R /Im428 1176 0 R /Im429 1177 0 R /Im430 1477 0 R /Im431 1453 0 R /Im432 1479 0 R /Im433 1480 0 R /Im434 1178 0 R /Im435 1179 0 R /Im436 1180 0 R /Im437 1181 0 R /Im438 1182 0 R /Im439 1183 0 R /Im440 1184 0 R /Im441 1185 0 R /Im442 1186 0 R /Im443 1187 0 R /Im444 1188 0 R /Im445 1189 0 R /Im446 1190 0 R /Im447 1191 0 R /Im448 1192 0 R /Im449 1193 0 R /Im450 1194 0 R /Im451 1195 0 R /Im452 1196 0 R /Im453 1197 0 R /Im454 1198 0 R /Im455 1199 0 R /Im456 1200 0 R /Im457 1201 0 R /Im458 1202 0 R /Im459 1203 0 R /Im460 1204 0 R /Im461 1205 0 R /Im462 1206 0 R /Im463 1207 0 R /Im464 1208 0 R /Im465 1209 0 R /Im466 1210 0 R /Im467 1211 0 R /Im468 1212 0 R /Im469 1213 0 R /Im470 1214 0 R /Im471 1215 0 R /Im472 1216 0 R /Im473 1217 0 R /Im474 1218 0 R /Im475 1219 0 R /Im476 1220 0 R /Im477 1221 0 R /Im478 1222 0 R /Im479 1223 0 R /Im480 1224 0 R /Im481 1225 0 R /Im482 1226 0 R /Im483 1227 0 R /Im484 1228 0 R /Im485 1481 0 R /Im486 1482 0 R /Im487 1483 0 R /Im488 1484 0 R /Im489 1485 0 R /Im490 1486 0 R /Im491 1487 0 R /Im492 1488 0 R /Im493 1489 0 R /Im494 1490 0 R /Im495 1475 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 995 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 8 >> endobj 995 0 obj << /Filter /FlateDecode /Length 996 0 R >> stream H[o7+xCHl71#ȇU-Jrr%*aG>K!.ě7Gg'Boߟj4(1l3>^xr:8pjJ7d#U^BhO"ؤw?xïbXOb5kn%%G,*Oyl{EfEy[?o2J5wLE,~U2~"+ebi7Wxv~piV |Mr/>/t-ĵvecBީlfj.&/x%7b2]y7v>e.7&ǹsT2S`z5[<h"_~9"[aQlwVA|AY66a=ڍVQ66Mgt> /;O+{`mt&d,F7g]V٤'njRdu?}ٝuɯc/\ޏ_~/CD]$շ7L_3T_+wT_\3\^r+@%?_ԟS*r+} bgW%Р/bg?LO=O ~鑿Ri= S2 ?2軔 ~v\ .[KW^o`wK+/+@7rYv7R2#O~'b_odEe>oe#oe&o|M7Q2M2k@2M?]yO0/؋k$5O/H~t}W-MO5%?WOeOST5OWQto\c9+O琟ْ3O3%?N#?W}%S:YSڄԟ6\? ?З#?_iFS"@hz?ӪJ4k"S25i }5?/l0 Ϧ_C=@ڀNu_c]毡ט_k5毥eZOkie>eZ_mk毥[U毭1-_UoAUe:?Ї=DCU?.{^Ke.c/v~옻ۤ۱Gu4UٱG{u'H#HL\G;T&jgj0i{z9+v6AE-ArV{|mnBvw0cku w5Ft|v#.pllz-nZLv9v*:Ʃ|)ğxXz20oX|~"t%WlTj__>}:峺|Q/?gօƄ}{hc.oR[^QPSE6%qS=]s=4EQ]WCշkz6M~#һnfq$a { `!REņ=`+O&" 5_? x_ϕyƧާt+ߟgً?={ @܎܆܆܍}'qw D;r;r;rr7MܟiTWKݽu*;==]fwuGսlWe6uG_ٍїYd$-rm"@,KCܾ7pNpݾrrO=/f;r;rr7r޹;7qgw.>-s"@ܤ/=I_zL2fk_ڗu!(vM_cw$qG܁'r־,pv6n&{&qυ܁܁ڗ_~ӟƬS ?I 7G284u꫽bZ,c2h2}@{GvI/g_67]t^ozߧJGVbOfGV'Ӄ{LڪHC!{cv}3'@vW;;:wMKKng˷曮zN~7YuieZriݑۑېېw/lI--rm"De:/vth62ՋҴAg42Vd[3~q7;y^pO޿ڛQfw=ҭYg܍sw&q"Ծ⍵ ={mm݈{m^ڗ_>eB@I{Mȭ}E_Ҿ/iq_l({[ڗevlMܡ}Yg/־b?8OBrUIh_j? U|Yh_'/WD#=7'3=ܓ[r]^7[rڗiڗu#!!w#{h_Ic!w $=&rȭ}7vh_ڗ7[2//7k_}wOڗuv w D/ˮ}U_v}Ygk_پۓ}?};_mOcJzvfV^XYi4ʛ/77e/7[{62۴7zM{3}ծlڛtkoꞛnio[G䞘{bI#mnIm!w w Dܽri{cgO'_ endstream endobj 996 0 obj 3874 endobj 997 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 51 /Filter /FlateDecode >> stream Hb`!L1BI8 QȀ…`}`qJz3MVU endstream endobj 998 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 45 /Filter /FlateDecode >> stream Hb`!B'd L l Gb Gp# 1T5 endstream endobj 999 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 49 /Filter /FlateDecode >> stream Hb`!BpUI8UaT>b` ,0 endstream endobj 1000 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 54 /Filter /FlateDecode >> stream Hb`AHA!d*Q@Bz"FQpi:>0H!N endstream endobj 1001 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 45 /Filter /FlateDecode >> stream Hb`!C%hR1!N8%/3 endstream endobj 1002 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 45 /Filter /FlateDecode >> stream Hb`!B'd()dd3`h#F{ ,0 endstream endobj 1003 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 50 /Filter /FlateDecode >> stream Hb`!L12…< *ʆ GQ 7= endstream endobj 1004 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` e0=` endstream endobj 1005 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb`a0=`7 endstream endobj 1006 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` e8h0F endstream endobj 1007 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`a0h=D [ endstream endobj 1008 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` e0h=D  endstream endobj 1009 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`Ffd<"a endstream endobj 1010 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`FF f`110 endstream endobj 1011 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 42 /Filter /FlateDecode >> stream Hb`F !0f`dddT CGP@ "0! endstream endobj 1012 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`F0c1#^.N=C0@  endstream endobj 1013 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`Ffd`ŭgzq@ endstream endobj 1014 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` $`%YF4@ endstream endobj 1015 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` $`%Y2\`  endstream endobj 1016 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` `%B0U endstream endobj 1017 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 04iͣ(d d endstream endobj 1018 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` pp.0 endstream endobj 1019 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`d e endstream endobj 1020 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` p81ҍ0  endstream endobj 1021 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`d `1@u endstream endobj 1022 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` p8Qf, endstream endobj 1023 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@al0 7 endstream endobj 1024 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`@F( 8X Qf endstream endobj 1025 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 42 /Filter /FlateDecode >> stream Hb`@F(f`ddd/`DTk*C( c endstream endobj 1026 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@ހ4V=pr# F endstream endobj 1027 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@F(tH( endstream endobj 1028 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@P΀4 V=pr#  endstream endobj 1029 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` f#h3@; endstream endobj 1030 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` f#&  endstream endobj 1031 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` f#o@J endstream endobj 1032 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`f!Σo@ endstream endobj 1033 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` R04lԷ f endstream endobj 1034 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` RPdɚ!Y`Y endstream endobj 1035 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`RPdɚ!UT7  endstream endobj 1036 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` RPdɚi!F4@u   endstream endobj 1037 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`RPdɚi!@ endstream endobj 1038 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` RPdɚi!@h endstream endobj 1039 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@"+L< s endstream endobj 1040 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`@F(YAfx`  endstream endobj 1041 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`@F 1 Ef`'*f@'" endstream endobj 1042 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@F(T4Xh!dKh  ) endstream endobj 1043 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb`@fm-=f@ endstream endobj 1044 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`Ri$fCpig4 endstream endobj 1045 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` Ri&fQChfc  endstream endobj 1046 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` Ri&fQC|  endstream endobj 1047 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`Ri$fQC4  endstream endobj 1048 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 5̄Ms t3`d endstream endobj 1049 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` b[h1  endstream endobj 1050 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`aȶB` endstream endobj 1051 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` b- endstream endobj 1052 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` b-4Q  endstream endobj 1053 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`aC4Q  endstream endobj 1054 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`@` *Pl4> stream Hb`@@bFSC4Q S endstream endobj 1056 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb`@`$Ht#0z(`% endstream endobj 1057 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@F(42j@ g endstream endobj 1058 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@F01di"ke"6Z endstream endobj 1059 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@pT@&)V!rl0  endstream endobj 1060 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`!lY"6* endstream endobj 1061 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` di"liQ endstream endobj 1062 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` di"lib@ endstream endobj 1063 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`!liO  endstream endobj 1064 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` bBDi *4's endstream endobj 1065 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` dI0p   endstream endobj 1066 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`b"FM6!-0  endstream endobj 1067 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` d h`D事6  endstream endobj 1068 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`b"FM6` + endstream endobj 1069 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` d h8  endstream endobj 1070 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb`@@*Zm&Cb@ endstream endobj 1071 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb`@F(f`ddd65tڌ!|z'&n endstream endobj 1072 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@p? !> stream Hb`@H$!L@Cz  H endstream endobj 1074 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@(:!L@C{t J endstream endobj 1075 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`@h4!L@Cxd L endstream endobj 1076 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@F0u!j endstream endobj 1077 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` ? !E` endstream endobj 1078 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` ? !O endstream endobj 1079 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`2`@C=4h|B 0 I endstream endobj 1080 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`a4v A0h|B 0q endstream endobj 1081 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`Hv1  endstream endobj 1082 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb`46AHv#1 X endstream endobj 1083 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`Hv#:h  endstream endobj 1084 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`46AHv` 1  endstream endobj 1085 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`Hv`Q b endstream endobj 1086 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`h8~ih&`lf0F endstream endobj 1087 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 44 /Filter /FlateDecode >> stream Hb`@g)M AҀ!lf0Q endstream endobj 1088 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 45 /Filter /FlateDecode >> stream Hb`@F(@N $[3#4 W 6? endstream endobj 1089 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`@F(f`"0U endstream endobj 1090 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb`@F(6`xx U endstream endobj 1091 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb`@  endstream endobj 1092 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 44 /Filter /FlateDecode >> stream Hb`Dʂ4#1SV(@% endstream endobj 1093 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 44 /Filter /FlateDecode >> stream Hb`@PK4##SV(@K endstream endobj 1094 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 53 /Filter /FlateDecode >> stream Hb`@Pe'%3H5I n)|x}f}`k endstream endobj 1095 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 48 /Filter /FlateDecode >> stream Hb`@PįьxdpY%4>#t endstream endobj 1096 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 50 /Filter /FlateDecode >> stream Hb`@P c`|Zh/HidJx=DK c! endstream endobj 1097 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb`@P"j&<[ H h&GH endstream endobj 1098 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 48 /Filter /FlateDecode >> stream Hb`HJƫ̈́e+aM,A``!' endstream endobj 1099 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 51 /Filter /FlateDecode >> stream Hb`!L1BI8 QȀ…`}`qL7@OJV endstream endobj 1100 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb`!B'd L l  /`ʩ  1S5 endstream endobj 1101 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 49 /Filter /FlateDecode >> stream Hb`!BpUI8UaB>B@,,0 endstream endobj 1102 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 55 /Filter /FlateDecode >> stream Hb`AHA!d*Q@Bz"FQpi:^0H"N endstream endobj 1103 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 47 /Filter /FlateDecode >> stream Hb`!C%hR1!N8Ƥʩ  18 endstream endobj 1104 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 44 /Filter /FlateDecode >> stream Hb`!B'd()ddh#t@,/ endstream endobj 1105 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 50 /Filter /FlateDecode >> stream Hb`!L12…< *ʆ3 h#$1;? endstream endobj 1106 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`Ffd`ŭgzq@k endstream endobj 1107 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` `%B` .F endstream endobj 1108 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` $`%BD8 H endstream endobj 1109 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` ;4  % endstream endobj 1110 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`ψ_y!8 ! b endstream endobj 1111 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` ;4a =0 GQ endstream endobj 1112 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` ;4Pf) endstream endobj 1113 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`ψ_y!*X ` r endstream endobj 1114 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@aK6g=D 4 endstream endobj 1115 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`@F( _1!* ` endstream endobj 1116 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 43 /Filter /FlateDecode >> stream Hb`@F(f`ddd/`DxMe@x>Br !` endstream endobj 1117 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`@ހ/4ncCpPn@P endstream endobj 1118 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@F(tx:@Bv endstream endobj 1119 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`0&l<=r# endstream endobj 1120 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0&lR  D endstream endobj 1121 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0&xZ[`T endstream endobj 1122 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`0&l<> stream Hb` R0 M6R5o@p endstream endobj 1124 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` R0%$MmԷ  endstream endobj 1125 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`R0%$M6{nM0 endstream endobj 1126 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` R0%$M6:RFAs endstream endobj 1127 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`R0%$M6za` endstream endobj 1128 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` R0%$MmT4, endstream endobj 1129 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@怑.!iܶC4, endstream endobj 1130 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 46 /Filter /FlateDecode >> stream Hb`@F(f`ddd6`Dhxqɀ}Dc%! endstream endobj 1131 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`@F 0)i'-=f@0 endstream endobj 1132 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@F(Tp I㳓fB z endstream endobj 1133 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`@Pꀑ.!iܖCp;hg4 endstream endobj 1134 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` R)&l9-!=e endstream endobj 1135 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` R)&r-B0 endstream endobj 1136 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`R)&l95=D  endstream endobj 1137 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` ^+s Iv f  endstream endobj 1138 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` %$M[(T5` endstream endobj 1139 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`%$M-ٶS i endstream endobj 1140 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` %$M-TN!08W endstream endobj 1141 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`%$M-xA 0y endstream endobj 1142 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` %$M[訙 0 endstream endobj 1143 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb`@` z\B\A endstream endobj 1144 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@@%${*A0 endstream endobj 1145 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 45 /Filter /FlateDecode >> stream Hb`@`$HM.!inBx j@+B$ endstream endobj 1146 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`@F(tM$=Dm; endstream endobj 1147 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`@F01%$IyTh  endstream endobj 1148 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@pTz\BEȱ  endstream endobj 1149 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`@`tz\BEȱ ' endstream endobj 1150 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` %$M0RH 2H endstream endobj 1151 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` %$M, endstream endobj 1152 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb`z%$M!r|OC` endstream endobj 1153 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` bB KH M"G endstream endobj 1154 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` R 4I\BiH6  endstream endobj 1155 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`b% M4A@6 I endstream endobj 1156 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` R 4I\B#iTi  ,.: endstream endobj 1157 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb`b% M4A@C$GW`X endstream endobj 1158 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` R 4I\B $GW` endstream endobj 1159 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb`@K@$.!iHmހ endstream endobj 1160 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`@F(#^.iqb=Dy  endstream endobj 1161 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 44 /Filter /FlateDecode >> stream Hb`@` `DXtS%$# endstream endobj 1162 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@H$`$Kjz  endstream endobj 1163 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@(:`$Kj{t endstream endobj 1164 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@h4`$Kj xd endstream endobj 1165 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`@F0FR,H5o`@ endstream endobj 1166 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` b璦"H6  endstream endobj 1167 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` b璦"FT  $, endstream endobj 1168 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 33 /Filter /FlateDecode >> stream Hb` b璦" n` endstream endobj 1169 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb`20%M5Ef"ـ endstream endobj 1170 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`a4 ;45" 7@' endstream endobj 1171 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`hri&,€y endstream endobj 1172 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`40)\4faH  d endstream endobj 1173 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`hri&,€j@ endstream endobj 1174 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb`40)\4faHA  endstream endobj 1175 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`hri&,€d n endstream endobj 1176 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 47 /Filter /FlateDecode >> stream Hb`@g@ DRE3,͸p)@! ] endstream endobj 1177 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 57 /Filter /FlateDecode >> stream Hb`@F(@ "0#NdikFţ/@!iAH endstream endobj 1178 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`@BS( 0b@l endstream endobj 1179 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb`!$\p Rp ) endstream endobj 1180 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb`AAG '@N+ endstream endobj 1181 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 0r`F&4u$ endstream endobj 1182 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 022vF&4&& endstream endobj 1183 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rF '@ BE endstream endobj 1184 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 35 /Filter /FlateDecode >> stream Hb`$DQ &CRp<k endstream endobj 1185 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 35 /Filter /FlateDecode >> stream Hb`b@GD`(@ Nni endstream endobj 1186 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb`#02 B !n endstream endobj 1187 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 37 /Filter /FlateDecode >> stream Hb`3 ѣ `d"0 '@j endstream endobj 1188 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0rF&CRpe endstream endobj 1189 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 022vF&CR`g endstream endobj 1190 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022vF€P endstream endobj 1191 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0rF&B H `%M endstream endobj 1192 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 37 /Filter /FlateDecode >> stream Hb`$D*0 '@- endstream endobj 1193 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb`b@G `d"P* endstream endobj 1194 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 41 /Filter /FlateDecode >> stream Hb`H2@0L *0 $@4r endstream endobj 1195 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 022vF&B H `' endstream endobj 1196 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0rF CRp3 endstream endobj 1197 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0rF&*0 '@A endstream endobj 1198 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 022vhF&*0 &@D^ endstream endobj 1199 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 39 /Filter /FlateDecode >> stream Hb` AŭrF&*0 '@H endstream endobj 1200 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 38 /Filter /FlateDecode >> stream Hb` PGG endstream endobj 1201 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 41 /Filter /FlateDecode >> stream Hb`A€.C02V)$ M endstream endobj 1202 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 38 /Filter /FlateDecode >> stream Hb`b@`d"* CRpGI endstream endobj 1203 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 38 /Filter /FlateDecode >> stream Hb`!ĂP9#@Pa  L endstream endobj 1204 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 38 /Filter /FlateDecode >> stream Hb`  PE endstream endobj 1205 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 7L#@Pa  GA endstream endobj 1206 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 022v0F€ H `W endstream endobj 1207 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0rpF&B Zg, endstream endobj 1208 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 022v0F&B Zjb. endstream endobj 1209 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0 `"H `~M endstream endobj 1210 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0 Zm endstream endobj 1211 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 022 Zo endstream endobj 1212 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 39 /Filter /FlateDecode >> stream Hb`$DʁLAU0~s endstream endobj 1213 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 39 /Filter /FlateDecode >> stream Hb`b@`d"* F '@q endstream endobj 1214 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 41 /Filter /FlateDecode >> stream Hb` <0|`#@Pa0)$ u endstream endobj 1215 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 37 /Filter /FlateDecode >> stream Hb` A H `Ep endstream endobj 1216 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb`0=#@Pa0)8 Fp endstream endobj 1217 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb`a#LAU0Gp endstream endobj 1218 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 39 /Filter /FlateDecode >> stream Hb`ALEp`DT@X-@ NRu endstream endobj 1219 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 022j0`"* F &@ endstream endobj 1220 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0 b̡ endstream endobj 1221 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 022j bR endstream endobj 1222 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0xH0U R# W endstream endobj 1223 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0xDT@X 5)8  endstream endobj 1224 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 022h3 F &@  endstream endobj 1225 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 022`"* b2 endstream endobj 1226 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0 bT,4 endstream endobj 1227 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 36 /Filter /FlateDecode >> stream Hb` LqDT1|@ NY endstream endobj 1228 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 35 /Filter /FlateDecode >> stream Hb`FH0V1|@ Nx endstream endobj 1229 0 obj << /Type /Page /Parent 2437 0 R /Resources << /ColorSpace << /CS13 2444 0 R /CS14 2445 0 R /CS15 1429 0 R /CS16 1430 0 R /CS17 1447 0 R /CS18 1515 0 R /CS19 1516 0 R /CS20 1517 0 R /CS21 1518 0 R /CS22 1519 0 R /CS23 1520 0 R /CS24 1521 0 R /CS25 1522 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT4 2467 0 R /TT5 2471 0 R /TT6 2447 0 R /TT7 2464 0 R >> /XObject << /Im108 1453 0 R /Im109 1454 0 R /Im110 1455 0 R /Im111 1232 0 R /Im112 1233 0 R /Im113 1234 0 R /Im114 1235 0 R /Im115 1236 0 R /Im116 1237 0 R /Im117 1238 0 R /Im118 1239 0 R /Im119 1240 0 R /Im120 1241 0 R /Im121 1242 0 R /Im122 1243 0 R /Im123 1244 0 R /Im124 1245 0 R /Im125 1246 0 R /Im126 1247 0 R /Im127 1248 0 R /Im128 1249 0 R /Im129 1250 0 R /Im130 1251 0 R /Im131 1252 0 R /Im132 1253 0 R /Im133 1254 0 R /Im134 1255 0 R /Im135 1256 0 R /Im136 1257 0 R /Im137 1258 0 R /Im138 1259 0 R /Im139 1260 0 R /Im140 1261 0 R /Im141 1262 0 R /Im142 1263 0 R /Im143 1264 0 R /Im144 1265 0 R /Im145 1266 0 R /Im146 1267 0 R /Im147 1268 0 R /Im148 1269 0 R /Im149 1270 0 R /Im150 1271 0 R /Im151 1272 0 R /Im152 1273 0 R /Im153 1274 0 R /Im154 1275 0 R /Im155 1276 0 R /Im156 1277 0 R /Im157 1278 0 R /Im158 1279 0 R /Im159 1280 0 R /Im160 1281 0 R /Im161 1282 0 R /Im162 1283 0 R /Im163 1284 0 R /Im164 1285 0 R /Im165 1286 0 R /Im166 1287 0 R /Im167 1288 0 R /Im168 1289 0 R /Im169 1290 0 R /Im170 1291 0 R /Im171 1292 0 R /Im172 1293 0 R /Im173 1294 0 R /Im174 1295 0 R /Im175 1296 0 R /Im176 1297 0 R /Im177 1298 0 R /Im178 1299 0 R /Im179 1300 0 R /Im180 1301 0 R /Im181 1302 0 R /Im182 1303 0 R /Im183 1304 0 R /Im184 1305 0 R /Im185 1306 0 R /Im186 1307 0 R /Im187 1308 0 R /Im188 1309 0 R /Im189 1310 0 R /Im190 1311 0 R /Im191 1312 0 R /Im192 1313 0 R /Im193 1314 0 R /Im194 1315 0 R /Im195 1316 0 R /Im196 1457 0 R /Im197 1456 0 R /Im198 1458 0 R /Im199 1459 0 R /Im200 1460 0 R /Im201 1462 0 R /Im202 1461 0 R /Im203 1463 0 R /Im204 1464 0 R /Im205 1465 0 R /Im206 1466 0 R /Im207 1467 0 R /Im208 1468 0 R /Im209 1469 0 R /Im210 1470 0 R /Im211 1471 0 R /Im212 1472 0 R /Im213 1473 0 R /Im214 1474 0 R /Im215 1475 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 1230 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 9 >> endobj 1230 0 obj << /Filter /FlateDecode /Length 1231 0 R >> stream H]oF+fh(M M7bhi,zEJR5q|(;3>U}{t~|v"xB D\/hk>nWMfqBn\J׋7*K! PzJREyXVkQV\X+WE:`}ZyhU+qYm:9`>:,qjZRM^,-w14çxo7ovcw׍nwa"#|>>LĉaOڨxjS-zw#bߊJ<˾>K9[LSse6E!E]oQp]tf]W_( c'.UXl:-JVN-9N-sL~ ݥYa~RLTFɟߨf6KT$-~8R|cz۫+] >~v5n&ݿ6=˰ME%>Wͺbxa-)oݝEoE~%[!w9N(N?lSXFWg+bqKKn9ܹ۳۱-۰5[[rmpjnXܞY܎mY܆mXܚŭXܒ-;&DMf䞩PȭlEd/PD62"їQKl T6RQ3hЗsl$5F_*jN4RSїzfl#\ j%Yܚō%[%Jn9 }9;cgq{cq[VїzdP 3'ۘїt6F_jꌕ-#[ ~Kv,n,nF_{X܊-./} _M%!|rz̞#!\KKC./ qM]B_rNЗsrїfmP Ff0/l\uj7ζ,n6,nV,n%;Dw~9Зsc6F_K;sjٚŭX܊-9#G,nF_{۲ }i){\їrG_ZRtKKU}i3֡/-uV9ҡ/l%tԝ͡/5'}9qKG͉C_:rNЗt6rzmۢ/ᶁY܎mYKr/aqkbq+Vї: QgA_UGVlAY܎XK:۰5[[r5K8:ru`qO|9c#|їi13P ܔ/5SgF_zKOU}驽T˹}B_їs#}T˹1};B_نŭYK:[%[&n۝1;=۱}sP/uJ\ujF_@6%Pzn"ۦMY܎mY܆ōR[їFe1>;/Ìle \hїZ ZfZR_jIͷMͷ_jIͷIMͷMM@njNGn#7bԊ: R+j/ R+j/ R+r/5r{-9mЗdF_:ruU;4ߧNj_۷Gg'"w>/+ -׋Zt,P^4.rQB폻eL55[pRX8Er J,m^, ^~x0.rXXX N aoSovc#ǶXm--ȿMaC%%a/dKmPעz\kqj{}|T lWjS=ur>&FXH%1m+vbݮ߬뛪oDӋfŪ^D0.^~ho.t=/jϡ6+dMdA/(v8MReGr2Uwp5R4$vik >iHpӋZBi63aSdIAa{֝mrU[M~vӮS<(ja݂zbT.- > V\m-ķnhsoO?]e6EFHsZ-@"4'nMH 6 "#m6{vݭCX1?Qf~!ti j#trgum ڄ0 YbfxNn"BGaѻ:EٖZޞի Í^{=+*<IQ[@_ dU?>bхy2(Q`MGma`ns endstream endobj 1231 0 obj 2813 endobj 1232 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` FQ@` endstream endobj 1233 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`a4@9T*w endstream endobj 1234 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`0XTj endstream endobj 1235 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`@ eP*Gu@ endstream endobj 1236 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`@ e!S*Gu@. endstream endobj 1237 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`QT* K endstream endobj 1238 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`R M(FF.- endstream endobj 1239 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`QT`$pj0{( endstream endobj 1240 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`h8QN{( endstream endobj 1241 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`a4@9T`$pj0+ endstream endobj 1242 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` FQN) endstream endobj 1243 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFF" endstream endobj 1244 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` 022vDFF $ endstream endobj 1245 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0rFNc @ endstream endobj 1246 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 30 /Filter /FlateDecode >> stream Hb` 0rF&|i,@] endstream endobj 1247 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 022vF&|i,@f_ endstream endobj 1248 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb`ArdF&|i,@b endstream endobj 1249 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 33 /Filter /FlateDecode >> stream Hb` !ãrF&|i,@"xd endstream endobj 1250 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 35 /Filter /FlateDecode >> stream Hb` $[HL#X!c endstream endobj 1251 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` )F*G `d Ia endstream endobj 1252 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 34 /Filter /FlateDecode >> stream Hb` !G0>@H3N[ 5 endstream endobj 1253 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 36 /Filter /FlateDecode >> stream Hb` !ãrF&`$p `C endstream endobj 1254 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 38 /Filter /FlateDecode >> stream Hb` $[Lx#3>H A endstream endobj 1255 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 38 /Filter /FlateDecode >> stream Hb` )F* `d F> endstream endobj 1256 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 38 /Filter /FlateDecode >> stream Hb` !$#[Lx#3>H @P endstream endobj 1257 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 36 /Filter /FlateDecode >> stream Hb`ArF&`$p `@R endstream endobj 1258 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 33 /Filter /FlateDecode >> stream Hb` 0rF&`$p `9Y endstream endobj 1259 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 35 /Filter /FlateDecode >> stream Hb` 022vF&`$p `< endstream endobj 1260 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1515 0 R /Length 35 /Filter /FlateDecode >> stream Hb` 0r0F /`d; H endstream endobj 1261 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 0r0F&|/`d n0l:- endstream endobj 1262 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 022vF&|/`d n0n/ endstream endobj 1263 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 40 /Filter /FlateDecode >> stream Hb`ƫrF&|/`d n0q1 endstream endobj 1264 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 40 /Filter /FlateDecode >> stream Hb`rF&|/`d n0t3 endstream endobj 1265 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 42 /Filter /FlateDecode >> stream Hb` #GL#3^Ȃ08`s/2 endstream endobj 1266 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 42 /Filter /FlateDecode >> stream Hb` ![L#3^Ȃ08`s52 endstream endobj 1267 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 40 /Filter /FlateDecode >> stream Hb` QU!Ȅ02,#Mo / endstream endobj 1268 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1516 0 R /Length 44 /Filter /FlateDecode >> stream Hb` Hȼ &|/`dX; yV endstream endobj 1269 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 44 /Filter /FlateDecode >> stream Hb` ŭrPF&|`d YF B endstream endobj 1270 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 46 /Filter /FlateDecode >> stream Hb` $[L#3>Ȃ0Nt endstream endobj 1271 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 45 /Filter /FlateDecode >> stream Hb` )F*`dF`$p  endstream endobj 1272 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 46 /Filter /FlateDecode >> stream Hb` #G`L#3>Ȃ0N  endstream endobj 1273 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 44 /Filter /FlateDecode >> stream Hb` !ãr0F&|`d YF  endstream endobj 1274 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 44 /Filter /FlateDecode >> stream Hb`ƫrF&|`d YF  endstream endobj 1275 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 0r`#>Ȍ0# endstream endobj 1276 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 43 /Filter /FlateDecode >> stream Hb` 022v #>Ȍ0# endstream endobj 1277 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1517 0 R /Length 42 /Filter /FlateDecode >> stream Hb` 0ƀ`F .0̔ endstream endobj 1278 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 0ƀ /`dYFV `$pz r endstream endobj 1279 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 46 /Filter /FlateDecode >> stream Hϱ 0's]1ۯXmHQ\C9T t endstream endobj 1280 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 1 Ff|`d F fs endstream endobj 1281 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 47 /Filter /FlateDecode >> stream Hb`,*Ff|`d F t endstream endobj 1282 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 48 /Filter /FlateDecode >> stream Hb` L*Ff|`d F /u endstream endobj 1283 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 47 /Filter /FlateDecode >> stream Hb`ƫ /`dYFV `$pz v endstream endobj 1284 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 48 /Filter /FlateDecode >> stream Hb`A /`dYFV `$pz v endstream endobj 1285 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1518 0 R /Length 52 /Filter /FlateDecode >> stream Hb` !<ʩ&`dYF6|q@? endstream endobj 1286 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 52 /Filter /FlateDecode >> stream Hb` a[%#>Ȍ0#^Ȏ08 `D endstream endobj 1287 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 52 /Filter /FlateDecode >> stream Hb`$S%#>Ȍ0#^Ȏ08 `D endstream endobj 1288 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 51 /Filter /FlateDecode >> stream Hb`ǩꀑ `d YFV| /`d 0 J endstream endobj 1289 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 51 /Filter /FlateDecode >> stream Hb`,*Ff`dFv|]B endstream endobj 1290 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 48 /Filter /FlateDecode >> stream HϹ 1Dj7]~cR1 ˰P^@ endstream endobj 1291 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 48 /Filter /FlateDecode >> stream HϹ 1Dj7'!Ӱ [q `B endstream endobj 1292 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1519 0 R /Length 49 /Filter /FlateDecode >> stream Hb` 0&|/`dYF6 )`_ endstream endobj 1293 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 49 /Filter /FlateDecode >> stream Hй Sk*E\[M C1 ˰| 0;- endstream endobj 1294 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 51 /Filter /FlateDecode >> stream Hй0@_+`crk(a)Rq O>F/ endstream endobj 1295 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 53 /Filter /FlateDecode >> stream H9 5#:RDDQTCSt0bo,B2 endstream endobj 1296 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 53 /Filter /FlateDecode >> stream H9 5_L(׈,JD,Q0 S [EX4 endstream endobj 1297 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 54 /Filter /FlateDecode >> stream H+ ?1vO4UH7Oɗ(jhnX-C3 endstream endobj 1298 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 53 /Filter /FlateDecode >> stream H+ _ǘUQ;AFStPL2b7A)1 endstream endobj 1299 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 51 /Filter /FlateDecode >> stream H) ,)cbVmDn?b!Pxq>X/ endstream endobj 1300 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1520 0 R /Length 55 /Filter /FlateDecode >> stream H+ .vLL#҈ > stream H) .70 `;*"1H YCU4CW 4,6$_8 endstream endobj 1302 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 54 /Filter /FlateDecode >> stream H) na*f[E$&nJϮba)!08 endstream endobj 1303 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 55 /Filter /FlateDecode >> stream Hй [&DBbȁ8B޼PÐXW[8 endstream endobj 1304 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 54 /Filter /FlateDecode >> stream Hй [&EB,9G86e1TE3t0a*`8 endstream endobj 1305 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 54 /Filter /FlateDecode >> stream H;  $M"b0j 08 endstream endobj 1306 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 54 /Filter /FlateDecode >> stream Hй [~o[&d'CU4CW 4,6|_8 endstream endobj 1307 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 55 /Filter /FlateDecode >> stream Hй @O @Ɖ¯ ? endstream endobj 1308 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 50 /Filter /FlateDecode >> stream Hй FjW"]޺ba)06 endstream endobj 1309 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 50 /Filter /FlateDecode >> stream Hй b"" H.hiXmx: 8 endstream endobj 1310 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1521 0 R /Length 50 /Filter /FlateDecode >> stream Hй G:ŕbfa&;<{'9U endstream endobj 1311 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1522 0 R /Length 50 /Filter /FlateDecode >> stream Hй _/HőI EQ M 0p=^ endstream endobj 1312 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1522 0 R /Length 50 /Filter /FlateDecode >> stream H) [`At_I EQ M 0p=` endstream endobj 1313 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1522 0 R /Length 54 /Filter /FlateDecode >> stream H;Q,xd AH(hnix޼c endstream endobj 1314 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1522 0 R /Length 54 /Filter /FlateDecode >> stream H;Qxd 5FE2dE1TE3tPL%e endstream endobj 1315 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1522 0 R /Length 56 /Filter /FlateDecode >> stream H9 A[`A\t NvQ YQ U 0y 0b endstream endobj 1316 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1522 0 R /Length 59 /Filter /FlateDecode >> stream H; ѝIr)> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT4 2467 0 R /TT5 2471 0 R /TT6 2447 0 R /TT7 1476 0 R >> /XObject << /Im79 1320 0 R /Im80 1321 0 R /Im81 1322 0 R /Im82 1323 0 R /Im83 1324 0 R /Im84 1325 0 R /Im85 1326 0 R /Im86 1327 0 R /Im87 1328 0 R /Im88 1329 0 R /Im89 1330 0 R /Im90 1331 0 R /Im91 1332 0 R /Im92 1333 0 R /Im93 1334 0 R /Im94 1335 0 R /Im95 1336 0 R /Im96 1337 0 R /Im97 1338 0 R /Im98 1339 0 R /Im99 1340 0 R /Im100 1341 0 R /Im101 1342 0 R /Im102 1343 0 R /Im103 1344 0 R /Im104 1345 0 R /Im105 1346 0 R /Im106 1347 0 R /Im107 1348 0 R /Im108 1349 0 R /Im109 1350 0 R /Im110 1351 0 R /Im111 1352 0 R /Im112 1353 0 R /Im113 1354 0 R /Im114 1355 0 R /Im115 1356 0 R /Im116 1357 0 R /Im117 1358 0 R /Im118 1359 0 R /Im119 1360 0 R /Im120 1361 0 R /Im121 1362 0 R /Im122 1363 0 R /Im123 1364 0 R /Im124 1365 0 R /Im125 1366 0 R /Im126 1367 0 R /Im127 1368 0 R /Im128 1369 0 R /Im129 1370 0 R /Im130 1371 0 R /Im131 1372 0 R /Im132 1373 0 R /Im133 1374 0 R /Im134 1375 0 R /Im135 1376 0 R /Im136 1377 0 R /Im137 1378 0 R /Im138 1379 0 R /Im139 1380 0 R /Im140 1381 0 R /Im141 1382 0 R /Im142 1383 0 R /Im143 1384 0 R /Im144 1385 0 R /Im145 1386 0 R /Im146 1387 0 R /Im147 1388 0 R /Im148 1389 0 R /Im149 1390 0 R /Im150 1391 0 R /Im151 1392 0 R /Im152 1393 0 R /Im153 1394 0 R /Im154 1395 0 R /Im155 1396 0 R /Im156 1397 0 R /Im157 1398 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 1318 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 10 >> endobj 1318 0 obj << /Filter /FlateDecode /Length 1319 0 R >> stream HWrI}WL,+^k Y3 kȬ7[Vg-e ",Oe*hOx (> V\ zvuy8p1c?wdjOF*R{gkȠ-o.N.1f[%M/Λdׂ$] P Am:7t?c-x[oOɻ;S%KNhʝ_ \tj69Y.k-_+kQk ΓUv렬1ڶtv}?o/OދwxPێ&x A/fmc?&zA/% EF "@:SM"א_"\$ꂣ. NXIIћwl+}uFXϣt{$ޗ Zu}^Mr2T! ʽX@n\צpVTOi >c{&Z>(½L% } 4mI.i#mZ%anĎ8Ƣ߲$a0TLpm9lS R΃aD.o: 8c8 ֱ"6 1q8ZC D=\>H.ݝE0Cu׏>[Se`pV :^T=)yd:rQ}A=;FWz=NjU7N͙C9O};(dST核U$30}P`0^M4XA Aw!g'X zwYb@\rVR\{  +-9%Ƌiߺ~Pl{yl:`m9Yl*rs*FFFEޅrdy tk`{lHȁJvpvȢ;snV텾k.f &hjJjU(\EV=Ua#RD'pBLv3yd'ܥHΉХ_߄[Jgii%*`> HUrqu7f  kf{昉kM03&\!ᢑ\(J4T렇Py$Ar̄91Z:$0_@[KV6~ 5P?}c{,{g=cV|ZRFsF֗ϢCe݃~݃˦ YU\@S6Mm882+\Еo ᴌK惃^`qjp0hpmmo &kKiJQ,ַnh)Wz7׳b߃ᦃҩzRLl^(7ʜ Zx/TnkNT udENYѽ KNZ[smrYg'ܠxL|=1;4W p%U<"U:XN2zQ >?P {N»ʦ78z7,2 8>+3` aù*ȒA/~ψ_dN% :el:T_ވgώ^] pŋQbtZ/i3:j/@4GO zA3#Ыh +˷ַKiuɏRN~mm C~#.E7,l.#?`B;D6GT#&31o|r+L}ُX/˜DSL )Q'b9_Lgbu3)n&ثv;ξl@l(QdX |Dt+om#n!hnfLQ-)%\K >&m'uRIeWo'Os}z"4Ѽ}t pyL鲨vf?!^<˰K5X[{bzXLZogW^U!WPW- ܍aPʷ޺6q)m“?HQ* WS!ۣ7t5_7jA hd+| ʠbz7_w۰)z܆]#[dO((aPp{4xɌX|BwXim~@\p}Ph6f=4Xڭt0OWFm1Ǎxwyr:|@VÇKtyet8Hv|!+94lգ+%{P .^"|Zc:yUsvylMJߗT݅[.띅zkq?E{?8  v Q q@-HvWZO8 󋝤=w> stream Hb`` : endstream endobj 1321 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 17 /Filter /FlateDecode >> stream Hb` endstream endobj 1322 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` 0rP  endstream endobj 1323 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0rF@ endstream endobj 1324 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 022vP endstream endobj 1325 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` FQ@K` endstream endobj 1326 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 40 /Filter /FlateDecode >> stream Hb`a4@9TzD|02 Ԁg.H endstream endobj 1327 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb`@ eP*G@ endstream endobj 1328 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1531 0 R /Length 35 /Filter /FlateDecode >> stream Hb`@ e!S*QQ  endstream endobj 1329 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1531 0 R /Length 33 /Filter /FlateDecode >> stream Hb`R M90(@)0} endstream endobj 1330 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`QT #q endstream endobj 1331 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`QTZ  endstream endobj 1332 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb`h8Q@K`  endstream endobj 1333 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb`a4@9TZ endstream endobj 1334 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 022vF @  endstream endobj 1335 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 0fbbB01 H3 M4`m endstream endobj 1336 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1492 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 0eC4)8#)x endstream endobj 1337 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0r02F@  endstream endobj 1338 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb`Ar02"h! endstream endobj 1339 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` $[( 0  endstream endobj 1340 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 56 /Filter /FlateDecode >> stream Hb` )F*Gi!ȓbrÖ́'fS endstream endobj 1341 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1493 0 R /Length 52 /Filter /FlateDecode >> stream Hb` $gc&& QxI1A9L'fa3A)p endstream endobj 1342 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` !ãr endstream endobj 1343 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` $[(;h 0 W endstream endobj 1344 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` )F*Gm@  endstream endobj 1345 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` !$#[( 0  endstream endobj 1346 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb`Ar ,D endstream endobj 1347 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 0fB"3)#V FÅdBR endstream endobj 1348 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1494 0 R /Length 44 /Filter /FlateDecode >> stream Hb` 0ebB"3)#Z Fօt#gp endstream endobj 1349 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0r0=  endstream endobj 1350 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`r  endstream endobj 1351 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` #G(7Fh 0 endstream endobj 1352 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` QU endstream endobj 1353 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 43 /Filter /FlateDecode >> stream Hb` HU@Ƨ!hN@$.d endstream endobj 1354 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1495 0 R /Length 39 /Filter /FlateDecode >> stream Hb` K1:@ƣ!hN @Iq endstream endobj 1355 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` )F*G8ZG#g@ endstream endobj 1356 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`ƫr  endstream endobj 1357 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0fBp!@-ix endstream endobj 1358 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1497 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 0eB0!@A endstream endobj 1359 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` 1`8`  endstream endobj 1360 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` L*G@ endstream endobj 1361 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 39 /Filter /FlateDecode >> stream Hb`ƫrcaBQ9J@nK endstream endobj 1362 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 33 /Filter /FlateDecode >> stream Hb`A\JBdQ 0s endstream endobj 1363 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` !ãr  endstream endobj 1364 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` a[( 0  endstream endobj 1365 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb`$S(;`(`3@#  endstream endobj 1366 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`ǩr endstream endobj 1367 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 29 /Filter /FlateDecode >> stream Hb`,*Gh 0 endstream endobj 1368 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`,*G@  endstream endobj 1369 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 0fB|0 M endstream endobj 1370 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1501 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0eB|(E/?rF @Eu endstream endobj 1371 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb` 0r03. 3 endstream endobj 1372 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 4~eL ZB 6* endstream endobj 1373 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 29 /Filter /FlateDecode >> stream Hb` 4^UL ZB , endstream endobj 1374 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1447 0 R /Length 31 /Filter /FlateDecode >> stream Hb`  i`BAK1 endstream endobj 1375 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 31 /Filter /FlateDecode >> stream Hb`,*G"nF#  endstream endobj 1376 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`xU  endstream endobj 1377 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb`9Tz endstream endobj 1378 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` aŭr~ endstream endobj 1379 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0 ! endstream endobj 1380 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` 0 v endstream endobj 1381 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb`ALmȈ;CԗCT31 endstream endobj 1382 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` aG%A0` endstream endobj 1383 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 40 /Filter /FlateDecode >> stream Hb` )Fd)"$k h toA endstream endobj 1384 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 28 /Filter /FlateDecode >> stream Hb` ) = p;T endstream endobj 1385 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` Q@` endstream endobj 1386 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 27 /Filter /FlateDecode >> stream Hb` Q0h 40 endstream endobj 1387 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 30 /Filter /FlateDecode >> stream Hb` a(t# endstream endobj 1388 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb`AQ@S`  endstream endobj 1389 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0jl:pm  endstream endobj 1390 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 60 /Filter /FlateDecode >> stream Hb` 0Bqb:0]xȴ&[')p6#"r(IZwF endstream endobj 1391 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 02"S$45f;R% endstream endobj 1392 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 58 /Filter /FlateDecode >> stream Hb` 02"Sr5Q|@FeŶ L02Na1&E:0P5 endstream endobj 1393 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 02"Sdr(MV,  endstream endobj 1394 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 02"SrNLEv endstream endobj 1395 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 02"SdruBQL`mdiF`0% endstream endobj 1396 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 45 /Filter /FlateDecode >> stream Hb` 02"S 4_3^}Oej'KHdd= endstream endobj 1397 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 022(7lCt`c`0g endstream endobj 1398 0 obj << /Type /XObject /Subtype /Image /Width 413 /Height 2 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 58 /Filter /FlateDecode >> stream Hb` 0Bq%S75R`1a(8QɁ%7=Rl]J endstream endobj 1399 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS2 2444 0 R /CS3 2445 0 R >> /XObject << /Im1 1402 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT3 2467 0 R /TT4 2447 0 R /TT5 2471 0 R /C2_1 1533 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> /Contents 1400 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 11 >> endobj 1400 0 obj << /Filter /FlateDecode /Length 1401 0 R >> stream HWmo6_oiD5]6qI"`/06mkP$ORHI IYuGwger4zr~qrvz GpO spD㘡l~vEi54[\9h1?`c9BͲQ.6O+l>47l29|p =AOӿf4zhL(]"" n8QJ`&,JbL.]dH#0ɕ mQ%ŌotX"Hih.gVVʲkߠkuTJ7:ߙAmQWxgD7LZOa-[6ubһ]̊y|E!ܣ0"XuWP}Z뵮u٢]o{ͳ:X4XtW1%ӑFK@ʶ.7HguV"#FZ "]V:9rP1qXiq/Dj*Tx"t>E6@#D6]|a]'}ŻӁ/FyDDh`.!yӂyRn Qnvk1~0 gr~!H B߫ x,0K@#<\R x,)̓($Iumk[V\kDfrIEjj wl aeQ!\bbꃂЂCT+Hsq+1,; %г"sI& .c/ Qo_|C3e K.D@ٞUߙZM@Ih U}.T *-MhBsoI(CͶ{eo&,( Fxeu3bhWTmߋ(COߟv KX G-v&r15$P>ԁ$\f 5@PPbh1 ?A_uqbAm^ DzUM.aNClu^70y;9f΃!\9{FĊc6tzn1MDy|\$sQ!Fb( ! +`ӷaA|qE^v~11~qbMA{ "pqnѝk`[Z{@TM?N (Z֮(q|d{x_6&[A]3068|5 e0GYbx+| ]z*<6}?ˈ wlc}£ͬKYLj~zlkAzd-#c8aLZcJxPbUlm.?n,V/T_XA˰'_X$Un$I %.Q8"ae0@ @pZ2Pb,c&A S6ػԐY}eP _0>7?bWBV +a} }{?v6yQ }> stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;X"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI%uO3?mmT}=lo&FħIs=O;(̲z8eF}c?6+oӾ_fO4z`ni]Xy<ɟ}ˊqoQ)})%_˱*6͔6T0}@ւc< H55xtI%)$IJI$RI$I%)a (.zlK1_Z.cY*t:NEJpVIS]X=b~[6]-1mպ'Q6O* Y`g}dpso7oSq6S&S k--1#֒|RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R S)ˤTٛ2b\@׻9NH$PMU.I $I)I$JRI$I$$I)I$JRWOk,Π5Sp.u:pt˩31JwCZ*`}X4{Z\="JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRWOk,vON]9wa8ag8@nV54$S]LcucC]c8l "JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRWOk,:NN~59u7 9cC#pLJwCUM ֵֵvDIJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R$^#AՕ5b465II$TI%)$IJI$RI$I%)$IJI$RI$zݸWՍSmnڨn+HGi.?E\Puv N_Nec c8> )RV|cCq:TVc\ۘڷ6݂k|^PY:m4T,6mm.60K[dYke=XnKi{mڷN96Uw~IIFp:6]nWE@ݵ&$UIJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R+X1i KO7xsdyu}n3r.p»5KD^+\8yc?/'*ݰpV7])NN>%Td̆9Ǔ<UkgNY\Go٘hz5vverXt["3ꩳfu8Z|Wpyzb#w_↑RC^ˤJV,Ϭ5ӑqmpun31ߚY9?C;?`$Ji浖c qkI>$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$XجdN$XSQ*{2b,k[kGobe0WK/48HazGՎy=571ۙEo#d퉔ɓ(1ѱD Ӷ>z>U_i%0]U@:m:Z5n0{LCD;esg] 6\Z\qkj: 5AԌr١^@7"lʘDjN:I$cR[u8 ,_SnWM3-哓3Jt.s_hh=,ip֗8Om−I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I%o\įQh̍Lk5qpt26c)X&RM$AJI$RI$I%)$IJI$RI$I%)$IJI$R/_^zt>Y[Z}C#6Z,_\mP>9GAάa9U$!2DXC)#jd5*r5}Qg϶caxp4w4%_f'7z~߻hݺuY6ծ\덖"ËdAnREoF5vw xk@i=R25!-OAIIcu.0fKpZZ_u\Vv5~` tllbvVV;'M\ַ 9unk–_=Bq+}ƻ)Bˤh5FWO%:TjeL.-/s缹>dDI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IH}71UcK,ZA^e,s~v55UsM)׼kv:N"r~Tᑏ*C~"QaaT1nlu$I:ʲJ$I$dRI$I$$I)I$JRI$I$$I)I$JRI$Yjl7,-YsK h׶ MW]]؝q]KaWPF%7 `"ĵ=є׭m:'O#1/&p1| e`{z /'+1i~(.?.ɩ¦sct>CNZ=Oò7z9l}BLJpN,]Qq{b$un>ts˩Ymw-x"`VCdgӉS/ۂv:$D>vOĵ(ZH;w1āM_S.Z]!s\%kI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$S][=9 nw0meCLv} uZ3GVR_[mnY fӰ8iF4ɂhidu;kV}_oK^w b-{I߶@q3=u(詻jl h5_Vkc5s^p:>g{Fߥ)@ATo@'RMƵ=tI$K'']?gzMY:m]ㅜU 'w|SOu19uo\Dv9<h)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JbϬ]T[ ׈q]0!l3]wv$tk;3;0t}laON)tiz>g~ngٶl/;5uz>gmٲ=cH; dt`pC[ ,-i{֙Z45?hsy"$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)e^u;)d2o;qE\[ t\W_l kw9KyH\uЍud v5J#gAa, kcˢWA[ced=sLǿcԫƍޓi獳.oÔ3gʭύZ5kf樝tM*łhxA1HL/PգڤJf8i}d/G~˳g?9u>Uw~YQw?c}_>?NCto-ޭNwNUιnsq"[׉$t\MY9+'!H?C"ī)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JY S]]!xD 7/fu+:gLc]sulend Nb&{}4ԝv"ubNu`vEE0ԩ{ H\ebӕX!4;7 @HJ@?B@&:w I$Y9?C;?`-eպ~PiƧ.g=[lhpnuINHtU2Xڪִֵ@ȉ)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)k5t>08+g\oU~Wd6o > ;t0y]2]knV "2~.cZ:=W*57qix9ufbۺ9as{5MFI*ՁzlW.I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JcnoJFgbfimPeCc63M Sa_Xc+)`6RM\׆NJ_[Uzjx/6tt\ {nɽmcǺZquƧMt1h&#e)Wjk)յn!$nuKu$$KgSsns](܇IvX4!o,Ut!SMZ$nc\DDIJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$SOG7}vݐf6k3 t߭Gf v]շٶvi%t3䷳P9j=p;a~+§c:Q6}Q EN>{ӦYk]λ:ekz5oz'nmbVV?k=<2:Ls0qɅF.l|DWMEI'R7c}dSvksMT6߬[ScO['']?gTYSSV$Nls#ȑ戒I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JY$;m5>- kk |˻c}]=NYϰs\?Hmc9c&,r߷Y8E^EIVë3}}Ns]Ys{5MFʌ A)]$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$ޱhZKw%i$5n=vvD Jo,Ϭ5ӑqmpun31ߚ׺e>̏ZϲSn_,wkk_i:: pUwUY:]ԽoN}v05uk#Jui6nkYih61/hq}I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JYpeu{;0121*u Ю0E@_Rr28 㹎H J$$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%5_PwOC}un31ߚ[Maau[]u1v^f6nI)2z/B :z{_O+"Cõ!av!Wh[EuonMV>ٕجUt!Sc Zld洷h5;t$JRI$I$$I)I$JRI$I$$I)I$JRI$I$C\Um.ǐֵ\ ߯V(e>din9K㫴xd\ 56@GI+2b|춧a͐uzn<}%7/e̎#^ᗌnPb _FU]XꭡֵZѠM$ ]$EJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)d⫧ VΧ'M 9QMn ՘iBJwCS-`pmh{\A71i"B"JRI$I$$I)I$JRI$I$$I)eQKNr;AW.n/bڛmO4ŎsG!>`_YlY1nôT{OPu G%Y9|yLcR6Jp*m*lzXs?w­.]$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$3X=[&o6q.qiPpjli>I)Iʘ:.i"vcD4DI%)$IJI$RI$HvMo8 Rf}i߭տ ̌gM,{=LZnH ͎W2f!(ځxh)Ux3%_]S6Ɔn=:yN_bGWI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R*}=USK5kDqгrnƨYN%ٮ.jbڛx侸>n.]k̛)Wceoi)곺J龟0Yk*ݶ7m&$*?C;?`(`۾f:v1m><5>DHYg~ l;^6_> @%=JK'Z`n_C'԰V]6Qaf 4ųDINK'Z`n,p?INk5t>08+g\oU~Wd6o > ;t0yZ'&5w3af/;U ڇW?/OSq!44([x43w:['s߫zNVˋNë3^չs tj5VwIɝKia5n ǵ 7V'Y7֟T5f6@+dOپIɃKa9v ȵg 1䒝ՇoAv%Nff46ov?&yݱg8w?YNyX^[C0m[s{zd[4DMđly%o_c7zzONXM.(X"`y%o_c7z_f8wY%~c]s:vmCmUXm|X7֯%:,:wRk[u7Aݏk25:V'X7֯%:,}j{|SORs]uגIݑk4Xc%;ʅb`U7ٌƁD\Z`n]'#=K բhcF Knu/q?LKc撝OپQ?Y:OOa6lClicg8Oپ}WX ޒd7Iɍv]XEٷ Ucc8icZ`n$sOL[MK m pmv=`8]X%cZ`n$~,p?UzOL]M=K u^Km'vEx8ha$*εMWdwSf3sO}j{wϧ<,/Vm6-Խ2 -JwY?f8wGd=>ڲ鲋 0m -& JwY?f8wo_c7zJuX8'&5w3af/;U ڇU}j{S?Y3m7u,&Sx-!\ub|}j{S7֯W?Y0iu4,'5]y.!Lu,p?U~?>԰Z)4`۴R4>i)IdWX ޫ`dj˦,,86Ɩ8s))IdWX ޗپ)I`teΥ]p`8UV<63j9V>,p?INK;dΥ԰Mwc̆ sՉV>,p?INK'Z`n_d԰]uwdZ3INnmX4~6Mqpu6c1k:t@7֯,^jUze]]x9γ&@i$I)I$JRI$I$$I)I$JRU}O6ڭie5p52#"I)zWRhQOnѻoW=G4}a;197֟k5Xue;v;ksLZ ETcdw]f3FK_ЧەԛMXU0m,ג2mE1hݸ7W7qټtL nG{pnvcvn~]JRI$I$$I)I$JR=G4}a;197֟k5Xue;v;ksLZ ETcdw]f3FK_떷tj]qsoy Énc+ִ@N+g\{Y6cewi!^ǝ}:H.3 RI$I%)$IJI$RY9 ]4aٍ}͹ΗִX񯸸GL˯.)۵_]gi7]{dhtP LZ*&14]:$Nw\ss/3 u/Md7~/,xodzrXgudcb[UpY:4πkHۉ)I$JRI$I$$I)K,hk0ƾK_kZ}\]c#ceחcm/=24:([k&x-QCI]uiDE.|Sg}dL}IЮ{7U;m`G?~}^=IJI$RI$I%)$IJXw[n5C'UslsZ]Huf#ՠo=o#K+i|I lxY//#+G3"-}6ɰciDAJmls}y6sh{$2cewXqjy7nqi˯Ȱ0ֻ&2\Ƹ 6mb`p$$I)I$JRI$I$,}o.vfgWSۛU}kFI]+i|I lxYY]r3z}uȪ󯴸}Zܗ&">)N߇M־]cw q5X,dcTz>8^Ŧ."KZ웬s0ٷt ¼I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$jhwl.Bo~MM_kwTlKJUW]+4{ Ufq;V4o"OBk+>EﶬͰ nPߐܬ[n_٩Ƹ18Hy!W\Wڊ=xx]:fbzYu dhv!k;;emcĵ~ LYXȁR1 @^Y8p{`Fg%κ[_~CZ/aV6|G T9fF2>OU4eɀB<\`WCIM$^1ǰO~ ʽzJlFL ϟdb1` &Y1d4ZtC qH8w7TOcbg]fZ=ݯe,k[cc5Ӵ"pŷ7+Km$N`2cZOP{r] hwaMD)JYkQܤ; %7+Ͽn혙 yc nIx0tL?mR(2F(㔅b@cUXDnƉO\FϊGID^|[Y[{vw&f)TQ,ocPd4= mo8c]]oQx[wkH}ԏYcMͲ !G30C=&'"4@&7JRlnVE̳/Tc\8}'xJ&GVd mks\ѸpQ L%/Gz%^ɣqUݷwocf;Cڿ0௩9yx)jMD I$TI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$'&Y[A E-ÅJz}8u뭳t]+SK.?i`׿U2lXDAxi+8,9؂S˩ |t#bq{ϋyDxN{hڛY}} f>Cp-}KJ 9-2c[?92;#>(D{qd_̒@rho1zULdVʉ|"e=-K"9Z&@ RUC_omS+?s]|+N~.}>UwĪYPS}@ߣ|dÄk(q<#,w+@ˋ@Lqr" ?VH6C7׈pluOև65]R =jGU"m}Aճ:qCH́##DbU-k'y?e`/1{!eD <=zVNV@4_7Ii:aݑ8xCu#'i& a({G_M{<;v? ?+ ծZѿqGsÓ7]$SRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$J endstream endobj 1403 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS3 2444 0 R /CS4 2445 0 R /CS5 1534 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT3 2471 0 R /TT4 2467 0 R /TT5 2447 0 R >> /XObject << /Im1 1406 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 1404 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 12 >> endobj 1404 0 obj << /Filter /FlateDecode /Length 1405 0 R >> stream Hko0+Η)ݥ66J$5EBm3ґt?CH6)299/y>`899=b kK 3f;VU>[d|6|f8M 3I,Rrgb))eQp18Edaē pEx]tO#H\jJ^+K m6"eN FQ_DQ`+(vJK"PQ-=emVEa_Ifz2M.+ޤ7TQrJOζ?Ul= DK?D1C\T2 Q1rmL+d;PMUj\8g z4Z@>c!Gs[y6F֥ ~0wU`8maM0o;[¬]D_V#'.bғ8#U#a^K֦o\^{WlRDٮk7U[9[~Ag_(||{1;E{~f6GxgG~o,{'Jj|17{_I"XRښ !DL ௌ/Θ|MDnc7<6)jqr98nKٞ-l5~^$xCpfd7r߽rR&l`uĵ #NYbsP穔Z!dU)> stream HMnJu13d)^@ _f6>CCLpa4:sd :@%˶$d?E `pbАdj0@(_s؊QkΥ]}쮠Ap$ظm!1^ҧv4 XZH8 F 3JW񁩠h͚K>Jf4nzn:a $JŒ]A׀U.A7MV9:^"$ cXˮdbMMI5$84@0E0Ѫ@]j(BZ/s@GJV @ m, :jOr⌋b۹E'AB[<͕bवΩx)n/-TD2Z )=61\#b"vT8ҹKklF[s\bQ phVÕY< ܋ӢN3g\GΗHnHS mO8e YE߽ Ih$IlEZ7s1<.!gNnE11IgyJ"[+J|dzdYΘLDe_ٗ"SoYύc:-ft6kyL2EmZ۰$!8<4*|+OhDKQh 0$Dg<^Tѧ9LDoXJ g1Fa [ߣ͠LV#MUeb|+1Uy8k;.3|!DVӷ#~T3x6.Bչ=ny_:#H/x`Xb4ٻ\fɣ~ ޗXnv4x!Ċ\Շ 6oח^JmEYZn.oqja@ڄ8F%#b/?~yfIq{\RgʢkgMuOypyDܤr7=~ O͇v; ,rU{/XmUuxl@K$ H8K⪳|r̒t<\9onϗ~qU'Woc/jY3W9F_{'<{IT W<_ x*; ͯdAޡ;]~e6noX<1•$Sޙ_Y+ww)FcJ)>4bz7ۗ/^j̙soWCV5KSҌ{5ϳBCKw\}@O(or$+A>:9y_Hܚ+&iKlxa븸)+J&V~^~aq+Z~o'/N^QX,nory灣r3[Gj~Ɲ [ճngwZYh d[\}xN3X7_pvn/\m86ԿkM@:?׼Xsy@1ӥ7p5`[p*%;R>iՖVj4=ա8jdq8UP]I.u8?T\~I.֬K?O r< ,WZq$4wﵥqSjtu[: XIayFX&WrR/>lףj7qnvb[欧݅Fg-F װ9WEdUOo抒Kz>m߈Y&K7}AuWZW"+\˫劐Ҝ43aD7ж׃Zǭ-U\ಶu+ Tꃾ ڣ_5%`QI **PhYX;Dhq,/>+D4rWa푫fкZ-.WMk$-M#>H{_:aOsA: >XbY$90l҈&HgD~TV?JcFUUQ/_>HP]H^Bt{42FCJ5Ē4C}i<|]"*/|'X x0 C@BAפQx .Py c] ZURWs{=0>bGqSh'e2(^byQE=O蚢PՃoCWv nrŕYC*޻[ X@{Ts2sŕIa+ u3*%6~,+QbWR0s @ c6se\>* mHrF7IJvʼn򕥫2?G\iҩr<HQl5tf9I 'p]&6na)J#Y,+m E*J:X"+6+y^ʏnJjfE$ $`>[+¡NyT|_.=aU2qM[]Q{z$giM]FLrb&!B_RVH6,V|>~¸_ѶM"ABWU)W<.Rܲ<6Zne͠PXrPT-ABW-ULi{M6x2F2ȹ̣ɕ-lAߥ1%l!"-J+O-W>YUiI3K3x϶`Trq>15|\v^EV9!a|E+R/`y& `HW2:B/)hb OibX?(YQ H[Mw ,̀lwXK=Ɩ |H&Pɏ[\eDW_ll,Xvocc` B6;/\iRdVqEk`*િR{+Â|<,}?a ޅSɯ|HȚuD[~7{p1+)-f(*93޸0$*y^/RA:lFಫ1 ^ l^ FYf}Wm8*jah_Lgc\mxJyPz#tj8)if}66CaQ}|p%œUP|%M rrՀP}TA*h/oD} [m}{aU奪UEq )XWƸ*b,Z.u?! 5:A_$ kA^|m5pb[7afJ/jl @OL*?ڗ6+BS7[;6nη;Չ[|lgvl{SðwZOBC팱$ [nh5LWvnцIƕʷK~B60MS ݜfqƾXmZV OPn/8z~3|prWDRT=$WLed9V)YARN{{!/.кsmY&m⎬Un-}Vs@@aW*yfҋ- >9\)eW2Wa)3~2ID1Z"p^_m2W:+SLL Ժo5WRa :HWAi0F+dQ= WuD%r()Ex>7 = U|ߣs}e0Kd4UF[RW~.- &~»pX!ý[5K\߭c^S!Tr@0SI}DT5nl|:,eLG?a8IլCb`IgP)©,`\)@pzS^vcաnGty\)7󭇅ϭh|dh,b;>!j:pb>9.n./Z-JN`q\)JJ`YU\#_]ѿfp'?H'8=|K1z^H`{ sB΋ٿ!{ZiVɺ栳X:HC`r[ևe(j uu-;$+/ԪW]}Gy +q|T~Ӹp"xֳ Mp)n ?(V <;ΰɔ ^ltH>I3@L+"{B >V73F㸩W†.iBO$j>VQ\UHgrર& {g2`L9N$3anEXa"lg5>tPLPU+/?/yTA+񗭓FX<2;fNFЋl--ibw)>WBIt;Cdr|{Geŋ{>Qs^U|T9JyCBaZ}!PW&j kǽ@AmbʃټE_;$ͻگ> Y %z(Zg]Ug`0 XY9XJ tBϤ ƆE$mq"#Dh93:A_᫆R>V5*!*F[*:#`0|Lk]'R IJ`ߢy3lAd!7F],Ȓ<7 xWA4>Lv4<0o RUC_ *d~x jkӋ3xػXI/$:TY'qY>Nh-vаo{2! z77TR  ΀4,ZHơd~=b*<]ޞe*d@qT>:[,lWmI=*#.W ›˫m$mnLm,`!K_Von }+Z+|q+ kopi[p9ɲyQ#$_P\z\>sǕǕmC^zq>{ HNn]|kmX,`ᘹv,OvY.} 9^ޢ[htDK&΁ 3VVt\W  )xI#*ahQy.m+IHS6tF( d!M`+F)}hE tUW. hٛjt8 9C%jڶm2@X~*a!'>O\N ˃3L$BÐ\GϹFe-Ϛ$T1@-Me&RF= s/[U8 Q_axOY)o?-UɷAp 7K5U vږ xpZfA$T8ߌ)6*笀vLJiYXVՃe3֠ɀ+p l~)Et^Ǹ҉|){$6(, N?k::R5ׄc4t.ԊAcm@ G Q_DJ+ǡ&Q,ݮDR BT3Eʃ#i@h`] <}tkK9ٙ֠Ê Sq;+Vva0 Mfn0VC`/`)agB>TB^I|h+I m=t>m>WpE@OT Նaű`7Z&U0[ˏv.D#91CG(Y9 lbTKpa,; iBpkU9'W։Uձ Z>Ҵ #"tNz?=qr f26zcK/ә`L Ϧ >y>OcQY{li^UU#ԞNcUk5Jr:3QfILnz9# 1S~ *✯_ G!:i0'\23q] $$R U`H^(|L.:hj遽)Èivn3'M~u TZ)4 88UdyF70_࣬VjjdM䱲 [w#xߛ˻w}w;:ݾ!YpAMHlMPq#r Tdhj,*_& jÌFkb_on>ftBnخ/&ktK֙[~æ׳Jl%uZіF[3Kǥ_5͵XU 24PoQ4#@=knh(VQ \ӧtsg, ゞ04']{wU JIaa< {:&mZZ6\7$B)(΢1FsTjKҽխ_};DN0_|!gܭ_?GSI4h:wZbv":wW=KC(}] -շl?bȕ1tUUsu+mC nsJW :5aEUOrjAq*{k+Y(&- :xȢ1_4>DII/`+0FǏ(cS!W ^&fw6s}0fl]quخSR"GF/sۧ곃۠SiPS880\+R`b`%lUȠy DW̲!/Qڂ>}pqy}`=rW[zk2ǕPf9 / #q$Db/ ƣIx6 ?çWs#quBі !_ڧl58~ŀZKJ[JU6>W %,E_: D׫9Y)TіEܷZ9PHY*7՛p>omPE2dd0>β!7{GolW:nE1^k^?^d_yBw)0a)=qywM¡~L&s+HOcH(憴MίVɮ]gW%~Cx̐֗O_Ϩ\=M,0R3` eANf|n8ƶH\ήnRd7(UA0%/ OҡA*[%^W閗swe\ɭVA7>J5'l*VV*.X,]\ٵ(\Zq -^<2nMUA:e56[:`IrM?j +o\"u\ݼ(gvV%IO*ʳ1_u\Wi6MiV){A}G6P 5udfwLHyD9u\݊ BJKX}#/W^u긺[@2Si@R\G7ӆs}ZRՍ˸"jB _/;F Da%@a Ѷ԰Wm _{c'+I W.+{vY{ m_b#GKf͔XUsXxmX~U;C+.erYjp2vkU¦%i]>JZ5!kgxu ɖg.w!A4<Ԩg8ǭ,Ǖ_;-K^j->ҴJ՟8|OWEC}6{bu!A|D-CII'rz\,ܖa:& Evn T vXV֕4aol^C:Ւ=]tDcr 僶W:nD0]?z-qu2^se/2XʰYW7"jO.Y; J*ѭa긺u5#t.Fu~ug B s/JW*nW)QVW7"4FܥE[2ph'.7VL5ӝ?Lм~dq\06B4,˲{X]fs &0kƆ{Agq,\\vCMQ Q+_K4)p=Ѳ\F2MYJ6KuE ђ+OF2BtDNl{ @(ˁEZFP`F`aFUPR.*3Q*eM# hR3)xڭz"rgOR?TNXDEmNs,?IJG~&$hEC/XjKE[̓]\F9>s/̈8qÇR @k&PC3 VXjK29,;&Gdyof%(BGvs~vtbMH7@66za"VBO'ymޒ,jVmIؗS4+ fX=N7 0| ַnor=@VV0ys`I}b { Y(~I{+YZ VceӜN*o%W99Pώz}瑼|ԤЃ^m+:(xr_F,wܩ$DU"su~t7^c̮&lmww{wذx _}Zm6W_mzz&]Q*w~5uo_}SpbnNw!-t'o饅I1P;}y.MSW=3Qs~?Woh4"cËFo3*6HIM*_lђcqH/z[OȲ:] uW*FxZ~-TX/5EfLCG."fN!οsAA'f>k[뻻Csc(OH,D%ל/KMӁhB }u8&]p`jX \\cK8+BNѿ^<,[ 9wo#O#8"؃68 B4T ۄe YIMw<ظ[ >x<**7OQ HVwa㨀Y9))V2*-@H@R?N| JɮkbQTU #d8 E2JJWȤ=)ENx>>!e=ވJ2 Ӷ/,e@EmJ0Fm)w'h ֽ,\^J =GPx&[kl5zi:t`(O^%WeɈԂJXTt@♟'R#>Qٶ)J{ (yms4;?n!DW& KHePU4 @ʨV0?dN@_'7*HUrQlL.QtS`&KӆYjhͤB`UrAXL遒@ F.'n;cKLҁI*ѣ( rS}i%:샃Ĝ&j&Y'paH'겸qL[LQ*s.!XJq88~z(8%m_R$M3?K,s9I=Z-]mJfKbM U/@ogP#,.%WZ ;0Z e:Tr5sx&93A:\Kn3,XzeTՌbF#Эg$xd]pSe Ccl42-R'#$RVTOYڂ ߑ j^k4j (+?#R%WKaZ7wSSy>\Ѱ  jᆳV1h?Jft@B}YF"8c=0aJʕQULiUoUH&K (z!8[3%M0.U40El}-UN=`lix(b JI8VUR8W\ld-8 [Udx']1WnrEV_R{B.hżDɻd4LsYb4rReayY~%(2dVbf&W詢-NR"CAin~(bUωV , 0 9VK[(S=ԚJ*ǟ @4l%+Wp[)4>A<ÇO. 4}ӓQpXzdEcKKKJšpv=E~gco/?T鲕3@b| eW-]rR U ӱmeB26[/{ΓN˶;PtH5HEF/Fq_J%WW(-q}/U ;;۽;_q~0Tr*$8CSrO$Ƅ1nMkY m Ϊ7̪N4$x^d$M/BZӱ"wj21-/g.\oI,(Ýsέ/Y%v,;x*U{=\Pzd>0f mL#4*C(,NWx6!kH~RtCnY4t\D׸@͹T:a :w̕g>,ZϛVkm?i8ݘTs"J4jXz@v^iv.c֘N~r`j[ ȼ0M)gD?hKD՜,Ihi6<˸d/F:X+jj\n ,A@4.Mk͹ʒA2n_o{9 EΆfJ\#ڨvAO`z'Q Rqo`VڽiU|W1XR& ^)Rot3k2@w{Ջw 0H1ܼەZQ>yh%\vI!Js} BOٳ"/;/o{Lƪvv7jR=c]cg38YYiQrF:h |5%_,z]kG2wdN 19{hRGBjB*j "r!J\n9]iW Ĥ5!g!a"STTFV Өp~%@(D$Xbc3HVUHgd92\Hu҇T.4oK,B$ŅraΚyCЯ+?Z7%31#$!:7~qk-{5\ѹ5ܲXandv/VrVŰT̹$ ?rg*zRZY m)(O\o!?Kz}T|Z*Qم,YAMRBA պ8^=&j':j&G5J|OtDs\ ߆qՋ;\rX:28q}OUj7ʦe8?N-VU2Q+Q<ab|yc{"b xf+Azοo@T+НP&ac Z% r. iQ#i_aL,,bz˔>k=l6/i3HUXM~`$-qyn+ܪ#(&▁d^_zQ\yc}! Nn>ovz$kN<ܔc~7{X<5|-G ZH`%0#66D'_CS 6/;6{-{p -Y:x6!"bk)ʋòbP"Q^Uw4cX;iWzJ`G'7̠ji~nnn~Q}V Pqs60 `r߽=LIpѕ)79 p*8qvT._ZYHeT:.<꽯e]{sn奊яh:x[5aZh۷?A1φÚgܷ]$(˥K7~%uNzə) Tl@bw{ܵ%Xq u#ʐ,EwTH0F(YwD7CtU#@pZʶ iE;j;Mݼ0lW\=ZWiدwp$VߴAK-ml+}b4V_r*;pӥHoMȡ: 0FNN0^ZjG0 21:ًW 0MFiR$i7.`޿UxoRXJTijbr!@P5;SgB!rĉRYY0L I|zz7^nG@j{ [8ghPԭO@wʹ859qkrr_̈́p#hGK4A)i' BPsSA\) Ls<. A?v/+ZgZnmI#}J"'fڄ7vaw\w5JGfhAq(G|e뎉3UlC(+`S VڕYs!%OJhY#[@ loOd ddQթO3M"cENf?@QUfuIjCPKAL=&6VPW>0b戜/]w0*MH2Y.z@x <[)a>#W5rKbL֩Ҽ E.vQU (h~-V齊@ѧC&n#ֵSOdy(( ԀiGa$ d&5 !)%A =JW{ IT%` (J}'ړ^X E%KHLdeh|Wx@ʙ3 +WrZH xp@%+ 6X{/Z{ҽ~kbS`,-ahlxB韒ĴccvA% 'cPU)c(t0(qLN @hQ2_XhV []\\IՄRyZDDVlF2L`"%R_&Xл@?,9m[;A(k '<9y?ڋ+/R6M;i,oD(EɕB1O2WI؈RDR\f&1mͿN#C4x/d4 3>9"l!(d[R؉V![>(l?ZGU"w)Y\`wpVjR1 \;?X_~PT~$g3 R/7O *XNpBZAv^oU[[kOQk wm4c?y0O2(=lH*o?tk5FALw 1Rqhy\Yv/ZmukmEG/NhJIG+ZzwUhE_,ѲScpiqťe'u,JzvK>UXDeP?Z]{UZhQFӋKP;̴I".{|2Ƭ _"?][|h zL{и[b:r:]}Sݪ>}ywl9B QG$hfHVb +\ޖ[0ҵ:"2#?Fdg3jVyqz``y*6ڕ(H RCلPA}Ih }"GO}"\E9/A4tpV6 (!P'k?}㔳h 2;Q.&gm[ ~04 F&VkgH#JUQLϏ r$B*ug.`?&zϫ[ou'=%]]tgc#VԞ}zHZNؓqUl"vJ> xQ *r )z,2Ȑ+>al_,Oܸ  !!K"?LJlGlݓaG.%P!;d%J1MoWk[Zm}ܕ NƗAQ^:8<~,y-"0lϘ @s+1ʲsb_Fw/TdA-yVnֶo^XBL{i׃6G3C?SŠBJY_H% BSNl(+RrB6a)t_;U^~;H>;Y.O4559iX aZq*I@rN*i7FoÎ9qqe64˪RA s(!Yg]wkN {8WJTMtuuu$)5q'OB4}`BvvxmVZc6܅Egg& Fiwi{yߺ)VَtgүKҕp铩I5z(~%TGr8QK#vg /v "uwگyy($&U3%R.+g0 4Dbٟ2TʳH_'̊U"ቅ" &"4v˃F& 2߷&Cޞ`HT^sQ^NB"'@La<=Q5qȚ2*RcN޹@p*NYjMv^~{`8G+E!c_t_5 # \ NQN.,|&dBFl6Ur}?e>ꢗ\T|̝2ؒ$!zfKd[]㡑!tu0~V`t3N|tNS3vDe|¥G.Nxgm`kX2"M~""MxlR?1_W[thz*_AÂw F$qgoRac:8W=zf^^&ЪkxupI8i>mFtŭcQNjn}7}ք?9grG_$% Qj}`Td]qG罘,^AG{3NbcſƠˊ쾔WHCo{͂9ob[@H B?U*67cf"93?(!I 8'I`ݺ&aJFB mU]2/+m/2_juhnFx+ C D"M=:*XLl=2ޒCt-!"Ҥn-p&G8e!8e!m!˗uO \A5|U수[[= 0pWNF8)$ nOhu䶙h^ts/&*VgnG1 m07aE~?1=[ٳFLLe;*5.KY+lCm~-,vŸSj`nXB2!&3DW~:2>I #wftF= ssr|*7OTb%5u>=bvD`M[-rmp%rt/,u1A Ĩ"M8`&厽šcͦ9 l}쨌ݾ>11=Q k穌K #m._u2Oyp* IgVݥ ‡+O{BkQ%1}23w@8e( ދəfIT34.4GlzO 2eȲk760/l+Dzi=s\>\zzFUDMǮS 1vRq/4 =i3C'^WcpY={w @TӴ3[2A9d&lyf>@)B&e˨@dF-:o8PaNIs ܼ.{o ']WW$"q3^j½CROj&&<j\O4|.4dՠ}*Ȱ8!\HI /d~RTY?PR 'BKUڃ {nW:T0xmmmm6W_cEEkxRƲȮr|~d M#na%iTpNpҌpO>.GWBAΡ"(V)G7^[$8{:}<HBR M,YخƦ2S|~jjd?U?^̚+2@)\U30Dե`d>D!^ D[9~|}}{m{g;PU(z#O^ߵc=x0ۛYٔ:PY\UȠ18 LH](w~ =F$d&a-m~ kjo!MŶm׻(p^!Wad1GViUsЃ3sݨݡSW)eq;.)Hb _HY8ula֣줺oVW7ˑȆBE]Z\{v$c@R:/-QQ20R %a۪Rm&Oyӳ9HV[Ֆnik))D4QCPHqjn 1gm\ǐa}|]RJcˀ*yBAy3*VyYP ;㿺3qd'wvDkJ4szk&Eo=jռGqe\*%ġRJ*c˻$nivRaD-2XOR+ႏeF7F>OBTs u=?!Z L-R1'@ABl u}B駏ՇHY . a:88xAbYL0.2"Q@ v5rl&3IwNrFU%!<+ܵ'A|>4HɏJ~%8vӆSyW%v+Cp4vjmy"37&8GW8hd+n/TkK`i ESFXӃR+OgWؿxUoNwM@2Ia|ioL*4 !9$^ҙ/*¹QY0'#7 c&Bu B@ۥ\Q(2z40+>2 Cf=y0i i=DtUyT}dڗn?DqtN;A0&~^K|sN6)z-ƴ]S59韭|ya}`7I;<=e1^Yh8@@|(5ޔS!16M0|hKRL:TJ탍06V/bWr &%?U,jWr֮fm-fg:RR.W6 #LrB#ߒV{HVKVy-/{Pf䏠3bia.;:i╘fekݱ̠=vl}Xߖc#7?emis9qys%~63+7d&HcEt]}* >m+luEOTf9Iu_'^g:hBA""3Ј; /ȃߌCg֖VVW+A); $EYn Z-Y(!ogvYSϏbˍ{,3aAKaZbPhlr36 Õ%̴7 BmqO8p iu:n Tbnq|YC+W@!4'R=~<+E0KF^Tùd ]#*(^_X<]mxw^Bl" eM\?{6!h6 raܛH+Dz"[uP껻֍]sfF\C޶?np ,XAqc s&(^MׁA֪nwGwBM&/6`׃sFt&V2q%Eo8? ~1Jk/^}67wv{LvHHE 9„LԹLL…/Ͻx \fR Y/d ĵ4e~ #ǎrgM/M{Jj3;{T6^pWnnRhD4="9 ԭط6\1bi M?Q   !h2_DZbÈ&W$0 /٠QD03|iI6WA>3QRޫsPXZ]Ū"B'Jjgv qKw-ao+>C]mD~%"B1]>?~~$&sBa^>1Xqwd !5^aEx* '=tgNDݓ, Å|z_#I뤻|0&jl[x)( endstream endobj 1407 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS0 2444 0 R /CS1 2445 0 R >> /ExtGState << /GS0 2481 0 R /GS1 2480 0 R >> /Font << /TT0 2471 0 R /TT1 2467 0 R /TT2 2447 0 R /TT3 1476 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 1408 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 13 >> endobj 1408 0 obj << /Filter /FlateDecode /Length 1409 0 R >> stream HWmo6_ΐ($^$2/hCEZ$ޯW[t@S+f;sϝN?oO?__J޽{q>9=dwJ!jOID>"+QVe:'e:9{5y?fh4[LNC99a`qS =2{L}>I^Ȇ\& .4VF58c3 ) r%DɊ JZ EcV%ދMGپ݃wCQ2'~ΖRIR$K'.ȦXǣx*\iVL}5fx]ĵafCPj%JyTԃ*lxWl58``|[DaD4' 0p0GüCh~y *5 xxs)n[QOPWYMw->dx#Uɯ4I*66M.C|69m mmGZjw\r6rj1מC]g`cfޘ8w"^g'\tGu*5/y'g) ;3=3+c;Z< n$wq%f{vscm Z~{ V6WcTaSc'6?n endstream endobj 1409 0 obj 1910 endobj 1410 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS0 2444 0 R /CS1 2445 0 R >> /ExtGState << /GS0 2481 0 R /GS1 2480 0 R >> /Font << /TT0 2471 0 R /TT1 2467 0 R /TT2 1476 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 1411 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 14 >> endobj 1411 0 obj << /Filter /FlateDecode /Length 1412 0 R >> stream H[s۶)(hAx3NZe& ]\HV}Il/w\GB/|x5zd0By5b$jUl?U7Ys.G7lFfL;͞GQp2O9%)^~^Moff_F̽=r ~"!7/.KHy?uY׫l^Yjy!?:jdw, +3peLɄE q4SE'h<),LD$)L̿k5z,| ϖX(e=1#iHޚrꂆ]݇;HrKtxqeq )TߔuUHcYN#hpًj)dx j16oJy?RѬ8aT:ԓZok#4r!Hf52@Z7/am;_&1яo5Vqcx- fz}$oAz`7)R(gAMrYZP!ڨ_Oĭzl ЀY+ښG> p%8dUV|˪&S؜4b0xH~&|fر7I0WpP{;2Z$"iص9?zPΠT`rFTέoX֊Ml|EKg03ĞvT"߯Dd>Q.^D).ivPuwKD6(MQPZ+UB/%1zIB"Չ+XJq<^ ޙXC[4CL7$IeXtFL6oP6ΊO|ʲ@z&8靋vjR;b:oϱYrdD#W2/øRF1jF/XFc?Xgidw04@ߟ++H~bxvn_}ˡ ߬ïON^ =^LC%=yI<)8}̔1?r9#:`sVቍ/%}NXƒE=o;#`^h0d}<)43@kG8 0F[ ֈ&5u%b+3;F1 v!8a; aʍ m^ =+Ô3X0!1,G'yS"[l)clX2iL&py)<0[ ֈ!&՞0Q7anEsh',V!9T:ৗoaf^>?J}V?>?^ʘه 2@JUK nPɵ{:2XvF7Lo%Zc-a,VZ<.Ӌg s#-IM_-T;8)Xu54kO[Bًj`N^ v#i={&qumF6@PF0匘:ߠb'//\}NO 3!Użo.oN%\pDuxQ dQd<džp(" \+ D+Ckah<)q;yW[@ Zl[M& oyLzo-ȪRUY-MIa7:dM(_k@+.wm âN0Wpmm]DA^l_G*Z0|QqFTѭoX֊*Ml}Eub:;8OkiR;vMhMƯ=f" endstream endobj 1412 0 obj 2114 endobj 1413 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS0 2444 0 R /CS1 2445 0 R >> /ExtGState << /GS0 2481 0 R /GS1 2480 0 R >> /Font << /TT0 2471 0 R /TT1 2467 0 R /TT2 1476 0 R /TT3 2447 0 R /TT4 2470 0 R /TT5 1537 0 R /C2_0 1536 0 R /C2_1 2460 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 1414 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 15 >> endobj 1414 0 obj << /Filter /FlateDecode /Length 1415 0 R >> stream HW]o:}]$ DJEo4 hw[?lpX6h׵YMIQ&-Q! !9g>|z{ t}A=|'"_mgUhv)O}njjv6. &,chB|t짂 EG?f7_y?3bhO`#6L! ̾+$mҢha" 2("9 >WmS6{qX/˷j=c~6emjR03 <D,0fSm FD7as#&D=+ec1pDžWHD<̘p@jw+fw -ۙʱY%v> /XObject << /Im2 1419 0 R /Im3 1420 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT4 2447 0 R /TT5 2467 0 R /TT6 2471 0 R /TT7 1476 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 1417 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 16 >> endobj 1417 0 obj << /Filter /FlateDecode /Length 1418 0 R >> stream HWo6~_q/6 I(ŲGEIr;EvPwwݑVeQcQ5P*'T!&(R QD@n8\͗+s C&ҘD{Cbv5Ǭm^ f_Uuų˺)T94E0}a`Xe SBu);`ܖfD ,>-l,WOf4ј̦G$?&Qyt1 IBz~QyѪI Ku~7kH,R-a1/,AUjYu_(2Y9+Sa( C0eP|^XBb)ixHӠN5/'Z̪*]U'$5uw7<sۿ?QDA"&Z,Aw ɉTgglhݠYVۢ3ovMyI q`Gvbmeϲ SM".Hv`##DzOj&DˡeQej O~=/*{[]6j-!b%s3?("DB&AXܪ^-fCgB}u`dG:pNDS8ک {&r#K|x{FivՐUFr[ݠm7"{dϷ\Ϊ\]ZeW[>e+^-%ֈp (I#xoe[c!nM9{l%>F[Cn782ŻCv9'@,?(i@-ԢOMg#O<1HI : dԘ݉ttn\3Ygv?!.ĻqHt4,Ѩ7a$f܊xN pr9qV#w:/? "yv7tܕ7O5\ҎUx1a7fx7 4a0kg? Ir>/}>)'ItPˡ k@gǽY=_ڏɥ[ S!:rnY 'm/; ^?y(<)qdux`2{Pek7I1}er7 7IXIJ"V?V׉tv)uV/呥Բ endstream endobj 1418 0 obj 1261 endobj 1419 0 obj << /Type /XObject /Subtype /Image /Width 290 /Height 197 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 1125 /Filter /FlateDecode >> stream H Ei1e*FH+C!B!yvBCBE؜87aFTݨcFZbbJud޳2e4C !P)59PY7MPၣ[ퟫ177_xnTr^^ŹT?l9zQ H7ڱPWژX u=9+Q; |h[JogR'[Zz_f;Zzܡwq~,pCqjeB 앓pue1tZ>Գaw-v{=ecWRЅ=ECrӞOi>gԂr[PF . ^2@A@dK('Ⱥu܍/Z{ {ouX(9{AX] uMm PU&"‹1H}~?f8IW鸡P«T7_1$ [ۤe'CVq/+ta}DTDl* #gDCb !B( !kDh!٠! !$qO<4!Do !h!;! !h!7$44AhACm8)O3: #&0+B4H OpRU4B4!"hACB4! !4! !hACB4MC 4c+[?NCg5X%lO i)$'6}R\d"H !hACBB<fVf/w3%;JbE.5;8;P9h6]1u иr}ߐ\C,b.Xy*h({w";|B!B'ev endstream endobj 1420 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 189 /BitsPerComponent 8 /ColorSpace 1498 0 R /Length 1098 /Filter /FlateDecode >> stream H엋 ](ΝsjB *+ھt (sś m-qӢH;\23MM|zV ݘjQQegjtT9O,hC3F{иlF?Lb 1,bcg&)*bL1ɔc?*bv9XMr 0e8Ou%9]Mx=7>^t<=潬Kɯ[;Mgpg]4L`}9fI졧 Z~";,<sJn>*h:v_8RA|Q+,e S@?E=#OA7kz؂f.ua.'y~C/t?.&a~ϻQ*1h?$</})ޢOIC ;6 R<E6RP*HkM\I&([lJAwd | #f}T"~evK޸]JqvQysTVCL )H.&WP{D-? J@$-A) >dy?5I BMɽX2\'&,˜sD,\E'ւ ]u-&UPNGy2\P-,#(&(A1],tiwsU@AD3g mP@DADwAD7`2@ЍU+}_eUĂ#8 " .A`#d *bCAD5 " "D "@@@o*  @A%g}N|2S'n/ l$DA@{{ QВށ?nZ1ע#١%-u?PALء΅Xs"IRuWg!H^ b/(bЄ?/ endstream endobj 1421 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS3 1430 0 R /CS4 2444 0 R /CS5 2445 0 R >> /XObject << /Im1 1424 0 R >> /ExtGState << /GS2 2481 0 R /GS3 2480 0 R >> /Font << /TT3 2467 0 R /TT4 1476 0 R /TT5 2447 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 1422 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 17 >> endobj 1422 0 obj << /Filter /FlateDecode /Length 1423 0 R >> stream HUn:+fͧDE), {e6jeI&;b" ôq̙mnmӧ5P*qVLA)Tlycpef~?g vXn%T~bj35d\c[uM7;7uC-rk-R Q1>dG.˟ٷ2uOg WPf8'GԌ~XWn ,~| /F*")"S %p! t&BH1áCB&8#*bZaoq~r2Lz() bҹ@qeLyˠuaѕ}eF65v Tqۮ?i,+-: #">A09uPYEְs' &%%suؘ] SI JcMp}t .I"Aqp^̦0+5ӧVMYLxrtVy݇5ާSP,+8PL9'V':\9N0bim7}\Q:y9 ]a9u=,d .S"$H.Ĝ EWJ.&N4: endstream endobj 1423 0 obj 887 endobj 1424 0 obj << /Type /XObject /Subtype /Image /Width 288 /Height 380 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 2228 /Filter /FlateDecode >> stream Hт E XAPI硵əs@D1x'Dt~\TLQ2?e2~춣Ɯr~:F$?J~lu<kyKWfdy936{,2>[pw~N~ kX匳؂gt7gFgQ2EAΤo=L-p~&o~7/!atH_"LVD ~fϽ#AtAPwDDD!?#֏;2痐!?ˑeLJs_Ñ,ώ~*)9n5vQdgRegt(i#U' ȠUƽ1&lvwvԏn9ُz;~aAtb/{(Q%GϑZ9 v.Ѭgsos>~{N1gCrzZ;,njycxٱǖǴ~yǺw/j~-`MKy {kay*YΓٮ9滚;-ge~-TypL Lt~bJ\28*[ݏ2Sϩ_/Sٲ~*Ģ~ƚ~Zeܿ_^MܿvK2f6ptR;~x挙Ŕ 9|y÷LaL‚/s0?z~ϐƩϘ8stw(X??g}O{/}EA[,8_{4?iW?<7+X#-V "Ó?V|fB1~}̌Q!3yK3;/3v_"B Iu-"+&$%%{kCPbˎzfGa HZ8Ykf J3_n($2ܜI0RL#N03F?j~v4v,L%R}bL;RȰ> ) ʿ_lH{?e'Ϥ8UbFzLUK2;h36buQhgd* _ƠZ=C"׺6Clgv"=P)Q&=J*=ޏ@gbK[];>ѴJ~v~Y?=yeœGce~G:<^j y[<TrhcV6J3错]=]R3GnOlgyq;oXn/&%ỌΠfieCj&,{W0-8,U ᨓoZSHgOcQMěok'K;Մ|?wͯj?YKn3kIzݲ3xJK=soيIG[Ut{hy~΋ԜDx{ʵT6WŸe endstream endobj 1425 0 obj << /Type /Page /Parent 2439 0 R /Resources << /ColorSpace << /CS0 2444 0 R /CS1 2445 0 R >> /ExtGState << /GS0 2481 0 R /GS1 2480 0 R >> /Font << /TT0 2447 0 R /TT1 2467 0 R /TT2 2471 0 R /TT3 1538 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 1426 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 18 >> endobj 1426 0 obj << /Filter /FlateDecode /Length 1427 0 R >> stream HWmo6n`!Qn ( 2h%C>hhsBvߏGA»{jS'pp:Xz;0@W9ٔ w]]=C]A] "*pL ! .uM1@k`Xqeu0mz|Qp\Zi<ޒCYm7fӞh槙7;o[*w{\9@`nsZ*W(P 0[8&o7\~Q1bnf\$*|%Hg^itI›x/:3XZi[q%Ys#u#}NHZ7Nx-iy(v ;GT 3v4O9.P W?A~{I 8zpK\[D.ϭ;64הIy|r|L8K/@DYTI/|gO'q_'=[s9\^ Zmܒ+R5MU)ECKf8Qx$K;يP&0XvZ=yZ'դo'ΰVWIbG<-]w]uU+%mW[nβ!>>}ӹK<E;h]{hsb# Q FQ*HU# uGIPN)y3D: ikxգ6Я34LMe֧]r̆3Řx ώe@Ƿ#`b%"?Ԓu.)hpR:ߐE  X366dS9}AO:ic ]ֱ2> endobj 1429 0 obj [ /Indexed 2444 0 R 0 1431 0 R ] endobj 1430 0 obj [ /Indexed 2444 0 R 1 1432 0 R ] endobj 1431 0 obj << /Length 4 >> stream endstream endobj 1432 0 obj << /Length 7 >> stream endstream endobj 1433 0 obj [ /Indexed 2444 0 R 255 1434 0 R ] endobj 1434 0 obj << /Length 264 /Filter /FlateDecode >> stream H!vE!Co926r$D"OvKO"H$rʴ[lNMp]znjЂJ H$$"YPDU 4Aނ۩ Q B H`2XV: l#Df";,JVj#3ԤLYVeuƦ4ު%}>uy9?n^}Gie9sl9lNr֑cִ̋_>{6ӶM;8/ן[= endstream endobj 1435 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 17 /Filter /FlateDecode >> stream Hb`  endstream endobj 1436 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rY`+ endstream endobj 1437 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r*@9 endstream endobj 1438 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb` 022vC  endstream endobj 1439 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rd@< endstream endobj 1440 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rD*@= endstream endobj 1441 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r8Z@V endstream endobj 1442 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rH&@u endstream endobj 1443 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0r(%@v endstream endobj 1444 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 0rȂAEy endstream endobj 1445 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 2 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 20 /Filter /FlateDecode >> stream Hb``  endstream endobj 1446 0 obj [ /Indexed 2444 0 R 1 1448 0 R ] endobj 1447 0 obj [ /Indexed 2444 0 R 2 1449 0 R ] endobj 1448 0 obj << /Length 7 >> stream endstream endobj 1449 0 obj << /Length 10 >> stream endstream endobj 1450 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PDLDHG+Wingdings3 /Encoding /Identity-H /DescendantFonts [ 1559 0 R ] >> endobj 1451 0 obj [ /Indexed 2444 0 R 3 1452 0 R ] endobj 1452 0 obj << /Length 13 >> stream ff~ endstream endobj 1453 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 17 /Filter /FlateDecode >> stream Hb`   endstream endobj 1454 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` 0r  endstream endobj 1455 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` 022v  endstream endobj 1456 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` Q@3` endstream endobj 1457 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 26 /Filter /FlateDecode >> stream Hb` ) =  UT endstream endobj 1458 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 22 /Filter /FlateDecode >> stream Hb` a(%0 endstream endobj 1459 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb` !Q@ ` G endstream endobj 1460 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 23 /Filter /FlateDecode >> stream Hb`AQ@ `} endstream endobj 1461 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0Bqb:0]`k' endstream endobj 1462 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0jl:pmD`G endstream endobj 1463 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 02#T3y)J8`0 endstream endobj 1464 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 02"S$45f;H#  endstream endobj 1465 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 02"Sr5Q|@& endstream endobj 1466 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 02"Sr5Q|͌p 1)  endstream endobj 1467 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 37 /Filter /FlateDecode >> stream Hb` 02"Sdr(MV,N`p endstream endobj 1468 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 02"SrNLE * endstream endobj 1469 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 41 /Filter /FlateDecode >> stream Hb` 02"SdruBQL`mdiF endstream endobj 1470 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 02"S 4_3^BF endstream endobj 1471 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 36 /Filter /FlateDecode >> stream Hb` 02"S$rt_3^BF endstream endobj 1472 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 022(7lCt`0 endstream endobj 1473 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 0Bq%S75R`1a3 K* endstream endobj 1474 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0ji%_; |Gõe@! endstream endobj 1475 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 2 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 18 /Filter /FlateDecode >> stream Hb`` endstream endobj 1476 0 obj << /Type /Font /Subtype /TrueType /FirstChar 48 /LastChar 121 /Widths [ 500 0 0 0 0 0 0 0 0 0 0 0 0 675 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 ] /Encoding /WinAnsiEncoding /BaseFont /PDLJII+TimesNewRoman,Italic /FontDescriptor 1547 0 R >> endobj 1477 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 2 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 20 /Filter /FlateDecode >> stream Hb``P F endstream endobj 1478 0 obj << /Type /XObject /Subtype /Image /Width 419 /Height 1 /BitsPerComponent 8 /ColorSpace 1429 0 R /Length 17 /Filter /FlateDecode >> stream Hb` endstream endobj 1479 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb`AA ] endstream endobj 1480 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`@ (-0  endstream endobj 1481 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 25 /Filter /FlateDecode >> stream Hb`TP0S endstream endobj 1482 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 21 /Filter /FlateDecode >> stream Hb`xL endstream endobj 1483 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 24 /Filter /FlateDecode >> stream Hb` + endstream endobj 1484 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 022F xWPn#) P endstream endobj 1485 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0B1 F xWPn##)  endstream endobj 1486 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 39 /Filter /FlateDecode >> stream Hb` 0B1R#)6(we`j @  endstream endobj 1487 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 35 /Filter /FlateDecode >> stream Hb` 0B1eR jx Ar@ , endstream endobj 1488 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 34 /Filter /FlateDecode >> stream Hb` 0B1Erb7Pd @ / endstream endobj 1489 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 32 /Filter /FlateDecode >> stream Hb` 0B1%RT1 H endstream endobj 1490 0 obj << /Type /XObject /Subtype /Image /Width 388 /Height 1 /BitsPerComponent 8 /ColorSpace 1430 0 R /Length 38 /Filter /FlateDecode >> stream Hb` 022 2rgP endstream endobj 1491 0 obj [ /Indexed 2444 0 R 1 1503 0 R ] endobj 1492 0 obj [ /Indexed 2444 0 R 2 1504 0 R ] endobj 1493 0 obj [ /Indexed 2444 0 R 2 1505 0 R ] endobj 1494 0 obj [ /Indexed 2444 0 R 2 1506 0 R ] endobj 1495 0 obj [ /Indexed 2444 0 R 2 1507 0 R ] endobj 1496 0 obj [ /Indexed 2444 0 R 2 1508 0 R ] endobj 1497 0 obj [ /Indexed 2444 0 R 2 1509 0 R ] endobj 1498 0 obj [ /Indexed 2444 0 R 2 1510 0 R ] endobj 1499 0 obj [ /Indexed 2444 0 R 3 1511 0 R ] endobj 1500 0 obj [ /Indexed 2444 0 R 3 1512 0 R ] endobj 1501 0 obj [ /Indexed 2444 0 R 2 1513 0 R ] endobj 1502 0 obj [ /Indexed 2444 0 R 3 1514 0 R ] endobj 1503 0 obj << /Length 7 >> stream endstream endobj 1504 0 obj << /Length 10 >> stream endstream endobj 1505 0 obj << /Length 10 >> stream P endstream endobj 1506 0 obj << /Length 10 >> stream ** endstream endobj 1507 0 obj << /Length 10 >> stream endstream endobj 1508 0 obj << /Length 10 >> stream endstream endobj 1509 0 obj << /Length 10 >> stream endstream endobj 1510 0 obj << /Length 10 >> stream endstream endobj 1511 0 obj << /Length 13 >> stream endstream endobj 1512 0 obj << /Length 13 >> stream endstream endobj 1513 0 obj << /Length 10 >> stream endstream endobj 1514 0 obj << /Length 13 >> stream endstream endobj 1515 0 obj [ /Indexed 2444 0 R 3 1523 0 R ] endobj 1516 0 obj [ /Indexed 2444 0 R 4 1524 0 R ] endobj 1517 0 obj [ /Indexed 2444 0 R 5 1525 0 R ] endobj 1518 0 obj [ /Indexed 2444 0 R 6 1526 0 R ] endobj 1519 0 obj [ /Indexed 2444 0 R 7 1527 0 R ] endobj 1520 0 obj [ /Indexed 2444 0 R 8 1528 0 R ] endobj 1521 0 obj [ /Indexed 2444 0 R 9 1529 0 R ] endobj 1522 0 obj [ /Indexed 2444 0 R 10 1530 0 R ] endobj 1523 0 obj << /Length 13 >> stream endstream endobj 1524 0 obj << /Length 16 >> stream endstream endobj 1525 0 obj << /Length 19 >> stream endstream endobj 1526 0 obj << /Length 22 >> stream endstream endobj 1527 0 obj << /Length 25 >> stream endstream endobj 1528 0 obj << /Length 28 >> stream ** endstream endobj 1529 0 obj << /Length 31 >> stream P** endstream endobj 1530 0 obj << /Length 34 >> stream P** endstream endobj 1531 0 obj [ /Indexed 2444 0 R 2 1532 0 R ] endobj 1532 0 obj << /Length 10 >> stream endstream endobj 1533 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PDKONJ+TimesNewRoman /Encoding /Identity-H /DescendantFonts [ 1553 0 R ] /ToUnicode 1554 0 R >> endobj 1534 0 obj [ /Indexed 2444 0 R 255 1535 0 R ] endobj 1535 0 obj << /Length 662 /Filter /FlateDecode >> stream H> endobj 1537 0 obj << /Type /Font /Subtype /TrueType /FirstChar 101 /LastChar 101 /Widths [ 292 ] /Encoding /WinAnsiEncoding /BaseFont /PDMFCI+Garamond-Italic /FontDescriptor 1549 0 R >> endobj 1538 0 obj << /Type /Font /Subtype /TrueType /FirstChar 121 /LastChar 121 /Widths [ 611 ] /Encoding /WinAnsiEncoding /BaseFont /PDMGCP+Arial-BlackItalic /FontDescriptor 1551 0 R >> endobj 1539 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 6 /FontBBox [ -568 -307 2028 1007 ] /FontName /PDKONJ+TimesNewRoman /ItalicAngle 0 /StemV 94 /XHeight 0 /FontFile2 1540 0 R >> endobj 1540 0 obj << /Filter /FlateDecode /Length 7881 /Length1 18760 >> stream H\U T{ApAȢ 74JAwE qDcԚ!*\K\Q5R3jm5-6=ѸZjL=ʼ^tϹ=vX ًߗ^]3%.xIނ@s\^h^3'vn:nqK[x|躣xl|& cynkۯ~5.9]>`槧B@&?wcSc."}]° )GЈ1xc"0 :b )؍0 @*ld`+`&Jq t\.'!.\`/_$cR1MA iAQyn ̣E}t=x ]P/ !"٨T BPJgkC1E6jM6~sKE/00.~K\I:B[yE8&# 1 밓q7Nu2r_lC86ajnj88CEtXԷF?d2wpc+yqL&g1dʧ  ]"{#Oȯ@Љnq혎ށ׸98H]?"K*A=5V{{}+`.uxpFݘC_*-3SVv.T%e D=z(n"F L(1ALfy (xj‸(d.9_n{y^C P1jU:Ϊl88baIdX,[,YXZ-։2y c#?XNZ,\I2b1U+#IWBʹzL<&>Pl$<:qC<U Mw)REy2YXZT*3ū(2YDjq.ħz̋NBQL`6S@[Xўw#: dN:/}ʑE M"CX%R˽/ iNVs lf=Ԫelt`2b8D>Xx,G؂ezch"Đ-e-QN |Z߬UNVlJF.^6l3aez˿Ƌ||c󛁝MVb7 I8A2|'4VM3,;j,߉Q7#n.ӕwwދXcdiFJ`=N}gdNU֣0 =f4kV_@ #+÷M-M6YxQSo&Lҵ:|QYyj@o{I#3&ܰC8 ؘю~}##CC޽zL[׀.;uϷb()=5g{T=--ulw'R1̟{&gy&3鿞oðh鴛)vfLd{]=oǵo 3 P.*pf|s|cӏ-'pj3͙X/ӁIySg) <2LLPl{NQm.Hn ${malPi;+6#';}=53#]Y1:Gqm͠ zFyw{`|ϐ;_Gy)p`uLIxQ0Jx6MDA)mmHk2J+Jʠ<ڦM BP 79Ъݙٙ1yAM|g/SѱkMvli aP,a=pa]ck퉸mǂj#ʜ亀XZLj.,ZRa4jAsHXX5R [N TVtnn nTK V]CƯ[d,B8UX7z6V0%4hm85ɔ|뛮ni;I(N,/78@<58Q8OgTVl1vE xwDh%:fG}h"U S$YHF-cI#ɨ' IQ$="Fj[^hշT2ۺA=[>;#K4[zZd Z+3kH5hKH-j*okffć\zȭ⿭E+d ާR)k)ZzOfuAA MITj Y U*3T2Xi|FWe<>tnۓ&hmA mW}WD7Z`WS[h& 5xo 2;!+WF:TW _գyFz9<n"|S4ųc@%VR=r}qWB-wX+p\Hu|_wZwCL<0)A0I@#Vq` ,P&mÁK Y򹚩XDe ]}7]2!+سec\ < <{eAiޫu Ͱcڟ`B%/E{./ hυo=B`|ll|$b86T#T9no8xv# |H cU9͜ <7njC!/^ʢBrc+r3RG39fm_;T|pcPN#w|u|)׻>3VR9xM$QΒsa>D?G)/~괮:s6v6ͅg˘2e-'߲~z{%ߵ)@w@\mz<ȇuE%d9rX"Bx (~仠}s/ٻoS0uQ3S{ {|?Md?(M+SNy܁YHy}_Zه%~#PP8jREsWn^J릡lup7mw{vwy:Y!ԋ aiv.*#fh`v1in|*03(x/Y6xnXd׷L7SKĐW%{+x6SO9}3M˞{A;OSmDg ]8߭ʆ]bff@Obq\ssW_[7 Ndezx }^`@vξ{o&R1w/'b"l-T:{y|k&` %(5:`fBil&VF!ih;定Emei2dtNF$is:Mf?ݝyy|sϽ=+SUu}H+ƔIݗ/l #JN=1ߧ]L?<;ooǢx?w9:RB:.!й.E(7()a($#JwZ!'0>$NI1q>}.?`(ET?G}WoH5M;@%p2߁1~'{C?SjL!>Dzי#uP3s3] Һ)E-rY+g?N8=*un7P"Dάy8]$'XYY <(\8 vS#K 9?Sz%%CزY:+%Z|" }(%t#_6byK]Wػ&eMmN^'ȫ/IXڜťP2 F1BOI; H(^̳]B,d3{ $mgz*'aτ@]vɆ (9o]rAh;X63G-@7 K߆kʵ \Dr֊VĴ"Rbb݀`XXwa7?E=uǬc툭 BSX0{*0+1]sTmަc6e%QOG6 @![Z7Fr!oIH#4&êdinY`nn" Z.}ސA;}aU#aJ6ɓ})" !љkfg u\lzb/;ֽK8N1ŎT)io+k&8 c[6mQ~3z^{ UdׂBRGE)j;mz9BB IAV 8 qd!Á)o4RNp~ͼ7ow=b+K͟RKTnU w%kA5lUrkOUrJp_wwceWx؊xXVĪp.bDUXg20Wl!Suq?,̃kO7#qvd [4UDff wpEq%1F6g;. ͱT,HOv/qj׵PDVMkO=Pl&7\pwJhk:|\yݤ'es׏K4k# `\+[1.| t$L"ߠB@|ʏ Ⱥ16OΉ%K: ^8j4 ?6|&@6=)D1&rXwc|}FMǪ +D wͱ,3]-r⸀C ;ߎxY,e%_+H6r/$~iyBUrcZqƺ3bF-[;0껊#ܾ+Ha{*4wlH*WXP ),*i!uJ~[dH*ua CҸ$F! r8(*k6iIqu-C![>/S5yToǺܦp#DƄjUE~[Ntn[.ƵvOv;I8O~{wǬ3ڷѝrp-'1dI!C7tǹ@.ܘa a;CNl_u^&nyAnzxxxxxxxxxxxxxxxxx/tneڮݽ ˓>dLAOoZǗ_S뽧=`3Cpo endstream endobj 1541 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 6 /FontBBox [ -139 -307 1063 986 ] /FontName /PDKPFF+Garamond /ItalicAngle 0 /StemV 81.108 /FontFile2 1542 0 R >> endobj 1542 0 obj << /Filter /FlateDecode /Length 8104 /Length1 15200 >> stream HW TSg~Y!IL5BIېf#RTHZ-mW=v\P*::2L.VQtE֙s朙3gΟケ/ A.R0Һ6w™z Ih9af:];dX,ɳ>Ev݄sAà8 ˠJή> M4ݨGw!VlG66xp⎰̱/ZE ޏ,6'|BC/D{tM썾[XFiL{ ƬSpLeȸK#GH8ޢ.h[xcXV;w͐>onz#t[8,9zIE WRrDYL.?@;js h 8YdwE)fhDBȀي5:̶<Ɲf#Tv;)EБ %HǤX:yHe2yF"a1E舡^cP8(Ƌc?p|4p-^Iw"p4G%ra;5dLs?ݨzy/:+6. 9WK̜e1]g݌fOO lʯ>} P7$ԮR81m̆q9QgW0_J }[gn=)9~}q7{YR~ȶȰ+ʧ…24m)iY ^uF1Y[p>> cj_)WrcM\ϯWm=kHNZV"rQWtm#[uIv;InAeSjEUA_׋G}Gs;r|PjHiIU^ J ;TU]na-5T-*>J%T8~vSn=6ʕy6 q;8W~5)%Qhm%g<_^P%ZήMnw0#6/w*]>޷t= 9Wkgxߚ+F7ͺ|&EPd2:UAI4 W[RӲӊƞ% f[!D1ahϘCQJ 0e6plgG̸A.fueL$ F8r34&34皍zނ 'q⹸q!r$@a HHZDa&n$i҄CxnLHR &6A&\Hb B1yLjky8=D9 /N._DKc`CJ q8a/zJkƋ0 >f(vL$$q/@j {2#2J#RJ`r5HԲt)!OREʠ>e` Z)fd@ 1u9,I5rEF4uVDL4JJ0I1) S%i0ArҦ\`juY J'22ӱ9u*Z<(+{7)(AE`P0!#!Ca[DVƊWxčZMi7TLԵD%- Īz~>/*LBT#3ZZ3\D)ѡFu%\}ƨ$\xLdxX\h8JŅE[NaQt^)Q Q%TM0*IfJɣ<(0ڐQJeԁXLöI:VBce$`YjPBufKW#|.I%UɈ:S''vW`.7T3 J R(%J}L3ui:ϴTQ!c'زRQ)*"T3B7Ǯa61I^I* 6BFNa2w.3Cec-{ Ys{7 bn'Td6YXm{qS?dœq/#&W4t\sЪo휐@eԩ`CnY0E3׳\)9n\QoeG[{&o[Qfy=AMo ؖ{c袂AkywR(;NFfɂ?XXcј>EVl.@c~j(8VCX:rh!8 Adpjz_RlDo[_pa $9iZ:U1W/fmKˤbWyZ`|)W,]y QׄN?H9GFoy${PK2vkg̴rUz}aitUYҚE=^=Ms%hγwoji;0ӯj>جI[PK޴CSx᷾Li>Ƅ:J$2&L8b? ~F{eUBuG]97 }:n^Y7- 'l)mszӵ7^V 3}ۚ>G&xE>ľ9K+޼.=twkAUVr϶ΘE mZWigѹFؒW8r_Vxm[[k rWX;е#mhr+ ǬR=J|OlSVr6.DZ`Fc5m?Ǟ?;Mt> `_0C@`tv"ᣬ5~TuZF?bNA 4+}=)Gվ|$T W{E &L(p8 M-i=tm!<+ I}gX I yɔt~6Mг:S!{`9-p .>) d- yb=ع0FZ5΂^ 8?_OJ<.}eYvD_ѹ"c 05i6z:@6f`,A+a Ԣ`b < HF'2H8&H EiBǤTDhͥnz6fHb&ŊMy)üsB :CwAq0I`a 1IbX>#Uނ>Fhp Op:wD$DMlB`ed@6J='sQt UQ5F;V!%¸1L#cR3Ic~`u}~mgx|^oƟw `X[ٷn[!wp% O d~GA'zS/OI3Q:oyA,l0gT֋_Rw*N6]Wj|GXZC 1Qh:u٠w5x.G,ڌ1}}"/OGǹuu8;qc>=qÆ`7d k+K s3>6 E"g BBȥb)E>iܩN:e:h1xyc_m*Qmʤ:D3לRUi1|D) !zoPri&2( _, RA}e$CN!91/-5`~,rs)ð,mvͶM?/C;s\tG Vc~̛C6|_phc_q;R=^?\dWɇtnn#/ .9Gm_@\8~.q ! A˷:5~'h1D P{=>qs:ذr-?l@K^(ussyh/6pse6*-~Ȩe=ge#8Ol95)^ίY0oZtY>}T:o,NDQ\_ijfë:w9aNpM^ \sLi*Ī< &zEq?A̧[ܝGmڔ{?S؟[\oշ;۹aS$5qZzڄ|SjsU6Ϙcr7nqbwG*X:7so3"Jk8a #Z}?Bo=@˔@^u wYgQ"߽7jZ3fمw;X9ͱkyygؿ&خv 1d_}_lyerf*?*_?yWz SZwPW9A.w]˙7j|}}AgY5s 0㨇,k{.ދE)r&wC9 Aoʌ%'G wTB?|/wI"OY:pb}!"Gܿ}oGܿӋ !᪄==M>`7ތf1)qHMRu{W'%TRBU̿CҷҰs|dǔ1?E %enrNr@) "@ 5Hb[̍o[J$KXo'D7 7T*$oTxVaQIaxfT*Fˠ*x[AFqO{l+Oy6:@빇<=/\ɗ/\ɿt cT,΋xӄ9Wk5KD %1`Pȍ_#"Q 6FFG50Fڨ Dĕ 5!rW&[TABUA f'EUhgA݃``xAAuiXc,SQTD^z_5_ SShO'DEO%ȕFG$Iw8f{S9Z2]&y=b__yպ?zʳyBZty:;=!gQKՈP63bXL zbؙk?!|^y;8n.%5\*J=EL;iS݀h>`Pm}1hRy%mooIc67ovgoglΨc QbDћ_Qa:tuݓd>` \%ۄu e#;<6O!%U)bxHJ+>%U(R)n[hyS4ͩ(GkO*@s3.mHblC5^KvYd%%YRhI%.Kr-ɱDPCwEҋCzv$g$fI%%-qZbD|]r 9esF;93eCT5MүKiI?%IC;%m3+c+X SX![X.3D3Fz{m>LmCBe\ۂk0>7ذFG 9AAln)åF++5U?|,)?})WHu\s{%mɽSB_ ]oKzƥ. o;{ O6 n X X5ͱcֱRo$X(LaW9Xz 1r}AÁU0f(Υrp* 3)@2cg*ĴI"w$:2Ok?{d?#D?GI!AL_&I0Ю- 21k2$ӡ,9}MxגIލjB1bkz|D|EH ţ 32G{=hh2Ppy]^yƞoovx#\xADS$"H` hyNey?VZ$,!DZ7G\TZRP[v?xƒld )Qoa^q~&䧍bro#bz1"Pa%F`D96^VޑyyȊx2P".W TV:`cA:s^d,A]*gKL#PEV_WEWOVW_] ??\}sZk\JwUPK@ɦ.?Ydɒ%K7՟ z-,ҿdA8SFŬYJż3fF\Z}(Maն gyQ endstream endobj 1543 0 obj << /Type /FontDescriptor /Ascent 898 /CapHeight 0 /Descent -210 /Flags 4 /FontBBox [ 0 -211 1359 899 ] /FontName /PDLBBC+Wingdings-Regular /ItalicAngle 0 /StemV 0 /FontFile2 1544 0 R >> endobj 1544 0 obj << /Filter /FlateDecode /Length 6023 /Length1 10228 >> stream HW TW< ѵK0p,$VM„Ef(-VK['UQc{Z{DP|Udn>ߠ{9gΜ{f'AR'o@I= (YL]|A8fg훮2>Z޷:ܐsdY [`AW-6j6΋Uau 4D!aFB.ܩj !lvFM? @z/--,X~ϛu AQ/q=V 6=`ת,T4H!4{#B"Ċ8F~[[nEWxTpD0 ]WҦ5K*G4ktO2ؐRǒ+\V6']ȵ+ Ya>&DF-h6h(Isw&J2 CG)U ` YZE4E$ NJ%h^S4A'uu} %̲2ܴe7{Oдw}כ~R륶qZ~[qaչz?ro=w#U{eB1plkC+7BV ^k-obfæS^'0Y0K ]θWJ9UU_^Z5{h!KwLjQqhçN9W4kGf~tU']\<۹6raחy4)˗Į \0;m#)D_!(M9*F$a}9_xbx?K/x<1;8&(,Szz%UUggy%*IieWNrl0{&j?ߎ!~[[mޓgpVm(߶d'{K:JB?뉕;K*٢t:޶kBqT$ *gi=.7Et^3t.KơcHS\b@n5$ 0$0Cg9pAAz\3[#Sb -(]CIHKXr5ۿ:t0x o=ni:ږ_|b#S8"ZlpWi6NsӶwDc{fjXϝolTsj"ilt&H  &c9r&X>=熗TҘؐ$}&і#T]dsKXwk|xsb̙@k/Fa^ڐU֛y['?qw}k5!4mWbk#F79Wl&|՗f19hY=cJy~svLcY˘|zf*Di&l {_~_vCYLRFBxl. s'nv VuCxDmDidbL̿(n27Ak!H`]a&L DoɆtոp3&\ @P$'!$"LGg& P,8pStd &n5Q S`$d4I pa54g DދDVD۠ph9YŃ~1XiB vHY|;et^(! Qql E."BMR9dV+P'9b W2Lɛ"SeJ-ЀTL#ϐaT SX&۰G2=h'*@FTi0LpѪ16 NkVEt 58)1der-&W@=h SBF lDr`Yد,Bqg澖F/l@TXPvW <4貼 HJ "*jXJZQѪU@|_;s̙sΜ3s  Q"ud`t_[8G 5@ЀH><&2|qC\$684[-ZtRZ8,Jz%Vv1Xɫ,TG)(Z*) BӁzl2}XLȅc!%g aeN< jH i/w~b>7= [R$= %BsĤs +Ŝ曯H4PH?Ykz>MHHUN.DY,f-As0p:Q$n((FJ(VIg3n3H)<ȅ7K$~NqDiuPm Ss5*׶}?ZL] k[WA Fݰݬ5W7}jY|^V뮸o_J^8t_A+Vbv aXҤ;% kBC1Գq('MdmT|ˢjǕح2QVlbQFi(VGhrF}!1'`d9Cbd|˪xMb!_{"[8~^Zv鍙K|2;y̾-9ַQ_{C}o'հI^ʘV]y)uPM; lzc)5x3 6o47J8d(wn륳|Xچ4\|Bfn]y>8)ط %ۭn]9;3κTMwh3ݥ"Tt*ş`%-?}>j`sM\ن/5]#4^8 DkS_*l+gGvuܺ|dP;.xf1u n7үoVwӖ}~oÃ{(k׾Z?tZ}nSrfgE.o_zU{%G=OgsiڑX6SҺ=Rf ~$8RBBH$óա:b22h:2U yH:n%2FsTi#m"pALL'yЧ&0vu @r:; pba} uQa?\OW+v@(E"؀7;"> UO*H#16*c:Ye(P`eZ5(Ռv:^#Il}d:# "'#W Va9֊(|,E FQ3jE55twl]x6 ?& d"XmFXor'G9r|K!( jruu:)k&Uɕq[Rvy]!p$T*]kE``%fc@<^x%k- އQp_÷q~2uоpEbI&Nv D$WMy 6ZR2ʞ@) ZFQ6 fEϧ:l`' C13d3EL "eD\v=%g9p.EqY\>wݕȰ0H=DcݧI; 9k (#V\E1 qQv,лt,FGYrPΥKAJ\>>Ii^j/5SNMQ[tN*D@Fpzr:TIakȵv2W1{ҍ)“a1ԇ#+\ d=crc\ߑ8'=~X1velm޲ZH8EjFݴFM)@HFy i1Z8SGp99-?rJηqЮVyc^$i7c ggUkyQ^֪@^4P"@RKhZB˨4cDL2Ujc\%`\Չ8jsmiˆE˵a۔H*K}pj" /B0!kŬI>@AVf)`h(Ca[ۊ/&Ϝs̜ic-hEA;nQhv7zLTը5Rw,Xkv g)(VIn㫮JQߘfL<oj2eo%=vL~ﴚ}Z]^ Ȼih6uꨝe Rd*>YZbto4M1,,Km:B#謹Y:F@fWT)Y ɞꪔXtjzQP8mbogpY¨sS䈌vlI:y#aL,y^C6qdKW'Ye|+`P̝+wֈꪭ"ll")HKj0偀\tQUQUשB5AS8b3='=g|C2+ǿEVwӬ\yV$Ze +c֠iOѲZ ŊY]Lн -ͱ\J_͍ *3NT%iVV;!*$|eluExr.耧RVI/Ry.ӔP2(zE0HI~K{G!c]5pަ~mr@mdv; WBƻ/9k*84lB耻%1_,;j,!qkh@2xЗT|7_@Þ ua$0S228&'Uv?S9831yk(=m=Ŷc{ 8skǍVknv/ȒN[qoB%rJ7YF=zC҂JyMO;96vZJN*RrBQ%GRҮMI%!%J)Yĭĥĩ~no 8>g@C8w zz3餒SJ+9=%4)Yd:%<%% A_+s >0omm~i~iDm k#Zbا%6k-ѧ%iZQI>q>>^Ky 鼐{8n=*f8Î=k4Z+&JlpOiI1n> endobj 1546 0 obj << /Filter /FlateDecode /Length 1954 /Length1 3840 >> stream HWkl>wfvf5YXf벻^lڲB66ۨl}xM@h TJ:kP~@TEU! VZZmG+E Ҫr+;$QJ9sϙw殁@s ;yw|5;P=6C3wΣ{C(9O& miA5q&>>VQGZ8M]XE]f|k IM~Q4oD14$$*ѹp )X ,v4ĵf~d!$̟΂R$D>eF?Y$YDZEאig o o8$G@T5Wnx͐wOk{|#wk4FAHϙ&Xu;ŰxO2p~6uԨ{ sq5Ҏ;Xm(H\ q {y 4fŻ(| aTGؑv\0&nAҒ(E.=].cۿֺS}ܮxٶ}ukScÖzBDs5Sh[ mjoj'e1Tp UbҋÛ,yKoɒpTBW9"ٯj ]4 ^h3v|B XG %1%@F@̏U>՗t9![Ylr4eI 1.ؗ@a}@@|#рfk.'%:a># }T2((Y>3C"RQ5⠇T?=tarϏFi/Gh6^Kg~Ƣ h‚Q~I#r5 #Q;f&VƑQ:%V7&XSjN)BQGS1\:#{ohT'm7g@?rVWۨq9fKںS]SΤJ:3Y[MXFjn$$Rn)I(/0UEmfV`,.-"Ok)3;ht9ѐ:fVh[(>scvʙ(t$Hئvh1lQ Ӥ1;F*M[#(iu*'dS-Oj4A|u=*A=sk鄪U= cXlF=n-(o-hd)yc0ʱY/^)*7(0Ɠ0Jq|3?0qH 0_߄|bc?ғEr>Dy\wFc(,\1U-; *~m(8miU˃" ܢ I.W͋;w-v=JU0?yJNG_*b aI"L^\tw^Y6/vw 9_\/VoɎan|sw~E`lMȁ]Cpxٺ&_}76N]eiu1 endstream endobj 1547 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 98 /FontBBox [ -498 -307 1120 1023 ] /FontName /PDLJII+TimesNewRoman,Italic /ItalicAngle -15 /StemV 0 /XHeight 0 /FontFile2 1548 0 R >> endobj 1548 0 obj << /Filter /FlateDecode /Length 8002 /Length1 16264 >> stream H\V tW>o!$͍x#^DRXM0&764fQTW vd|{o}AZcRO95m=0BbV} и6v ДOy6wvi߻s<3/1Dur^' ʬ/A2+(.i!c̓d8gr@M %Wi%sCms΁! :Vl-Jj{م]c*A12"tMwZkn2gT1{/`*B@"g,b12aիX4ÏMQ2[}ZLw61A/skcb|z}MQOiZd%,B$ !}E+$E" gi"tQMiTw&B4{xaa?b62h8ɁCM~ԝw it%*gp( cxc ,C.yKTn;J] vG*1nBQlF6/vw~rͻ87 jKG/_Uƻ^HV a!qlԃS1]bonó5UQ2qz>&1 +"!(Y-'Awx$TA5TKO=FYo>[u$G_D X`d ygԅkV*ZO K_WcT 2"|¼a`u*]XW f _N#q܃8"؞Q+0H%j]$\HuSvFq޸j.0+\!t-6 i"Gܲ@BP$['wO(ً:P RdzM'Q}@Utwjګ.(M/3Rd.V--QLv/ÚO5_wrup&TUMo׻usWv~DB[*g,a" ["Ň؇¸ mܑsMSGS?KMLʡBZ7h#m-#TG]z!3=nǾ܇8y!YėTWDJRS%"jڦEUn!9 4F157fQ%Rmk9ccX{X)֏{Z*kJjTqay@^Jyޜ8`]xKB-KEeMR h,I rg4)aMuExs[jUZ`E=a:Jƽ1rt :!̘mNJ.} woH0[a{D \NxUy?N""[#F=OI7<-A:#Jn@E-ǷPIsZytNQ/\|2MQRGmީrh .G5#YA(nR6d5XGAv]qg^?HtpEWXxi*0cWcc޵F8'awP'?'(RAIȥbkJo!]Wɫ;Dž m,3y4,]p†GLʿ|.ݴJcGƎ>lQ׷O^a={ٻֵKN:m֧wV^yX-`asd8{RRDǯ26Y[-mfeXe/$p %mγvA2!M76}׸֢[BǼx2l V$dq5^qlψpxz%^XC1V?ah ãrv'8;[8Upc3eBZB|p'e3r6A%iu_c *l5u+VAfhਪ+|޻F kB%!M,?I$qF "AҊЂi,h;v6 @h( (s-VL3{9s_j|EORp\tҀ^^wXKڰZWnvnFDls)oFd;53,gσdϜ, B3i,1<g?f=.;pp잶jJ-#u vLM ʼpNAoaφ˞.7[Qv:<)OuMKeu7%֑7=(h[zʶD=^⯀wW9ZbM/s~kocja{Vf='DnD`bI1W|A#3TT͝t'$%eʽr3[0^|@a#E/rv\;7dU  kkyZ6تӄZzzW[=WvuN E'WiknQqʔXϥ*e5Bg4R8[ֹiz,lo)gB n^%ZA"P訦Tum^- 3RNt#/G-E2 L''#ce }Jr'p,,| 8n6z:,njEQ- R;cx݌E3y[/.~b uG1Pf ?e$<XGC C^(OnAAi{(m=h; P[Ȥuz&L}#zY~kפt0.Fؿ۸ۗ,|#3@Ү[F:-0ca8Oܫ@QN8K#PgS [% d=Au#a>y}ۨPMdU2ד.>q4.Ï6c~MOǞqŽ kY<8 h7(ykSQs/8cC}5^܄/)A`}#3&dWܔo17?@?}Wkc{-/Jѫ~60gOk6sƖ75x:WTw Q>`̭Ľc+ywVœ1#YŃ1|q)iq㬒[Z{q8"w`[KLp?;0kAgOTVzY_I(g9 cm$1|׈l2Zh;6UhLF^4ڴFF_;egmY2m_U@Ь7E*JVr^҆n[B_TCRmqZY@.:Pix)s4w2kgBF(R5@b.CZ!FxZ-%mvG9sܵ{Գ[8>s~Uf䐏n3V?_Ęy%ϱs 柅way*>"q8;ݾ >Sq{ =88L{U<T$F*MY rdTNR2';<*7D@y-oz*o"1JTqeFCR6*o"eЋTliX~9Q^(z/Tn7tTVg}'NB^1b{ [. Y-}~@ݗJYGC)0}aBĒ5WNF`s~06{OjC zw@}\.<8L|@EjUtPLi!58,T}%jB-&x* b+8zɕFg܋Q3ڡv8"Ư  |qez2[˾~>G.ui*q&UAC,z@5`/ʛ&pʫOu 3wzΊ3h >? Pn 40[;2, AUșa](w~` ޯ%ne<9|%sW2&e-%wHkuDr^UmO9D$bkOfz8e[mО%a,;;F'c t,pa0i DLÄ2M ht>1fL?0Ng2I0!mq@}rC_z~~ݽ];KyRv\18#SH SBEȓ{孞Žb%״@/W̻ ɓIX56kˠCsORr:iEKrE,$rɡk wA 6&'^ A~^qbmiDL תݢ sOmax,?э<@3, Gun"Ζ9Z"V, r]Ȟ!iT +ӉPCY0qNi֫Er׳X_bUr+ViKkX~(Qjne'Y|&ͨݚ{ v#Qt>mRԨPrȟ/<4BE~R+Qlve!Xs^gG')^8Ѩt( +Hq"E+(<hKi(jhaG!Nt $~(=MZ ^ͦlQҖ_hú`+}MS$ӯ0 3t2xbaKfuބM㫺5Xe ɡAsڪiUF KEHIĚi;u8brB ɒK*=cPBbd {EM7w k <[YC Hkc[daL,b wP Q׎Q+61*r"wӈ { " wsuQEҶJkQi~TjJqІd$ L\\7dY(KߗeUY^YKx1@溕9L+P%-GAT( ՖpZ)Jjɀf jcE)?GA-/a15$Rc-7Q33+~ ^<Km+,W퐓uoC!N-06܀k y];E? 兌Eoy EoDe#7ռߪW%o' 㑍U8}Hbf*z4AwAgb A>n `@+T.lj.\i' 乚ܽ fH>~D|$l4i∸EL!.Av.,gt:6':VaTp1pؘK`{)YEBbl'baN%+ c$N_{<.]ִ{NĚM;y qy7KG&M&gOs/|?M3:12OI$AyФ_;)cլ&4434m,(xMah'4O2l3оqJ9Ƕ e8'cU(s_8v97.)P"!F0 pG`Ѽh;T| tb ʡq'I.Y_Dkb*t՟dzQY8i{̲`|aWn(7'0 mˡ[1-/3lgf3&   +! A̦ؗM$oRpRG`^vh\UMpow?JMcNgJ_8 oxYzеi](u}PֆʆJ&L.7s$.Ám76F!ͳH~ܱL|?@xʛ=;;vyOEʳ+ssb:0Y&md5ۉB[E`k_d.d1|0v݌ǜzrda_c~OӰY0spCtm&p)trP$ǏIҜpCC#]4#" sj.%/%\H`kr5`-ѧUwk_S@471!!'3e-q33\NY9" ;y%RR+45./RmwVUx}-HS:|-~w[ ]/:+Z}m1Mmv%ЕUiuՙ3A-DK=v^N$|?5E%E0rK7H>@z v8ҿZV(nÕKk74[?֗4 # QWk`we Es59:,Zx,T8b%Y7&S33ɓY|s@gT"ߩlUMDmü[s<5?i҅oW6(Z)]#ּv2^U'qJ>',1qYiD齭-$b2H,<gD شrJ#j.R|8)4RU m=/J**]e5@yEs${P(q_$wwNc+3kgu}RM[ҫZSFzo%LJ=diApcilQcuM9Wyr ?㞶hhhT5=0zpp/Gؠ?_ {@ !=ǑwZ S2hivQ6HN{T9G&'SwwI^Nlo lw:wnM>GW'9p endstream endobj 1549 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 98 /FontBBox [ -217 -315 1129 993 ] /FontName /PDMFCI+Garamond-Italic /ItalicAngle -15 /StemV 0 /FontFile2 1550 0 R >> endobj 1550 0 obj << /Filter /FlateDecode /Length 9239 /Length1 17216 >> stream HV TSWY!Iٚ3  %q$Sk^ƒD)*-VK+⊢ǥLOqQc#ZAzΜ3̜9wyIԨ# 1hD&,3\ 'e,,e #PDaÙ7<Ϟom4V7Z@d< <|6)](#RǸ!G-tKHN?l3ڑc]OpgP :(  ;@pH'yD.S+Usc0n)d0+\ XeL!h|+ l @{,}aylOg7"ԍW.mpz9bM']eV,jޢs{ʕF*VIcsYYlpH60iLVuL#bct(MB'1T[  0 4Ypd͇Qd20fX:$- -P*UZU2G|Gc2i86CIHK#P٘38UŽYQNK- qg'wF^/5G"wSWc+m6ǿ[yn൙:Or޽uwԱ{C^ 33D9QniJu3[Y~+͕㓗LmuzIBEBIhqƞ*TzfswcIgq\AQՏsLZoX޽whe\kןqv+9g,)ofclIKl/ o:O[\Կz\wN=D{QLo~ts[jorQ: pi<9'(>K\θ5%@ p]lΑz2SƦ✥7yGeoZw ({-7ߒ1cߚ/sǝ׎Tphޮ5Z/3-noSux@jKUSgI=5:'+9ןׅl&0frlVgi7'ƥ?9f-p1a6B̏ff0C1F ~ a1]6\ cNv3>@ A#e'EcqU8YMZAL"ab#HkD B qk.4Q$,$$0(s ,O% lbH 8~~ph4QRpbG4I `h"dfq*ЬU !A$E?9|N0\&@iфTHj+R8bm"(PEF4 8LFR<w*fI#HGDLJRU4Zj2ENU%BEZ3s8EFcX§ihYLOBjM;uZЪ 5LRd%W)PN/*Vw6"(mHK@7 4D wG1*qqPqF1cxv#B9g~͙WV}[%}xWL+Ȏ:RÈaV8., XC\$pʠ5gEdFr^jJg襳VLy; p0ܟe\8u* iBA"*SER)`V#Jj8a6d+ ' Wh8B!6i/ })JKJiє't,J x.-=V xmBeʈ͡$"{cpƤ蹬l.Vťӫxc'1Y\L\\Nf LHL5qnvC-(R 27&|fwԧ'%&'H 2 ',*ɗ䛘O+f"Re2h?$}ӒI%6}C Vߘ!YFe;w79KIuRi-t KҧKIL(_sᤶBy!{"U㔣YaW3MlCC}KfgVC|%΁X{b7_j=${Pe>VWn=.~:AڑSqsg/*mYPv^5 =(KuI`xaĬ]&Aeqz]7!1:Knێd@Pj%|/.St6I4]`<@&ݩi(!) qTJ0gothq1Wvf>;/C?!GX[2oeɓ;RO^wv.h g`^!V7owiGmA7\)?֚dTdgP?vz}UC[CDC ?}&6vН+O8~}4N4oMnܼGÄG?$Ƣ͵˛~;Ek+G݃)evuJ311@%fދCãkZs{k|/ET4b_|&zƍXG1b5U}i_{m?tl\PrGu ݉ۮk`oވƏOwd+O;i;.3O76w|e.;nY~vj7$T{1rƍFFjFF9nqvЛ?NNjz-2r̅rӤЅ%7?v-vXeNLg@DkE(kZH`V*@4O|[{&w=Vȝn/ߟ[[BY+]Ws:%obI/FЀ0Tq8\(gLzTr2x"` A0 ` p/,ao߃pLN\ih\v07EP/ 4g JH% ,/VRm(ȆRbtjF~F~ГF@GC"l(p =q%cu-bՓR+0χ:` Mp@5\yJhEg+t@))j 0>ğE)L60$"X-T } H>{R$'9B*b6 yER F3,"}iQd"k6#N.G8 , PW[&AflcO@>dX(ӲȲX.y5 EM*1AVfԢx|R}M_]h1mgn>W_gZR izS9Q{P,}B E&FbiN $:L=ʄ,R+*0l|FQEF*%m@#.܃,7A ,[PdY A[CI#_#D`F$B'd`O(XKp#Uxq(NcY ˤOΐ3l_P~<+ߕ'Nx}~7|QPЌN2zcq047_4{Ƽj{&xf{"ٰnGH|yt.)rKԝem^+"vXҎhq+D6w$SPg׵*` cr">-PS  +TN ;vEpdym9|@խ8d:E~Ǭs<աV_e*Kkuml1q~gr?@evhEɯhE-jp}P(܊;//pqstc1l\Aj;b5G8T+hՏ Tye,wWPclF{nNrnAꬩ5ȮG8Z DmGWO{5%Vc>1 œvQ-B ׯi1˽.|άY):-TyNk90-bS &;'-ZSvU#<ΔL";Q҉J_wpGM/yOӍhE[rgYE<+DdĶ"xM-klLn dz*'v9] FuX_e"i2V7֨NƇ74RzW\!ʯ .3⹸=3R^РBeJ1'HmPW)w㲋ﴔ! Ğ:2jN*0 x8|KYwIыFʍw^zOW^=E%=͠{z&c}5.<_{#E.)ƀ;zZDac˝S'3ѫAjkA-ԡY ,;T k.Zi ^F go¾yROQ7d[>Ţwp1"ZNb h1z39?$ӗ_4YF~J7 "psǽ)[ϛ%tI6r_'c@6}VPqf͆ C;{U s<^}i_ɲe{5ќ/m;@v <ma﵄k]x5 6mHHŜ"1LJ,,R ^{wE/= Aܿuл,cgdP3Eځnc@33@c3,vGcۋsֳ_轜GXFeC2ۜ_Y2+g2f~oZsR~rSQSV}M ?a\3OΓ/Q!e9e)j wDߠ\T>#_ukG\\|B|-yD}1#M 3_l+4oTIGT qM\Jb^w>z3n6Qvhx?˥?A.WNxLw?^Z.fYalj]ڤ|A[ 5ڔ{xc*HZ6].]g< 5~:nܛVo+{ޭS|{PjO^laR491~(oڇ&Zj@?D4%pg>!#ԭrk{Ç+aMc(窺!M_$0**?+ryu^;sxg2;SG=ӣi6MqO@=/D),1 ;i :[Ot-N { Уn2wCښ[ݷB|,X{  $@N^{XgԏFq()N2Y՛U}:F qgF?Eg!<)ym,a &!^ gq1ޏ4FrJ\TB2&g3?**q'}="6G?%.AL89m"cV5Y%ZVʡ@Urh&E4CHB#{m0_ɡvP+;J6|rt070lj]j#Xc#T _n(gWe =V (iVJ֨#FbC.DaS\¸MBl< ebFf"}I%tq: ۄGY,5W)Yk8FNN?šIx"<̮7;?'bKc#b_8@_Tτ.V+iAqOḦ `g:ceDXd5| Q$:#OcP`Gjycd,vRP,QdZ(K eOC+!+%I%~Y)XQrB!91^Ҁj&YZ)'vq@a6FR#Df*&kj>Z,ňxR (;&(֬z8LMJkHJ1kKRl];6j=HC*y(o+M6Z>{>rG~>G6M|P$Xa0_D!KB"A@x7z1jYc@Tguhy[]9b4S%^+ khu7߰mc(y!Qk[ yьƶ8,{19ү9_u`?S <9^Qx} ("0Ad$9ѧh3fިg'd;NazFGn?֨2;L}]}J̎>Ud S |Ja`2x\l\Fl(Fdd=P?twNׇV>!o&`!GCr/ 5<ꈏr> n}k=Ev֡–yyvZ ~iR:,M]> /$ҳJ7i^%M;`buD98+Jzn6E{i Z4?C0ihh y=I A97O6ߩMϨ)Sa(w NFvLKբ^g!7.~ˎ%}N+IJ #3dvbgV8N40H1 bxL|7qO'``eYSOdrYeuzY{BZu%]s&s09asxX^+{,8m-ZZ>ffvz_Ih7ZDhq2́egS\I4LPMZO%mn\|ݜ=sRt=Ks2Ie`paepcpf8!hk CC*C:C)CXZ]h Ð@\Ci:'` ` t4 Y&ə\V6_9Ao#X#jNvPqBu0; endstream endobj 1551 0 obj << /Type /FontDescriptor /Ascent 1100 /CapHeight 0 /Descent -309 /Flags 96 /FontBBox [ -254 -212 1433 975 ] /FontName /PDMGCP+Arial-BlackItalic /ItalicAngle -15 /StemV 0 /FontFile2 1552 0 R >> endobj 1552 0 obj << /Filter /FlateDecode /Length 3181 /Length1 5832 >> stream HW lS>=I4 ~ge4mI iiJ!D66;8xJҩP+B vHhFE:ZlHkQ(PuvH(:i{=s߻y!FDSd^t)P)_K9XFE}sckg kmil8"_ 7C/W!ێa0[&w cHi3]׼:8挛D)9*OI~;Oy(w2h1&ʹ*pޔ?)¶,=Rx9>#(mN5KL$d2,]V)ְ̧R?"D6~(>T u?gS*ѯsw3 nɠُk ~7*l6ˢ߳t 3~t`{G+1[9 +/:pG0hS6S!6tR ZV.u3<>TM ?c^wq|g3Viy9Y֌LNb1d \>Oܫ5½UKK8eT-?7+yNe~nqLWqzCRbg!>Ƨj?~.ڸT{&|,T](Zmj||:Qx8DcӭBSN?y/pFˈSVP0UesO/Η'B${µ|Ze*p+nc5ROX 4~]U_0Bpy6?.5&5A?JlX%Ԅ$x+k|.tQq Px-VģakH_]fJ3hUb_(߯NKKWtݫ)^=cmbJ= (C?i.?l -z[#*UXSS?)obBdV'±)^8e"E҇_m1X6bхfFTU<;Nǂ- ād8)])$mIɘz@C +WLkgjYJyᅚ\>&d5Ɂ;@K"tƭnvm~ŚK{V|,Yo܎')Ygy.f\r~cGOt'oy(_Kd>NUjEaG̦Wm)Xʩ-Pk>N5Щa>uQ?4p{Ŝ>ַ} mKO+D6l6`oBǞ{>g 1ݴüCNLo˘8p&lR>M}'^8q{88aEIrP\Jۋ8.ƾ@^'x^h>hыIX مbt#{qZi@guwn'I7*z(yc' m Y@x$jtHW} ?" \υ[;GEߢZ"Fs16|@>zU!=԰ctedgtoVGO;' -/Z^,3NZZ6h:$mCˆZڇ'0葶#@`;/lŰslϭo}~ƟN[иCC8~S 7mu[豶cRnb~SvNNigcrd{^Z=,yG==Rw,ys>27_~rJmWLgRo݅:ۻ;BchW/ϴgvf[&# ;^ԍ !,! g[(-̏e8M- -5DU@/J @KC09 .܀ Uꭇ qFfrU%Toy3ƿGw-c̊Zڈ[8f9|mn^s]/NÈFC7pPYT 1+$ʯOWOէjPo {bpẘKU"AOt!p|K]WcN^D 3ӋJ \ TεRg[> gΗqHS=%1&Ş8RB7\U f++]R@Q'BRaJ4֕F徣rb^Œ趩p ۨ`M!CEYS%)4b!^ VKgb<b"'tGtPC I:4$B#6l{%d ξ~ʐBJj :!"cF'ٚ:n1ITQE@%~Vǻ26MTiSAS3ٖ` WO\wT{O$e,ɸt:ݙQA4{@jwlbRe.Md k'6a<_UحhZ?*Z݄ ޟ|߽R 9]|XCd5B#,JLvXf7fX#ݻkL,Ԫ[ѩFu6wy(@.$δ5<K8 MBUf> /DW 1000 /W [ 143 [ 548 ] ] >> endobj 1554 0 obj << /Filter /FlateDecode /Length 228 >> stream HTMo >vj(MВNH Qmcٯ_Xjg#y`c&H ᎝uK5X27PHi~m/`W4cأ@),Exv bw 8J_M&tF=$^izg_GDt> 祂y[Goo endstream endobj 1555 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PDKPFF+Garamond /FontDescriptor 1541 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 148 [ 666 ] 167 [ 666 ] ] >> endobj 1556 0 obj << /Filter /FlateDecode /Length 230 >> stream HTP=o [uRr]2j89CB.F~6?w ;ayK8 G硒`I;ڢt:'Z?h?rrN]WA?Er~T-?2-1~>MǣUkDA~DhxUɫ<&[-c.ʨ~V,kҥxex;fro!m endstream endobj 1557 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PDLBBC+Wingdings-Regular /FontDescriptor 1543 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 131 [ 457 ] ] >> endobj 1558 0 obj << /Filter /FlateDecode /Length 216 >> stream HTP1n0 2Hv3^C۠v+)>$@> /DW 1000 /W [ 28 [ 554 ] ] >> endobj 1560 0 obj << /Count 23 /First 1561 0 R /Last 1562 0 R >> endobj 1561 0 obj << /Title (Extrema Tutorial) /Dest [ 2443 0 R /XYZ 0 720 null ] /Parent 1560 0 R /Next 1562 0 R >> endobj 1562 0 obj << /Title (Customizing Graph Presentation) /Dest [ 2443 0 R /XYZ 0 646 null ] /Parent 1560 0 R /Prev 1561 0 R /First 1563 0 R /Last 1564 0 R /Count 21 >> endobj 1563 0 obj << /Title (Introduction) /Dest [ 2443 0 R /XYZ 0 265 null ] /Parent 1562 0 R /Next 1583 0 R >> endobj 1564 0 obj << /Title (SUMMARY) /Dest [ 1425 0 R /XYZ 0 720 null ] /Parent 1562 0 R /Prev 1565 0 R /First 1566 0 R /Last 1567 0 R /Count 8 >> endobj 1565 0 obj << /Title (Axis characteristics) /Dest [ 1421 0 R /XYZ 0 371 null ] /Parent 1562 0 R /Prev 1574 0 R /Next 1564 0 R >> endobj 1566 0 obj << /Title (Plot symbol characteristics) /Dest [ 1425 0 R /XYZ 0 646 null ] /Parent 1564 0 R /Next 1573 0 R >> endobj 1567 0 obj << /Title (File related characteristics) /Dest [ 1425 0 R /XYZ 0 181 null ] /Parent 1564 0 R /Prev 1568 0 R >> endobj 1568 0 obj << /Title (Graph legend characteristics) /Dest [ 1425 0 R /XYZ 0 238 null ] /Parent 1564 0 R /Prev 1569 0 R /Next 1567 0 R >> endobj 1569 0 obj << /Title (Text characteristics) /Dest [ 1425 0 R /XYZ 0 283 null ] /Parent 1564 0 R /Prev 1570 0 R /Next 1568 0 R >> endobj 1570 0 obj << /Title (y-axis characteristics) /Dest [ 1425 0 R /XYZ 0 397 null ] /Parent 1564 0 R /Prev 1571 0 R /Next 1569 0 R >> endobj 1571 0 obj << /Title (x-axis characteristics) /Dest [ 1425 0 R /XYZ 0 510 null ] /Parent 1564 0 R /Prev 1572 0 R /Next 1570 0 R >> endobj 1572 0 obj << /Title (General characteristics) /Dest [ 1425 0 R /XYZ 0 567 null ] /Parent 1564 0 R /Prev 1573 0 R /Next 1571 0 R >> endobj 1573 0 obj << /Title (Data curve characteristics) /Dest [ 1425 0 R /XYZ 0 601 null ] /Parent 1564 0 R /Prev 1566 0 R /Next 1572 0 R >> endobj 1574 0 obj << /Title (Graph axes) /Dest [ 1403 0 R /XYZ 0 119 null ] /Parent 1562 0 R /Prev 1575 0 R /Next 1565 0 R /First 1576 0 R /Last 1577 0 R /Count 4 >> endobj 1575 0 obj << /Title (Graph legend) /Dest [ 1399 0 R /XYZ 0 466 null ] /Parent 1562 0 R /Prev 1580 0 R /Next 1574 0 R >> endobj 1576 0 obj << /Title (Scaling) /Dest [ 1407 0 R /XYZ 0 604 null ] /Parent 1574 0 R /Next 1579 0 R >> endobj 1577 0 obj << /Title (Axis placement) /Dest [ 1416 0 R /XYZ 0 556 null ] /Parent 1574 0 R /Prev 1578 0 R >> endobj 1578 0 obj << /Title (Logarithmic axes) /Dest [ 1413 0 R /XYZ 0 653 null ] /Parent 1574 0 R /Prev 1579 0 R /Next 1577 0 R >> endobj 1579 0 obj << /Title (Tic marks) /Dest [ 1407 0 R /XYZ 0 349 null ] /Parent 1574 0 R /Prev 1576 0 R /Next 1578 0 R >> endobj 1580 0 obj << /Title (Axis labels) /Dest [ 1317 0 R /XYZ 0 478 null ] /Parent 1562 0 R /Prev 1581 0 R /Next 1575 0 R >> endobj 1581 0 obj << /Title (Data curves) /Dest [ 1229 0 R /XYZ 0 402 null ] /Parent 1562 0 R /Prev 1582 0 R /Next 1580 0 R >> endobj 1582 0 obj << /Title (Histograms) /Dest [ 763 0 R /XYZ 0 427 null ] /Parent 1562 0 R /Prev 1583 0 R /Next 1581 0 R >> endobj 1583 0 obj << /Title (Plot symbols) /Dest [ 1 0 R /XYZ 0 587 null ] /Parent 1562 0 R /Prev 1563 0 R /Next 1582 0 R >> endobj 1584 0 obj << /TextBox /Div /Frame /Div /Footnote /Note /Endnote /Note /Shape /Figure /InlineShape /Figure /TOA /TOC /TOAI /TOCI /TOF /TOC /TOFI /TOCI /Superscript /Span /Subscript /Span /Strikeout /Span /Underline /Span /DropCap /Figure /Heading#202 /H2 /Heading#201,Section /P /Picture /P /Body#20Text /P /Macro#20Text /P /Normal /P /List#20Bullet /P /Heading#203 /H3 /List#20Number /P >> endobj 1585 0 obj << /S /Heading#202 /C /Heading#202 /Pg 2443 0 R /K 0 /P 2057 0 R >> endobj 1586 0 obj << /S /Heading#201,Section /C /Heading#201,Section /Pg 2443 0 R /K 1 /P 2057 0 R >> endobj 1587 0 obj << /Heading#202 1588 0 R /Heading#201,Section 1590 0 R /Picture 1592 0 R /Body#20Text 1596 0 R /Macro#20Text 1600 0 R /Normal 1609 0 R /List#20Bullet 1622 0 R /Heading#203 1942 0 R /List#20Number 2021 0 R >> endobj 1588 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 1589 0 obj << /S /Picture /C /Picture /Pg 2443 0 R /K [ 1591 0 R 4 ] /P 2057 0 R >> endobj 1590 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 12 /SpaceAfter 6 /TextIndent 0 >> endobj 1591 0 obj << /S /InlineShape /Pg 2443 0 R /P 1589 0 R /K [ 2 3 ] /Alt () /A [ 2373 0 R ] >> endobj 1592 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent 0 >> endobj 1593 0 obj << /S /Heading#202 /C /Heading#202 /Pg 2443 0 R /K 5 /P 2057 0 R >> endobj 1594 0 obj << /S /Body#20Text /C /Body#20Text /Pg 2443 0 R /K 6 /P 2057 0 R >> endobj 1595 0 obj << /S /Body#20Text /C /Body#20Text /Pg 2443 0 R /K 7 /P 2057 0 R >> endobj 1596 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent 0 >> endobj 1597 0 obj << /S /Body#20Text /C /Body#20Text /Pg 2443 0 R /K 8 /P 2057 0 R >> endobj 1598 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 2443 0 R /K 9 /P 2057 0 R >> endobj 1599 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 0 /P 2057 0 R >> endobj 1600 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 6 /TextIndent 0 >> endobj 1601 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1 0 R /K 1 /P 2057 0 R >> endobj 1602 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 2 /P 2057 0 R >> endobj 1603 0 obj << /S /Heading#202 /A [ 1604 0 R ] /C /Heading#202 /Pg 1 0 R /K 3 /P 2057 0 R >> endobj 1604 0 obj << /O /Layout /SpaceBefore 6 >> endobj 1605 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 4 /P 2057 0 R >> endobj 1606 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 5 /P 2061 0 R >> endobj 1607 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 6 /P 2064 0 R >> endobj 1608 0 obj << /S /Body#20Text /A [ 1610 0 R ] /C /Body#20Text /Pg 1 0 R /K 7 /P 2057 0 R >> endobj 1609 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 1610 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1611 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 8 /P 2069 0 R >> endobj 1612 0 obj << /S /Macro#20Text /A [ 1613 0 R ] /C /Macro#20Text /Pg 1 0 R /K 9 /P 2069 0 R >> endobj 1613 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1614 0 obj << /S /Macro#20Text /A [ 1615 0 R ] /C /Macro#20Text /Pg 1 0 R /K 10 /P 2069 0 R >> endobj 1615 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1616 0 obj << /S /Picture /C /Picture /K 1617 0 R /P 2072 0 R >> endobj 1617 0 obj << /S /InlineShape /Pg 1 0 R /K 11 /P 1616 0 R /Alt () /A [ 2375 0 R ] >> endobj 1618 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 12 /P 2072 0 R >> endobj 1619 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 13 /P 2057 0 R >> endobj 1620 0 obj << /S /LBody /A [ 1621 0 R ] /C /List#20Bullet /Pg 1 0 R /K 14 /P 2361 0 R >> endobj 1621 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1622 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 18 /EndIndent 18 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent -17.99998 >> endobj 1623 0 obj << /S /LBody /A [ 1624 0 R ] /C /List#20Bullet /Pg 1 0 R /K 15 /P 2362 0 R >> endobj 1624 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1625 0 obj << /S /LBody /C /List#20Bullet /Pg 1 0 R /K 16 /P 2363 0 R >> endobj 1626 0 obj << /S /Picture /A [ 1627 0 R ] /C /Picture /Pg 39 0 R /K [ 1628 0 R 1 ] /P 2057 0 R >> endobj 1627 0 obj << /O /Layout /TextAlign /Center >> endobj 1628 0 obj << /S /InlineShape /Pg 39 0 R /K 0 /P 1626 0 R /Alt () /A [ 2377 0 R ] >> endobj 1629 0 obj << /S /Body#20Text /C /Body#20Text /Pg 39 0 R /K 2 /P 2057 0 R >> endobj 1630 0 obj << /S /Body#20Text /C /Body#20Text /Pg 39 0 R /K 3 /P 2077 0 R >> endobj 1631 0 obj << /S /Macro#20Text /A [ 1632 0 R ] /C /Macro#20Text /Pg 39 0 R /K 4 /P 2077 0 R >> endobj 1632 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1633 0 obj << /S /Macro#20Text /A [ 1634 0 R ] /C /Macro#20Text /Pg 39 0 R /K 5 /P 2077 0 R >> endobj 1634 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1635 0 obj << /S /Macro#20Text /A [ 1636 0 R ] /C /Macro#20Text /Pg 39 0 R /K 6 /P 2077 0 R >> endobj 1636 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1637 0 obj << /S /Body#20Text /C /Body#20Text /K 1638 0 R /P 2080 0 R >> endobj 1638 0 obj << /S /InlineShape /Pg 39 0 R /K 7 /P 1637 0 R /Alt () /A [ 2378 0 R ] >> endobj 1639 0 obj << /S /Body#20Text /A [ 1640 0 R ] /C /Body#20Text /Pg 39 0 R /K 8 /P 2057 0 R >> endobj 1640 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1641 0 obj << /S /Body#20Text /C /Body#20Text /Pg 78 0 R /K 0 /P 2085 0 R >> endobj 1642 0 obj << /S /Macro#20Text /A [ 1643 0 R ] /C /Macro#20Text /Pg 78 0 R /K 1 /P 2085 0 R >> endobj 1643 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1644 0 obj << /S /Macro#20Text /A [ 1645 0 R ] /C /Macro#20Text /Pg 78 0 R /K 2 /P 2085 0 R >> endobj 1645 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1646 0 obj << /S /Macro#20Text /A [ 1647 0 R ] /C /Macro#20Text /Pg 78 0 R /K 3 /P 2085 0 R >> endobj 1647 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1648 0 obj << /S /Macro#20Text /A [ 1649 0 R ] /C /Macro#20Text /Pg 78 0 R /K 4 /P 2085 0 R >> endobj 1649 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1650 0 obj << /S /Body#20Text /C /Body#20Text /K 1651 0 R /P 2088 0 R >> endobj 1651 0 obj << /S /InlineShape /Pg 78 0 R /K 5 /P 1650 0 R /Alt () /A [ 2380 0 R ] >> endobj 1652 0 obj << /S /Body#20Text /A [ 1653 0 R ] /C /Body#20Text /Pg 78 0 R /K 6 /P 2057 0 R >> endobj 1653 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1654 0 obj << /S /Body#20Text /A [ 1655 0 R ] /C /Body#20Text /Pg 78 0 R /K 7 /P 2093 0 R >> endobj 1655 0 obj << /O /Layout /SpaceBefore 6 /SpaceAfter 6 >> endobj 1656 0 obj << /S /Body#20Text /A [ 1657 0 R ] /C /Body#20Text /Pg 78 0 R /K 8 /P 2096 0 R >> endobj 1657 0 obj << /O /Layout /SpaceBefore 6 /SpaceAfter 6 >> endobj 1658 0 obj << /S /Body#20Text /A [ 1659 0 R ] /C /Body#20Text /Pg 78 0 R /K 9 /P 2057 0 R >> endobj 1659 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1660 0 obj << /S /Body#20Text /C /Body#20Text /Pg 315 0 R /K 0 /P 2101 0 R >> endobj 1661 0 obj << /S /Macro#20Text /A [ 1662 0 R ] /C /Macro#20Text /Pg 315 0 R /K 1 /P 2101 0 R >> endobj 1662 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1663 0 obj << /S /Macro#20Text /A [ 1664 0 R ] /C /Macro#20Text /Pg 315 0 R /K 2 /P 2101 0 R >> endobj 1664 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1665 0 obj << /S /Macro#20Text /A [ 1666 0 R ] /C /Macro#20Text /Pg 315 0 R /K 3 /P 2101 0 R >> endobj 1666 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1667 0 obj << /S /Macro#20Text /A [ 1668 0 R ] /C /Macro#20Text /Pg 315 0 R /K 4 /P 2101 0 R >> endobj 1668 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1669 0 obj << /S /Macro#20Text /A [ 1670 0 R ] /C /Macro#20Text /Pg 315 0 R /K 5 /P 2101 0 R >> endobj 1670 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1671 0 obj << /S /Body#20Text /C /Body#20Text /K 1672 0 R /P 2104 0 R >> endobj 1672 0 obj << /S /InlineShape /Pg 315 0 R /P 1671 0 R /K [ 6 7 ] /Alt () /A [ 2382 0 R ] >> endobj 1673 0 obj << /S /Body#20Text /C /Body#20Text /Pg 315 0 R /K 8 /P 2057 0 R >> endobj 1674 0 obj << /S /Body#20Text /C /Body#20Text /Pg 315 0 R /K 9 /P 2109 0 R >> endobj 1675 0 obj << /S /Body#20Text /C /Body#20Text /Pg 315 0 R /K 10 /P 2112 0 R >> endobj 1676 0 obj << /S /Body#20Text /C /Body#20Text /Pg 315 0 R /K 11 /P 2116 0 R >> endobj 1677 0 obj << /S /Body#20Text /A [ 1678 0 R ] /C /Body#20Text /Pg 315 0 R /K [ 1679 0 R 14 ] /P 2119 0 R >> endobj 1678 0 obj << /O /Layout /TextAlign /Center >> endobj 1679 0 obj << /S /InlineShape /P 1677 0 R /Pg 315 0 R /K [ 12 13 ] /Alt () /A [ 2383 0 R ] >> endobj 1680 0 obj << /S /Body#20Text /A [ 1681 0 R ] /C /Body#20Text /Pg 315 0 R /K 15 /P 2057 0 R >> endobj 1681 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1682 0 obj << /S /Body#20Text /C /Body#20Text /Pg 315 0 R /K 16 /P 2057 0 R >> endobj 1683 0 obj << /S /Body#20Text /A [ 1684 0 R ] /C /Body#20Text /Pg 315 0 R /K 17 /P 2057 0 R >> endobj 1684 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1685 0 obj << /S /Body#20Text /A [ 1686 0 R ] /C /Body#20Text /Pg 315 0 R /K 18 /P 2057 0 R >> endobj 1686 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1687 0 obj << /S /Body#20Text /A [ 1688 0 R ] /C /Body#20Text /Pg 320 0 R /K 0 /P 2057 0 R >> endobj 1688 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1689 0 obj << /S /Body#20Text /C /Body#20Text /Pg 320 0 R /K 1 /P 2057 0 R >> endobj 1690 0 obj << /S /Body#20Text /C /Body#20Text /Pg 320 0 R /K 2 /P 2057 0 R >> endobj 1691 0 obj << /S /Macro#20Text /A [ 1692 0 R ] /C /Macro#20Text /Pg 320 0 R /K 3 /P 2057 0 R >> endobj 1692 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1693 0 obj << /S /Macro#20Text /A [ 1694 0 R ] /C /Macro#20Text /Pg 320 0 R /K 4 /P 2057 0 R >> endobj 1694 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1695 0 obj << /S /Macro#20Text /A [ 1696 0 R ] /C /Macro#20Text /Pg 320 0 R /K 5 /P 2057 0 R >> endobj 1696 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1697 0 obj << /S /Macro#20Text /A [ 1698 0 R ] /C /Macro#20Text /Pg 320 0 R /K 6 /P 2057 0 R >> endobj 1698 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1699 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 320 0 R /K 7 /P 2057 0 R >> endobj 1700 0 obj << /S /Picture /A [ 1701 0 R ] /C /Picture /Pg 320 0 R /K [ 1702 0 R 9 ] /P 2057 0 R >> endobj 1701 0 obj << /O /Layout /TextAlign /Center >> endobj 1702 0 obj << /S /InlineShape /Pg 320 0 R /K 8 /P 1700 0 R /Alt () /A [ 2385 0 R ] >> endobj 1703 0 obj << /S /Body#20Text /A [ 1704 0 R ] /C /Body#20Text /Pg 320 0 R /K 10 /P 2057 0 R >> endobj 1704 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1705 0 obj << /S /Body#20Text /C /Body#20Text /Pg 324 0 R /K 0 /P 2124 0 R >> endobj 1706 0 obj << /S /Macro#20Text /A [ 1707 0 R ] /C /Macro#20Text /Pg 324 0 R /K 1 /P 2124 0 R >> endobj 1707 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1708 0 obj << /S /Macro#20Text /A [ 1709 0 R ] /C /Macro#20Text /Pg 324 0 R /K 2 /P 2124 0 R >> endobj 1709 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1710 0 obj << /S /Macro#20Text /A [ 1711 0 R ] /C /Macro#20Text /Pg 324 0 R /K 3 /P 2124 0 R >> endobj 1711 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1712 0 obj << /S /Macro#20Text /A [ 1713 0 R ] /C /Macro#20Text /Pg 324 0 R /K 4 /P 2124 0 R >> endobj 1713 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1714 0 obj << /S /Macro#20Text /A [ 1715 0 R ] /C /Macro#20Text /Pg 324 0 R /K 5 /P 2124 0 R >> endobj 1715 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1716 0 obj << /S /Macro#20Text /A [ 1717 0 R ] /C /Macro#20Text /Pg 324 0 R /K 6 /P 2124 0 R >> endobj 1717 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1718 0 obj << /S /Body#20Text /C /Body#20Text /K 1719 0 R /P 2127 0 R >> endobj 1719 0 obj << /S /InlineShape /Pg 324 0 R /K 7 /P 1718 0 R /Alt () /A [ 2387 0 R ] >> endobj 1720 0 obj << /S /Body#20Text /A [ 1721 0 R ] /C /Body#20Text /Pg 324 0 R /K 8 /P 2057 0 R >> endobj 1721 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1722 0 obj << /S /Body#20Text /C /Body#20Text /Pg 324 0 R /K 9 /P 2132 0 R >> endobj 1723 0 obj << /S /Macro#20Text /A [ 1724 0 R ] /C /Macro#20Text /Pg 324 0 R /K 10 /P 2132 0 R >> endobj 1724 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1725 0 obj << /S /Macro#20Text /A [ 1726 0 R ] /C /Macro#20Text /Pg 324 0 R /K 11 /P 2132 0 R >> endobj 1726 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1727 0 obj << /S /Macro#20Text /A [ 1728 0 R ] /C /Macro#20Text /Pg 324 0 R /K 12 /P 2132 0 R >> endobj 1728 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1729 0 obj << /S /Macro#20Text /A [ 1730 0 R ] /C /Macro#20Text /Pg 324 0 R /K 13 /P 2132 0 R >> endobj 1730 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1731 0 obj << /S /Macro#20Text /A [ 1732 0 R ] /C /Macro#20Text /Pg 324 0 R /K 14 /P 2132 0 R >> endobj 1732 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1733 0 obj << /S /Macro#20Text /A [ 1734 0 R ] /C /Macro#20Text /Pg 324 0 R /K 15 /P 2132 0 R >> endobj 1734 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1735 0 obj << /S /Macro#20Text /A [ 1736 0 R ] /C /Macro#20Text /Pg 324 0 R /K 16 /P 2132 0 R >> endobj 1736 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1737 0 obj << /S /Body#20Text /C /Body#20Text /K 1738 0 R /P 2135 0 R >> endobj 1738 0 obj << /S /InlineShape /Pg 324 0 R /K 17 /P 1737 0 R /Alt () /A [ 2388 0 R ] >> endobj 1739 0 obj << /S /Body#20Text /A [ 1740 0 R ] /C /Body#20Text /Pg 324 0 R /P 2057 0 R /K [ 18 << /Type /MCR /Pg 763 0 R /MCID 0 >> ] >> endobj 1740 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1741 0 obj << /S /Body#20Text /A [ 1742 0 R ] /C /Body#20Text /Pg 763 0 R /K 1 /P 2140 0 R >> endobj 1742 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1743 0 obj << /S /Macro#20Text /A [ 1744 0 R ] /C /Macro#20Text /Pg 763 0 R /K 2 /P 2140 0 R >> endobj 1744 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1745 0 obj << /S /Macro#20Text /A [ 1746 0 R ] /C /Macro#20Text /Pg 763 0 R /K 3 /P 2140 0 R >> endobj 1746 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1747 0 obj << /S /Macro#20Text /A [ 1748 0 R ] /C /Macro#20Text /Pg 763 0 R /K 4 /P 2140 0 R >> endobj 1748 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1749 0 obj << /S /Macro#20Text /A [ 1750 0 R ] /C /Macro#20Text /Pg 763 0 R /K 5 /P 2140 0 R >> endobj 1750 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1751 0 obj << /S /Macro#20Text /A [ 1752 0 R ] /C /Macro#20Text /Pg 763 0 R /K 6 /P 2140 0 R >> endobj 1752 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1753 0 obj << /S /Macro#20Text /A [ 1754 0 R ] /C /Macro#20Text /Pg 763 0 R /K 7 /P 2140 0 R >> endobj 1754 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1755 0 obj << /S /Macro#20Text /A [ 1756 0 R ] /C /Macro#20Text /Pg 763 0 R /K 8 /P 2140 0 R >> endobj 1756 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1757 0 obj << /S /Macro#20Text /A [ 1758 0 R ] /C /Macro#20Text /Pg 763 0 R /K 9 /P 2140 0 R >> endobj 1758 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1759 0 obj << /S /Macro#20Text /A [ 1760 0 R ] /C /Macro#20Text /Pg 763 0 R /K 10 /P 2140 0 R >> endobj 1760 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1761 0 obj << /S /Macro#20Text /A [ 1762 0 R ] /C /Macro#20Text /Pg 763 0 R /K 11 /P 2140 0 R >> endobj 1762 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1763 0 obj << /S /Macro#20Text /A [ 1764 0 R ] /C /Macro#20Text /Pg 763 0 R /K 12 /P 2140 0 R >> endobj 1764 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1765 0 obj << /S /Macro#20Text /A [ 1766 0 R ] /C /Macro#20Text /Pg 763 0 R /K 13 /P 2140 0 R >> endobj 1766 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1767 0 obj << /S /Body#20Text /A [ 1768 0 R ] /C /Body#20Text /K 1769 0 R /P 2143 0 R >> endobj 1768 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1769 0 obj << /S /InlineShape /Pg 763 0 R /K 14 /P 1767 0 R /Alt () /A [ 2390 0 R ] >> endobj 1770 0 obj << /S /Heading#202 /A [ 1771 0 R ] /C /Heading#202 /Pg 763 0 R /K 15 /P 2057 0 R >> endobj 1771 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1772 0 obj << /S /Body#20Text /C /Body#20Text /Pg 763 0 R /K 16 /P 2057 0 R >> endobj 1773 0 obj << /S /Body#20Text /C /Body#20Text /Pg 763 0 R /K 17 /P 2148 0 R >> endobj 1774 0 obj << /S /Macro#20Text /A [ 1775 0 R ] /C /Macro#20Text /Pg 763 0 R /K 18 /P 2148 0 R >> endobj 1775 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1776 0 obj << /S /Macro#20Text /A [ 1777 0 R ] /C /Macro#20Text /Pg 763 0 R /K 19 /P 2148 0 R >> endobj 1777 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1778 0 obj << /S /Body#20Text /C /Body#20Text /K 1779 0 R /P 2151 0 R >> endobj 1779 0 obj << /S /InlineShape /Pg 763 0 R /K 20 /P 1778 0 R /Alt () /A [ 2391 0 R ] >> endobj 1780 0 obj << /S /Body#20Text /C /Body#20Text /Pg 763 0 R /K 21 /P 2057 0 R >> endobj 1781 0 obj << /S /Body#20Text /C /Body#20Text /Pg 994 0 R /K 0 /P 2156 0 R >> endobj 1782 0 obj << /S /Macro#20Text /A [ 1783 0 R ] /C /Macro#20Text /Pg 994 0 R /K 1 /P 2159 0 R >> endobj 1783 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1784 0 obj << /S /Macro#20Text /A [ 1785 0 R ] /C /Macro#20Text /Pg 994 0 R /K 2 /P 2159 0 R >> endobj 1785 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1786 0 obj << /S /Macro#20Text /A [ 1787 0 R ] /C /Macro#20Text /Pg 994 0 R /K 3 /P 2159 0 R >> endobj 1787 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1788 0 obj << /S /Body#20Text /A [ 1789 0 R ] /C /Body#20Text /Pg 994 0 R /K 4 /P 2057 0 R >> endobj 1789 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1790 0 obj << /S /Picture /A [ 1791 0 R ] /C /Picture /Pg 994 0 R /K [ 1792 0 R 6 ] /P 2057 0 R >> endobj 1791 0 obj << /O /Layout /TextAlign /Center >> endobj 1792 0 obj << /S /InlineShape /Pg 994 0 R /K 5 /P 1790 0 R /Alt () /A [ 2393 0 R ] >> endobj 1793 0 obj << /S /Body#20Text /C /Body#20Text /Pg 994 0 R /K 7 /P 2057 0 R >> endobj 1794 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 994 0 R /K 8 /P 2164 0 R >> endobj 1795 0 obj << /S /Macro#20Text /A [ 1796 0 R ] /C /Macro#20Text /Pg 994 0 R /K 9 /P 2164 0 R >> endobj 1796 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1797 0 obj << /S /Macro#20Text /A [ 1798 0 R ] /C /Macro#20Text /Pg 994 0 R /K 10 /P 2164 0 R >> endobj 1798 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1799 0 obj << /S /Macro#20Text /A [ 1800 0 R ] /C /Macro#20Text /Pg 994 0 R /K 11 /P 2164 0 R >> endobj 1800 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1801 0 obj << /S /Body#20Text /C /Body#20Text /K 1802 0 R /P 2167 0 R >> endobj 1802 0 obj << /S /InlineShape /Pg 994 0 R /K 12 /P 1801 0 R /Alt () /A [ 2394 0 R ] >> endobj 1803 0 obj << /S /Body#20Text /A [ 1804 0 R ] /C /Body#20Text /Pg 1229 0 R /K 0 /P 2057 0 R >> endobj 1804 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1805 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1229 0 R /K 1 /P 2172 0 R >> endobj 1806 0 obj << /S /Macro#20Text /A [ 1807 0 R ] /C /Macro#20Text /Pg 1229 0 R /K 2 /P 2172 0 R >> endobj 1807 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1808 0 obj << /S /Macro#20Text /A [ 1809 0 R ] /C /Macro#20Text /Pg 1229 0 R /K 3 /P 2172 0 R >> endobj 1809 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1810 0 obj << /S /Macro#20Text /A [ 1811 0 R ] /C /Macro#20Text /Pg 1229 0 R /K 4 /P 2172 0 R >> endobj 1811 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1812 0 obj << /S /Macro#20Text /A [ 1813 0 R ] /C /Macro#20Text /Pg 1229 0 R /K 5 /P 2172 0 R >> endobj 1813 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1814 0 obj << /S /Macro#20Text /A [ 1815 0 R ] /C /Macro#20Text /Pg 1229 0 R /K 6 /P 2172 0 R >> endobj 1815 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1816 0 obj << /S /Body#20Text /C /Body#20Text /K 1817 0 R /P 2175 0 R >> endobj 1817 0 obj << /S /InlineShape /Pg 1229 0 R /K 7 /P 1816 0 R /Alt () /A [ 2396 0 R ] >> endobj 1818 0 obj << /S /Heading#202 /A [ 1819 0 R ] /C /Heading#202 /Pg 1229 0 R /K 8 /P 2057 0 R >> endobj 1819 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1820 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1229 0 R /K 9 /P 2057 0 R >> endobj 1821 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1317 0 R /K 0 /P 2180 0 R >> endobj 1822 0 obj << /S /Macro#20Text /A [ 1823 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 1 /P 2180 0 R >> endobj 1823 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1824 0 obj << /S /Macro#20Text /A [ 1825 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 2 /P 2180 0 R >> endobj 1825 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1826 0 obj << /S /Macro#20Text /A [ 1827 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 3 /P 2180 0 R >> endobj 1827 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1828 0 obj << /S /Macro#20Text /A [ 1829 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 4 /P 2180 0 R >> endobj 1829 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1830 0 obj << /S /Macro#20Text /A [ 1831 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 5 /P 2180 0 R >> endobj 1831 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1832 0 obj << /S /Macro#20Text /A [ 1833 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 6 /P 2180 0 R >> endobj 1833 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1834 0 obj << /S /Macro#20Text /A [ 1835 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 7 /P 2180 0 R >> endobj 1835 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1836 0 obj << /S /Macro#20Text /A [ 1837 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 8 /P 2180 0 R >> endobj 1837 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1838 0 obj << /S /Macro#20Text /A [ 1839 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 9 /P 2180 0 R >> endobj 1839 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1840 0 obj << /S /Macro#20Text /A [ 1841 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 10 /P 2180 0 R >> endobj 1841 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1842 0 obj << /S /Macro#20Text /A [ 1843 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 11 /P 2180 0 R >> endobj 1843 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1844 0 obj << /S /Macro#20Text /A [ 1845 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 12 /P 2180 0 R >> endobj 1845 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1846 0 obj << /S /Macro#20Text /A [ 1847 0 R ] /C /Macro#20Text /Pg 1317 0 R /K 13 /P 2180 0 R >> endobj 1847 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1848 0 obj << /S /Body#20Text /C /Body#20Text /K 1849 0 R /P 2183 0 R >> endobj 1849 0 obj << /S /InlineShape /Pg 1317 0 R /K 14 /P 1848 0 R /Alt () /A [ 2398 0 R ] >> endobj 1850 0 obj << /S /Heading#202 /A [ 1851 0 R ] /C /Heading#202 /Pg 1317 0 R /K 15 /P 2057 0 R >> endobj 1851 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1852 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1317 0 R /K 16 /P 2057 0 R >> endobj 1853 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1317 0 R /K 17 /P 2057 0 R >> endobj 1854 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1317 0 R /K 18 /P 2057 0 R >> endobj 1855 0 obj << /S /Picture /A [ 1856 0 R ] /C /Picture /Pg 1399 0 R /K [ 1857 0 R 1 ] /P 2057 0 R >> endobj 1856 0 obj << /O /Layout /TextAlign /Center >> endobj 1857 0 obj << /S /InlineShape /Pg 1399 0 R /K 0 /P 1855 0 R /Alt () /A [ 2400 0 R ] >> endobj 1858 0 obj << /S /Heading#202 /C /Heading#202 /Pg 1399 0 R /K 2 /P 2057 0 R >> endobj 1859 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1399 0 R /K 3 /P 2057 0 R >> endobj 1860 0 obj << /S /Body#20Text /A [ 1861 0 R ] /C /Body#20Text /Pg 1399 0 R /K 4 /P 2057 0 R >> endobj 1861 0 obj << /O /Layout /SpaceAfter 6 >> endobj 1862 0 obj << /S /Macro#20Text /A [ 1863 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 5 /P 2057 0 R >> endobj 1863 0 obj << /O /Layout /SpaceAfter 12 >> endobj 1864 0 obj << /S /Body#20Text /A [ 1865 0 R ] /C /Body#20Text /Pg 1399 0 R /K 6 /P 2188 0 R >> endobj 1865 0 obj << /O /Layout /SpaceBefore 6 /SpaceAfter 6 >> endobj 1866 0 obj << /S /Body#20Text /A [ 1867 0 R ] /C /Body#20Text /Pg 1399 0 R /K 7 /P 2191 0 R >> endobj 1867 0 obj << /O /Layout /SpaceBefore 6 /SpaceAfter 6 >> endobj 1868 0 obj << /S /Body#20Text /A [ 1869 0 R ] /C /Body#20Text /Pg 1399 0 R /K 8 /P 2057 0 R >> endobj 1869 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1870 0 obj << /S /Macro#20Text /A [ 1871 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 9 /P 2057 0 R >> endobj 1871 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1872 0 obj << /S /Macro#20Text /A [ 1873 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 10 /P 2057 0 R >> endobj 1873 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1874 0 obj << /S /Macro#20Text /A [ 1875 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 11 /P 2057 0 R >> endobj 1875 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1876 0 obj << /S /Macro#20Text /A [ 1877 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 12 /P 2057 0 R >> endobj 1877 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1878 0 obj << /S /Macro#20Text /A [ 1879 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 13 /P 2057 0 R >> endobj 1879 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1880 0 obj << /S /Macro#20Text /A [ 1881 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 14 /P 2057 0 R >> endobj 1881 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1882 0 obj << /S /Macro#20Text /A [ 1883 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 15 /P 2057 0 R >> endobj 1883 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1884 0 obj << /S /Macro#20Text /A [ 1885 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 16 /P 2057 0 R >> endobj 1885 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1886 0 obj << /S /Macro#20Text /A [ 1887 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 17 /P 2057 0 R >> endobj 1887 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1888 0 obj << /S /Macro#20Text /A [ 1889 0 R ] /C /Macro#20Text /Pg 1399 0 R /K 18 /P 2057 0 R >> endobj 1889 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1890 0 obj << /S /Macro#20Text /A [ 1891 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 0 /P 2057 0 R >> endobj 1891 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1892 0 obj << /S /Macro#20Text /A [ 1893 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 1 /P 2057 0 R >> endobj 1893 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1894 0 obj << /S /Macro#20Text /A [ 1895 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 2 /P 2057 0 R >> endobj 1895 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1896 0 obj << /S /Macro#20Text /A [ 1897 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 3 /P 2057 0 R >> endobj 1897 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1898 0 obj << /S /Macro#20Text /A [ 1899 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 4 /P 2057 0 R >> endobj 1899 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1900 0 obj << /S /Macro#20Text /A [ 1901 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 5 /P 2057 0 R >> endobj 1901 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1902 0 obj << /S /Macro#20Text /A [ 1903 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 6 /P 2057 0 R >> endobj 1903 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1904 0 obj << /S /Macro#20Text /A [ 1905 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 7 /P 2057 0 R >> endobj 1905 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1906 0 obj << /S /Macro#20Text /A [ 1907 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 8 /P 2057 0 R >> endobj 1907 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1908 0 obj << /S /Macro#20Text /A [ 1909 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 9 /P 2057 0 R >> endobj 1909 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1910 0 obj << /S /Macro#20Text /A [ 1911 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 10 /P 2057 0 R >> endobj 1911 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1912 0 obj << /S /Macro#20Text /A [ 1913 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 11 /P 2057 0 R >> endobj 1913 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1914 0 obj << /S /Macro#20Text /A [ 1915 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 12 /P 2057 0 R >> endobj 1915 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1916 0 obj << /S /Macro#20Text /A [ 1917 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 13 /P 2057 0 R >> endobj 1917 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1918 0 obj << /S /Macro#20Text /A [ 1919 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 14 /P 2057 0 R >> endobj 1919 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1920 0 obj << /S /Macro#20Text /A [ 1921 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 15 /P 2057 0 R >> endobj 1921 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1922 0 obj << /S /Macro#20Text /A [ 1923 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 16 /P 2057 0 R >> endobj 1923 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1924 0 obj << /S /Macro#20Text /A [ 1925 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 17 /P 2057 0 R >> endobj 1925 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1926 0 obj << /S /Macro#20Text /A [ 1927 0 R ] /C /Macro#20Text /Pg 1403 0 R /K 18 /P 2057 0 R >> endobj 1927 0 obj << /O /Layout /SpaceAfter 0 >> endobj 1928 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1403 0 R /K 19 /P 2057 0 R >> endobj 1929 0 obj << /S /Picture /A [ 1930 0 R ] /C /Picture /Pg 1403 0 R /K [ 1931 0 R 21 ] /P 2057 0 R >> endobj 1930 0 obj << /O /Layout /TextAlign /Center >> endobj 1931 0 obj << /S /InlineShape /Pg 1403 0 R /K 20 /P 1929 0 R /Alt () /A [ 2402 0 R ] >> endobj 1932 0 obj << /S /Heading#202 /C /Heading#202 /Pg 1403 0 R /K 22 /P 2057 0 R >> endobj 1933 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1403 0 R /K 23 /P 2057 0 R >> endobj 1934 0 obj << /S /Macro#20Text /A [ 1935 0 R ] /C /Macro#20Text /Pg 1407 0 R /K 0 /P 2057 0 R >> endobj 1935 0 obj << /O /Layout /SpaceAfter 12 >> endobj 1936 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 1 /P 2057 0 R >> endobj 1937 0 obj << /S /Macro#20Text /A [ 1938 0 R ] /C /Macro#20Text /Pg 1407 0 R /K 2 /P 2057 0 R >> endobj 1938 0 obj << /O /Layout /SpaceAfter 12 >> endobj 1939 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 3 /P 2057 0 R >> endobj 1940 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1407 0 R /K 4 /P 2057 0 R >> endobj 1941 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 5 /P 2057 0 R >> endobj 1942 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 1943 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 6 /P 2057 0 R >> endobj 1944 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 7 /P 2057 0 R >> endobj 1945 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1407 0 R /K 8 /P 2057 0 R >> endobj 1946 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1407 0 R /K 9 /P 2057 0 R >> endobj 1947 0 obj << /S /Macro#20Text /A [ 1948 0 R ] /C /Macro#20Text /Pg 1407 0 R /K 10 /P 2057 0 R >> endobj 1948 0 obj << /O /Layout /SpaceAfter 12 >> endobj 1949 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 11 /P 2057 0 R >> endobj 1950 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1407 0 R /K 12 /P 2057 0 R >> endobj 1951 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 13 /P 2057 0 R >> endobj 1952 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 14 /P 2196 0 R >> endobj 1953 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 15 /P 2199 0 R >> endobj 1954 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 16 /P 2203 0 R >> endobj 1955 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 17 /P 2206 0 R >> endobj 1956 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 18 /P 2210 0 R >> endobj 1957 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 19 /P 2213 0 R >> endobj 1958 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 20 /P 2217 0 R >> endobj 1959 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 21 /P 2220 0 R >> endobj 1960 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 22 /P 2224 0 R >> endobj 1961 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1407 0 R /K 23 /P 2227 0 R >> endobj 1962 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 0 /P 2231 0 R >> endobj 1963 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 1 /P 2234 0 R >> endobj 1964 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 2 /P 2238 0 R >> endobj 1965 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 3 /P 2241 0 R >> endobj 1966 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 4 /P 2245 0 R >> endobj 1967 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 5 /P 2248 0 R >> endobj 1968 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 6 /P 2252 0 R >> endobj 1969 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 7 /P 2255 0 R >> endobj 1970 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 8 /P 2057 0 R >> endobj 1971 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 9 /P 2057 0 R >> endobj 1972 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 10 /P 2260 0 R >> endobj 1973 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 11 /P 2263 0 R >> endobj 1974 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 12 /P 2267 0 R >> endobj 1975 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 13 /P 2270 0 R >> endobj 1976 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 14 /P 2274 0 R >> endobj 1977 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 15 /P 2277 0 R >> endobj 1978 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 16 /P 2281 0 R >> endobj 1979 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 17 /P 2284 0 R >> endobj 1980 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 18 /P 2288 0 R >> endobj 1981 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 19 /P 2291 0 R >> endobj 1982 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 20 /P 2295 0 R >> endobj 1983 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 21 /P 2298 0 R >> endobj 1984 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 22 /P 2302 0 R >> endobj 1985 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 23 /P 2305 0 R >> endobj 1986 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 24 /P 2309 0 R >> endobj 1987 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1410 0 R /K 25 /P 2312 0 R >> endobj 1988 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 0 /P 2316 0 R >> endobj 1989 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 1 /P 2319 0 R >> endobj 1990 0 obj << /S /Heading#203 /A [ 1991 0 R ] /C /Heading#203 /Pg 1413 0 R /K 2 /P 2057 0 R >> endobj 1991 0 obj << /O /Layout /SpaceBefore 12 >> endobj 1992 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 3 /P 2057 0 R >> endobj 1993 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 4 /P 2324 0 R >> endobj 1994 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 5 /P 2327 0 R >> endobj 1995 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 6 /P 2331 0 R >> endobj 1996 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 7 /P 2334 0 R >> endobj 1997 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 8 /P 2057 0 R >> endobj 1998 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 9 /P 2057 0 R >> endobj 1999 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 10 /P 2057 0 R >> endobj 2000 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 11 /P 2057 0 R >> endobj 2001 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 12 /P 2339 0 R >> endobj 2002 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 13 /P 2342 0 R >> endobj 2003 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 14 /P 2346 0 R >> endobj 2004 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 15 /P 2349 0 R >> endobj 2005 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 16 /P 2057 0 R >> endobj 2006 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1413 0 R /K 17 /P 2057 0 R >> endobj 2007 0 obj << /S /Body#20Text /C /Body#20Text /K 2008 0 R /P 2354 0 R >> endobj 2008 0 obj << /S /InlineShape /Pg 1416 0 R /K 0 /P 2007 0 R /Alt () /A [ 2407 0 R ] >> endobj 2009 0 obj << /S /Body#20Text /C /Body#20Text /K 2010 0 R /P 2357 0 R >> endobj 2010 0 obj << /S /InlineShape /Pg 1416 0 R /K 1 /P 2009 0 R /Alt () /A [ 2408 0 R ] >> endobj 2011 0 obj << /S /Heading#203 /A [ 2012 0 R ] /C /Heading#203 /Pg 1416 0 R /K 2 /P 2057 0 R >> endobj 2012 0 obj << /O /Layout /SpaceBefore 12 >> endobj 2013 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1416 0 R /K 3 /P 2057 0 R >> endobj 2014 0 obj << /S /Macro#20Text /A [ 2015 0 R ] /C /Macro#20Text /Pg 1416 0 R /K 4 /P 2057 0 R >> endobj 2015 0 obj << /O /Layout /SpaceAfter 0 >> endobj 2016 0 obj << /S /Body#20Text /A [ 2017 0 R ] /C /Body#20Text /Pg 1416 0 R /K 5 /P 2057 0 R >> endobj 2017 0 obj << /O /Layout /SpaceBefore 12 >> endobj 2018 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1416 0 R /K 6 /P 2057 0 R >> endobj 2019 0 obj << /S /LBody /A [ 2020 0 R ] /C /List#20Number /Pg 1416 0 R /K 7 /P 2365 0 R >> endobj 2020 0 obj << /O /Layout /SpaceAfter 0 >> endobj 2021 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 36 /EndIndent 18 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent -17.99998 >> endobj 2022 0 obj << /S /LBody /A [ 2023 0 R ] /C /List#20Number /Pg 1416 0 R /K 8 /P 2366 0 R >> endobj 2023 0 obj << /O /Layout /SpaceAfter 0 >> endobj 2024 0 obj << /S /LBody /A [ 2025 0 R ] /C /List#20Number /Pg 1416 0 R /K 9 /P 2367 0 R >> endobj 2025 0 obj << /O /Layout /SpaceAfter 0 >> endobj 2026 0 obj << /S /LBody /A [ 2027 0 R ] /C /List#20Number /Pg 1416 0 R /K 10 /P 2368 0 R >> endobj 2027 0 obj << /O /Layout /SpaceAfter 0 >> endobj 2028 0 obj << /S /LBody /A [ 2029 0 R ] /C /List#20Number /Pg 1416 0 R /K 11 /P 2369 0 R >> endobj 2029 0 obj << /O /Layout /SpaceAfter 0 >> endobj 2030 0 obj << /S /LBody /C /List#20Number /Pg 1416 0 R /K 12 /P 2370 0 R >> endobj 2031 0 obj << /S /Body#20Text /A [ 2032 0 R ] /C /Body#20Text /Pg 1421 0 R /K [ 2033 0 R 1 ] /P 2057 0 R >> endobj 2032 0 obj << /O /Layout /TextAlign /Center >> endobj 2033 0 obj << /S /InlineShape /Pg 1421 0 R /K 0 /P 2031 0 R /Alt () /A [ 2410 0 R ] >> endobj 2034 0 obj << /S /Body#20Text /A [ 2035 0 R ] /C /Body#20Text /Pg 1421 0 R /K 2 /P 2057 0 R >> endobj 2035 0 obj << /O /Layout /TextAlign /Start >> endobj 2036 0 obj << /S /Heading#202 /A [ 2037 0 R ] /C /Heading#202 /Pg 1421 0 R /K 3 /P 2057 0 R >> endobj 2037 0 obj << /O /Layout /SpaceBefore 12 >> endobj 2038 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1421 0 R /K 4 /P 2057 0 R >> endobj 2039 0 obj << /S /Heading#202 /C /Heading#202 /Pg 1425 0 R /K 0 /P 2058 0 R >> endobj 2040 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1425 0 R /K 1 /P 2058 0 R >> endobj 2041 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 2 /P 2058 0 R >> endobj 2042 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 3 /P 2058 0 R >> endobj 2043 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 4 /P 2058 0 R >> endobj 2044 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 5 /P 2058 0 R >> endobj 2045 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 6 /P 2058 0 R >> endobj 2046 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 7 /P 2058 0 R >> endobj 2047 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 8 /P 2058 0 R >> endobj 2048 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 9 /P 2058 0 R >> endobj 2049 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 10 /P 2058 0 R >> endobj 2050 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 11 /P 2058 0 R >> endobj 2051 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 12 /P 2058 0 R >> endobj 2052 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 13 /P 2058 0 R >> endobj 2053 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 14 /P 2058 0 R >> endobj 2054 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 15 /P 2058 0 R >> endobj 2055 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1425 0 R /K 16 /P 2058 0 R >> endobj 2056 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 1425 0 R /K 17 /P 2058 0 R >> endobj 2057 0 obj << /S /Sect /P 2442 0 R /K [ 1585 0 R 1586 0 R 1589 0 R 1593 0 R 1594 0 R 1595 0 R 1597 0 R 1598 0 R 1599 0 R 1601 0 R 1602 0 R 1603 0 R 1605 0 R 2059 0 R 1608 0 R 2067 0 R 1619 0 R 2360 0 R 1626 0 R 1629 0 R 2075 0 R 1639 0 R 2083 0 R 1652 0 R 2091 0 R 1658 0 R 2099 0 R 1673 0 R 2107 0 R 1680 0 R 1682 0 R 1683 0 R 1685 0 R 1687 0 R 1689 0 R 1690 0 R 1691 0 R 1693 0 R 1695 0 R 1697 0 R 1699 0 R 1700 0 R 1703 0 R 2122 0 R 1720 0 R 2130 0 R 1739 0 R 2138 0 R 1770 0 R 1772 0 R 2146 0 R 1780 0 R 2154 0 R 1788 0 R 1790 0 R 1793 0 R 2162 0 R 1803 0 R 2170 0 R 1818 0 R 1820 0 R 2178 0 R 1850 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1858 0 R 1859 0 R 1860 0 R 1862 0 R 2186 0 R 1868 0 R 1870 0 R 1872 0 R 1874 0 R 1876 0 R 1878 0 R 1880 0 R 1882 0 R 1884 0 R 1886 0 R 1888 0 R 1890 0 R 1892 0 R 1894 0 R 1896 0 R 1898 0 R 1900 0 R 1902 0 R 1904 0 R 1906 0 R 1908 0 R 1910 0 R 1912 0 R 1914 0 R 1916 0 R 1918 0 R 1920 0 R 1922 0 R 1924 0 R 1926 0 R 1928 0 R 1929 0 R 1932 0 R 1933 0 R 1934 0 R 1936 0 R 1937 0 R 1939 0 R 1940 0 R 1941 0 R 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1949 0 R 1950 0 R 1951 0 R 2194 0 R 1970 0 R 1971 0 R 2258 0 R 1990 0 R 1992 0 R 2322 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2337 0 R 2005 0 R 2006 0 R 2352 0 R 2011 0 R 2013 0 R 2014 0 R 2016 0 R 2018 0 R 2364 0 R 2031 0 R 2034 0 R 2036 0 R 2038 0 R ] >> endobj 2058 0 obj << /S /Sect /P 2442 0 R /K [ 2039 0 R 2040 0 R 2041 0 R 2042 0 R 2043 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R 2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R ] >> endobj 2059 0 obj << /S /Table /K 2060 0 R /P 2057 0 R /A [ 2412 0 R ] >> endobj 2060 0 obj << /S /TR /P 2059 0 R /K [ 2061 0 R 2064 0 R ] >> endobj 2061 0 obj << /S /TD /A [ 2062 0 R 2063 0 R ] /P 2060 0 R /K 1606 0 R >> endobj 2062 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2063 0 obj << /O /Layout /BlockAlign /Before >> endobj 2064 0 obj << /S /TD /A [ 2065 0 R 2066 0 R ] /P 2060 0 R /K 1607 0 R >> endobj 2065 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2066 0 obj << /O /Layout /BlockAlign /Before >> endobj 2067 0 obj << /S /Table /K 2068 0 R /P 2057 0 R /A [ 2413 0 R ] >> endobj 2068 0 obj << /S /TR /P 2067 0 R /K [ 2069 0 R 2072 0 R ] >> endobj 2069 0 obj << /S /TD /A [ 2070 0 R 2071 0 R ] /P 2068 0 R /K [ 1611 0 R 1612 0 R 1614 0 R ] >> endobj 2070 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2071 0 obj << /O /Layout /BlockAlign /Before >> endobj 2072 0 obj << /S /TD /A [ 2073 0 R 2074 0 R ] /P 2068 0 R /K [ 1616 0 R 1618 0 R ] >> endobj 2073 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2074 0 obj << /O /Layout /BlockAlign /Before >> endobj 2075 0 obj << /S /Table /K 2076 0 R /P 2057 0 R /A [ 2414 0 R ] >> endobj 2076 0 obj << /S /TR /P 2075 0 R /K [ 2077 0 R 2080 0 R ] >> endobj 2077 0 obj << /S /TD /A [ 2078 0 R 2079 0 R ] /P 2076 0 R /K [ 1630 0 R 1631 0 R 1633 0 R 1635 0 R ] >> endobj 2078 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2079 0 obj << /O /Layout /BlockAlign /Before >> endobj 2080 0 obj << /S /TD /A [ 2081 0 R 2082 0 R ] /P 2076 0 R /K 1637 0 R >> endobj 2081 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2082 0 obj << /O /Layout /BlockAlign /Before >> endobj 2083 0 obj << /S /Table /K 2084 0 R /P 2057 0 R /A [ 2415 0 R ] >> endobj 2084 0 obj << /S /TR /P 2083 0 R /K [ 2085 0 R 2088 0 R ] >> endobj 2085 0 obj << /S /TD /A [ 2086 0 R 2087 0 R ] /P 2084 0 R /K [ 1641 0 R 1642 0 R 1644 0 R 1646 0 R 1648 0 R ] >> endobj 2086 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2087 0 obj << /O /Layout /BlockAlign /Before >> endobj 2088 0 obj << /S /TD /A [ 2089 0 R 2090 0 R ] /P 2084 0 R /K 1650 0 R >> endobj 2089 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2090 0 obj << /O /Layout /BlockAlign /Before >> endobj 2091 0 obj << /S /Table /K 2092 0 R /P 2057 0 R /A [ 2416 0 R ] >> endobj 2092 0 obj << /S /TR /P 2091 0 R /K [ 2093 0 R 2096 0 R ] >> endobj 2093 0 obj << /S /TD /A [ 2094 0 R 2095 0 R ] /P 2092 0 R /K 1654 0 R >> endobj 2094 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2095 0 obj << /O /Layout /BlockAlign /Before >> endobj 2096 0 obj << /S /TD /A [ 2097 0 R 2098 0 R ] /P 2092 0 R /K 1656 0 R >> endobj 2097 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2098 0 obj << /O /Layout /BlockAlign /Before >> endobj 2099 0 obj << /S /Table /K 2100 0 R /P 2057 0 R /A [ 2417 0 R ] >> endobj 2100 0 obj << /S /TR /P 2099 0 R /K [ 2101 0 R 2104 0 R ] >> endobj 2101 0 obj << /S /TD /A [ 2102 0 R 2103 0 R ] /P 2100 0 R /K [ 1660 0 R 1661 0 R 1663 0 R 1665 0 R 1667 0 R 1669 0 R ] >> endobj 2102 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2103 0 obj << /O /Layout /BlockAlign /Before >> endobj 2104 0 obj << /S /TD /A [ 2105 0 R 2106 0 R ] /P 2100 0 R /K 1671 0 R >> endobj 2105 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2106 0 obj << /O /Layout /BlockAlign /Before >> endobj 2107 0 obj << /S /Table /P 2057 0 R /K [ 2108 0 R 2115 0 R ] /A [ 2418 0 R ] >> endobj 2108 0 obj << /S /TR /P 2107 0 R /K [ 2109 0 R 2112 0 R ] >> endobj 2109 0 obj << /S /TD /A [ 2110 0 R 2111 0 R ] /P 2108 0 R /K 1674 0 R >> endobj 2110 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2111 0 obj << /O /Layout /BlockAlign /Before >> endobj 2112 0 obj << /S /TD /A [ 2113 0 R 2114 0 R ] /P 2108 0 R /K 1675 0 R >> endobj 2113 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2114 0 obj << /O /Layout /BlockAlign /Before >> endobj 2115 0 obj << /S /TR /P 2107 0 R /K [ 2116 0 R 2119 0 R ] >> endobj 2116 0 obj << /S /TD /A [ 2117 0 R 2118 0 R ] /P 2115 0 R /K 1676 0 R >> endobj 2117 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2118 0 obj << /O /Layout /BlockAlign /Before >> endobj 2119 0 obj << /S /TD /A [ 2120 0 R 2121 0 R ] /P 2115 0 R /K 1677 0 R >> endobj 2120 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2121 0 obj << /O /Layout /BlockAlign /Before >> endobj 2122 0 obj << /S /Table /K 2123 0 R /P 2057 0 R /A [ 2419 0 R ] >> endobj 2123 0 obj << /S /TR /P 2122 0 R /K [ 2124 0 R 2127 0 R ] >> endobj 2124 0 obj << /S /TD /A [ 2125 0 R 2126 0 R ] /P 2123 0 R /K [ 1705 0 R 1706 0 R 1708 0 R 1710 0 R 1712 0 R 1714 0 R 1716 0 R ] >> endobj 2125 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2126 0 obj << /O /Layout /BlockAlign /Before >> endobj 2127 0 obj << /S /TD /A [ 2128 0 R 2129 0 R ] /P 2123 0 R /K 1718 0 R >> endobj 2128 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2129 0 obj << /O /Layout /BlockAlign /Before >> endobj 2130 0 obj << /S /Table /K 2131 0 R /P 2057 0 R /A [ 2420 0 R ] >> endobj 2131 0 obj << /S /TR /P 2130 0 R /K [ 2132 0 R 2135 0 R ] >> endobj 2132 0 obj << /S /TD /A [ 2133 0 R 2134 0 R ] /P 2131 0 R /K [ 1722 0 R 1723 0 R 1725 0 R 1727 0 R 1729 0 R 1731 0 R 1733 0 R 1735 0 R ] >> endobj 2133 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2134 0 obj << /O /Layout /BlockAlign /Before >> endobj 2135 0 obj << /S /TD /A [ 2136 0 R 2137 0 R ] /P 2131 0 R /K 1737 0 R >> endobj 2136 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2137 0 obj << /O /Layout /BlockAlign /Before >> endobj 2138 0 obj << /S /Table /K 2139 0 R /P 2057 0 R /A [ 2421 0 R ] >> endobj 2139 0 obj << /S /TR /P 2138 0 R /K [ 2140 0 R 2143 0 R ] >> endobj 2140 0 obj << /S /TD /A [ 2141 0 R 2142 0 R ] /P 2139 0 R /K [ 1741 0 R 1743 0 R 1745 0 R 1747 0 R 1749 0 R 1751 0 R 1753 0 R 1755 0 R 1757 0 R 1759 0 R 1761 0 R 1763 0 R 1765 0 R ] >> endobj 2141 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2142 0 obj << /O /Layout /BlockAlign /Before >> endobj 2143 0 obj << /S /TD /A [ 2144 0 R 2145 0 R ] /P 2139 0 R /K 1767 0 R >> endobj 2144 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2145 0 obj << /O /Layout /BlockAlign /Before >> endobj 2146 0 obj << /S /Table /K 2147 0 R /P 2057 0 R /A [ 2422 0 R ] >> endobj 2147 0 obj << /S /TR /P 2146 0 R /K [ 2148 0 R 2151 0 R ] >> endobj 2148 0 obj << /S /TD /A [ 2149 0 R 2150 0 R ] /P 2147 0 R /K [ 1773 0 R 1774 0 R 1776 0 R ] >> endobj 2149 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2150 0 obj << /O /Layout /BlockAlign /Before >> endobj 2151 0 obj << /S /TD /A [ 2152 0 R 2153 0 R ] /P 2147 0 R /K 1778 0 R >> endobj 2152 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2153 0 obj << /O /Layout /BlockAlign /Before >> endobj 2154 0 obj << /S /Table /K 2155 0 R /P 2057 0 R /A [ 2423 0 R ] >> endobj 2155 0 obj << /S /TR /P 2154 0 R /K [ 2156 0 R 2159 0 R ] >> endobj 2156 0 obj << /S /TD /A [ 2157 0 R 2158 0 R ] /P 2155 0 R /K 1781 0 R >> endobj 2157 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2158 0 obj << /O /Layout /BlockAlign /Before >> endobj 2159 0 obj << /S /TD /A [ 2160 0 R 2161 0 R ] /P 2155 0 R /K [ 1782 0 R 1784 0 R 1786 0 R ] >> endobj 2160 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2161 0 obj << /O /Layout /BlockAlign /Before >> endobj 2162 0 obj << /S /Table /K 2163 0 R /P 2057 0 R /A [ 2424 0 R ] >> endobj 2163 0 obj << /S /TR /P 2162 0 R /K [ 2164 0 R 2167 0 R ] >> endobj 2164 0 obj << /S /TD /A [ 2165 0 R 2166 0 R ] /P 2163 0 R /K [ 1794 0 R 1795 0 R 1797 0 R 1799 0 R ] >> endobj 2165 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2166 0 obj << /O /Layout /BlockAlign /Before >> endobj 2167 0 obj << /S /TD /A [ 2168 0 R 2169 0 R ] /P 2163 0 R /K 1801 0 R >> endobj 2168 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2169 0 obj << /O /Layout /BlockAlign /Before >> endobj 2170 0 obj << /S /Table /K 2171 0 R /P 2057 0 R /A [ 2425 0 R ] >> endobj 2171 0 obj << /S /TR /P 2170 0 R /K [ 2172 0 R 2175 0 R ] >> endobj 2172 0 obj << /S /TD /A [ 2173 0 R 2174 0 R ] /P 2171 0 R /K [ 1805 0 R 1806 0 R 1808 0 R 1810 0 R 1812 0 R 1814 0 R ] >> endobj 2173 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2174 0 obj << /O /Layout /BlockAlign /Before >> endobj 2175 0 obj << /S /TD /A [ 2176 0 R 2177 0 R ] /P 2171 0 R /K 1816 0 R >> endobj 2176 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2177 0 obj << /O /Layout /BlockAlign /Before >> endobj 2178 0 obj << /S /Table /K 2179 0 R /P 2057 0 R /A [ 2426 0 R ] >> endobj 2179 0 obj << /S /TR /P 2178 0 R /K [ 2180 0 R 2183 0 R ] >> endobj 2180 0 obj << /S /TD /A [ 2181 0 R 2182 0 R ] /P 2179 0 R /K [ 1821 0 R 1822 0 R 1824 0 R 1826 0 R 1828 0 R 1830 0 R 1832 0 R 1834 0 R 1836 0 R 1838 0 R 1840 0 R 1842 0 R 1844 0 R 1846 0 R ] >> endobj 2181 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2182 0 obj << /O /Layout /BlockAlign /Before >> endobj 2183 0 obj << /S /TD /A [ 2184 0 R 2185 0 R ] /P 2179 0 R /K 1848 0 R >> endobj 2184 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2185 0 obj << /O /Layout /BlockAlign /Before >> endobj 2186 0 obj << /S /Table /K 2187 0 R /P 2057 0 R /A [ 2427 0 R ] >> endobj 2187 0 obj << /S /TR /P 2186 0 R /K [ 2188 0 R 2191 0 R ] >> endobj 2188 0 obj << /S /TD /A [ 2189 0 R 2190 0 R ] /P 2187 0 R /K 1864 0 R >> endobj 2189 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2190 0 obj << /O /Layout /BlockAlign /Before >> endobj 2191 0 obj << /S /TD /A [ 2192 0 R 2193 0 R ] /P 2187 0 R /K 1866 0 R >> endobj 2192 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2193 0 obj << /O /Layout /BlockAlign /Before >> endobj 2194 0 obj << /S /Table /P 2057 0 R /K [ 2195 0 R 2202 0 R 2209 0 R 2216 0 R 2223 0 R 2230 0 R 2237 0 R 2244 0 R 2251 0 R ] /A [ 2428 0 R ] >> endobj 2195 0 obj << /S /TR /P 2194 0 R /K [ 2196 0 R 2199 0 R ] >> endobj 2196 0 obj << /S /TD /A [ 2197 0 R 2198 0 R ] /P 2195 0 R /K 1952 0 R >> endobj 2197 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2198 0 obj << /O /Layout /BlockAlign /Before >> endobj 2199 0 obj << /S /TD /A [ 2200 0 R 2201 0 R ] /P 2195 0 R /K 1953 0 R >> endobj 2200 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2201 0 obj << /O /Layout /BlockAlign /Before >> endobj 2202 0 obj << /S /TR /P 2194 0 R /K [ 2203 0 R 2206 0 R ] >> endobj 2203 0 obj << /S /TD /A [ 2204 0 R 2205 0 R ] /P 2202 0 R /K 1954 0 R >> endobj 2204 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2205 0 obj << /O /Layout /BlockAlign /Before >> endobj 2206 0 obj << /S /TD /A [ 2207 0 R 2208 0 R ] /P 2202 0 R /K 1955 0 R >> endobj 2207 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2208 0 obj << /O /Layout /BlockAlign /Before >> endobj 2209 0 obj << /S /TR /P 2194 0 R /K [ 2210 0 R 2213 0 R ] >> endobj 2210 0 obj << /S /TD /A [ 2211 0 R 2212 0 R ] /P 2209 0 R /K 1956 0 R >> endobj 2211 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2212 0 obj << /O /Layout /BlockAlign /Before >> endobj 2213 0 obj << /S /TD /A [ 2214 0 R 2215 0 R ] /P 2209 0 R /K 1957 0 R >> endobj 2214 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2215 0 obj << /O /Layout /BlockAlign /Before >> endobj 2216 0 obj << /S /TR /P 2194 0 R /K [ 2217 0 R 2220 0 R ] >> endobj 2217 0 obj << /S /TD /A [ 2218 0 R 2219 0 R ] /P 2216 0 R /K 1958 0 R >> endobj 2218 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2219 0 obj << /O /Layout /BlockAlign /Before >> endobj 2220 0 obj << /S /TD /A [ 2221 0 R 2222 0 R ] /P 2216 0 R /K 1959 0 R >> endobj 2221 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2222 0 obj << /O /Layout /BlockAlign /Before >> endobj 2223 0 obj << /S /TR /P 2194 0 R /K [ 2224 0 R 2227 0 R ] >> endobj 2224 0 obj << /S /TD /A [ 2225 0 R 2226 0 R ] /P 2223 0 R /K 1960 0 R >> endobj 2225 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2226 0 obj << /O /Layout /BlockAlign /Before >> endobj 2227 0 obj << /S /TD /A [ 2228 0 R 2229 0 R ] /P 2223 0 R /K 1961 0 R >> endobj 2228 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2229 0 obj << /O /Layout /BlockAlign /Before >> endobj 2230 0 obj << /S /TR /P 2194 0 R /K [ 2231 0 R 2234 0 R ] >> endobj 2231 0 obj << /S /TD /A [ 2232 0 R 2233 0 R ] /P 2230 0 R /K 1962 0 R >> endobj 2232 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2233 0 obj << /O /Layout /BlockAlign /Before >> endobj 2234 0 obj << /S /TD /A [ 2235 0 R 2236 0 R ] /P 2230 0 R /K 1963 0 R >> endobj 2235 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2236 0 obj << /O /Layout /BlockAlign /Before >> endobj 2237 0 obj << /S /TR /P 2194 0 R /K [ 2238 0 R 2241 0 R ] >> endobj 2238 0 obj << /S /TD /A [ 2239 0 R 2240 0 R ] /P 2237 0 R /K 1964 0 R >> endobj 2239 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2240 0 obj << /O /Layout /BlockAlign /Before >> endobj 2241 0 obj << /S /TD /A [ 2242 0 R 2243 0 R ] /P 2237 0 R /K 1965 0 R >> endobj 2242 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2243 0 obj << /O /Layout /BlockAlign /Before >> endobj 2244 0 obj << /S /TR /P 2194 0 R /K [ 2245 0 R 2248 0 R ] >> endobj 2245 0 obj << /S /TD /A [ 2246 0 R 2247 0 R ] /P 2244 0 R /K 1966 0 R >> endobj 2246 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2247 0 obj << /O /Layout /BlockAlign /Before >> endobj 2248 0 obj << /S /TD /A [ 2249 0 R 2250 0 R ] /P 2244 0 R /K 1967 0 R >> endobj 2249 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2250 0 obj << /O /Layout /BlockAlign /Before >> endobj 2251 0 obj << /S /TR /P 2194 0 R /K [ 2252 0 R 2255 0 R ] >> endobj 2252 0 obj << /S /TD /A [ 2253 0 R 2254 0 R ] /P 2251 0 R /K 1968 0 R >> endobj 2253 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2254 0 obj << /O /Layout /BlockAlign /Before >> endobj 2255 0 obj << /S /TD /A [ 2256 0 R 2257 0 R ] /P 2251 0 R /K 1969 0 R >> endobj 2256 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2257 0 obj << /O /Layout /BlockAlign /Before >> endobj 2258 0 obj << /S /Table /P 2057 0 R /K [ 2259 0 R 2266 0 R 2273 0 R 2280 0 R 2287 0 R 2294 0 R 2301 0 R 2308 0 R 2315 0 R ] /A [ 2429 0 R ] >> endobj 2259 0 obj << /S /TR /P 2258 0 R /K [ 2260 0 R 2263 0 R ] >> endobj 2260 0 obj << /S /TD /A [ 2261 0 R 2262 0 R ] /P 2259 0 R /K 1972 0 R >> endobj 2261 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2262 0 obj << /O /Layout /BlockAlign /Before >> endobj 2263 0 obj << /S /TD /A [ 2264 0 R 2265 0 R ] /P 2259 0 R /K 1973 0 R >> endobj 2264 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2265 0 obj << /O /Layout /BlockAlign /Before >> endobj 2266 0 obj << /S /TR /P 2258 0 R /K [ 2267 0 R 2270 0 R ] >> endobj 2267 0 obj << /S /TD /A [ 2268 0 R 2269 0 R ] /P 2266 0 R /K 1974 0 R >> endobj 2268 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2269 0 obj << /O /Layout /BlockAlign /Before >> endobj 2270 0 obj << /S /TD /A [ 2271 0 R 2272 0 R ] /P 2266 0 R /K 1975 0 R >> endobj 2271 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2272 0 obj << /O /Layout /BlockAlign /Before >> endobj 2273 0 obj << /S /TR /P 2258 0 R /K [ 2274 0 R 2277 0 R ] >> endobj 2274 0 obj << /S /TD /A [ 2275 0 R 2276 0 R ] /P 2273 0 R /K 1976 0 R >> endobj 2275 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2276 0 obj << /O /Layout /BlockAlign /Before >> endobj 2277 0 obj << /S /TD /A [ 2278 0 R 2279 0 R ] /P 2273 0 R /K 1977 0 R >> endobj 2278 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2279 0 obj << /O /Layout /BlockAlign /Before >> endobj 2280 0 obj << /S /TR /P 2258 0 R /K [ 2281 0 R 2284 0 R ] >> endobj 2281 0 obj << /S /TD /A [ 2282 0 R 2283 0 R ] /P 2280 0 R /K 1978 0 R >> endobj 2282 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2283 0 obj << /O /Layout /BlockAlign /Before >> endobj 2284 0 obj << /S /TD /A [ 2285 0 R 2286 0 R ] /P 2280 0 R /K 1979 0 R >> endobj 2285 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2286 0 obj << /O /Layout /BlockAlign /Before >> endobj 2287 0 obj << /S /TR /P 2258 0 R /K [ 2288 0 R 2291 0 R ] >> endobj 2288 0 obj << /S /TD /A [ 2289 0 R 2290 0 R ] /P 2287 0 R /K 1980 0 R >> endobj 2289 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2290 0 obj << /O /Layout /BlockAlign /Before >> endobj 2291 0 obj << /S /TD /A [ 2292 0 R 2293 0 R ] /P 2287 0 R /K 1981 0 R >> endobj 2292 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2293 0 obj << /O /Layout /BlockAlign /Before >> endobj 2294 0 obj << /S /TR /P 2258 0 R /K [ 2295 0 R 2298 0 R ] >> endobj 2295 0 obj << /S /TD /A [ 2296 0 R 2297 0 R ] /P 2294 0 R /K 1982 0 R >> endobj 2296 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2297 0 obj << /O /Layout /BlockAlign /Before >> endobj 2298 0 obj << /S /TD /A [ 2299 0 R 2300 0 R ] /P 2294 0 R /K 1983 0 R >> endobj 2299 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2300 0 obj << /O /Layout /BlockAlign /Before >> endobj 2301 0 obj << /S /TR /P 2258 0 R /K [ 2302 0 R 2305 0 R ] >> endobj 2302 0 obj << /S /TD /A [ 2303 0 R 2304 0 R ] /P 2301 0 R /K 1984 0 R >> endobj 2303 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2304 0 obj << /O /Layout /BlockAlign /Before >> endobj 2305 0 obj << /S /TD /A [ 2306 0 R 2307 0 R ] /P 2301 0 R /K 1985 0 R >> endobj 2306 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2307 0 obj << /O /Layout /BlockAlign /Before >> endobj 2308 0 obj << /S /TR /P 2258 0 R /K [ 2309 0 R 2312 0 R ] >> endobj 2309 0 obj << /S /TD /A [ 2310 0 R 2311 0 R ] /P 2308 0 R /K 1986 0 R >> endobj 2310 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2311 0 obj << /O /Layout /BlockAlign /Before >> endobj 2312 0 obj << /S /TD /A [ 2313 0 R 2314 0 R ] /P 2308 0 R /K 1987 0 R >> endobj 2313 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2314 0 obj << /O /Layout /BlockAlign /Before >> endobj 2315 0 obj << /S /TR /P 2258 0 R /K [ 2316 0 R 2319 0 R ] >> endobj 2316 0 obj << /S /TD /A [ 2317 0 R 2318 0 R ] /P 2315 0 R /K 1988 0 R >> endobj 2317 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2318 0 obj << /O /Layout /BlockAlign /Before >> endobj 2319 0 obj << /S /TD /A [ 2320 0 R 2321 0 R ] /P 2315 0 R /K 1989 0 R >> endobj 2320 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2321 0 obj << /O /Layout /BlockAlign /Before >> endobj 2322 0 obj << /S /Table /P 2057 0 R /K [ 2323 0 R 2330 0 R ] /A [ 2430 0 R ] >> endobj 2323 0 obj << /S /TR /P 2322 0 R /K [ 2324 0 R 2327 0 R ] >> endobj 2324 0 obj << /S /TD /A [ 2325 0 R 2326 0 R ] /P 2323 0 R /K 1993 0 R >> endobj 2325 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2326 0 obj << /O /Layout /BlockAlign /Before >> endobj 2327 0 obj << /S /TD /A [ 2328 0 R 2329 0 R ] /P 2323 0 R /K 1994 0 R >> endobj 2328 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2329 0 obj << /O /Layout /BlockAlign /Before >> endobj 2330 0 obj << /S /TR /P 2322 0 R /K [ 2331 0 R 2334 0 R ] >> endobj 2331 0 obj << /S /TD /A [ 2332 0 R 2333 0 R ] /P 2330 0 R /K 1995 0 R >> endobj 2332 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2333 0 obj << /O /Layout /BlockAlign /Before >> endobj 2334 0 obj << /S /TD /A [ 2335 0 R 2336 0 R ] /P 2330 0 R /K 1996 0 R >> endobj 2335 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2336 0 obj << /O /Layout /BlockAlign /Before >> endobj 2337 0 obj << /S /Table /P 2057 0 R /K [ 2338 0 R 2345 0 R ] /A [ 2431 0 R ] >> endobj 2338 0 obj << /S /TR /P 2337 0 R /K [ 2339 0 R 2342 0 R ] >> endobj 2339 0 obj << /S /TD /A [ 2340 0 R 2341 0 R ] /P 2338 0 R /K 2001 0 R >> endobj 2340 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2341 0 obj << /O /Layout /BlockAlign /Before >> endobj 2342 0 obj << /S /TD /A [ 2343 0 R 2344 0 R ] /P 2338 0 R /K 2002 0 R >> endobj 2343 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2344 0 obj << /O /Layout /BlockAlign /Before >> endobj 2345 0 obj << /S /TR /P 2337 0 R /K [ 2346 0 R 2349 0 R ] >> endobj 2346 0 obj << /S /TD /A [ 2347 0 R 2348 0 R ] /P 2345 0 R /K 2003 0 R >> endobj 2347 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2348 0 obj << /O /Layout /BlockAlign /Before >> endobj 2349 0 obj << /S /TD /A [ 2350 0 R 2351 0 R ] /P 2345 0 R /K 2004 0 R >> endobj 2350 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2351 0 obj << /O /Layout /BlockAlign /Before >> endobj 2352 0 obj << /S /Table /K 2353 0 R /P 2057 0 R /A [ 2432 0 R ] >> endobj 2353 0 obj << /S /TR /P 2352 0 R /K [ 2354 0 R 2357 0 R ] >> endobj 2354 0 obj << /S /TD /A [ 2355 0 R 2356 0 R ] /P 2353 0 R /K 2007 0 R >> endobj 2355 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2356 0 obj << /O /Layout /BlockAlign /Before >> endobj 2357 0 obj << /S /TD /A [ 2358 0 R 2359 0 R ] /P 2353 0 R /K 2009 0 R >> endobj 2358 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 2359 0 obj << /O /Layout /BlockAlign /Before >> endobj 2360 0 obj << /S /L /P 2057 0 R /K [ 2361 0 R 2362 0 R 2363 0 R ] >> endobj 2361 0 obj << /S /LI /P 2360 0 R /K 1620 0 R >> endobj 2362 0 obj << /S /LI /P 2360 0 R /K 1623 0 R >> endobj 2363 0 obj << /S /LI /P 2360 0 R /K 1625 0 R >> endobj 2364 0 obj << /S /L /P 2057 0 R /K [ 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R ] >> endobj 2365 0 obj << /S /LI /P 2364 0 R /K 2019 0 R >> endobj 2366 0 obj << /S /LI /P 2364 0 R /K 2022 0 R >> endobj 2367 0 obj << /S /LI /P 2364 0 R /K 2024 0 R >> endobj 2368 0 obj << /S /LI /P 2364 0 R /K 2026 0 R >> endobj 2369 0 obj << /S /LI /P 2364 0 R /K 2028 0 R >> endobj 2370 0 obj << /S /LI /P 2364 0 R /K 2030 0 R >> endobj 2371 0 obj << /Nums [ 0 2372 0 R 1 2374 0 R 2 2376 0 R 3 2379 0 R 4 2381 0 R 5 2384 0 R 6 2386 0 R 7 2389 0 R 8 2392 0 R 9 2395 0 R 10 2397 0 R 11 2399 0 R 12 2401 0 R 13 2403 0 R 14 2404 0 R 15 2405 0 R 16 2406 0 R 17 2409 0 R 18 2411 0 R ] >> endobj 2372 0 obj [ 1585 0 R 1586 0 R 1591 0 R 1591 0 R 1589 0 R 1593 0 R 1594 0 R 1595 0 R 1597 0 R 1598 0 R ] endobj 2373 0 obj << /O /Layout /BBox [ 111 291 487 591 ] /Placement /Inline >> endobj 2374 0 obj [ 1599 0 R 1601 0 R 1602 0 R 1603 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1611 0 R 1612 0 R 1614 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1623 0 R 1625 0 R ] endobj 2375 0 obj << /O /Layout /BBox [ 239 233 527 462 ] /Placement /Inline >> endobj 2376 0 obj [ 1628 0 R 1626 0 R 1629 0 R 1630 0 R 1631 0 R 1633 0 R 1635 0 R 1638 0 R 1639 0 R ] endobj 2377 0 obj << /O /Layout /BBox [ 217 566 394 720 ] /Placement /Inline >> endobj 2378 0 obj << /O /Layout /BBox [ 237 270 528 498 ] /Placement /Inline >> endobj 2379 0 obj [ 1641 0 R 1642 0 R 1644 0 R 1646 0 R 1648 0 R 1651 0 R 1652 0 R 1654 0 R 1656 0 R 1658 0 R ] endobj 2380 0 obj << /O /Layout /BBox [ 233 480 533 720 ] /Placement /Inline >> endobj 2381 0 obj [ 1660 0 R 1661 0 R 1663 0 R 1665 0 R 1667 0 R 1669 0 R 1672 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1679 0 R 1679 0 R 1677 0 R 1680 0 R 1682 0 R 1683 0 R 1685 0 R ] endobj 2382 0 obj << /O /Layout /BBox [ 254 505 552 703 ] /Placement /Inline >> endobj 2383 0 obj << /O /Layout /BBox [ 168 237 493 389 ] /Placement /Inline >> endobj 2384 0 obj [ 1687 0 R 1689 0 R 1690 0 R 1691 0 R 1693 0 R 1695 0 R 1697 0 R 1699 0 R 1702 0 R 1700 0 R 1703 0 R ] endobj 2385 0 obj << /O /Layout /BBox [ 163 335 448 551 ] /Placement /Inline >> endobj 2386 0 obj [ 1705 0 R 1706 0 R 1708 0 R 1710 0 R 1712 0 R 1714 0 R 1716 0 R 1719 0 R 1720 0 R 1722 0 R 1723 0 R 1725 0 R 1727 0 R 1729 0 R 1731 0 R 1733 0 R 1735 0 R 1738 0 R 1739 0 R ] endobj 2387 0 obj << /O /Layout /BBox [ 239 480 539 720 ] /Placement /Inline >> endobj 2388 0 obj << /O /Layout /BBox [ 266 136 557 375 ] /Placement /Inline >> endobj 2389 0 obj [ 1739 0 R 1741 0 R 1743 0 R 1745 0 R 1747 0 R 1749 0 R 1751 0 R 1753 0 R 1755 0 R 1757 0 R 1759 0 R 1761 0 R 1763 0 R 1765 0 R 1769 0 R 1770 0 R 1772 0 R 1773 0 R 1774 0 R 1776 0 R 1779 0 R 1780 0 R ] endobj 2390 0 obj << /O /Layout /BBox [ 266 450 552 668 ] /Placement /Inline >> endobj 2391 0 obj << /O /Layout /BBox [ 239 112 530 351 ] /Placement /Inline >> endobj 2392 0 obj [ 1781 0 R 1782 0 R 1784 0 R 1786 0 R 1788 0 R 1792 0 R 1790 0 R 1793 0 R 1794 0 R 1795 0 R 1797 0 R 1799 0 R 1802 0 R ] endobj 2393 0 obj << /O /Layout /BBox [ 148 394 463 633 ] /Placement /Inline >> endobj 2394 0 obj << /O /Layout /BBox [ 239 102 530 341 ] /Placement /Inline >> endobj 2395 0 obj [ 1803 0 R 1805 0 R 1806 0 R 1808 0 R 1810 0 R 1812 0 R 1814 0 R 1817 0 R 1818 0 R 1820 0 R ] endobj 2396 0 obj << /O /Layout /BBox [ 266 426 557 665 ] /Placement /Inline >> endobj 2397 0 obj [ 1821 0 R 1822 0 R 1824 0 R 1826 0 R 1828 0 R 1830 0 R 1832 0 R 1834 0 R 1836 0 R 1838 0 R 1840 0 R 1842 0 R 1844 0 R 1846 0 R 1849 0 R 1850 0 R 1852 0 R 1853 0 R 1854 0 R ] endobj 2398 0 obj << /O /Layout /BBox [ 275 502 557 720 ] /Placement /Inline >> endobj 2399 0 obj [ 1857 0 R 1855 0 R 1858 0 R 1859 0 R 1860 0 R 1862 0 R 1864 0 R 1866 0 R 1868 0 R 1870 0 R 1872 0 R 1874 0 R 1876 0 R 1878 0 R 1880 0 R 1882 0 R 1884 0 R 1886 0 R 1888 0 R ] endobj 2400 0 obj << /O /Layout /BBox [ 146 477 465 720 ] /Placement /Inline >> endobj 2401 0 obj [ 1890 0 R 1892 0 R 1894 0 R 1896 0 R 1898 0 R 1900 0 R 1902 0 R 1904 0 R 1906 0 R 1908 0 R 1910 0 R 1912 0 R 1914 0 R 1916 0 R 1918 0 R 1920 0 R 1922 0 R 1924 0 R 1926 0 R 1928 0 R 1931 0 R 1929 0 R 1932 0 R 1933 0 R ] endobj 2402 0 obj << /O /Layout /BBox [ 101 131 510 442 ] /Placement /Inline >> endobj 2403 0 obj [ 1934 0 R 1936 0 R 1937 0 R 1939 0 R 1940 0 R 1941 0 R 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R 1954 0 R 1955 0 R 1956 0 R 1957 0 R 1958 0 R 1959 0 R 1960 0 R 1961 0 R ] endobj 2404 0 obj [ 1962 0 R 1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R 1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R ] endobj 2405 0 obj [ 1988 0 R 1989 0 R 1990 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R ] endobj 2406 0 obj [ 2008 0 R 2010 0 R 2011 0 R 2013 0 R 2014 0 R 2016 0 R 2018 0 R 2019 0 R 2022 0 R 2024 0 R 2026 0 R 2028 0 R 2030 0 R ] endobj 2407 0 obj << /O /Layout /BBox [ 90 579 296 720 ] /Placement /Inline >> endobj 2408 0 obj << /O /Layout /BBox [ 307 586 511 720 ] /Placement /Inline >> endobj 2409 0 obj [ 2033 0 R 2031 0 R 2034 0 R 2036 0 R 2038 0 R ] endobj 2410 0 obj << /O /Layout /BBox [ 197 435 414 720 ] /Placement /Inline >> endobj 2411 0 obj [ 2039 0 R 2040 0 R 2041 0 R 2042 0 R 2043 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R 2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R ] endobj 2412 0 obj << /O /Layout /BBox [ 90 488.4962 525.49968 518.29182 ] /Placement /Block /StartIndent 0 /EndIndent -3.49968 >> endobj 2413 0 obj << /O /Layout /BBox [ 90 206.6761 527.03999 463.16396 ] /Placement /Block /StartIndent 0 /EndIndent -5.03999 >> endobj 2414 0 obj << /O /Layout /BBox [ 88.2 270.1201 528.84001 499.88376 ] /Placement /Block /StartIndent -1.8 /EndIndent -6.84001 >> endobj 2415 0 obj << /O /Layout /BBox [ 83.7 480.78 533.34001 721.04387 ] /Placement /Block /StartIndent -6.3 /EndIndent -11.34001 >> endobj 2416 0 obj << /O /Layout /BBox [ 90 363.7565 526.59482 448.52386 ] /Placement /Block /StartIndent 0 /EndIndent -4.59482 >> endobj 2417 0 obj << /O /Layout /BBox [ 90 505.24475 552.35349 721.04387 ] /Placement /Block /StartIndent 0 /EndIndent -30.35349 >> endobj 2418 0 obj << /O /Layout /BBox [ 90 233.4362 528.73848 457.22386 ] /Placement /Block /StartIndent 0 /EndIndent -6.73848 >> endobj 2419 0 obj << /O /Layout /BBox [ 90 480.78 539.64 721.04387 ] /Placement /Block /StartIndent 0 /EndIndent -17.64 >> endobj 2420 0 obj << /O /Layout /BBox [ 90 136.56 557.64 376.82407 ] /Placement /Block /StartIndent 0 /EndIndent -35.64 >> endobj 2421 0 obj << /O /Layout /BBox [ 90 450.72 552.36 669.44406 ] /Placement /Block /StartIndent 0 /EndIndent -30.36 >> endobj 2422 0 obj << /O /Layout /BBox [ 89.9996 112.32001 530.64 352.58386 ] /Placement /Block /StartIndent -0.0004 /EndIndent -8.64 >> endobj 2423 0 obj << /O /Layout /BBox [ 90 681.98726 426.58846 721.71037 ] /Placement /Block /StartIndent 0 /EndIndent 95.41154 >> endobj 2424 0 obj << /O /Layout /BBox [ 89.9998 102.36 530.64 343.57166 ] /Placement /Block /StartIndent -0.0002 /EndIndent -8.64 >> endobj 2425 0 obj << /O /Layout /BBox [ 90 426.36 557.64 666.62396 ] /Placement /Block /StartIndent 0 /EndIndent -35.64 >> endobj 2426 0 obj << /O /Layout /BBox [ 90 502.32001 557.64 721.04387 ] /Placement /Block /StartIndent 0 /EndIndent -35.64 >> endobj 2427 0 obj << /O /Layout /BBox [ 90 252.6962 526.32951 282.32396 ] /Placement /Block /StartIndent 0 /EndIndent -4.32951 >> endobj 2428 0 obj << /O /Layout /Placement /Block /StartIndent 0 /EndIndent 13.02359 >> endobj 2429 0 obj << /O /Layout /Placement /Block /StartIndent 0 /EndIndent 13.02359 >> endobj 2430 0 obj << /O /Layout /BBox [ 90 525.56647 502.44241 612.68387 ] /Placement /Block /StartIndent 0 /EndIndent 19.55759 >> endobj 2431 0 obj << /O /Layout /BBox [ 90 295.34647 502.44241 383.00386 ] /Placement /Block /StartIndent 0 /EndIndent 19.55759 >> endobj 2432 0 obj << /O /Layout /BBox [ 90 579.84 511.32001 720.06 ] /Placement /Block /StartIndent 0 /EndIndent 10.67999 >> endobj 2433 0 obj << /S /D >> endobj 2434 0 obj << /Nums [ 0 2433 0 R ] >> endobj 2435 0 obj << /Producer (Acrobat Distiller 5.0.5 \(Windows\)) /Author (Joe Chuma) /Creator (Acrobat PDFMaker 5.0 for Word) /ModDate (D:20030505124707-06'00') /Title (Using Colormaps and Gradients) /CreationDate (D:20030505124648-07'00') >> endobj 2436 0 obj << /Type /Metadata /Subtype /XML /Length 1084 >> stream Using Colormaps and Gradients endstream endobj 2437 0 obj << /Type /Pages /Kids [ 2443 0 R 1 0 R 39 0 R 78 0 R 315 0 R 320 0 R 324 0 R 763 0 R 994 0 R 1229 0 R ] /Count 10 /Parent 2438 0 R >> endobj 2438 0 obj << /Type /Pages /Kids [ 2437 0 R 2439 0 R ] /Count 19 >> endobj 2439 0 obj << /Type /Pages /Kids [ 1317 0 R 1399 0 R 1403 0 R 1407 0 R 1410 0 R 1413 0 R 1416 0 R 1421 0 R 1425 0 R ] /Count 9 /Parent 2438 0 R >> endobj xref 0 2440 0000000000 65535 f 0000153257 00000 n 0000154158 00000 n 0000156622 00000 n 0000156643 00000 n 0000156826 00000 n 0000157027 00000 n 0000157224 00000 n 0000157477 00000 n 0000157667 00000 n 0000157945 00000 n 0000158136 00000 n 0000158422 00000 n 0000158613 00000 n 0000158923 00000 n 0000159114 00000 n 0000159403 00000 n 0000159594 00000 n 0000159911 00000 n 0000160101 00000 n 0000160396 00000 n 0000160587 00000 n 0000160882 00000 n 0000161073 00000 n 0000161388 00000 n 0000161579 00000 n 0000161880 00000 n 0000162072 00000 n 0000162401 00000 n 0000162597 00000 n 0000162902 00000 n 0000163095 00000 n 0000163391 00000 n 0000163585 00000 n 0000163873 00000 n 0000164065 00000 n 0000164301 00000 n 0000164503 00000 n 0000164736 00000 n 0000164936 00000 n 0000165815 00000 n 0000166951 00000 n 0000166973 00000 n 0000175312 00000 n 0000175496 00000 n 0000175699 00000 n 0000175896 00000 n 0000176156 00000 n 0000176347 00000 n 0000176631 00000 n 0000176822 00000 n 0000177112 00000 n 0000177305 00000 n 0000177611 00000 n 0000177802 00000 n 0000178094 00000 n 0000178285 00000 n 0000178597 00000 n 0000178787 00000 n 0000179085 00000 n 0000179278 00000 n 0000179574 00000 n 0000179765 00000 n 0000180077 00000 n 0000180268 00000 n 0000180568 00000 n 0000180761 00000 n 0000181079 00000 n 0000181274 00000 n 0000181577 00000 n 0000181769 00000 n 0000182071 00000 n 0000182267 00000 n 0000182569 00000 n 0000182761 00000 n 0000182996 00000 n 0000183198 00000 n 0000183430 00000 n 0000183632 00000 n 0000187782 00000 n 0000190803 00000 n 0000190825 00000 n 0000191013 00000 n 0000191208 00000 n 0000191405 00000 n 0000191608 00000 n 0000191806 00000 n 0000192001 00000 n 0000192192 00000 n 0000192383 00000 n 0000192574 00000 n 0000192765 00000 n 0000192958 00000 n 0000193149 00000 n 0000193340 00000 n 0000193531 00000 n 0000193722 00000 n 0000193914 00000 n 0000194106 00000 n 0000194300 00000 n 0000194492 00000 n 0000194685 00000 n 0000194878 00000 n 0000195070 00000 n 0000195262 00000 n 0000195454 00000 n 0000195646 00000 n 0000195838 00000 n 0000196032 00000 n 0000196224 00000 n 0000196416 00000 n 0000196608 00000 n 0000196800 00000 n 0000196992 00000 n 0000197184 00000 n 0000197376 00000 n 0000197570 00000 n 0000197762 00000 n 0000197958 00000 n 0000198155 00000 n 0000198351 00000 n 0000198551 00000 n 0000198750 00000 n 0000198952 00000 n 0000199153 00000 n 0000199350 00000 n 0000199547 00000 n 0000199745 00000 n 0000199936 00000 n 0000200127 00000 n 0000200318 00000 n 0000200509 00000 n 0000200701 00000 n 0000200893 00000 n 0000201085 00000 n 0000201277 00000 n 0000201471 00000 n 0000201663 00000 n 0000201855 00000 n 0000202047 00000 n 0000202239 00000 n 0000202431 00000 n 0000202623 00000 n 0000202815 00000 n 0000203007 00000 n 0000203201 00000 n 0000203393 00000 n 0000203585 00000 n 0000203777 00000 n 0000203969 00000 n 0000204161 00000 n 0000204357 00000 n 0000204554 00000 n 0000204753 00000 n 0000204947 00000 n 0000205139 00000 n 0000205331 00000 n 0000205523 00000 n 0000205720 00000 n 0000205916 00000 n 0000206117 00000 n 0000206313 00000 n 0000206509 00000 n 0000206706 00000 n 0000206897 00000 n 0000207088 00000 n 0000207279 00000 n 0000207470 00000 n 0000207661 00000 n 0000207854 00000 n 0000208045 00000 n 0000208236 00000 n 0000208427 00000 n 0000208618 00000 n 0000208809 00000 n 0000209000 00000 n 0000209191 00000 n 0000209383 00000 n 0000209577 00000 n 0000209769 00000 n 0000209961 00000 n 0000210153 00000 n 0000210345 00000 n 0000210539 00000 n 0000210735 00000 n 0000210932 00000 n 0000211128 00000 n 0000211322 00000 n 0000211518 00000 n 0000211710 00000 n 0000211902 00000 n 0000212094 00000 n 0000212286 00000 n 0000212478 00000 n 0000212670 00000 n 0000212864 00000 n 0000213056 00000 n 0000213248 00000 n 0000213441 00000 n 0000213633 00000 n 0000213825 00000 n 0000214017 00000 n 0000214209 00000 n 0000214406 00000 n 0000214602 00000 n 0000214801 00000 n 0000214997 00000 n 0000215194 00000 n 0000215390 00000 n 0000215585 00000 n 0000215777 00000 n 0000215969 00000 n 0000216163 00000 n 0000216361 00000 n 0000216560 00000 n 0000216761 00000 n 0000216957 00000 n 0000217154 00000 n 0000217346 00000 n 0000217538 00000 n 0000217730 00000 n 0000217922 00000 n 0000218115 00000 n 0000218307 00000 n 0000218501 00000 n 0000218693 00000 n 0000218885 00000 n 0000219077 00000 n 0000219270 00000 n 0000219462 00000 n 0000219654 00000 n 0000219846 00000 n 0000220038 00000 n 0000220230 00000 n 0000220424 00000 n 0000220619 00000 n 0000220812 00000 n 0000221005 00000 n 0000221198 00000 n 0000221395 00000 n 0000221593 00000 n 0000221792 00000 n 0000221990 00000 n 0000222186 00000 n 0000222385 00000 n 0000222578 00000 n 0000222772 00000 n 0000222965 00000 n 0000223159 00000 n 0000223352 00000 n 0000223546 00000 n 0000223739 00000 n 0000223939 00000 n 0000224137 00000 n 0000224337 00000 n 0000224535 00000 n 0000224730 00000 n 0000224927 00000 n 0000225125 00000 n 0000225319 00000 n 0000225512 00000 n 0000225709 00000 n 0000225905 00000 n 0000226104 00000 n 0000226305 00000 n 0000226501 00000 n 0000226698 00000 n 0000226897 00000 n 0000227091 00000 n 0000227285 00000 n 0000227479 00000 n 0000227673 00000 n 0000227867 00000 n 0000228060 00000 n 0000228255 00000 n 0000228449 00000 n 0000228643 00000 n 0000228837 00000 n 0000229031 00000 n 0000229228 00000 n 0000229425 00000 n 0000229625 00000 n 0000229825 00000 n 0000230021 00000 n 0000230220 00000 n 0000230420 00000 n 0000230615 00000 n 0000230809 00000 n 0000231004 00000 n 0000231199 00000 n 0000231393 00000 n 0000231588 00000 n 0000231786 00000 n 0000231983 00000 n 0000232179 00000 n 0000232381 00000 n 0000232579 00000 n 0000232778 00000 n 0000232977 00000 n 0000233175 00000 n 0000233375 00000 n 0000233575 00000 n 0000233774 00000 n 0000233984 00000 n 0000234189 00000 n 0000234388 00000 n 0000234583 00000 n 0000234772 00000 n 0000234964 00000 n 0000235166 00000 n 0000235368 00000 n 0000235575 00000 n 0000235778 00000 n 0000235980 00000 n 0000236180 00000 n 0000236386 00000 n 0000236832 00000 n 0000239382 00000 n 0000239405 00000 n 0000244423 00000 n 0000244673 00000 n 0000245077 00000 n 0000246109 00000 n 0000246131 00000 n 0000248270 00000 n 0000255840 00000 n 0000260676 00000 n 0000260699 00000 n 0000260893 00000 n 0000261086 00000 n 0000261279 00000 n 0000261478 00000 n 0000261677 00000 n 0000261878 00000 n 0000262079 00000 n 0000262282 00000 n 0000262481 00000 n 0000262680 00000 n 0000262879 00000 n 0000263078 00000 n 0000263277 00000 n 0000263475 00000 n 0000263675 00000 n 0000263881 00000 n 0000264083 00000 n 0000264282 00000 n 0000264479 00000 n 0000264672 00000 n 0000264868 00000 n 0000265063 00000 n 0000265258 00000 n 0000265453 00000 n 0000265649 00000 n 0000265843 00000 n 0000266037 00000 n 0000266234 00000 n 0000266428 00000 n 0000266622 00000 n 0000266816 00000 n 0000267013 00000 n 0000267209 00000 n 0000267404 00000 n 0000267600 00000 n 0000267794 00000 n 0000267990 00000 n 0000268186 00000 n 0000268382 00000 n 0000268574 00000 n 0000268769 00000 n 0000268964 00000 n 0000269159 00000 n 0000269356 00000 n 0000269552 00000 n 0000269746 00000 n 0000269940 00000 n 0000270137 00000 n 0000270335 00000 n 0000270534 00000 n 0000270734 00000 n 0000270933 00000 n 0000271132 00000 n 0000271329 00000 n 0000271526 00000 n 0000271728 00000 n 0000271928 00000 n 0000272128 00000 n 0000272329 00000 n 0000272526 00000 n 0000272721 00000 n 0000272913 00000 n 0000273107 00000 n 0000273300 00000 n 0000273494 00000 n 0000273689 00000 n 0000273883 00000 n 0000274077 00000 n 0000274271 00000 n 0000274467 00000 n 0000274661 00000 n 0000274855 00000 n 0000275049 00000 n 0000275243 00000 n 0000275439 00000 n 0000275635 00000 n 0000275831 00000 n 0000276027 00000 n 0000276224 00000 n 0000276421 00000 n 0000276615 00000 n 0000276809 00000 n 0000277003 00000 n 0000277196 00000 n 0000277388 00000 n 0000277580 00000 n 0000277772 00000 n 0000277965 00000 n 0000278161 00000 n 0000278357 00000 n 0000278552 00000 n 0000278749 00000 n 0000278947 00000 n 0000279144 00000 n 0000279344 00000 n 0000279546 00000 n 0000279745 00000 n 0000279946 00000 n 0000280145 00000 n 0000280347 00000 n 0000280549 00000 n 0000280748 00000 n 0000280948 00000 n 0000281148 00000 n 0000281346 00000 n 0000281545 00000 n 0000281743 00000 n 0000281940 00000 n 0000282133 00000 n 0000282326 00000 n 0000282519 00000 n 0000282712 00000 n 0000282909 00000 n 0000283106 00000 n 0000283303 00000 n 0000283501 00000 n 0000283698 00000 n 0000283896 00000 n 0000284090 00000 n 0000284286 00000 n 0000284484 00000 n 0000284680 00000 n 0000284876 00000 n 0000285073 00000 n 0000285269 00000 n 0000285466 00000 n 0000285664 00000 n 0000285861 00000 n 0000286057 00000 n 0000286253 00000 n 0000286449 00000 n 0000286643 00000 n 0000286837 00000 n 0000287030 00000 n 0000287223 00000 n 0000287416 00000 n 0000287611 00000 n 0000287805 00000 n 0000287999 00000 n 0000288193 00000 n 0000288389 00000 n 0000288586 00000 n 0000288784 00000 n 0000288981 00000 n 0000289178 00000 n 0000289376 00000 n 0000289577 00000 n 0000289775 00000 n 0000289975 00000 n 0000290172 00000 n 0000290369 00000 n 0000290567 00000 n 0000290763 00000 n 0000290959 00000 n 0000291153 00000 n 0000291349 00000 n 0000291544 00000 n 0000291737 00000 n 0000291931 00000 n 0000292124 00000 n 0000292317 00000 n 0000292513 00000 n 0000292708 00000 n 0000292906 00000 n 0000293104 00000 n 0000293303 00000 n 0000293497 00000 n 0000293691 00000 n 0000293888 00000 n 0000294085 00000 n 0000294280 00000 n 0000294476 00000 n 0000294675 00000 n 0000294871 00000 n 0000295069 00000 n 0000295271 00000 n 0000295470 00000 n 0000295664 00000 n 0000295860 00000 n 0000296056 00000 n 0000296254 00000 n 0000296445 00000 n 0000296636 00000 n 0000296827 00000 n 0000297021 00000 n 0000297217 00000 n 0000297411 00000 n 0000297605 00000 n 0000297800 00000 n 0000297999 00000 n 0000298198 00000 n 0000298398 00000 n 0000298597 00000 n 0000298793 00000 n 0000298989 00000 n 0000299184 00000 n 0000299380 00000 n 0000299576 00000 n 0000299772 00000 n 0000299968 00000 n 0000300166 00000 n 0000300365 00000 n 0000300564 00000 n 0000300759 00000 n 0000300957 00000 n 0000301149 00000 n 0000301341 00000 n 0000301533 00000 n 0000301725 00000 n 0000301921 00000 n 0000302114 00000 n 0000302306 00000 n 0000302499 00000 n 0000302693 00000 n 0000302889 00000 n 0000303082 00000 n 0000303275 00000 n 0000303469 00000 n 0000303662 00000 n 0000303855 00000 n 0000304049 00000 n 0000304243 00000 n 0000304433 00000 n 0000304625 00000 n 0000304820 00000 n 0000305015 00000 n 0000305211 00000 n 0000305413 00000 n 0000305608 00000 n 0000305798 00000 n 0000305988 00000 n 0000306179 00000 n 0000306370 00000 n 0000306572 00000 n 0000306774 00000 n 0000306980 00000 n 0000307186 00000 n 0000307391 00000 n 0000307598 00000 n 0000307803 00000 n 0000308012 00000 n 0000308221 00000 n 0000308423 00000 n 0000308627 00000 n 0000308834 00000 n 0000309040 00000 n 0000309247 00000 n 0000309439 00000 n 0000309633 00000 n 0000309826 00000 n 0000310019 00000 n 0000310218 00000 n 0000310417 00000 n 0000310618 00000 n 0000310818 00000 n 0000311020 00000 n 0000311219 00000 n 0000311418 00000 n 0000311617 00000 n 0000311816 00000 n 0000312015 00000 n 0000312213 00000 n 0000312413 00000 n 0000312619 00000 n 0000312821 00000 n 0000313020 00000 n 0000313217 00000 n 0000313410 00000 n 0000313601 00000 n 0000313793 00000 n 0000313984 00000 n 0000314175 00000 n 0000314370 00000 n 0000314565 00000 n 0000314760 00000 n 0000314955 00000 n 0000315151 00000 n 0000315345 00000 n 0000315539 00000 n 0000315736 00000 n 0000315930 00000 n 0000316124 00000 n 0000316318 00000 n 0000316512 00000 n 0000316708 00000 n 0000316902 00000 n 0000317097 00000 n 0000317291 00000 n 0000317485 00000 n 0000317676 00000 n 0000317868 00000 n 0000318063 00000 n 0000318256 00000 n 0000318449 00000 n 0000318645 00000 n 0000318842 00000 n 0000319041 00000 n 0000319239 00000 n 0000319438 00000 n 0000319635 00000 n 0000319832 00000 n 0000320031 00000 n 0000320229 00000 n 0000320427 00000 n 0000320626 00000 n 0000320823 00000 n 0000321016 00000 n 0000321208 00000 n 0000321402 00000 n 0000321596 00000 n 0000321792 00000 n 0000321985 00000 n 0000322178 00000 n 0000322371 00000 n 0000322565 00000 n 0000322759 00000 n 0000322955 00000 n 0000323151 00000 n 0000323347 00000 n 0000323544 00000 n 0000323741 00000 n 0000323935 00000 n 0000324129 00000 n 0000324323 00000 n 0000324516 00000 n 0000324708 00000 n 0000324900 00000 n 0000325092 00000 n 0000325285 00000 n 0000325481 00000 n 0000325677 00000 n 0000325872 00000 n 0000326069 00000 n 0000326267 00000 n 0000326464 00000 n 0000326664 00000 n 0000326866 00000 n 0000327065 00000 n 0000327266 00000 n 0000327465 00000 n 0000327667 00000 n 0000327869 00000 n 0000328068 00000 n 0000328268 00000 n 0000328468 00000 n 0000328666 00000 n 0000328864 00000 n 0000329060 00000 n 0000329256 00000 n 0000329449 00000 n 0000329642 00000 n 0000329835 00000 n 0000330028 00000 n 0000330225 00000 n 0000330422 00000 n 0000330618 00000 n 0000330816 00000 n 0000331013 00000 n 0000331211 00000 n 0000331405 00000 n 0000331601 00000 n 0000331799 00000 n 0000331995 00000 n 0000332191 00000 n 0000332385 00000 n 0000332579 00000 n 0000332773 00000 n 0000332968 00000 n 0000333161 00000 n 0000333354 00000 n 0000333549 00000 n 0000333743 00000 n 0000333936 00000 n 0000334129 00000 n 0000334322 00000 n 0000334518 00000 n 0000334715 00000 n 0000334911 00000 n 0000335108 00000 n 0000335309 00000 n 0000335507 00000 n 0000335707 00000 n 0000335904 00000 n 0000336101 00000 n 0000336299 00000 n 0000336495 00000 n 0000336691 00000 n 0000336885 00000 n 0000337081 00000 n 0000337276 00000 n 0000337469 00000 n 0000337663 00000 n 0000337856 00000 n 0000338049 00000 n 0000338245 00000 n 0000338440 00000 n 0000338638 00000 n 0000338836 00000 n 0000339035 00000 n 0000339229 00000 n 0000339423 00000 n 0000339620 00000 n 0000339817 00000 n 0000340012 00000 n 0000340206 00000 n 0000340400 00000 n 0000340597 00000 n 0000340791 00000 n 0000340985 00000 n 0000341179 00000 n 0000341375 00000 n 0000341568 00000 n 0000341761 00000 n 0000341954 00000 n 0000342151 00000 n 0000342348 00000 n 0000342546 00000 n 0000342744 00000 n 0000342940 00000 n 0000343136 00000 n 0000343331 00000 n 0000343527 00000 n 0000343723 00000 n 0000343919 00000 n 0000344115 00000 n 0000344311 00000 n 0000344508 00000 n 0000344705 00000 n 0000344900 00000 n 0000345094 00000 n 0000345286 00000 n 0000345480 00000 n 0000345675 00000 n 0000345870 00000 n 0000346066 00000 n 0000346268 00000 n 0000350615 00000 n 0000355003 00000 n 0000355026 00000 n 0000355214 00000 n 0000355403 00000 n 0000355596 00000 n 0000355791 00000 n 0000356000 00000 n 0000356198 00000 n 0000356402 00000 n 0000356605 00000 n 0000356824 00000 n 0000357026 00000 n 0000357241 00000 n 0000357445 00000 n 0000357646 00000 n 0000357845 00000 n 0000358067 00000 n 0000358275 00000 n 0000358496 00000 n 0000358698 00000 n 0000358896 00000 n 0000359092 00000 n 0000359299 00000 n 0000359494 00000 n 0000359695 00000 n 0000359891 00000 n 0000360085 00000 n 0000360282 00000 n 0000360489 00000 n 0000360686 00000 n 0000360894 00000 n 0000361088 00000 n 0000361282 00000 n 0000361488 00000 n 0000361681 00000 n 0000361881 00000 n 0000362071 00000 n 0000362266 00000 n 0000362463 00000 n 0000362656 00000 n 0000362863 00000 n 0000363063 00000 n 0000363278 00000 n 0000363475 00000 n 0000363671 00000 n 0000363869 00000 n 0000364075 00000 n 0000364274 00000 n 0000364474 00000 n 0000364666 00000 n 0000364860 00000 n 0000365054 00000 n 0000365252 00000 n 0000365446 00000 n 0000365657 00000 n 0000365857 00000 n 0000366059 00000 n 0000366255 00000 n 0000366462 00000 n 0000366666 00000 n 0000366879 00000 n 0000367078 00000 n 0000367276 00000 n 0000367473 00000 n 0000367678 00000 n 0000367871 00000 n 0000368070 00000 n 0000368262 00000 n 0000368455 00000 n 0000368649 00000 n 0000368848 00000 n 0000369041 00000 n 0000369256 00000 n 0000369462 00000 n 0000369666 00000 n 0000369865 00000 n 0000370082 00000 n 0000370285 00000 n 0000370504 00000 n 0000370706 00000 n 0000370909 00000 n 0000371105 00000 n 0000371309 00000 n 0000371504 00000 n 0000371705 00000 n 0000371898 00000 n 0000372091 00000 n 0000372285 00000 n 0000372486 00000 n 0000372679 00000 n 0000372886 00000 n 0000373084 00000 n 0000373280 00000 n 0000373479 00000 n 0000373686 00000 n 0000373879 00000 n 0000374087 00000 n 0000374284 00000 n 0000374480 00000 n 0000374681 00000 n 0000374875 00000 n 0000375081 00000 n 0000375278 00000 n 0000375478 00000 n 0000375679 00000 n 0000375892 00000 n 0000376094 00000 n 0000376310 00000 n 0000376511 00000 n 0000376712 00000 n 0000376911 00000 n 0000377120 00000 n 0000377324 00000 n 0000377545 00000 n 0000377747 00000 n 0000377947 00000 n 0000378147 00000 n 0000378359 00000 n 0000378559 00000 n 0000378780 00000 n 0000378980 00000 n 0000379180 00000 n 0000379380 00000 n 0000379592 00000 n 0000379790 00000 n 0000379988 00000 n 0000380187 00000 n 0000380401 00000 n 0000380599 00000 n 0000380811 00000 n 0000381012 00000 n 0000381212 00000 n 0000381414 00000 n 0000381629 00000 n 0000381834 00000 n 0000382056 00000 n 0000382256 00000 n 0000382450 00000 n 0000382651 00000 n 0000382865 00000 n 0000383064 00000 n 0000383276 00000 n 0000383473 00000 n 0000383672 00000 n 0000383869 00000 n 0000384081 00000 n 0000384281 00000 n 0000384488 00000 n 0000384684 00000 n 0000384881 00000 n 0000385078 00000 n 0000385279 00000 n 0000385474 00000 n 0000385673 00000 n 0000385870 00000 n 0000386062 00000 n 0000386263 00000 n 0000386460 00000 n 0000386654 00000 n 0000386855 00000 n 0000387062 00000 n 0000387258 00000 n 0000387466 00000 n 0000387662 00000 n 0000387852 00000 n 0000388047 00000 n 0000388245 00000 n 0000388436 00000 n 0000388640 00000 n 0000388869 00000 n 0000389077 00000 n 0000389303 00000 n 0000389508 00000 n 0000389719 00000 n 0000389930 00000 n 0000390142 00000 n 0000390351 00000 n 0000390577 00000 n 0000390781 00000 n 0000390978 00000 n 0000391174 00000 n 0000391366 00000 n 0000391560 00000 n 0000391754 00000 n 0000391952 00000 n 0000392151 00000 n 0000392352 00000 n 0000392553 00000 n 0000392747 00000 n 0000392943 00000 n 0000393141 00000 n 0000393337 00000 n 0000393538 00000 n 0000393738 00000 n 0000393943 00000 n 0000394141 00000 n 0000394337 00000 n 0000394533 00000 n 0000394731 00000 n 0000394932 00000 n 0000395132 00000 n 0000395336 00000 n 0000395537 00000 n 0000395738 00000 n 0000395938 00000 n 0000396137 00000 n 0000396338 00000 n 0000396534 00000 n 0000396732 00000 n 0000396930 00000 n 0000397126 00000 n 0000397324 00000 n 0000397526 00000 n 0000397727 00000 n 0000397930 00000 n 0000398130 00000 n 0000398328 00000 n 0000398527 00000 n 0000398728 00000 n 0000398929 00000 n 0000399125 00000 n 0000399323 00000 n 0000399520 00000 n 0000399716 00000 n 0000399912 00000 n 0000400112 00000 n 0000400306 00000 n 0000400500 00000 n 0000400705 00000 n 0000400904 00000 n 0000405336 00000 n 0000409290 00000 n 0000409313 00000 n 0000409532 00000 n 0000409745 00000 n 0000409962 00000 n 0000410185 00000 n 0000410399 00000 n 0000410613 00000 n 0000410832 00000 n 0000411024 00000 n 0000411217 00000 n 0000411412 00000 n 0000411608 00000 n 0000411803 00000 n 0000412001 00000 n 0000412200 00000 n 0000412411 00000 n 0000412615 00000 n 0000412822 00000 n 0000413024 00000 n 0000413223 00000 n 0000413424 00000 n 0000413627 00000 n 0000413828 00000 n 0000414030 00000 n 0000414232 00000 n 0000414433 00000 n 0000414633 00000 n 0000414835 00000 n 0000415036 00000 n 0000415247 00000 n 0000415451 00000 n 0000415653 00000 n 0000415857 00000 n 0000416057 00000 n 0000416259 00000 n 0000416459 00000 n 0000416660 00000 n 0000416863 00000 n 0000417062 00000 n 0000417264 00000 n 0000417466 00000 n 0000417667 00000 n 0000417867 00000 n 0000418069 00000 n 0000418269 00000 n 0000418476 00000 n 0000418678 00000 n 0000418884 00000 n 0000419088 00000 n 0000419292 00000 n 0000419493 00000 n 0000419695 00000 n 0000419898 00000 n 0000420099 00000 n 0000420301 00000 n 0000420505 00000 n 0000420706 00000 n 0000420908 00000 n 0000421111 00000 n 0000421313 00000 n 0000421525 00000 n 0000421729 00000 n 0000421934 00000 n 0000422136 00000 n 0000422340 00000 n 0000422545 00000 n 0000422748 00000 n 0000422952 00000 n 0000423157 00000 n 0000423358 00000 n 0000423562 00000 n 0000423765 00000 n 0000423969 00000 n 0000424170 00000 n 0000424376 00000 n 0000424588 00000 n 0000424790 00000 n 0000424992 00000 n 0000425194 00000 n 0000425396 00000 n 0000425601 00000 n 0000425804 00000 n 0000426005 00000 n 0000426208 00000 n 0000426410 00000 n 0000426608 00000 n 0000426810 00000 n 0000427009 00000 n 0000427209 00000 n 0000427405 00000 n 0000427609 00000 n 0000427822 00000 n 0000428036 00000 n 0000428232 00000 n 0000428423 00000 n 0000428616 00000 n 0000428829 00000 n 0000429042 00000 n 0000429264 00000 n 0000429481 00000 n 0000429700 00000 n 0000429912 00000 n 0000430129 00000 n 0000430349 00000 n 0000430561 00000 n 0000430779 00000 n 0000431003 00000 n 0000431219 00000 n 0000431432 00000 n 0000431651 00000 n 0000431856 00000 n 0000432059 00000 n 0000432258 00000 n 0000432460 00000 n 0000432665 00000 n 0000432867 00000 n 0000433069 00000 n 0000433272 00000 n 0000433477 00000 n 0000433680 00000 n 0000433892 00000 n 0000434099 00000 n 0000434303 00000 n 0000434508 00000 n 0000434711 00000 n 0000434912 00000 n 0000435115 00000 n 0000435321 00000 n 0000435522 00000 n 0000435727 00000 n 0000435930 00000 n 0000436133 00000 n 0000436335 00000 n 0000436540 00000 n 0000436755 00000 n 0000436963 00000 n 0000437167 00000 n 0000437375 00000 n 0000437578 00000 n 0000437781 00000 n 0000437986 00000 n 0000438193 00000 n 0000438396 00000 n 0000438601 00000 n 0000438804 00000 n 0000439009 00000 n 0000439210 00000 n 0000439416 00000 n 0000439621 00000 n 0000439835 00000 n 0000440042 00000 n 0000440250 00000 n 0000440455 00000 n 0000440662 00000 n 0000440867 00000 n 0000441072 00000 n 0000441278 00000 n 0000441484 00000 n 0000441690 00000 n 0000441897 00000 n 0000442104 00000 n 0000442311 00000 n 0000442517 00000 n 0000442727 00000 n 0000442935 00000 n 0000443148 00000 n 0000443353 00000 n 0000443558 00000 n 0000443763 00000 n 0000443971 00000 n 0000444175 00000 n 0000444380 00000 n 0000444582 00000 n 0000444788 00000 n 0000444992 00000 n 0000445192 00000 n 0000445396 00000 n 0000445599 00000 n 0000445803 00000 n 0000446003 00000 n 0000446219 00000 n 0000446445 00000 n 0000446650 00000 n 0000446851 00000 n 0000447052 00000 n 0000447249 00000 n 0000447448 00000 n 0000447646 00000 n 0000447850 00000 n 0000448054 00000 n 0000448259 00000 n 0000448465 00000 n 0000448663 00000 n 0000448863 00000 n 0000449065 00000 n 0000449265 00000 n 0000449471 00000 n 0000449676 00000 n 0000449886 00000 n 0000450088 00000 n 0000450290 00000 n 0000450493 00000 n 0000450698 00000 n 0000450906 00000 n 0000451113 00000 n 0000451323 00000 n 0000451530 00000 n 0000451737 00000 n 0000451944 00000 n 0000452149 00000 n 0000452355 00000 n 0000452556 00000 n 0000452759 00000 n 0000452961 00000 n 0000453164 00000 n 0000453369 00000 n 0000453577 00000 n 0000453785 00000 n 0000453995 00000 n 0000454201 00000 n 0000454406 00000 n 0000454611 00000 n 0000454819 00000 n 0000455026 00000 n 0000455227 00000 n 0000455430 00000 n 0000455632 00000 n 0000455835 00000 n 0000456040 00000 n 0000456246 00000 n 0000456446 00000 n 0000456651 00000 n 0000456855 00000 n 0000459172 00000 n 0000462067 00000 n 0000462091 00000 n 0000462287 00000 n 0000462484 00000 n 0000462682 00000 n 0000462878 00000 n 0000463075 00000 n 0000463269 00000 n 0000463469 00000 n 0000463667 00000 n 0000463867 00000 n 0000464068 00000 n 0000464269 00000 n 0000464464 00000 n 0000464661 00000 n 0000464856 00000 n 0000465055 00000 n 0000465256 00000 n 0000465458 00000 n 0000465660 00000 n 0000465864 00000 n 0000466067 00000 n 0000466270 00000 n 0000466475 00000 n 0000466682 00000 n 0000466889 00000 n 0000467096 00000 n 0000467301 00000 n 0000467503 00000 n 0000467707 00000 n 0000467911 00000 n 0000468117 00000 n 0000468325 00000 n 0000468534 00000 n 0000468743 00000 n 0000468954 00000 n 0000469165 00000 n 0000469374 00000 n 0000469587 00000 n 0000469800 00000 n 0000470015 00000 n 0000470229 00000 n 0000470444 00000 n 0000470657 00000 n 0000470870 00000 n 0000471080 00000 n 0000471292 00000 n 0000471503 00000 n 0000471716 00000 n 0000471931 00000 n 0000472144 00000 n 0000472360 00000 n 0000472577 00000 n 0000472793 00000 n 0000473010 00000 n 0000473231 00000 n 0000473452 00000 n 0000473673 00000 n 0000473893 00000 n 0000474113 00000 n 0000474330 00000 n 0000474547 00000 n 0000474765 00000 n 0000474983 00000 n 0000475203 00000 n 0000475425 00000 n 0000475647 00000 n 0000475870 00000 n 0000476092 00000 n 0000476312 00000 n 0000476536 00000 n 0000476759 00000 n 0000476982 00000 n 0000477206 00000 n 0000477429 00000 n 0000477652 00000 n 0000477875 00000 n 0000478099 00000 n 0000478318 00000 n 0000478537 00000 n 0000478756 00000 n 0000478975 00000 n 0000479194 00000 n 0000479417 00000 n 0000479640 00000 n 0000479865 00000 n 0000480093 00000 n 0000481918 00000 n 0000485279 00000 n 0000485303 00000 n 0000485492 00000 n 0000485678 00000 n 0000485869 00000 n 0000486065 00000 n 0000486258 00000 n 0000486454 00000 n 0000486663 00000 n 0000486859 00000 n 0000487063 00000 n 0000487265 00000 n 0000487463 00000 n 0000487657 00000 n 0000487852 00000 n 0000488049 00000 n 0000488247 00000 n 0000488453 00000 n 0000488659 00000 n 0000488857 00000 n 0000489060 00000 n 0000489256 00000 n 0000489481 00000 n 0000489702 00000 n 0000489896 00000 n 0000490099 00000 n 0000490295 00000 n 0000490491 00000 n 0000490690 00000 n 0000490896 00000 n 0000491109 00000 n 0000491309 00000 n 0000491503 00000 n 0000491706 00000 n 0000491900 00000 n 0000492112 00000 n 0000492320 00000 n 0000492524 00000 n 0000492718 00000 n 0000492914 00000 n 0000493110 00000 n 0000493306 00000 n 0000493501 00000 n 0000493709 00000 n 0000493911 00000 n 0000494106 00000 n 0000494301 00000 n 0000494506 00000 n 0000494700 00000 n 0000494898 00000 n 0000495092 00000 n 0000495290 00000 n 0000495493 00000 n 0000495693 00000 n 0000495891 00000 n 0000496089 00000 n 0000496289 00000 n 0000496489 00000 n 0000496683 00000 n 0000496884 00000 n 0000497078 00000 n 0000497273 00000 n 0000497468 00000 n 0000497676 00000 n 0000497873 00000 n 0000498082 00000 n 0000498279 00000 n 0000498470 00000 n 0000498666 00000 n 0000498865 00000 n 0000499057 00000 n 0000499260 00000 n 0000499489 00000 n 0000499696 00000 n 0000499923 00000 n 0000500129 00000 n 0000500339 00000 n 0000500549 00000 n 0000500763 00000 n 0000500973 00000 n 0000501200 00000 n 0000501601 00000 n 0000503541 00000 n 0000503565 00000 n 0000519435 00000 n 0000519843 00000 n 0000520689 00000 n 0000520712 00000 n 0000549252 00000 n 0000549615 00000 n 0000551607 00000 n 0000551631 00000 n 0000551979 00000 n 0000554175 00000 n 0000554199 00000 n 0000554621 00000 n 0000557155 00000 n 0000557179 00000 n 0000557615 00000 n 0000558958 00000 n 0000558982 00000 n 0000560280 00000 n 0000561551 00000 n 0000561959 00000 n 0000562928 00000 n 0000562951 00000 n 0000565352 00000 n 0000565715 00000 n 0000567303 00000 n 0000567327 00000 n 0000567495 00000 n 0000567548 00000 n 0000567601 00000 n 0000567658 00000 n 0000567718 00000 n 0000567773 00000 n 0000568113 00000 n 0000568299 00000 n 0000568492 00000 n 0000568685 00000 n 0000568879 00000 n 0000569072 00000 n 0000569265 00000 n 0000569458 00000 n 0000569651 00000 n 0000569844 00000 n 0000570037 00000 n 0000570226 00000 n 0000570279 00000 n 0000570332 00000 n 0000570392 00000 n 0000570456 00000 n 0000570596 00000 n 0000570649 00000 n 0000570716 00000 n 0000570902 00000 n 0000571093 00000 n 0000571286 00000 n 0000571477 00000 n 0000571672 00000 n 0000571863 00000 n 0000572055 00000 n 0000572247 00000 n 0000572450 00000 n 0000572653 00000 n 0000572860 00000 n 0000573067 00000 n 0000573273 00000 n 0000573480 00000 n 0000573686 00000 n 0000573896 00000 n 0000574106 00000 n 0000574309 00000 n 0000574514 00000 n 0000574722 00000 n 0000574929 00000 n 0000575137 00000 n 0000575324 00000 n 0000575678 00000 n 0000575867 00000 n 0000576053 00000 n 0000576246 00000 n 0000576440 00000 n 0000576634 00000 n 0000576824 00000 n 0000577017 00000 n 0000577220 00000 n 0000577423 00000 n 0000577631 00000 n 0000577835 00000 n 0000578038 00000 n 0000578239 00000 n 0000578446 00000 n 0000578499 00000 n 0000578552 00000 n 0000578605 00000 n 0000578658 00000 n 0000578711 00000 n 0000578764 00000 n 0000578817 00000 n 0000578870 00000 n 0000578923 00000 n 0000578976 00000 n 0000579029 00000 n 0000579082 00000 n 0000579142 00000 n 0000579206 00000 n 0000579270 00000 n 0000579334 00000 n 0000579398 00000 n 0000579462 00000 n 0000579526 00000 n 0000579590 00000 n 0000579657 00000 n 0000579724 00000 n 0000579788 00000 n 0000579855 00000 n 0000579908 00000 n 0000579961 00000 n 0000580014 00000 n 0000580067 00000 n 0000580120 00000 n 0000580173 00000 n 0000580226 00000 n 0000580280 00000 n 0000580347 00000 n 0000580417 00000 n 0000580490 00000 n 0000580566 00000 n 0000580645 00000 n 0000580727 00000 n 0000580812 00000 n 0000580900 00000 n 0000580953 00000 n 0000581017 00000 n 0000581181 00000 n 0000581236 00000 n 0000581974 00000 n 0000582133 00000 n 0000582329 00000 n 0000582527 00000 n 0000582758 00000 n 0000590731 00000 n 0000590946 00000 n 0000599142 00000 n 0000599358 00000 n 0000605473 00000 n 0000605682 00000 n 0000607727 00000 n 0000607965 00000 n 0000616059 00000 n 0000616279 00000 n 0000625610 00000 n 0000625833 00000 n 0000629105 00000 n 0000629330 00000 n 0000629634 00000 n 0000629866 00000 n 0000630172 00000 n 0000630401 00000 n 0000630693 00000 n 0000630914 00000 n 0000630984 00000 n 0000631106 00000 n 0000631286 00000 n 0000631404 00000 n 0000631560 00000 n 0000631702 00000 n 0000631835 00000 n 0000631969 00000 n 0000632119 00000 n 0000632261 00000 n 0000632405 00000 n 0000632549 00000 n 0000632694 00000 n 0000632842 00000 n 0000633017 00000 n 0000633151 00000 n 0000633264 00000 n 0000633384 00000 n 0000633522 00000 n 0000633653 00000 n 0000633786 00000 n 0000633919 00000 n 0000634050 00000 n 0000634181 00000 n 0000634605 00000 n 0000634698 00000 n 0000634807 00000 n 0000635044 00000 n 0000635197 00000 n 0000635295 00000 n 0000635449 00000 n 0000635556 00000 n 0000635712 00000 n 0000635805 00000 n 0000635898 00000 n 0000635991 00000 n 0000636147 00000 n 0000636240 00000 n 0000636335 00000 n 0000636425 00000 n 0000636580 00000 n 0000636672 00000 n 0000636762 00000 n 0000636869 00000 n 0000636923 00000 n 0000637013 00000 n 0000637103 00000 n 0000637193 00000 n 0000637300 00000 n 0000637453 00000 n 0000637506 00000 n 0000637596 00000 n 0000637705 00000 n 0000637758 00000 n 0000637868 00000 n 0000637921 00000 n 0000637999 00000 n 0000638098 00000 n 0000638189 00000 n 0000638280 00000 n 0000638384 00000 n 0000638437 00000 n 0000638603 00000 n 0000638707 00000 n 0000638760 00000 n 0000638847 00000 n 0000638960 00000 n 0000639018 00000 n 0000639117 00000 n 0000639208 00000 n 0000639299 00000 n 0000639409 00000 n 0000639462 00000 n 0000639572 00000 n 0000639625 00000 n 0000639735 00000 n 0000639788 00000 n 0000639874 00000 n 0000639973 00000 n 0000640081 00000 n 0000640136 00000 n 0000640227 00000 n 0000640337 00000 n 0000640390 00000 n 0000640500 00000 n 0000640553 00000 n 0000640663 00000 n 0000640716 00000 n 0000640826 00000 n 0000640879 00000 n 0000640965 00000 n 0000641064 00000 n 0000641172 00000 n 0000641225 00000 n 0000641333 00000 n 0000641402 00000 n 0000641510 00000 n 0000641579 00000 n 0000641687 00000 n 0000641742 00000 n 0000641834 00000 n 0000641945 00000 n 0000641998 00000 n 0000642109 00000 n 0000642162 00000 n 0000642273 00000 n 0000642326 00000 n 0000642437 00000 n 0000642490 00000 n 0000642601 00000 n 0000642654 00000 n 0000642740 00000 n 0000642846 00000 n 0000642938 00000 n 0000643030 00000 n 0000643123 00000 n 0000643216 00000 n 0000643339 00000 n 0000643397 00000 n 0000643505 00000 n 0000643615 00000 n 0000643670 00000 n 0000643763 00000 n 0000643873 00000 n 0000643926 00000 n 0000644036 00000 n 0000644089 00000 n 0000644198 00000 n 0000644251 00000 n 0000644343 00000 n 0000644435 00000 n 0000644546 00000 n 0000644599 00000 n 0000644710 00000 n 0000644763 00000 n 0000644874 00000 n 0000644927 00000 n 0000645038 00000 n 0000645091 00000 n 0000645185 00000 n 0000645299 00000 n 0000645357 00000 n 0000645457 00000 n 0000645567 00000 n 0000645622 00000 n 0000645714 00000 n 0000645825 00000 n 0000645878 00000 n 0000645989 00000 n 0000646042 00000 n 0000646153 00000 n 0000646206 00000 n 0000646317 00000 n 0000646370 00000 n 0000646481 00000 n 0000646534 00000 n 0000646645 00000 n 0000646698 00000 n 0000646784 00000 n 0000646884 00000 n 0000646993 00000 n 0000647048 00000 n 0000647140 00000 n 0000647252 00000 n 0000647305 00000 n 0000647417 00000 n 0000647470 00000 n 0000647582 00000 n 0000647635 00000 n 0000647747 00000 n 0000647800 00000 n 0000647912 00000 n 0000647965 00000 n 0000648077 00000 n 0000648130 00000 n 0000648242 00000 n 0000648295 00000 n 0000648381 00000 n 0000648482 00000 n 0000648633 00000 n 0000648688 00000 n 0000648797 00000 n 0000648852 00000 n 0000648963 00000 n 0000649016 00000 n 0000649127 00000 n 0000649180 00000 n 0000649291 00000 n 0000649344 00000 n 0000649455 00000 n 0000649508 00000 n 0000649619 00000 n 0000649672 00000 n 0000649783 00000 n 0000649836 00000 n 0000649947 00000 n 0000650000 00000 n 0000650111 00000 n 0000650164 00000 n 0000650276 00000 n 0000650329 00000 n 0000650441 00000 n 0000650494 00000 n 0000650606 00000 n 0000650659 00000 n 0000650771 00000 n 0000650824 00000 n 0000650927 00000 n 0000650982 00000 n 0000651083 00000 n 0000651193 00000 n 0000651248 00000 n 0000651341 00000 n 0000651434 00000 n 0000651546 00000 n 0000651599 00000 n 0000651711 00000 n 0000651764 00000 n 0000651850 00000 n 0000651951 00000 n 0000652044 00000 n 0000652136 00000 n 0000652247 00000 n 0000652300 00000 n 0000652411 00000 n 0000652464 00000 n 0000652575 00000 n 0000652628 00000 n 0000652737 00000 n 0000652792 00000 n 0000652906 00000 n 0000652964 00000 n 0000653064 00000 n 0000653156 00000 n 0000653250 00000 n 0000653361 00000 n 0000653414 00000 n 0000653526 00000 n 0000653579 00000 n 0000653691 00000 n 0000653744 00000 n 0000653830 00000 n 0000653931 00000 n 0000654041 00000 n 0000654096 00000 n 0000654189 00000 n 0000654301 00000 n 0000654354 00000 n 0000654466 00000 n 0000654519 00000 n 0000654631 00000 n 0000654684 00000 n 0000654796 00000 n 0000654849 00000 n 0000654961 00000 n 0000655014 00000 n 0000655100 00000 n 0000655201 00000 n 0000655311 00000 n 0000655366 00000 n 0000655459 00000 n 0000655552 00000 n 0000655664 00000 n 0000655717 00000 n 0000655829 00000 n 0000655882 00000 n 0000655994 00000 n 0000656047 00000 n 0000656159 00000 n 0000656212 00000 n 0000656324 00000 n 0000656377 00000 n 0000656489 00000 n 0000656542 00000 n 0000656654 00000 n 0000656707 00000 n 0000656819 00000 n 0000656872 00000 n 0000656984 00000 n 0000657037 00000 n 0000657150 00000 n 0000657203 00000 n 0000657316 00000 n 0000657369 00000 n 0000657482 00000 n 0000657535 00000 n 0000657648 00000 n 0000657701 00000 n 0000657787 00000 n 0000657889 00000 n 0000658000 00000 n 0000658055 00000 n 0000658149 00000 n 0000658243 00000 n 0000658337 00000 n 0000658452 00000 n 0000658510 00000 n 0000658611 00000 n 0000658704 00000 n 0000658797 00000 n 0000658907 00000 n 0000658960 00000 n 0000659072 00000 n 0000659126 00000 n 0000659236 00000 n 0000659305 00000 n 0000659415 00000 n 0000659484 00000 n 0000659594 00000 n 0000659649 00000 n 0000659761 00000 n 0000659814 00000 n 0000659927 00000 n 0000659980 00000 n 0000660093 00000 n 0000660146 00000 n 0000660259 00000 n 0000660312 00000 n 0000660425 00000 n 0000660478 00000 n 0000660591 00000 n 0000660644 00000 n 0000660757 00000 n 0000660810 00000 n 0000660923 00000 n 0000660976 00000 n 0000661089 00000 n 0000661142 00000 n 0000661255 00000 n 0000661308 00000 n 0000661420 00000 n 0000661473 00000 n 0000661585 00000 n 0000661638 00000 n 0000661750 00000 n 0000661803 00000 n 0000661915 00000 n 0000661968 00000 n 0000662080 00000 n 0000662133 00000 n 0000662245 00000 n 0000662298 00000 n 0000662410 00000 n 0000662463 00000 n 0000662575 00000 n 0000662628 00000 n 0000662740 00000 n 0000662793 00000 n 0000662905 00000 n 0000662958 00000 n 0000663071 00000 n 0000663124 00000 n 0000663237 00000 n 0000663290 00000 n 0000663403 00000 n 0000663456 00000 n 0000663569 00000 n 0000663622 00000 n 0000663735 00000 n 0000663788 00000 n 0000663901 00000 n 0000663954 00000 n 0000664067 00000 n 0000664120 00000 n 0000664233 00000 n 0000664286 00000 n 0000664399 00000 n 0000664452 00000 n 0000664548 00000 n 0000664664 00000 n 0000664722 00000 n 0000664824 00000 n 0000664918 00000 n 0000665012 00000 n 0000665124 00000 n 0000665178 00000 n 0000665271 00000 n 0000665383 00000 n 0000665437 00000 n 0000665530 00000 n 0000665623 00000 n 0000665716 00000 n 0000665869 00000 n 0000665962 00000 n 0000666055 00000 n 0000666150 00000 n 0000666245 00000 n 0000666358 00000 n 0000666412 00000 n 0000666506 00000 n 0000666600 00000 n 0000666694 00000 n 0000666788 00000 n 0000666882 00000 n 0000666976 00000 n 0000667070 00000 n 0000667164 00000 n 0000667258 00000 n 0000667352 00000 n 0000667446 00000 n 0000667540 00000 n 0000667634 00000 n 0000667727 00000 n 0000667820 00000 n 0000667913 00000 n 0000668006 00000 n 0000668099 00000 n 0000668192 00000 n 0000668285 00000 n 0000668378 00000 n 0000668471 00000 n 0000668564 00000 n 0000668658 00000 n 0000668752 00000 n 0000668846 00000 n 0000668940 00000 n 0000669034 00000 n 0000669128 00000 n 0000669222 00000 n 0000669316 00000 n 0000669410 00000 n 0000669504 00000 n 0000669598 00000 n 0000669692 00000 n 0000669786 00000 n 0000669880 00000 n 0000669974 00000 n 0000670068 00000 n 0000670161 00000 n 0000670254 00000 n 0000670364 00000 n 0000670419 00000 n 0000670512 00000 n 0000670605 00000 n 0000670698 00000 n 0000670791 00000 n 0000670884 00000 n 0000670977 00000 n 0000671070 00000 n 0000671164 00000 n 0000671258 00000 n 0000671352 00000 n 0000671446 00000 n 0000671540 00000 n 0000671634 00000 n 0000671728 00000 n 0000671822 00000 n 0000671908 00000 n 0000672009 00000 n 0000672095 00000 n 0000672196 00000 n 0000672306 00000 n 0000672361 00000 n 0000672454 00000 n 0000672566 00000 n 0000672619 00000 n 0000672729 00000 n 0000672784 00000 n 0000672877 00000 n 0000672983 00000 n 0000673036 00000 n 0000673202 00000 n 0000673308 00000 n 0000673361 00000 n 0000673467 00000 n 0000673520 00000 n 0000673627 00000 n 0000673680 00000 n 0000673787 00000 n 0000673840 00000 n 0000673930 00000 n 0000674053 00000 n 0000674111 00000 n 0000674212 00000 n 0000674322 00000 n 0000674379 00000 n 0000674489 00000 n 0000674544 00000 n 0000674637 00000 n 0000674730 00000 n 0000674823 00000 n 0000674916 00000 n 0000675011 00000 n 0000675104 00000 n 0000675199 00000 n 0000675292 00000 n 0000675387 00000 n 0000675480 00000 n 0000675575 00000 n 0000675669 00000 n 0000675765 00000 n 0000675859 00000 n 0000675955 00000 n 0000676049 00000 n 0000676145 00000 n 0000676239 00000 n 0000676335 00000 n 0000677715 00000 n 0000677936 00000 n 0000678016 00000 n 0000678089 00000 n 0000678175 00000 n 0000678236 00000 n 0000678295 00000 n 0000678381 00000 n 0000678442 00000 n 0000678501 00000 n 0000678581 00000 n 0000678654 00000 n 0000678762 00000 n 0000678823 00000 n 0000678882 00000 n 0000678981 00000 n 0000679042 00000 n 0000679101 00000 n 0000679181 00000 n 0000679254 00000 n 0000679371 00000 n 0000679432 00000 n 0000679491 00000 n 0000679577 00000 n 0000679638 00000 n 0000679697 00000 n 0000679777 00000 n 0000679850 00000 n 0000679976 00000 n 0000680037 00000 n 0000680096 00000 n 0000680182 00000 n 0000680243 00000 n 0000680302 00000 n 0000680382 00000 n 0000680455 00000 n 0000680541 00000 n 0000680602 00000 n 0000680661 00000 n 0000680747 00000 n 0000680808 00000 n 0000680867 00000 n 0000680947 00000 n 0000681020 00000 n 0000681155 00000 n 0000681216 00000 n 0000681275 00000 n 0000681361 00000 n 0000681422 00000 n 0000681481 00000 n 0000681574 00000 n 0000681647 00000 n 0000681733 00000 n 0000681794 00000 n 0000681853 00000 n 0000681939 00000 n 0000682000 00000 n 0000682059 00000 n 0000682132 00000 n 0000682218 00000 n 0000682279 00000 n 0000682338 00000 n 0000682424 00000 n 0000682485 00000 n 0000682544 00000 n 0000682624 00000 n 0000682697 00000 n 0000682841 00000 n 0000682902 00000 n 0000682961 00000 n 0000683047 00000 n 0000683108 00000 n 0000683167 00000 n 0000683247 00000 n 0000683320 00000 n 0000683474 00000 n 0000683535 00000 n 0000683594 00000 n 0000683680 00000 n 0000683741 00000 n 0000683800 00000 n 0000683880 00000 n 0000683953 00000 n 0000684152 00000 n 0000684213 00000 n 0000684272 00000 n 0000684358 00000 n 0000684419 00000 n 0000684478 00000 n 0000684558 00000 n 0000684631 00000 n 0000684739 00000 n 0000684800 00000 n 0000684859 00000 n 0000684945 00000 n 0000685006 00000 n 0000685065 00000 n 0000685145 00000 n 0000685218 00000 n 0000685304 00000 n 0000685365 00000 n 0000685424 00000 n 0000685532 00000 n 0000685593 00000 n 0000685652 00000 n 0000685732 00000 n 0000685805 00000 n 0000685922 00000 n 0000685983 00000 n 0000686042 00000 n 0000686128 00000 n 0000686189 00000 n 0000686248 00000 n 0000686328 00000 n 0000686401 00000 n 0000686536 00000 n 0000686597 00000 n 0000686656 00000 n 0000686742 00000 n 0000686803 00000 n 0000686862 00000 n 0000686942 00000 n 0000687015 00000 n 0000687223 00000 n 0000687284 00000 n 0000687343 00000 n 0000687429 00000 n 0000687490 00000 n 0000687549 00000 n 0000687629 00000 n 0000687702 00000 n 0000687788 00000 n 0000687849 00000 n 0000687908 00000 n 0000687994 00000 n 0000688055 00000 n 0000688114 00000 n 0000688271 00000 n 0000688344 00000 n 0000688430 00000 n 0000688491 00000 n 0000688550 00000 n 0000688636 00000 n 0000688697 00000 n 0000688756 00000 n 0000688829 00000 n 0000688915 00000 n 0000688976 00000 n 0000689035 00000 n 0000689121 00000 n 0000689182 00000 n 0000689241 00000 n 0000689314 00000 n 0000689400 00000 n 0000689461 00000 n 0000689520 00000 n 0000689606 00000 n 0000689667 00000 n 0000689726 00000 n 0000689799 00000 n 0000689885 00000 n 0000689946 00000 n 0000690005 00000 n 0000690091 00000 n 0000690152 00000 n 0000690211 00000 n 0000690284 00000 n 0000690370 00000 n 0000690431 00000 n 0000690490 00000 n 0000690576 00000 n 0000690637 00000 n 0000690696 00000 n 0000690769 00000 n 0000690855 00000 n 0000690916 00000 n 0000690975 00000 n 0000691061 00000 n 0000691122 00000 n 0000691181 00000 n 0000691254 00000 n 0000691340 00000 n 0000691401 00000 n 0000691460 00000 n 0000691546 00000 n 0000691607 00000 n 0000691666 00000 n 0000691739 00000 n 0000691825 00000 n 0000691886 00000 n 0000691945 00000 n 0000692031 00000 n 0000692092 00000 n 0000692151 00000 n 0000692224 00000 n 0000692310 00000 n 0000692371 00000 n 0000692430 00000 n 0000692516 00000 n 0000692577 00000 n 0000692636 00000 n 0000692793 00000 n 0000692866 00000 n 0000692952 00000 n 0000693013 00000 n 0000693072 00000 n 0000693158 00000 n 0000693219 00000 n 0000693278 00000 n 0000693351 00000 n 0000693437 00000 n 0000693498 00000 n 0000693557 00000 n 0000693643 00000 n 0000693704 00000 n 0000693763 00000 n 0000693836 00000 n 0000693922 00000 n 0000693983 00000 n 0000694042 00000 n 0000694128 00000 n 0000694189 00000 n 0000694248 00000 n 0000694321 00000 n 0000694407 00000 n 0000694468 00000 n 0000694527 00000 n 0000694613 00000 n 0000694674 00000 n 0000694733 00000 n 0000694806 00000 n 0000694892 00000 n 0000694953 00000 n 0000695012 00000 n 0000695098 00000 n 0000695159 00000 n 0000695218 00000 n 0000695291 00000 n 0000695377 00000 n 0000695438 00000 n 0000695497 00000 n 0000695583 00000 n 0000695644 00000 n 0000695703 00000 n 0000695776 00000 n 0000695862 00000 n 0000695923 00000 n 0000695982 00000 n 0000696068 00000 n 0000696129 00000 n 0000696188 00000 n 0000696261 00000 n 0000696347 00000 n 0000696408 00000 n 0000696467 00000 n 0000696553 00000 n 0000696614 00000 n 0000696673 00000 n 0000696746 00000 n 0000696832 00000 n 0000696893 00000 n 0000696952 00000 n 0000697038 00000 n 0000697099 00000 n 0000697158 00000 n 0000697251 00000 n 0000697324 00000 n 0000697410 00000 n 0000697471 00000 n 0000697530 00000 n 0000697616 00000 n 0000697677 00000 n 0000697736 00000 n 0000697809 00000 n 0000697895 00000 n 0000697956 00000 n 0000698015 00000 n 0000698101 00000 n 0000698162 00000 n 0000698221 00000 n 0000698314 00000 n 0000698387 00000 n 0000698473 00000 n 0000698534 00000 n 0000698593 00000 n 0000698679 00000 n 0000698740 00000 n 0000698799 00000 n 0000698872 00000 n 0000698958 00000 n 0000699019 00000 n 0000699078 00000 n 0000699164 00000 n 0000699225 00000 n 0000699284 00000 n 0000699364 00000 n 0000699437 00000 n 0000699523 00000 n 0000699584 00000 n 0000699643 00000 n 0000699729 00000 n 0000699790 00000 n 0000699849 00000 n 0000699930 00000 n 0000699990 00000 n 0000700050 00000 n 0000700110 00000 n 0000700218 00000 n 0000700278 00000 n 0000700338 00000 n 0000700398 00000 n 0000700458 00000 n 0000700518 00000 n 0000700578 00000 n 0000700836 00000 n 0000700951 00000 n 0000701036 00000 n 0000701215 00000 n 0000701300 00000 n 0000701406 00000 n 0000701491 00000 n 0000701576 00000 n 0000701691 00000 n 0000701776 00000 n 0000701973 00000 n 0000702058 00000 n 0000702143 00000 n 0000702267 00000 n 0000702352 00000 n 0000702549 00000 n 0000702634 00000 n 0000702719 00000 n 0000702943 00000 n 0000703028 00000 n 0000703113 00000 n 0000703255 00000 n 0000703340 00000 n 0000703425 00000 n 0000703540 00000 n 0000703625 00000 n 0000703822 00000 n 0000703907 00000 n 0000704104 00000 n 0000704189 00000 n 0000704432 00000 n 0000704517 00000 n 0000704760 00000 n 0000705021 00000 n 0000705209 00000 n 0000705351 00000 n 0000705435 00000 n 0000705520 00000 n 0000705589 00000 n 0000705674 00000 n 0000705862 00000 n 0000705999 00000 n 0000706136 00000 n 0000706278 00000 n 0000706419 00000 n 0000706556 00000 n 0000706695 00000 n 0000706832 00000 n 0000706962 00000 n 0000707092 00000 n 0000707222 00000 n 0000707365 00000 n 0000707503 00000 n 0000707643 00000 n 0000707773 00000 n 0000707906 00000 n 0000708043 00000 n 0000708137 00000 n 0000708231 00000 n 0000708369 00000 n 0000708507 00000 n 0000708639 00000 n 0000708672 00000 n 0000708720 00000 n 0000708969 00000 n 0000710139 00000 n 0000710298 00000 n 0000710378 00000 n trailer << /Size 2440 /ID[<8b6d0422a4955b8b6b8aab14a8d15afa>] >> startxref 173 %%EOF extrema-4.4.5/doc/Using_Colormaps_and_Gradients.doc0000644012702201742730000457000011274636625021413 0ustar spangspangࡱ> 4PIE@ x@bjbjFF fj,,r8|$|$|$|$8%8%8%4l%````4`ll%qz:`a*b*b*b*b cd\sd0yyyyyyy$|R~z8%fc cffz|$|$*b*b+zjjjfl|$*b8%*byjfyjjjq%68%x*bTa 0.``7hw2x$Az0qz.xzjdxl%l%|$|$|$|$8%x$dveTjmeDedddzzl%l%dBjl%l%BExtrema Tutorial Using Colormaps and Gradients INTRODUCTION Extrema uses an indexed color model. This means that the colors are stored in an array, and referenced by their index number in that array. Since colors are treated as index numbers, you can select colors algorithmically to make sophisticated use of color in your drawings. Note that indexed color image formats, such as GIF, usually have a maximum number of colors (typically 256, which is why they are called 8-bit color graphics). Extrema will often use colormaps with 256 or fewer colors, which will be compatible with these graphic formats. However, Extrema has no upper limit on the number of colors it can index, and you can devise colormaps with thousands of colors, if you need them. Such images will only reproduce faithfully using image formats and displays that support 16- or 24-bit color, such as JPEG or PNG. (Extrema can export its drawings to JPEG and PNG format.) Extrema has two groups of colors that it works with; a standard set of colors that are always defined, and a dynamically loaded colormap that can be changed at will. Dynamically-loaded colors use color indexes starting at 1 and increasing to the number of colors in the colormap. Standard colors use index numbers starting at 0 and decreasing (to -22, since there are 23 standard colors). STANDARD COLORS The 20 standard colors that are always defined in Extrema are:  These standard colors can be referenced by name, or by index number. For instance, if you want to draw in red, select color "RED" or color number -2. This will always give you red, no matter which colormap you are currently using. MANUAL SETTING OF COLORS At any time you can set the drawing color using the command: SET COLOR color where color is the color index or color name (in the case of a standard color). You can also predefine the colors that will be used for standard drawing features, such as axes and labels, using the color characteristics for those features: AREAFILLCOLOR, LEGENDTITLECOLOR, CURVECOLOR, PLOTSYMBOLCOLOR, XAXISCOLOR, XLABELCOLOR, XNUMBERSCOLOR, YAXISCOLOR, YLABELCOLOR, YNUMBERSCOLOR, TEXTCOLOR To set a color characteristic, use the command SET characteristic color Using the Extrema GUI, you can set colors by selecting the color for the drawing object from the displayed palette, when it is provided to you. The displayed palette shows you all of the currently available colors, which includes the standard colors, plus the currently loaded colormap. COLORMAPS In addition to the predefined standard colors, there are a number of predefined colormaps. If none of these is satisfactory, you can load up your own colors using a colormap file. A colormap is a set of RGB (Red, Green, Blue) values -- the red, green, and blue components combine to make a particular color on the actual drawing, according to the principles of additive color theory. An individual RGB value is expressed using hexadecimal notation (values from 00 to FF). For instance, this is the RGB value for white: FF FF FF Here is the RGB value for yellow (i.e., a combination of red and green): FF FF 00 Predefined Colormaps Extrema has a number of predefined colormaps, which are chosen by name using the following command SET COLORMAP colormapname The colormap called DEFAULT is pre-loaded whenever you start Extrema. The predefined colormaps are displayed below.  EMBED Word.Picture.8  DEFAULT EMBED Word.Picture.8  THERMAL EMBED Word.Picture.8  RAINBOW EMBED Word.Picture.8  TOPO256  EMBED Word.Picture.8  REDBLUE16  EMBED Word.Picture.8  CLASSIC8 EMBED Word.Picture.8  GRAY256  EMBED Word.Picture.8  GRAY16 The DEFAULT colormap is the so-called Netscape palette, which is the set of all colors made by combining red, green, and blue at the following intensities: 0, 20, 40, 60, 80, and 100%. With these 6 color levels in each of the 3 RGB color channels, this gives a set of 216 colors to work with, which is enough for most colored plots. This is also the most standardized set of colors for faithful reproduction on the web. Other colors might not reproduce well on 8-bit color displays. (Note that Extrema's standard colors also conform to the Netscape palette, and can be safely used for web graphics.) The colors in the default colormap are produced by cycling upward through the 6 values in each of red, green, and blue. Blue cycles the fastest and red the slowest. In other words, the first 8 colors of the default color map are: 00 00 00 00 00 33 00 00 66 00 00 99 00 00 CC 00 00 FF 00 33 00 00 33 33 ... and the last 8 colors are: ... FF CC CC FF CC FF FF FF 00 FF FF 33 FF FF 66 FF FF 99 FF FF CC FF FF FF Note for legacy users: The colormap called CLASSIC8 reproduces the old pen-plotter palette of 8 colors. Users of the Physica package can reproduce their old color selections by loading this colormap before doing any drawing. This may be useful for comparison with old drawings, but it is rather limited if you are not working with pen plotters. User defined colormaps Extrema allows you to create your own colormaps. A user created colormap has the name USERDEFINED. There are two ways to generate your own colormap. The simplest method is to create three vectors, say rvec, gvec, and bvec, containing the R, G, B color values and enter SET COLORMAP rvec gvec bvec You can also write your R, G, B color values in hexadecimal format to a plain text file and enter SET COLORMAPFILE filename A colormap file provides a sequence of RGB values, one per line. These are read into Extrema's internal colormap, where they are indexed in the same order. That is, line number 1 in the file is color number 1 in the colormap, and so on. If you load a new colormap, it replaces all the indices of the previous one. It does not replace the standard colors, since those use negative index numbers Color order is not important in a regular colormap, but you may want to make note of which color numbers are which if you will ever need to invoke particular colors on demand from a script or command. Using the GUI, you will always be able to browse all available colors and select them using the mouse. Colormap Example #1 Say you need to plot 50 different sets of X-Y data points against each other on the same scatterplot, for comparison of data sets. Each data set needs to be visually distinct, but using different shapes (plotting symbols) for each one is problematic, since the symbols have to be large enough to read and yet small enough that they don't overlap and interfere with each other. Using colors to distinguish between data sets is a better option, since it keeps the points small and simple. If your data exists in separate files, you'll need to load the data from each file, increment the color number, and then plot the X-Y pairs. If the data file names are stored in a text array, FILES, you could do something like this: SET PLOTSYMBOL 11 ! disconnected points DO I = [1:50] READ FILES[I] X Y SET PLOTSYMBOLCOLOR I GRAPH X Y ENDDO REPLOT ! to plot all points on common scale If the data is organized into X and Y matrices, where the columns correspond to the data sets, then you could do something like this: SET PLOTSYMBOL -11 DO I = [1:50] SET PLOTSYMBOLCOLOR I GRAPH X[*,I] Y[*,I] ENDDO REPLOT These examples will use the first 50 colors in whatever colormap you are using. If the first 50 colors of the default colormap are not to your satisfaction, you could load your own colormap with your 50 favorite colors in it, before executing the above commands.  EMBED Word.Picture.8  GRADIENTS A gradient is just a colormap where the ordering of colors is meaningful. This is another way of saying that colors close together in the colormap are visually similar, while those that are widely separated are visually different. This is not necessarily true of the Netscape palette. For instance, in the DEFAULT colormap, color number 210 (light pink) has no obvious visual relationship to color 211 (bright yellow), even though the colors are derived in a logical order. A good example of a gradient is the white light spectrum, or RAINBOW gradient. By setting deep red to color number 1 and violet to color number 256, you can fill in the remaining values by traversing the spectrum in small steps. Each increment produces a color closely related to those beside it, but distantly related to those further away. There are many ways to produce an ordered set of colors that will serve as a gradient. Extrema comes with 7 predefined gradient colormaps (in addition to the DEFAULT): RAINBOW256 colors covering the white light spectrum from red to violet.THERMAL256 colors ranging from black to red to yellow to white.TOPO256256 colors emulating topographic map colorsREDBLUE1616 colors ranging from pure red to pure blueCLASSIC88 colors reproducing the old pen-plotter paletteGRAY256256 greyscale shades ranging from black to whiteGRAY1616 greyscale shades ranging from black to whiteNote that while many of these gradients use more than 250 colors, others use only 16. In practice, your gradients can have any number of colors, from 2 to a thousand or more. A low number of colors will mean that your color scale is more granular, and may have more of a stepped or contoured appearance. A large number of colors will make transitions appear smoother. Much more than 256 colors will usually not have much noticeable effect, unless most of your graph activity occurs in a very narrow subset of the gradient.  EMBED Word.Picture.8  Gradient example #1 The graph type called a density plot uses full-color gradients by default. The DENSITY command automatically scales the graph to use the full color range of the gradient. To make a density plot, you simply need to provide it with a matrix of data: DENSITY myMatrix  Note that there are other types of density plots, which do not use color gradients. You might want to consider these for drawings that will be reproduced in a monochrome print medium. Gradient example #2 You can also use color gradients to represent extra dimensions of data in other types of plots. For instance, say you have three vectors of data, X, Y, and T, representing X-Y coordinate pairs, and the time T at which each pair was measured. By converting the time T to a color number in a gradient, you can display all three dimensions in a simple 2-D graph:  The above drawing was produced using these commands: DEFINE\CONSTANTS GENERATE PHI 0,,3*PI 100 A=0.2 B=0.5 X=A*PHI-B*SIN(PHI) Y=A-B*COS(PHI) F=2*PHI^2-3*PHI+5 SET COLORMAP RAINBOW GET COLORMAPSIZE CSIZE C=INT(F*CSIZE/MAX(F)+0.99) SCALES\-MESSAGES MIN(X) MAX(X) MIN(Y) MAX(Y) SET PLOTSYMBOL 17 PLOTSYMBOLCOLOR C GRAPH X Y Gradient example #3 Consider a parametric path, X(t) and Y(t), and a function that assumes different values along this path, F(t). You could display F using a color gradient, using a similar approach to the above. The only difference is that you may want to represent the path as a line instead of a scatterplot. Here is one way you could accomplish this: DEFINE\CONSTANTS GENERATE PHI 0,,3*PI 100 A=0.2 B=0.5 X=A*PHI-B*SIN(PHI) Y=A-B*COS(PHI) F=2*PHI^2-3*PHI+5 SET COLORMAP RAINBOW GET COLORMAPSIZE CSIZE C=INT(F*CSIZE/MAX(F)+0.99) SCALES\-MESSAGES MIN(X) MAX(X) MIN(Y) MAX(Y) SET PLOTSYMBOL 0 CURVELINEWIDTH 10 GRAPH\AXESONLY DO I = [1:LEN(PHI)-1] SET CURVECOLOR C[I] GRAPH\OVERLAY [X[I];X[I+1]] [Y[I];Y[I+1]] ENDDO  HOW TO GENERATE YOUR OWN GRADIENTS If you want a special color effect that you cannot accomplish with Extrema's predefined gradients, you can easily generate your own. It helps to have some basic knowledge of additive color theory to know how to combine red, green, and blue values to produce the colors you want, and how to blend them with adjacent colors. For instance, say you need to represent the state of health of some botanical samples, and you would like a gradient that runs from brown through yellow to green. Start by noting the R, G, B values for the key colors in this sequence: brown = 66 33 00 yellow = FF FF 00 green = 00 FF 00 Now decide how many colors you want in your gradient. Let's say it is 100. You have two color ranges to span in this example gradient (brown to yellow, and yellow to green), so you will need 50 colors in each sequence if you want the colors evenly balanced between these two ranges. For the first sequence, brown to yellow, you need to shift the red component from hex 66 (decimal 102) to hex FF (decimal 255) in 50 steps, and the green component from hex 33 (decimal 51) to hex FF (decimal 255) in the same 50 steps. The blue component does not change. For the second sequence, yellow to green, you need to shift the red component from hex FF (decimal 255) to hex 00 (decimal 0) in 50 steps. The green and blue components do not change. By appending the two lists that result, you get your desired colormap. Note that because the first sequence ends at yellow, and the second sequence begins at yellow, pure yellow will occur twice in the sequence (at color numbers 50 and 51). That may not be important to you, but if you need absolute precision, then simply make the second sequence progress in 51 steps, and drop the first element (yellow), since you already have it from the first sequence. Here is an Extrema script that creates this gradient colormap and draws the graph: PI=ACOS(-1) ! generate some data GENERATE X 0,,2*PI,100 Y=SIN(X) GENERATE T 1,,3600,100 ! GENERATE R1 102,,255 50 ! make the R G B vectors GENERATE G1 51,,255 50 B1[1:50] = 0 GENERATE R2 255,,0 51 G2[1:51] = 255 B2[1:51] = 0 R = INT(R1//R2[2:51]) G = INT(G1//G2[2:51]) B = INT(B1//B2[2:51]) SET COLORMAP R G B ! make the colormap GET COLORMAPSIZE CSIZE C=INT(T*CSIZE/MAX(T)+.99) SET PLOTSYMBOL -17 PLOTSYMBOLCOLOR C GRAPH X Y  Heres what the user defined colormap looks like:  EMBED Word.Picture.8  SUMMARY Here are the commands you will need to use to achieve these color effects in your drawings. These may be looked up in the Extrema Command Reference for more details on their use. Manually setting colors: SET COLOR SET AREAFILLCOLOR SET LEGENDTITLECOLOR SET PLOTSYMBOLCOLOR SET CURVECOLOR SET XAXISCOLOR SET XLABELCOLOR SET XNUMBERSCOLOR SET YAXISCOLOR SET YLABELCOLOR SET YNUMBERSCOLOR SET TEXTCOLOR Loading colormaps: SET COLORMAP SET COLORMAPFILE Density plots: DENSITY /0Q R  !#02<>IKXZcdms2;BCZԾ԰ԾԾԢԘԘԪԪԾԘԐjxh,Uh,OJQJ^Jh,mH sH  h,CJh,B*OJQJ^Jphh,B*CJphjf"hOUhOh,jh,@KHOJQJUh,5B*CJ0\phh,B*CJXph5/=Q : < L u,d2;PUZr@w@PB^f|| $$$Ifa$Zkd}$$IflF ,"   6    4 la $x$If $$x$Ifa$U$a$Z[\]^efg~֯֟֊t_Qtj ~h,OJQJU^J)j\B h,@CJUVaJmH sH j8 h,OJQJU^Jjnh,U)jL\B h,@CJUVaJmH sH jh,Uj^h,U)jo\B h,@CJUVaJmH sH j h,Uh,OJQJ^Jh,jxh,UjQh,U)j\B h,@CJUVaJmH sH !"9:;<=EFG^_`abhpx󊂟ze]zjh,U)jaB h,@CJUVaJmH sH jh,Ujth,U)j\B h,@CJUVaJmH sH j h,Ujh,U)jB h,@CJUVaJmH sH jHh,Uh,OJQJ^Jjh,U)jtB h,@CJUVaJmH sH h,jh,U" !=EFbijZkd $$IflF ,"   6    4 la $$$Ifa$ $$x$Ifa$ jkl&/xUUZkd$$IflF ,"   6    4 laez.9d~  ###N$$%%%%%%% ''))))**B*J*w***vjh,@KHOJQJU5j\B h,@CJKHOJQJUVaJmH sH h,@KHOJQJjh,@KHOJQJUh,B*phh,B*CJphh,B*OJQJ^Jphh,OJQJ^J h,6] h,CJh,h,mH sH ./8AJS\ed~ < P 9"##M#[#o#####N$a$o$$UU$$$$%%%' ))))**A*GkdB$$Ifl0T,"64 la $$Ifa$$a$UUA*B*J*v*w***hGkd_C$$Ifl0T,"64 la $$Ifa$GkdB$$Ifl0T,"64 la******#+hGkd#D$$Ifl0T,"64 la $$Ifa$GkdC$$Ifl0T,"64 la****$+++k-l-------...00 0 000!0"0#0$0D0E0000001&2345T77<A>B>u>v>>jph,Ujh,U h,CJj( h,U h,@jh,@Ujڃh,Uh,B*CJphh,B*OJQJ^JphjIEh,U)jB\B h,@CJUVaJmH sH jh,Uh,h,OJQJ^J.#+$+++[+\+k---G...hd_][[YUZ$a$GkdD$$Ifl0T,"64 la $$Ifa$GkdD$$Ifl0T,"64 la ..`/t/001&1?1E1K1^1m1111111222&2:23333U$a$UZ$a$Z33333 4#4>4k4o4}444444445$5h6T7e7w7789m:UZUUm:8<<<<<<<=3=@=V=e=r======>>">5>7>A>C>u>>Z$a$ZUU>>>>f?*@=@[@j@r@w@x@h,B*CJphh,jph,Uj#h,U)jZ\B h,@CJUVaJmH sH  >>M?f?p????????? @@*@=@J@[@j@r@s@t@u@v@w@x@UU 1h/ =!"#$% 1h/ =!"#$% 1h/ =!"#$%f"Dd(#R  C .AtopPictureb!Wsiy!D_n!WsiyPNG  IHDRXYG IDATx]%ו'Gn(.SeZEk F`2zDF.WJTa$/à6,p#Z,RCUXEYVvNjH9͛C:kwu'bǎ8_qNbXj2s@UUUUUUUݦ XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM XUUUUUUUUVUUUUUUUĪUUUUUUUU5*`UUUUUUUUM٭~UUUUUUUw666zbz{1o*`UUUUUUUM < V VUUUUUUvZ:XXUUUUsS'wJCRw`u-u-?v^fmlnlq_k6~{Wfݺ.m߇^hz׬#>f[~s.әsDVF[-f6]x<<Ϟ=\ev>'^O/N=Ϝ?:.h+!c${F;ߏ|t@aNjm,ngvL>6$YPul_,rHO~~>\z`۬VK}r_Gז.绋=TRJ*VJ[r4t1l~Iʁ101PhA߸w dh~s=xuJ|7JJsdhXd]1f+^ tp= jrmz]rEY [ \9FeKo<՛Y77-bmX>.Vm X9Xx7S"p(7gOwx"p(UQ9X`,7`cs4PI/<@jjj~%u,f6o]-y Z.4\5&|tf>{o}cJ?)O4ͽx챫q@vt:a@Y@T޶_K,Ye ”.p*-bmV_w6+w,0` $PԪUԞVX0EeGp]h~ϜJ% &կ6q$ TJO`_9KV7r+nܩvULmD1typm]./a[M#E)WIx! eYa#—uV5Eb8BPܫU9?,8lmUa>cJ[T@U.\)oG能n9mshD+9>gt`Έ4=@z߲PiTٝGn˭.?pa4쮓ߣhTaνX?=?_d;Uwe9T^pyΖ&\W`y#`: EC}XsSۢ )>L9<mVV{IQTr'`UYS~A|.Yv Z,0JW^i~jع}d*W*NJruOaL-(eaniH|0Udo˒$x훂0|JiX,*o9^Y{ %/*;{BN{PExλbYp`nRziq>ܪ U UR龲[^Y ߘc>NqR.IG B{WrݭkղF!8E.n呆P5&/kk z*"b7Ųhòٔiƀd/z u%{4pcW}oix=ʱr*qA>v.[kd۴Kݖ?;?*}oJ\-="`;VQ^֭6]71Ȓ 9/+wZ Uk UWa5,yzAr- 'WpeAIK)z}z6XM*Ef\VUB*?w,T7mqr%|(J^:snȰT Y,rifte-kG|UU5eYsyUW@\q9.X) XI(eVV~ TyV9>Ve) "ʂ!X=>P_] [.( xyp1:r+k2\UY-pT9 VpUe,=1d'yunPsWj+ FP 8o XE=V)JS#b``JֵAWV.S!c<_>;zV]8T-niL Fj J>Ԋ aLS^pjȒ2ceu ]!\rJjKa VY˚${-KJQ>Ʌɂ,B tUdq{Iv]Jπ*iƒ V `p)CG;U߾V-]-Вe-}b%@ kji@Ju0WCNGmw50T(z2PaVsU4ZJ|PT%RڭWf/5, WhYDp%nC 4P/n{5`Uj5,ŲnH,{ۮtU; <;VKy聸nLTi Wam* ,1rdzNT;h.}۲@ <&+8lo/p/# uvx>øP[AO;YzwunQITr S[&d-'Y`P8{3%57= /;%x=fkeenN+ ZY zeʩqf]yyZVB|2ß?$?餛%ꐡ#ն} Wqxۃ, X: DX%5CYZMpcT}ZC@ 48X]7ȺEV+q乭@H tWg<tzSC{v+j;K4%XRN!WѨQ]q" Y:zy<ÍA~1,a("X@G^Oc"T\]]7 s}M`^?+\Zz~AkZSU31Zcܫ߯(jKؒkj hgo#Á= ynޞeeVI/,U*Pr?t_U5*`e,ԮԱr"*gesf Ty)+` \F V_lAK;KaQ-/iVR*Etx0xZ:<.Ңm)3:HTiO$6kKp[-h>aDo4P{*z2z=S)5xVU^n,'Yܪ>d1H>|,N{Q\c8ja XY7(WUIUkŵyĵrÁV,`%1I9ֱ~r^P.霢7w}8p">`^UdVʥ*M7u+R-AaYBN!bɽ5xgW.\ 9.j µF2XR-J@Xxڣ\,l\+ }Rz ~un'Ez#=G@+m8FZZaЊuv,-*YΑW/+,#[$C%!k`UY ڽzhNS:ZŵNbu шAV)۽^ob8|,=۵%b9l|8U <(<~^hR9*panjp dyEB SPa dvU2 XUrJ `MiqNk%mWkTk!GU\.k\q_ W;ܦ0vѼ1%/^kv^X5 Ai, jfQsG'{ +`͗(Ґe[v>],+oCj.V*KkX/!\|,ϵJ쥮\++T@yITJhypťJ hb6KԔRQhQaU ~fv~V<ܬo5YZ:ޒ|ZY68 wYҡX2CVUմZcJWzAm'nr{2JtuR'*ZZY:=Z͚g՜_/"~5@rYs V>V4eAKC5g1rA+¯ni(Sx ikjeyM;݂-#h s/{YUV5vhivYϹEoK*ç>=k5keqY֒2 pm}N)@eM㍄cTJA~_S;7ؒ9k l8o_2f9 Y9"8h 0.kd!X%K~apVOtY+ipxp'l9n7zf•~inR0VV;wL$L9hk{Nx,︑<КZ%Ss> K YWQ<ڐ^ugĢU>'d+) D:,K8^I[X*JCVUմkX;*8 Mo \%]+ UZq;Okpr,JBU%V\<$Qry4Ĕ:Y^.d܅r동99lhmnqAn͓2'[}~7˹Z>=.]X8.%\mgCU WS\U[VrpU*JYJ# L2B7J;8^2Z}BJvHs^Ⱥpr/*.Ґe%ke uP.!K'7d( hiu"yXumۘ/_%tI{嵕k:XU*`*vJ׭m\E'* EkVV1\Y2EXVYnj.7+]1`p3{N~-J!%< ^U5Ұau emos 41dE#e,WځY!*Kk X^046CN4Wwo~hj}u IDATKJ!kTӸW@ulUʀ+dJ]l*o,/J mF`91Z&Lbdʁ\*)AjJ=8`as"*yNPq{TQ?W*ۊ, 1e;ʽ:q]%}jnDLCv"aJ]*1n9XQU4 F6zҧ.d2֔r~,9'`,X@V. X-"|H&nȒP/|ŮeYV[G dЬZjz1`67A;R07ۣ @m\\rWUi0% ,L>E:V%9YU˛gX",nY]ѐŹS؅ ڀ.ǯ.8a6dk45G5Mpӛj5}^˔sK=FHUdv#*Jjev>STIu)EOvܳ|47ڽ%RA$+Um+,'+lXO1WaKiʃ, Ux:77k7,-`t8,7eR{*\o=|sj[!XUΕ`%RM Nڮ'OP@U }J< ;=@A@yzϩAaoyhNUnsb(ҠcodY}-0xÐaUꪀU\M Ws(us5 4D[p]+o{R(k$FkS F MGVYAY"azb|<[}]F2ʜA7B~Ęwak*;X^〫tn\0M R!REpemrH]t^BdWT;?Jc܂r|ivT^2`N=7K4bsG!jXJC@-Fe s='+Jp0 ;Yv,=167VWV*WW e>gpe[v}+`\"U$"/FC U..n+L9y͹f\^RdSs a V6{#.;N]ʅ, `4a4~W}ҵBvi!. U(Bs^8BkZ)p*賲p"9(r[ }έ($XbBF2w/B6f uXOLz +Z=:꯺yǑ|~;V-գTC7Cw=` Pi= X9pUR4+UXEpYi1`4Rg+irx?T"%1ڮ/cJ o`E9G6>ZӊJo鉹UV[j㏁*:_ylchT^[ OeAdaYq<7F_)/UC$pyjCxbX+!AorW+BY묜*n]u}. 1oYٟ *$-sReVe,U:F'l6}vBZ1$ZW%a/KCs1 UUVXw}~s nrsI~|Ç-^.9p{ |"G Ri3+5',(K@alȪUei++/\w3J \MDf_'m;09fTc^!f[++d=dE 0W)Gzid-sdCdi7+ZSŅH VU5$w-[vpeJ|ͫ.r\, W(D)}(7"*O== Azw͓.li׃/_ji9Ti{qCvƄ},rNq޼q>s.g"ٹinU`47IQ-?5fhm ĤpTiʃ(M׺О+#jJsCpyJ*2"LVɋwZE۶r/t?hO= 0t9rX1`yW dym̟G\rA"w$dw"d:_vKК}*M@ ,J |%@hlUt07*rd+'z<-Dba;৭Z".X-!Re~Z`]t=}/%l A|,V\S.7 ZVi-CWzY𢡄n*txe9ӹ"qEr…?P.Uei {|~Xkl)*͂:Wcȷ*MdLjuwܪo/<o]+~߶K:w.R!y!˲z cWT#}>iGK;,g8DN*],!+L}+_hPj:Y/wovK?X5t>0sœ7=7dpC*P9!A]?o$Cd9" IX1T]1"WK8.L1I'.JIo)%!*Kk X < E]H(w$S@ ²[.6-p`$5$+կ!}4TP  g=O{wAuepr Znj9Md#v",Idх\AjdJ Z}uk*HZ?UJtf%cзG\}/PZERU^p+ a `qĞ+Y Woyׯw%<,Vs.5~Bԅ KžA}cQ|dENZR4"Y=tNY8d,/k-Ȋ Âd}eZw=`usu\pǶqG u*zUBo%}-,* puxexz, ˒X7ul {zv,2Tx:d}B2,\}站  /Te%VTzh*+QjĠuA!\I#dJ`ɱJVZ6^D|+jYJBUTdj!\";<OzP,kb-qDCz)Y[o  /pY34 dwep!UAWynC6 SYn,H e|r>Q"yk4!-K!ҧ&g:Z|lR믤UcȥJc{8pe9W\0k\Ype9ZMykƏRJk犷֧Pi^t3JsgO㭷!ks鳹ـ5#, 67/+Dt[JZvos|Wޥlo?ON|y+W.,-}LivFk7hBo\sJԿ[ulw?, L$\htmUeC(  b6od `evv@Uj+KfQJjRq HTⷷOTVoJ10\ qoϻ~rp /)::Hj>y{C|wn~I2CD?u …"bibKo*%zZ9n>m+x[:,"K$OfUUXٔ" DA}48Ujvܫ%zIC%zzkk$]oV'GpE`j>o BnSֿn}n9 AgyP ]j^K_j kwE*Aw|N )_Hׅ>^Z},knU4Ơ w72WK*#z^xǒsKѐe[HY㍍AJI666ŻRmaLZ[rth8Dp%ǃ+ ?Jڃ*_ʺр7xJ)W@`ÿ\v XL#޺ܻp^|.\󰎎\eds>WB]xfrߵ\*vR52zI^2W/?VՂdx[>?љa*<⶛^해*ڞ yA WλJ|ZVEK-XF#|kM{pe]RDuA1\}nrH%Yk\?mW. Kέ\@Nx# dʹwJ?g|)*gRp/>zC{}J:<v KC/pjd4J㰶~>:N-`CZhWK[yW@0bFnׂ9Np_Nz?vt2t0sp,06(m صNCVc$bw ]$OQ<_<|}<'nbfbɨB`@g-A'Ѳσ5)Ge!C\,wA|,n {n>[XGG?W*Ok{Z1}f ?d(\^u;7%D XE*I'jE z9(Kr7 "੠B9C S *cFZ$ 4PY[g-GabS09ke 0d]-o^vxoY𥝫dz:,P B平ݩ9OznEa XUǡ=-,(7-wXi/\ %!.' OHβVǂ+вpoFSi5rKQ( jʁ\H0l^- qcrsWrzY5P׃,9Qf~%K3v[ؾ2yjiH6J: #_!,s^U¼ъZa}9쩑3?MutTCUVk X"˽v Cd}R@OY!BԪ.ңek|+ W:4Husa]S`jyWt4Ra(<˥xsޏbRJx*m>hj%mfj YtJ|Ȓ[2TP-k%GaD/T8Zk%tGִ7cF)ry|W"/[! -bqv-b9[ WS+)`X25.o <WbI;C,:n~%Μ,-;:jjh=tY[[4vΕ|߀~xP_9W+z!KK'G2?Ma.1e{͜JHV|B'BIWyXU#˛OȽР6C#A}o'AV.L}nH5\1X-c4?H WN5djY$tN 'RBM5Xy=:X#; ,!2 4߿+Ù/Ҡj%ehq.dY!@K탤T/BlDpeR;tGZ,UǖyRcB…˽DceWUXU5n{J9TM5Bsz*lL +1\YpĮ :W^BneL1\ f[m㰘.)_ݲƄ{! G\-D3- _S˽XWHô\9}B+TBٜ-Ix:Tn+iխڞ w IDATy[Rq(4.+,ÜJ\fl7{IѲ^'s {ӃP+N~סyJ/GkHJ=JA>^ xXz.zE ,{"3jcV^Z\ZβMmA@yX9r$PhbzmP! 5(D~t*\Ik{%t۟5_WHr )2rreZN?]Xm#r }84%gW8V6,@ڼ豽8V./XRT.! ƺ ӲOQo<7~z/^;`N *r1(tA# Q3B߀}xB\-}<ѽJu~M{p" PZ WXR},JkJCNl_*ּ%kurc,j4X:0@ y4n[Hcy,/ڮ5MpyHC=Дc-{ŮVIf9͒y4ǰ]DOv5dŮ8,[N%'jcjhf`(+Jlvog~#ۭeOT ~},*"y$*]]m_IX26s0s<ʽĔR05a ZZ}*-]A,)7jW_nRV hiʓX\rҾtvйX q[9chH;JZu#OU}_W0YUvZC(0SU\YpVX1XUvŲTZh3Jϛesʿ҉ǰ4X/$*7 XZ! .ч.Ų@K.[7L@nZ90ݪs00u@E?K E/˒r 6p\NTx\,YK&qWҪ;X*.k}M6jI{eY`Y[uH? ϵrj.Y4Jʂ, >is:`Vƴtun>~JX}n^PsA6kV<8KOd9-~ \`hð!iKPe.dYd}v},9h/dFS]XsKDUUs"Jo:G`2ɝ<)Y#ZWpu  hFdq?+m*4dJ#,/7ՏW޲|,WrrÑ9Y*+7KÕnu/%8}(fIx Y%= cX.51vjY.Wb(=:N];ù/.,۬.*,mo'/^IF# 1\E9W}puZU|`Eǖ g's=*>TY?^Axl؊*zS)67!W RޔG}.~Rs dqKGiTANJ%\,+$}q%ٺO kqU`޿XLYfmsh]}y8Y34# uC:Nbi+?i3tapMc[)>Jk}%t۟5w#Y^>s)q^]"ϥ W+V\7E ׹j́+ e)BYCO+o9E\.DpyI _ 8ʃ.-]rpxݚk !&^E۽angjYA iȵr Ât:w4;z\mm ,B_l@{Sbcɲy6wy91t,9b'kލ.n+KНWe$Ro%ݴeMLXPy #FҮUUehm+gW{%5VV{{e0m||bg3ɝs,@ u; h9V9?hD0b/7,` loC _ԏDRd ʽLI$},>#'GۭcJ?>iydġY`IP mY odY34{nUwβ~_zItzvx0eoJk XIW+6] vQd{!?գ=NE*,w`7 2k1r"lޏ-߭^H)y;CY,q( BDdg1(|(yS.wV􎩥ɛ5d!p%g~Y.JZimOʒ9R!˪>+hT!gJ i=gZ&ߧy"[utePU-S%˩^! B|v/[5dqʽ@U^~U XqewדϡZt)UqL~Qbg$VJ36䘑n{˃ Mxhzw&Sm&靡E%rt.YZVXSTw}JF&hY.yjJ-`E_(%<tXVXA똥ScX&|qܫv$!إ}1a@ުng%uʑUO^XPO?Tg~|{Zc "˰+?esR.V;]H6s>MqRm(u%a1g GaX u߀Tlyzok.V.xk%해*ZSeW S^QHAIT[οR PY~:<\1Xq.)`DzkEJXuL W.\n.ʻHoj/ xxX;0Su8w8RY_\5' # Z,*-f:I/h%,Nd"ƙ!{KJ+wtԁ52l,wL0miITFJ<έ\, ~cYol{iq /ߒ$wKhAhbip\{UCUǡtR. g6Iʂ,yeɻZrTNl}ĭ!pZ{)krUʓ|&V].p%7E˽8]b0*:_s='PC'IZ\MѴ׹ZyK],`F»W96x=s`k55XjTe+%+% /{RCյ9P_seH$+GQV[\_dJɃEZ-w k3-@ M9A,o}'lRttD6_jYcJ]_Ƴv w?@l>.ȫ%- r;Zj]WwqVјiݯ,-&-[*97P/]M%/<H=3gŎ-yUXĽP!Kxt8P KV`1v-dE̎lBxZ%Ԕ jiWK)5z9p{dՁgrKzPTxwdFO"yUnUU jMƒ{W|UA敧Tv^ Y@UZE*bysDWXYng]O&FI3?PBH[˺x<ևx68KCVV9c4%7 [a2}:K'sit@fMdX Phy.֔9|AVˣ+^NW^hpLH'yAž]^0r,ENU)\ ,Sw6?9JyA~onв[nih*{)@R`JFJ퓒Ǵ sj XZ:u-UT'ϑ69|""@U/)UW9P5?LnHJ mlx$Z+?mفsfLxN`uAٵ {1`zixzM|Lλ:dӎ̷Pv8} dĔ3:frZcwbXQuC k(C-=0b~"V-Y?1t'vUeimJdҗN/4^ym Eex9GDP9u0mAkOSVA/uPy`h`zϟxq>? X R\\obZY\M`ED=}'U VYZ[?^z!\i˚k4 \ɲ5sW/ ;,h~B ǜ^-C|IVh@4yU;ɝs?+[O{Z}67ɪ>d{ !p[n~Wxr=Ѡx*lV)H9WRd4CJs~$a VYZ[ p~WcQ2j0h鏘W9+ JHHڬ8 ؘ/n+Р.>hDvWrc1ỎYs ϟ%`8TTOmN6 KYta@ܹ=l؊KW|9a%/dAs.[tP\s<ʺBq %̿V,Arr^fhW?\\ᴧBPaF]$$/C@Z|Qҹ2)\e^O=ϯ'ծ)J%| o,A0Ufc]AwW$dp$cNN-KwɭIeއ4{j:t$<% 0HQ#ť4 vrx^ew .HvM*[k X|q}~JZVۣR \dv+R%EVQQWڝ@YA^%ɑW޽^u/4(ۗ\ZЉc•Z\Z}ƀ-oDhJ!:o Y|Ѵ]}Chx$y,:,7PJCV;L(J6}ȹ*Iv? j  v基&:n-`s&}*'Զ ?cνzUZW\Aڼ BW4pZj$Μܾrvzp |W[qĥ7 ®,.-?+-9bŚo'ѽp`x`b<$C--n= z77 yF E:]{t\aBg(\,~>S,w*3?ˮS kv7dfգ4Tq?pFp V^uڗ#уʰG(<¢D;OܦY<Ӎ&`u]*dZ[\f lC1~qX\2ݫ{"!RH;Ւ\-qΟ@J@!KV$bkSX# 1(L 3.'R8YUoW S6 1LXCU~xPSX^fs}>\~N<GOjeɺsW0F@KAWVoetM\#bYKi&e=@'֥\ëCuR < TTuQ Gw=`+IUi^+,u"WJ*pInU h}`GCW.IZ`Ճ* Wvѯ֮KݪWZz~îPV؅xkq] hu]+|ʽZ9(۸>'{%)e˱m:W边O37/g!A$4r+𪑋,f 90*!*Kk XfUIxк8J+rr6{*F ˃\YIQf=x뭮zQS+3Me+=*P8';hJ2ݔ63{JW p6}xy V>7X~ư6/޾8t†`-v8X]rw\T->h['s@+p o#]+)/ a W V%uyʑW:VIw`J*&\E5DXeim, vT{ vyWѺYU{v"ʓ.47=b@U j3%ꕶ`,/׈Knչ]J,y^oo/޸ouvj8Ն %y|ږ;m%x9maK3ⷀ YzйX%}P5,_vdMJB)BSXgUvYg~UUSjmK4ȿƅ1shU*W{۬}c xro~muz&DEΖ|>Z:Sz>A fh WXIl?c ~5ZCJr?fkS n柌ֱZqZ.6j7Ճ*5o!h^>"~.h>x,y*'j0!i۬E(Lbq؃߲dw@oШqah 03rNx( ^`XAT( ؽ3j^ɭw-'J;\Yӌk$k9ȹUf2fsZx%KX:'_?]S1uZѭ(jE`xy};<Ԭq~f8^j‡+.`X&˭_G5{aA (XdbGt *0!*Kk X$R`Pּtiuhr㥔OB.I,߭ rKuK_r+1\ t{+ D3~]iv muj07Þ%vSݴ;1FFN_uogvX(A(=ZDpeh6 ZЫ%yX@WhBvq0)_`4 <ը%p ݶ4oSZǡ(/dUlB ZˑZLRAxĠuOΕvW5BsBSp']\,%g[? T@/j)vg_篼\^Bբ]: d}wp*F{[pej$K`oUb]( A.ZV,q<>.U*=rLY„T*9XURr VYt:/fX%(,j/5d(+S Wh rYrtp% V颱hlor \AVF%T@Trھ7CX: ,- zPuߐul rZ{t΀,KO^}m J(= ~+M)jʙ6b^xP×WzAK~dbaBbXQhjV_$"u y{\UnJ~3Jhr,ys@xD^B BYW-Pm<&H@^B?{=zν ?򝰿-sf6π&⍋Mn_^:Y|`FoK&Fs%T}$]AYS%\2~ ];<.%*u7l*0R},~L8ݣ0aY&)QUȿeѕ 3*z[:mk*'t+XRƵ W\C,w>{E9W WΓ5&dтRBWG6X{ I*N]aL* }tֹwy>o[>Oqv~ӺY6`tb(YWT>cl\Ke9Xճv.ÀyVlQ1XJl` z%e j=Y|aҁ,jVl[qAr?4ثwׅp[] шUJ4dK#;T W/[}N&d: 7 ,7ca{YzD!'KhPaG%WMzM~p_ùb8ްل9!^ Kjţ e&3PKXY@a0LvjOvcYdzWO9 =jΝ'EUCU>_]A3BQx,J9WڑspѷΕт\{o:n5v) )jwKU%}`' BW9aBfҙj׏%%0(g{:ZW$_Yap6u8d#;M r;P2Pi2[Jܭb~VzB WVhejAK YH\>g 1%cF0d8Cl hm X&la MY\kaYa!hY%9k{|?3uY:(Ki`zcq _lS. s&l>-Ih Sd?Жr%\{M5TLRsSR 9e˔ UVLLƠ-EHR.jey9*ل ka"Xl䉕?(119c*-_ i/4.`>%1ZCh], yA>F*ʒWaE5Tʑ,~=V#Y6l n& B&)W\!(vSCGdk~$ w'L-YYE%l=Ǧ-q)W)W;h,kPI7EHzwٻI=5^KTdv^wwx]*+%Z!ßg݅rn*^&%gg9vcy&4"bsX|V̩X-nY &NqYYS utdEOƛJ"kݞyS9e+;Ն}iC8sazAFtzg7wނ;+ޖpM`oedlAO!Wj呩jHUJ앪\> F^wh젂dᣞhe2%7,1 (8 X5^ '2ܫ/vL=SHemWbRhy+xw{?:8JJ|D&88ː#Y*{!N"@ڗE7͛CrSj -vOΜKm1ćЯW]OAм-hځ> ;.*lុ*\j)6kIVRpNlh-Э]xVlB\T-3SutCz-۶-=m#Y۽.Ύ7*T,VTRk"jO] 'R<"v݉B?w(앩WIY7W\ فLrĊg+>d8_..oxर;0\2a>!WSO3%Y\BbA^vC]2o<[NU*ͿEnh>dvj@[!`Mpp #Q.76=g,/;!N<I IDATǕ'ق& lrY!U+&S z˷䊂V!Ҿ ҜfXHժ*V ƨY95 Exxv*WӰ7%A&YF<;|>ϓ,ZL=rO '2UR% ˘Z|U#{P1e&3&0Y* Gjՠ{B+:غ"Xy)w`m+]eJ+Tʑj)VcIY,nr=RdYoCSx>j?7qcSh$'7 Zo;(l!g/?Qz:v%ZuV='{p1d5>=_&V=8ZJrijR"5Ԯ=<Vx:䂢dBx+}U@YUZhXb5PNIbqEhDԬ9>'Z b0UqUl=Ֆ͐ke*> cxoG-(]p~c#h],ϩT /kgQ[v3RUeΎgȕIuM Ogq#BҤ䪆l$J/{wuj6>r*or YlwA{hA9Em8Rt%{e4ĥ']|xAMhX/㽄\T(_U"V5NuHkP<~bx ͝FZg X?WydMnu?(*[WIP):?=T҃jl<pmA*'R&lh2y&ԓ/g(ـؔ)OkkW]ͳ0sE߻޵q!2 Re$CRePa~l\c>Re+h=t o[*Bտ~t/|&Ozaۚ5|Ϫ"˔aϏǖׁ?{ uPpo%fs#Qn0O՜nH P"BjMUQEWy{aid*NWF+].Ru p)YTŲj ju:jHŭGcO)7JY"y zF8E>7!Ϸn=z68+ȯLM1`"Xw9Ժ]JUD<͗VkЋܕ ^YWrR;i 9h]2Ybxۤ`yfĀ/|=*d(yUx Lu4+?Wuu#UpU {ܦD,<#F}ϙuH:$g#Wi4'`hԅkl(aS'%(UVZPص`zUU+9x) V[ĂsW?5r+Oi_Cyvdd?*9d.gQeHԪeҌuH. fww-|wy _$%~L#okD)eKJcT9-}ljp~VQ,֝mAkkAD#]3uYsA ? D/Ң` . GrD_Sre>\,OE{] -[\A8WңPl?9b-j?3̀苎>>c=Ul!gzy@)Z\(*UdDKVTä Mppcy՞Ɛ>1zq;[^}*@okzrYV^٠jYp;z$J++`ly]=!z&e7ڱUr[tӷHsXUȪU$@r!Jʕ)*=Ht];oyUn{FӖdޕ&hwRbfTT,}m*{թWT;iQQQ~WU,fFymk}[έK:\hT,~/ Qk.>JUusѬOz~5G׫l;pf*~Уd2* \EQE|{絳{BG'L8Iq/,%WzGՒ "Pzg&{w >6EWJc֯R!}e_RBK;Hw6ΠoU,EWӉbzm`m=*W6S!sxxNJ"5)Xw%&5JTZbd+['  9{E kW=+nGrAW:`&5f}O{9rm3*7ix\o6@bxlxMM#t@>x˕'%Z>۔/q{ҺzX"vϩaw`ݕq1O]*'<}{S&,:{ ;s='VYڮF}9x=<i!ɇSUlٗ#D% ^oº7%S7Fonؕ"u )O2n&cXhiQUKPK#MkC,R@6SSx=QG q4n.˱9Zw۳U8Oi4w=2u*"S־Vf4 NہGR`$*ŋ&>qU:,uaֽJ?!a $KP[vJy,w0anc w%.4d@(,[~ލχw⨃6+6n0-ӄi"Xw'zU*$Z*DQP!;>{H/,sCrUTՐ;9$ݦb d@`%@b<>k7MBU+nlSOhHāX^U*? )F7 bEʕ,FS"BeGi{]\-dXpO;M&uw'X %Ym XsJEN}RRAGK6ͤD7}ݮ{bN 迗BK~9nXUl=x@V%PyS#Q}[ln _+HOb#ߗmK,UtUf3`{;xnl[yoݠ?A6_6 6 )4ի]^/?LX\ohX^s[N`PDxq$**Vt7z zՅ-A[.ԔBkq {٥M—VmoaltrXb QV <֍xy\x ]+joN3UT*}n' Lbr']w M͍{7`\=ATuM*biDU39[) 3xp->w[g[HzmX)> HU̝ZjyX6\Dv[Lb*?;HcQ%eiMyN[~Exw1ʩKGOXn耟 rXu R}Лo0kzE5pٲH~Ux'Z"avlGx[[wt8%,!'^[?V ͼ[+k J~Xi϶,܅2 `dyP-)n˚@9g+Z4a݉K JrcيX gnfȜO>(h-\mHs2e;6kk.*>&4kSY :(kPR*Q~hϫsװ{/W9ˎ`;ֶ\}0U*mڑIy7a[Vutܼ.75ȐM@m 5rIZca#reH) U.]@cѻ-n^Xz`m6!y`H6oOT,Ulh?)D^m^];UZWm-MbRQy߽UedUw_|-r3z^Rc SwZ!­Uv %ԥ9ZHsX5 j **6?~n?8qv~6Keu@ORjTfT oHg rW>zsJڃ[}$ťTqn?@T}ze֞Wu=U=YNkqhE*wiU؝ǒ3os?N`ݝCUCr,P}d0d֣g RBv ҦT͑٬qufysxN޽ڄ_oUMm`/ `޾Aoڟumv>v OHَ4{ʐ_vHcGDƔ\Y?b2] 0ЫW;}5nDLЃn G5 ߾:PJ4*փgSa~S;s`+`h:K֫h]`4:pCIݎf^-G^}}y p yz\\\S5CNqh>ӧuk5˗w*ќR{=q(^h\إT[kxE#y-cP&5&Xc y+38tUJOLvNJI/[[:͸Mx-MFxԳZ `ӾǭT-7\8(ɚ>;db,Ѫ%U.M seIًg?{ͷ/wWC ϭVEBՐelAC b{p{o357/6;[=b2j3cnu_LhRUyO;51 &Xm4كƨzXSMsxF-2γX؄zlVg$hЛ&Rµv4ᅨnPzu1@"]Jv&#T^_Ɛ+yg^h@b H <^%!U zU*06se SۆɶQʦFre DڙKݫhSړl݁#0ZzG,Äyh-d6G-Tӛ0 sX6mv\lT,+pIkvА)Sև-2G{8W{_?enTZ`B>-{ʦJ\q'zV` cG?xڼ=ͷY"*l~>$^z4eIX*W/=rʣw#ԝ4 w'`1<!﬿]6a)޽w%V\]I+}ƜuX5T=@,, ݼc x?SVzv6YT}*[ڙ7P{7WJӒ, _tz&`DS,zYɕW**ZӫG`\ {;~VUJ50Y~CcXOiDl~0`@v1Xz؃cWipݴU/r5+>^*sKɖ*90ExBcD&x8 g*@GKpYސnНHYc3lYdbl˖zH/\bUZ YL<$kpQ3نET-phYXTU+޶\y=wu6<&(sc-i F=7u^T+LJ@bx5y8aB%N,r9*,ͷX/ ;tu9lyVv(*֪}qѤڄoꤑ* ݒ ݇m }&#Y8l[@kmhD,ZVihVe%Wt#WLllH ]<"5 άC%[P.nH'VVڙj>Vjcݫ{ nPbۇ H*T)[ղe=WM$c aʋF9YЩWDbr#s LkMzeW=@d1P-!*J[ y!5U;_ U8&{6OW^ŋT ^P\"%S&څQf@7F!v~]O@g,9D lkmXR:ۏm@n++VVeUY߶3BhjWb˽*ْq^Εf٬Wl9QdE%2B*:o/MV@Oj+8|{s䪝rv&`mmzUOj'A+ 36쮥xx U&숙l?dI]mB FlšW<,{Dgl>lH/DRIYJlަղeQcQz jvoV gn5;v~/ȕ^r9=t0u孼y}NzŹ,v'%PX.žlV6o' {*Q$E8.}Oē+WL*Vmׅ{oH'\Ɇ+L{C)ZנaLCԷA` >Z.@0.Ywqsїr蕨yz%D+21:+PVٲWT+Z1JT+!W M-Wp{lmA"'B6GjV|Oy?%r, J:rKv`vzs˵`Mpjx$KmU8U Z]_cn 8 g(ni#W7Z*Cރ<)P0 4̥ͬAށ9gň=GEZrei>hW:;cx(5_AuP:/^E7<{Vdw2\2wO?P95 $XQT氎MȈJ6mQYJc*ۄV2' :&˪]&ک|RuiQ(u7(meHhrlhU"[#SFm蛎XYx}$nfaB۱k{qv0*Y^"piI}6`&QEӏy \A=oҹF(WAv7U`t"X<@Հ/aMKњV #b&$+е iv~jEUбB/'>]ϵgNܭ /_!@:ːHe@Wעy {+N5zrvZU {&kk Vwwek0k~\AzDk k4-Ϡwioet~cWmcQiCrh| M8Xդz$+raHBK0no- *VTa*Y-!|y.C}sq=  DZ}M?ąw\ +XO=L=pYnP*~|w=Å((p1V@{kk?j)w"\U1Mpb kW)R6GP+"2.)٠k'XjF$dGV%H4b{ =N:[0 kxeh!x[?[6KfzE"Uj41AUkv` juCڹBԨj]BJdzsK?H ;n(+}#ԪW5E}'dʳu^W~3}.&G<ل*<:N7TR |cC6Ɩj(,8 >I7{nymzfu)%W2ه$-ל%Ts\rPzVJtXcv='n;P"e%R9>nMD6R=䐍!WoO+V]htPh=X^yB%TFۃ4'`I-,m/6!Pziy;9Q6a.Ž\0Rm7Z ?Ml+d7rK0WNJW)Sz|o\ɕ2 T8ߧqsVֈ$Gqc56؃D& rLp& V43Jބ@dpKA{[݁NZɖ@{N*Xܡs|Gp{Om_VZ5vkyZdy r V= _lB`@2"jބzjGr%*{eK*VNʑ&8+o{O50𼑮٬'[l%$kd;-9iF~ Df%CLyU"`v(K,oN~_$TժW^i~k{Se-~ڞއJ=zU;d;ɠ!R6 Mpb )8> \:olBX&Tv8%KLQ#:12Hի5hobey\g9ɲ_w^ n GPYw!TLCbo_㌇ y&WQ !@dw,˟]v^zDrt#Wc.zكڃ p`;WgA`h~xQLJ3 n_D`Mpb wQ؄@\EYvGr6! W+WQuw%Z֦arGw<3kYⰻWjaUxߩߕE**]zپ!\qH,])b"#Z>3fSbm U|lcJk=E{2W9^=c ZP#VQhHM=kzH4;Ce6 ;ըX+ɰj2X^-؃5qb 9AuMA=هV)Wj=:QBfmJ&PBВ/U<[nWo;Ԝ}i(YҀq7d%C$T;UR؅Ӟc'5T"S/PH~o -2@|AljrUa Z +B2DKcJ1^EmEo&(كH sZ[pn_TIr5aBKXلXMۜSCTR³ZW -ٰm9,VxP1䠖`NVDJ$t$eٔɷچ|v{B75:Lrsα5^ `LFPrUk/GJc+~zeghѨYJW ڙƫJVfp;},w S% N4 0XkMlSJٝg%0ݙ8-䰴O8;J%ok(V*<%*Q>|P$SF4eb M*Wa++à+`%hDx窯{_+sPWH%D)aHB^l.0$LQ{ajjN%X@J&VD8h  n,VN>O Gx6!ۦ>ڄ@zԥuYc-ã#8#)LD0;F:d0-N=Anۮdt~`6|渱3EȖeZՒB/W^Iɕ/ bx[iKP7VڝcR'ۯw.Fl=h8*u^=5كN,,$]WU:Ckpudl¯PeEVTY[כPz֠:7lȈkmœ+^O~Ll%Yޓ1e#Z^Fg,Ul=z=5>"U4s*K̩V$;GJU@U1E+GɊA%ezA.ܾ=Jv- ǁKdmAMԇbRSsG#RfJՒ-9 %oU4ܪeWS'Kz(ll$ `|+O.#jGkFKEsI~#e T|e6Xs%::jk5ĪHT1ܠ2t[ fx)aA|1mgϨT,ƪ9p5վ '`v@3vXv/ل}K65.57R c dm]{;PؼԪcs.~%3% #e#$ wGm{psw$\B ߻~#be*jU˟]v#W%W%&݁9,~]~B&W" I٪s.zuT 4MR vXv<ǡ塼Z}wh\D01y@U U~'cU3).B\^lbi; wxג+O~9*NY{>[MDit]D7ĕ+ꕾ΄ `-dLRkp\*0S̅KEGcT,N4ԪL$s / -ݐ:}EݕXeK75T{WUHVadJd mأTxgX_~9U,'ZrMJ*GxD:DEg 襤JL.犨(/GD'Jtf2HJo"]`MpJbؘāso}(Ua^Þcﭳ'Mڕ,V&~d -`HP쑪hySm^֊U^'YQR:Ȕ> EJوz8{ w 1#bemXu;H-C#W;}Mm+xÌyUj+X7_ް8QMk'`TݙL} 0fd{⨶òdq bC-Y'r99(?ߗWk=YlW_u;D_t!cD#O[z)V^"X^~*RB@\4ڍL)z0%VZA-jrՕbeV욿V^9$+^xYI_HQ@Z|X ֋Ūm*Q/"Sd}B>>sdCV(*HG yJJىl= JP03^{m8{#=ѶKrsI3姟vJ-p\&WLT]JgIR{0TIG^[bpEPY^A\uHo0RbTYwzɔ-TA!-Vk$z֫SFh!"S]>ߛ,~O9O_&U.kUYy=K**];QjW-B&WG6(Y3 rW/ƢUqx>gz=&_KLXgTgsW+[$+\Q<ҖAU8U,/)%5a¦qO,:c~8c!꫻x3wҴ TFORՀg'a%YFbfq6+"Zr͑,VIt0i %: 6 垓SJmeSrBmkk𔫈XKЭ beǨYXGLk_UӧJГLͧpwgd. eDmP|R(mоdh6C783mwKu*-ɲ $ sJVJ8VH\j/OlA]yF+GosߢTՊ@?\TɕCsCo@H؇HWn-WlՅ aҖ?m;7猭-lo7oY'=`m)Uj -kOjX6;P'[B]B]wJ{v#3U-M25kC~姆JVXE*DcWEvHj3du.Ե)XF3 UTPT~!кUuZ#n}.Qmy*&k{`mGG.S&faw6mXx7jɕZw/$'W|B} %'vhy{'YCVp!%YoFTNLlzvaɒTxxe8f5ȒGFsGJD\n>{y-xJڽ>VW"re!W6y3"W6i`H5*s"w`/8~W0 p,oV}/9RU[Am<$LS]\;3+{A=WIsVG>Dx$T;TɲwRY- N>6ҕ.?}-\yV6oUZy֧ 髒+vQ)Ws"Q¬e H`͛5ȣMp_,\zF_Ar-*%*V.оf_?hl2C6m޶!H+~o9P fփIRB&Y' 9XO'cHRD"5,%VO>=HTk1-+oD,'Y,ۭ^ZEG%wYk31V!W}46nPl)U%kpp'Xr)Y=_*6PxݠlCD,^'^kh.wuمFJ= _}@s{e +0mXKX::j+Dym RrzUʑ1-XM'X5l*)oSnZۙUhPRݸ$?p3[ǡf.C.V>jeiUH-D8E*BCHQ(etYp?C@(jn{d2τ\'W^&Sd ;bف:ko$<+=+=Y*WJJE]>2**<\5a"pva -qkwEu-i*B=^(xl4/P[(텀t.Zq yBT+zCrWhyRˆ\(X2be~ 47cXn˻> Hre6UVDrAX=(QOG+wOqu 2Rdj yo\ڑRm+Vo@!*AU;UȒ_ |z G*[\y7#C^5XbrU]؋&l=9:*_cuWvx.Gށm%t!%-޼h1A{=q?/{J b֍%Yf3&SeO*"[:eu u3u¹2|aTe [$Sg,^NjɔHF\cr mJ-C#W8Q*Rr=P*+~]^QՐAO8 ʠFOUS0*@J7Xԉl],%K,%{`RU~PYy{|94U {-vD @7!-`n1`Ub%_{,FdHO2L,bU4I]Id] s,1륶R<* GBb9mء  L1-o|B,3)֌ `8 a0 "/ ‹4 <0`cc^! (0^x A&  ecF?R7WnU:t{}{Sg Z!*3OJ7rMe0WX\-U~!P4X\@,~WA+Zc5WQ5 G1Q-KJC wq8s6 |g]-|,wyٗ@KҌ<Q$f̈́ܬ,Oihz$T=1̑6f\2((h1wvC4.K~x$…Z/0X7_=`GϏy*6nv?xm$A^ZM*_D:o98LVh*Zxmwjt< ,3ym 4S'GZ#/@r Ό/|aU]BK3ŋCBB,]_2;g/mW_YB,ӟWSOjvZ1ǢsB" F -)DYɪumK47Xؗ5k)]- 9Za-7X^ςHok,ڧ߉C@s` 4Uc`\y@/]+b\‚r(ȃ@}ׯ?'M %]=ɢ?|psnT"e} 7"}y>/ d_X'idͬH/yxtn]"mPůq1!M13SJakg߃m[.?]s赮$YLڌ{՗/k8X?]}% h>p-\6~$K ys|ߔ`uSo+EdiXZB9%V<'+*/,͹\s2??L?%z:ZEd9}[7(?rffI7o -jb!AGWLqE hqf~~v2{/cJKJs$\(CJMhBj ھV#iJUaYZP8/\aO6Ђ, \?O%{3 =O'h(hI,SZPs|8OD^#Ďr(j٥k65T$4`k jp\yk z=1h%*+-WE y8]W1 cFS܁Ata[o %sXrfw /OW_|,FݨXnO4_d/`љc+4#oz<- ZX 6}7LdΫ.+;++˭.Å^P Pg^ips/kiEeUؖ ?7 G`fןg=;,0)DOCB׵,Ö9X񛢼YPi" &lDeaAi|Qg q~%sEn5jnsDJ@h},𪕕P){ZRyM{Tف5u"Ap(PW_ IDAT Zp9NYWZEw D~pug0̌WmWf`4 b%. m Ypڭ%v1XbG& Kʻ=J BUM-A;o+i]UzTދ"Y4wGU®+y\]tӜhAl"3e.\W2 ܦpu3|[ XBCG/l᫬}wBʛ‚V>7ǒ6MZb1/KJ qjtEPa \YРg%s<#\wX \C[ѱ, -Q:s̅XTQ ZGK9YppYZ^6yÂV+,M,H%Y^"v$)ժHͨqQyyvZX2ʓjYI6Vq1` 5p%+04Oj's Xq3kZ%9Y2 !'YztN+,/7޸K_(._^Y7VDCo%vh݃K⡼GcO=p ,(ZL%2{/W0-fy9ZsejY/ɼ9q}5J]I&DY\ b+]+޷ZAi+TN|zJMpF94靤` %l}+][Kn kxj^QV`Im i%s%hiU{+ Ȋ( Wk큶XO\I8"Y]9X%Zku r0HO[zU헎US"|V(x,|!PVWZXs>.!Ce(czCV{6/%!&`ibCpakNڥR{۸4x2\y.Vt\W.'Vt~F"t?V.W" 8wEy)(\qk"܀`BF{ ܭʡBoˤwzVDNn k-jsxPa$T0qKG˚u(DBpE/u!dq'K k&!ɂmZxV,j s ^+ٯƵx\MW^.Vo*^!\e0~-)l:5KIZ:PEKdܹ%kWI}R]7 =T\-(ZVtZ+yy*lT{\iIrK~nyVtJs\+`oU W\(\…5ILzO)'P\iV]7Ɩ`a=AZtݹ#?=rJMuKR ˃,!CձX Y8\xch56]*l!_c}f]`6Pʪ9&eȃu$k׶{|oAVfiʰ1w!L̯3n.oCZ;{_qBs YN)pWY=>-8DРP᪟ jPa)G?ғ#B@?Li,X%,#uu[Ӑ_MBb&1>+`'\Ya(XE`jƥviu4׊5 {;?$kjdiߟm>T7 h;wOמi߫;6kf!P}9+~NlFkv'+'ecq#0X_eU+3LX Vڢ|LxYZ+/q݂.֕W9Mg ~ ?ΥW=ꣅU|_ /3` Z)?'K@z -i8%4H k(@W5@{1tВ3ܬ*%[k?VUK .Ih.7p4xoFU <*N]KX}ެV%Zhp/Ѱ\,yY@ ZV>V$\LCM;cY[ؐyngE%xm/]G^%o\^%,X9a|*+&cj!˘!xV@ vJdX֖1.rMl:'pF+㶫gpZ"VEm-[&PRyΕtZ1o #.- ,`hq_j(2hi(7ˮ&KůQ Gp"׌LkY Ņc3wJ˵"7ȃdrqPpcu8h?T`_bIxq*ROx*l' sH:~qnmXjYlj=cS+}Ⰼ^n?s74PB᜖]-jy~ hSP0sF'b4hYcq-qVlV^+`ؖS<;iU-ˮN%]8X1 m[uq?-bDY[LxBׯ_>0V(dӐ!x~^b!h"ǭkO*m"oVP-TOy3{9Y%WV^mFyV4;\\V9/J1\I`pX^hm͇{3㶫Lڀ"46}ob(9'>} ׮ k? }X}cGKkӾ<&GK_y*PL9m‡(@k6Bx…/ܩab5Q5S5^ڌ{-#aGVsԯ`5knWV+˽Â\ho֧Usǧ`}c5bIՙ k,>IGsZ:XyYOъ|V8^%-f *K1eUs^{T^}/OX}11/@"qqG e"jƸHk[U& (;VOyj]+-p-=~R9jY⣴m+]0S]]MkZ0`}:0 mYc9H*d6X~@6?k #m0"C> ־0!-ѽ^V8&7Jk[2_ X>PɶZbn0 TCu`Ux`۵t_~A^ŵ|6:Z<.Vxt5 w r~}"[G'}/V +E[m*9QQgmղKmRsB'l ѾZ/gʂ)y Tѭl3€nՉ[BOmϜ|vSX^aOiJ OUۮ# hǰω/#ǝtgj [h9skMUVrQnkaYd?Ph;׀Rm{ Hyc \m0 m[˵}.cW=6n|zv hKtNOx?Vb8AYzwBpT*;9hy}U؊TV.pIiy\zTOz@܍wΗ[!K*@w;ۯq,7K[FS [i`J)1Zm[pOD XKd.&C!bhbZ6"Q-/f4,+ VV? }9 =ܻ~ >sJk[#ao#a@+q}k֔x07J+ E:>U ]X n$`m@ /CϿ`í Z.*ĂZТmO@ C%вZdϏo [޹H_zy=!LN(<`$kIi,Ղ},rj< =x>myI X)K ,Z\, V.*,Chim=A ?tXZ5պt[7gf[j[ХE U0qE.R Tcrh@X-Xɾ%WJ/"%*dU 9TmyI=#㶫$`m@ /"VHTs"pEV»Y@=-m̺UzZ41^ۆaKkk-o?>>JI(klk[O T*JuxO{L +ɻ*Wwњ4S~zv XЂC;&硇 ǐ̻@C;A_S+A&!'h}V?l._m-ڱF`F(I:XV: ɼ*:o[卫+@ϳk]+~~VWsQ1^ ; ҹT_-$,Y5AJw֙h-=K׶w W|UĽ*bՂyU6V6ZYY}qj}V<ߖ4S*?-4G*nYldS' J_ ZmyZ@{@Zkuж;;ώg%Z}RCp5ѪV+y0u>mȘ! /خ/-]jMd~Ze=%GU+` o %`롇 =}{Ѓ#Z0`}1-B(!uТmK謔+^^zo+CZM. ^ڱRj,]ܰ.e CR͘Ҹ`E5V\MU `qJ&͆{ʺ{koB , fւ ++ٽ&DX,-dgZ@*? %K גU [tV";\t~Ɇ`qj8X@~)Q@U͘[ `U+.KX%׊?с(`qjZͽy'@RҼ?̻+I|55L׊׾֞2ez>lM}B߻6VPJڒa_:A-hAe}G=r:[P ({QyZศqz^/zܶkQu$^V*JRT*JR]:l RT*J7$2 '}{`(߇+߃zeQ 7f0JRel?*@%!T*JRJJRT*`RT*J[`RT*JuVV*JRTg%`RT*JuViHmU`^k}{Je{j+,^|ׯܧRQ:Xʪ/jU攟T+sRHJU|*GMOTjʛ{*JmV"Lm\阤ܧRR:XT*JRzT gRQOR&ZsJ?%`M&D>:$TW̛Lj}*u|VjʛLj}*uVjoyI-QOJmMyٜJD؜NV7IBVVoߜs[IDATJ-GϿԆUsCϏg?^|׫ܧRR:XBtZT*tRT*J:+T*JRJJRT*T*JRJJRT*T*JRJJRT*T*JRJJRT*T*JRJJRT*T*JRJJRT*T*JRJJRT*T*JR4EپIENDB`H/DdN  C *Aimage004b.Jqa'{3."_nz.Jqa'{3PNG  IHDR_[i IDATx{\TugUDEĻ *^kH^X_sm]Esm5o!". XDwTDa1Hf? 3x~p$I ""r "2T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aLPGPZ0IN`G3 ،v`ЍHV*0T""aXDD°Ra J%"JD$LT++Fk `rj#QơIrh2**AǏ.w"2*FUΝ0f̘~￿vZaaaݻwXYYyzzVWWO:Ǐ2dɓ'£ƞ:u*==EO>GQTEEE/vqq9rn;?7;;I࿁0<xCSrxse.c+uXˁ@`lx8u z]Ul;//d$ycbb\\\&O,IɓU*޽{%I:uꔳ$I322$IիWc4"Ꙫ7oƍG cǎeeeBBBz-jzРA VG@ \ @ Qi|Mt mF%=l`1  j`͓)8XJH7IO)/y4߹B2J I:;{Ĥ[XXjVVV ?mUJJJ 욘!QӦTWWWUU_rtĉ}qww TNNNQUUUeeeQQQVxXjIޚpJ3jKk"OW3.`  ak{*ӦTWUU07Ǖ+5u7h8uzBE߈TDt>>>/vss=ztaaaTT(J]>V=z-ϋSRn$&&*ugrLMM]\\̘1c׮]QQQgϞ#oL-pAy@^{7 nܻ\S٭>^݋qpTU@ǎקD{D%8qb=JKKyggg_!ƍ%IJKKsww!QTuu̞=;>>^w_VV 88X$'' Žwϟ,*I8~$H@H{qx$Ů{Y-\cSY6-Z>]ٳKJ=$@>],iX);y4߹?qF]-8qܼ\J=zٳgG٧O:uJHDZNKKsrruҥK 333׭[WPP0|~ ~ĉӦMF93tr  {F|\|~@``T؃kZHRL-INN?W9RQ)Kґ#RnRI5&;1BΥ&NA4/{R -Q hs`aH ڹf;sF;0NկɋJD$ +HV*0T""aXDD°Ra Z*֭[&L߿o޼)wf"z|g@aD^z z@y!dZ*uժU~~~O ;x_|񅳳ADfF]|` [o\rsΖ;ۥK$Ir力[~F<4Hk֙$ P7yR#=M7/qF60)4TZ36}~S?als͝;wZm]?zK/@1𡾾~4i9:"._= r# X(w z V=|VL|v]zU77PT.]4qD pR7L ̡D J .]B~uWB57Jj@kT??%KG /#}fݻ>P,#N`DyV>ᜀhs7nܘ>}zIIs|||۶mk5s[{6A@.ݛk5R^'U/ %n 3♚v`0*SDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°R1E1?aF;60Jq-;B=`Lr`;xȝY((w:<'"JD$ +HV*0T""aXDD°Ra J|{#~VV?$J%we6I͈JD$Tjp7&jch㩻o?fT[YuY>zr>Ǿ?3k>vϞ!8ya(xx`(?8wƌocZ^`)rM<|kNw7ɯ7*GFZ7Å >}/At4o`fFNfƂ#Gp._cUc>9saC1ade!=W=D7eK&&T ?de  \O?=㧟z^ W_/wp}0iS=~_!*iqT#6n?ԮS3;54fh?7ob.cU^۷agHH ,^ ~~+w0-={+@m}c<X{Rɓwo˔W85uЊV{#'_-YlJʠ+\2eJŋ:43suYP i@O?:;+]YA @w"<3%UG~V#aT*iݐ'1S#7V" ]~Z!{01iCZ"#ѺwΟOjT/FFa!0|?.FM ѵ}c TR >&A$h.R)iTV8jfK^`5ZmT(( @@q6V~ytLȿ$KZ=3M5QK]\eÍukJNhO70~P[caaDGC9~>9>>>`a77aHu O]Wكp1gd "S ##?as\'M7+eeu0@ T55.NXr̾aa|\.1> >. (1ϔ3K5Z !JZtcE5mk|MЦawb]ƙ8]^/kRG M M07Ǯ]ܸ!!x]8:"&nΞE۶=+V`8}f<pp=c7np:w7jkGt?ƍxر'""_+4֭oVЭW;t}jffK/=*_Dzѿ_Ⱦg,譮 wo cn>G}ݞhssx($8P(M:8~W=6n&NA}"q@4ԲSP4%HՁcuΡOqd<7umf̙rг8f2K%"JD$ +HV*0T""aXDD°Ra c<8 5@[+L#w"1*+1{6an8-w Q'",+Ci)nݒ5H Jo^3 䔔&y~ۤm,NoR09݂j~=wؿ˖a~QxY6ls*,l۫{sɝHU>ӽ3}r'ҷuD?fml6oXL1>};|/ wԗ/iƦu[R>3풿"wrGUW[h142}Q?%8{IImCr!9Y}f͸7oZ8:q׮M|ŗuڛw]Ƞu[YuX-FYj88 + uѫ3xo#"}u+(YϭTTzi{mKW\S5B捳3~AA %BRRT76w/ʒ=~ڿ@Qb]wzeGZ3fJQsrA&VnLN_{G3G?տyD"#" cXL(N1uWBmsPTM6FwO2uҳot'U[qyZi7,QY͛ ٳDlqVڴAi/w:4"ںΝo/}N;tzҊ|j;licÙտUֻc5&mLwQ*ǃ8vwG=֩5?&"j&T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""a SrG @̀=Uy1r/4!';S4~_`ߟb):iW}@HV*0T""aXDD°Ra J%"JD$W]{rGGrGhva&wofFӣ7գ7!B5aY B b@ 诧WX6Kdn~$T&MFm>J\: Ϣ֎OiVQZ[}aY_p͙|.ﳝѯzq5ڥ1B"O]QrYG 們d}_V~~;lcF4LKEj%*u+`UqN T5ԑ@{T%*w e([KDaYxf rx;ǻɹĔ'O5gzZRźyWˮ?ǥso_P\7-ߞgFvpvM6TV;#rtnC^>r”C/w S%hG(Vln+up od{!cu `ܕlvtncx7qIɵrUmE Lz{wZīWNZ?nJ>CO66hUk7'ܻ^^6շgMQ[ui+E^+5 YVڇ}cy/7`x[8ۊqjl1TMشkFaywVT+=Brzi⻀O8~^{EEoIWˮg\dwƤ|_fJWi4 T*C;903Q4__d3=z/nI=cjgNKY]fֶVJI+0?[hFP۶xaN[&fr 7)_f};sWh(1CpԮB]%w {+xEF eGRN=biF"2k6U0!+ ~ >6Z3o߽pWB[5nCֲ+5~U9q_ n|7יpK0Vtw) f򟯷3oۨ?EU(SkkX?NSU f6kFijaYE\qߒx>{J;祅ZZ-Zhu5)FqWtUB|'K|],j\ % A+7$驴PZm}U{dԀzot2__\3I}]|Q>'ywnݹϸthĿ͟TR%N𴻷MJU܆iKi2^Ъ~Z2aо~}p ؋Zh}+=FK Dd{k.)@v7μ]P8ͮZ.98o`a>s|ͥcrG c/5m,hkR>z՞iImY ډnEoʯsvnq_zՐ\FlMd7k[;>Ŗ+L,rFnF&n~%rٚ8K[܅]{gcњNPsʋ{i-)?{n~O/ `G[ŎRmC[3־6Ĥ){Χ߈A2Y5FlAI^+шP>Mwmk:+L~kF !vc~ Ty;2#cG,\/f{x0w9;1,̊G|:e$].jniJS.wQDhe?Apߗ__>A%!i!D]t0.OƼ:xNlf5t-P;ZT#]LzguiɡuMpr?|΃33緿ޣ5'<89):p芮0n:ˑ˟)n5ruT#qo+/]㻹-X4kwn]J^oa{ 8 y|?/1̬hKw#]N<0HEy݉aYOaܕGIr*mܴCn4kKD\i`Az#c+wj*^(B)-/B)DDFJD$ +HV*0T""aXDD°Ra J%"X$IDATJD$ +HV*0T""aXDD°Ra J%"JD$](EDԂHL?p#4p9rD=F J%"JD$ +HV*0T""aXDD°Ra!ZR1g1y2|ƍ;HzfMb8XdТA-[A;>+Ꜹ.c9v:4+: 1M,-EF߰Aeajꓽ{߹v4!8…6..Scc6>k䓇W޵KZ22򘯯ۓOZor߿ed '$mBRQXo/&..@A÷V=keX++҄ w\.,L=yr[aaB\pqkj)) ._VɘݻvѢE0nܸXjդI jo^UUo޸q^ѣn{oo/n۶L<*,$ᥗ8٩kjTi42ر Ǐ˝TZ^T5t舕+EFF :/Xpx^^;FfM_̊ܯ_Vt6x~Ӧkt_#q#gj̼Gի{ym9rǚ5cLȑU۷g͘`Nyy O<͛eeE?F3 @#/_V57ۿv`A{͛7n.__/ӧwncccǎe˖EDD69s; OxmZ][{F5_~o \0xÇncǚ1c䎩o-~/Uj/;K'N0L]ĉ#Vprw7bf@9qq6lg\/(cdJIIg\W(V+Vpww4;35UN7..'-h˖vʖ; ''n„ qQ*M7yrT۶n,,m+ 8pɒ%ӦMktװa6mڤh>sʺ|;wjkkkBѻwo}]vֶCtbw''K0U6`FbԜށ4FT6\lBں͕uMM- J~nܸnKj޽yAAEY?.B)I5sһv曚TPn>\`oӧO'''c332EP*V}tԴyˉ{Z11V? GgpwQ\ ''n؈VgxzХY;c{3uhѢφ|}}uR?;ne0Kf⋤3g|\\L[OZ^C YYZZVZXVq Nk]"h33疖V).V;uٲ46yyʪbcOW8pa^,ML }pScҖHIY0uj jkx^ S* 8pݺuaaa^{mڵfffVo&9vB;ukkv9wnieeZQQaiK6ŷnɝT hVp34zlww8u cSPHc WW8$wV8 @||n||)Z J%"JD$ +HV*0T""aXDD°RiEo4733/٣mZ|-s&pr̜ 4:zJ~k>-(.w&q;732@XXTӖVV;șin޼g*jƍ$.Z_~rll2u`nbwڼ>+{WtzZ*h;ggݢA_YqۻCtgg;e>%%w7Msz߀xy5ESD=e[zn9xur5U~~oܸ[\vo?\R׳-wS8սLy={]"o}llJe/9Xdd7??cnnRVV5&TlTֵ _/;H׿,Y',^xÆiBxyž520 K&޷_P*ӟ2֯-֟ h)T0.ݞ81]WT.q Fۗ+ڳ䜜Cn̙'?q&Lyf5*, ۷'5~^4ZolFsH'cԭDJZGP8o^In k/uR==qhFz(**ҥˉ'٥K}j:R\쳻ΜY0xj+a̕BBDG?[wJJϗ;0˖N]zTUiV#ж[ySlٲo޼frfšC{^|1bX厣?PJ `lxJуVQs` J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra c@J;`ReHV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0„s$>IENDB`@ Dd J   !"#$%&'()*+,-./012345789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~6Root Entry] F`5 Data 6L+WordDocument\fjObjectPool_0``_1113372307 F0`0`1TableCompObjhObjInfo      !"#$%&'()*+,-./0123.O89:;<=>@ABCDEFHIJKLMNRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font#  @V####l,2$וBZ\{$r;22@ܕz(  xC@ O 0N/ !N  3 "O `!!N  3 "`! b"!N  3 "b" s#!N  3 "s# $!N  3 "$ %!N  3 "% &!N   3 "& '!N   3 "' (!N   3 "( )!N   3 ") *!N   3 "* +!N  3 "+ ,!N  3 ", .!N  3 " . /!N  3 "/ 0!N  3 "O !`!"N  3 "`!!b""N  3 "b"!s#"N  3 "s#!$"N  3 "$!%"N  3 "%!&"N  3 "&!'"N  3 "'!("N  3 "(!)"N  3 ")!*"N  3 "*!+"N  3 "+!,"N  3 ",! ."N  3 " .!/"N   3 "/!0"N ! 3 "O "`!#N " 3 "`!"b"#N # 3 "b""s##N $ 3 "s#"$#N % 3 "$"%#N & 3 "%"&#N ' 3 "&"'#N ( 3 "'"(#N ) 3 "(")#N * 3 ")"*#N + 3 "*"+#N , 3 "+",#N - 3 "," .#N . 3 " ."/#N / 3 "/"0#N 0 3 "O #`!$N 1 3 "`!#b"$N 2 3 "b"#s#$N 3 3 "s##$$N 4 3 "$#%$N 5 3 "%#&$N 6 3 "&#'$N 7 3 "'#($N 8 3 "(#)$N 9 3 ")#*$N : 3 "*#+$N ; 3 "+#,$N < 3 ",# .$N = 3 " .#/$N > 3 "/#0$N ? 3 "O $`!%N @ 3 "`!$b"%N A 3 "b"$s#%N B 3 "s#$$%N C 3 "$$%%N D 3 "%$&%N E 3 "&$'%N F 3 "'$(%N G 3 "($)%N H 3 ")$*%N I 3 "*$+%N J 3 "+$,%N K 3 ",$ .%N L 3 " .$/%N M 3 "/$0%N N 3 "O %`!&N O 3 "`!%b"&N P 3 "b"%s#&N Q 3 "s#%$&N R 3 "$%%&N S 3 "%%&&N T 3 "&%'&N U 3 "'%(&N V 3 "(%)&N W 3 ")%*&N X 3 "*%+&N Y 3 "+%,&N Z 3 ",% .&N [ 3 " .%/&N \ 3 "/%0&N ] 3 "O &`!'N ^ 3 "`!&b"'N _ 3 "b"&s#'N ` 3 "s#&$'N a 3 "$&%'N b 3 "%&&'N c 3 "&&''N d 3 "'&('N e 3 "(&)'N f 3 ")&*'N g 3 "*&+'N h 3 "+&,'N i 3 ",& .'N j 3 " .&/'N k 3 "/&0'N l 3 "O '`!(N m 3 "`!'b"(N n 3 "b"'s#(N o 3 "s#'$(N p 3 "$'%(N q 3 "%'&(N r 3 "&''(N s 3 "''((N t 3 "(')(N u 3 ")'*(N v 3 "*'+(N w 3 "+',(N x 3 ",' .(N y 3 " .'/(N z 3 "/'0(N { 3 "O (`! *N | 3 "`!(b" *N } 3 "b"(s# *N ~ 3 "s#($ *N  3 "$(% *N  3 "%(& *N  3 "&(' *N  3 "'(( *N  3 "(() *N  3 ")(* *N  3 "*(+ *N  3 "+(, *N  3 ",( . *N  3 " .(/ *N  3 "/(0 *N  3 "O *`! +N  3 "`! *b" +N  3 "b" *s# +N  3 "s# *$ +N  3 "$ *% +N  3 "% *& +N  3 "& *' +N  3 "' *( +N  3 "( *) +N  3 ") ** +N  3 "* *+ +N  3 "+ *, +N  3 ", * . +N  3 " . */ +N  3 "/ *0 +N  3 "O +`!,N  3 "`! +b",N  3 "b" +s#,N  3 "s# +$,N  3 "$ +%,N  3 "% +&,N  3 "& +',N  3 "' +(,N  3 "( +),N  3 ") +*,N  3 "* ++,N  3 "+ +,,N  3 ", + .,N  3 " . +/,N  3 "/ +0,N  3 "O ,`!--N  3 "`!,b"--N  3 "b",s#--N  3 "s#,$--N  3 "$,%--N  3 "%,&--N  3 "&,'--N  3 "',(--N  3 "(,)--N  3 "),*--N  3 "*,+--N  3 "+,,--N  3 ",, .--N  3 " .,/--N  3 "/,0--N  3 "O --`!=.N  3 "`!--b"=.N  3 "b"--s#=.N  3 "s#--$=.N  3 "$--%=.N  3 "%--&=.N  3 "&--'=.N  3 "'--(=.N  3 "(--)=.N  3 ")--*=.N  3 "*--+=.N  3 "+--,=.N  3 ",-- .=.N  3 " .--/=.N  3 "/--0=.N  3 "O =.`!N/N  3 "`!=.b"N/N  3 "b"=.s#N/N  3 "s#=.$N/N  3 "$=.%N/G@ O 0P0  N  3 "%=.&N/N  3 "&=.'N/N  3 "'=.(N/N  3 "(=.)N/N  3 ")=.*N/N  3 "*=.+N/N  3 "+=.,N/N  3 ",=. .N/N  3 " .=./N/N  3 "/=.0N/N  3 "O N/`!P0N  3 "`!N/b"P0N  3 "b"N/s#P0N  3 "s#N/$P0N  3 "$N/%P0N  3 "%N/&P0T  C "O `!!T  C 3"`! b"!T  C f"b" s#!T  C "s# $!T  C "$ %!T  C "% &!T  C 3"& '!T  C 33"' (!T  C 3f"( )!T  C 3") *!T  C 3"* +!T  C 3"+ ,!T  C f", .!T  C f3" . /!T  C ff"/ 0!T  C f"O !`!"T  C f"`!!b""T  C f"b"!s#"T  C "s#!$"T  C 3"$!%"T  C f"%!&"T  C "&!'"T  C "'!("T  C "(!)"T  C ")!*"T  C 3"*!+"T  C f"+!,"T  C ̙",! ."T  C " .!/"T  C "/!0"T  C "O "`!#T  C 3"`!"b"#T  C f"b""s##T  C "s#"$#T  C "$"%#T  C "%"&#T  C 3"&"'#T  C 33"'"(#T  C 3f"(")#T  C 3")"*#T  C 3"*"+#T  C 3"+",#T  C 33"," .#T  C 333" ."/#T  C 33f"/"0#T   C 33"O #`!$T   C 33"`!#b"$T   C 33"b"#s#$T   C 3f"s##$$T   C 3f3"$#%$T  C 3ff"%#&$T  C 3f"&#'$T  C 3f"'#($T  C 3f"(#)$T  C 3")#*$T  C 33"*#+$T  C 3f"+#,$T  C 3",# .$T  C 3" .#/$T  C 3"/#0$T  C 3"O $`!%T  C 33"`!$b"%T  C 3f"b"$s#%T  C 3̙"s#$$%T  C 3"$$%%T  C 3"%$&%T  C 3"&$'%T  C 33"'$(%T   C 3f"($)%T ! C 3")$*%T " C 3"*$+%T # C 3"+$,%T $ C f",$ .%T % C f3" .$/%T & C ff"/$0%T ' C f"O %`!&T ( C f"`!%b"&T ) C f"b"%s#&T * C f3"s#%$&T + C f33"$%%&T , C f3f"%%&&T - C f3"&%'&T . C f3"'%(&T / C f3"(%)&T 0 C ff")%*&T 1 C ff3"*%+&T 2 C fff"+%,&T 3 C ff",% .&T 4 C ff" .%/&T 5 C ff"/%0&T 6 C f"O &`!'T 7 C f3"`!&b"'T 8 C ff"b"&s#'T 9 C f"s#&$'T : C f"$&%'T ; C f"%&&'T < C f"&&''T = C f3"'&('T > C ff"(&)'T ? C f̙")&*'T @ C f"*&+'T A C f"+&,'T B C f",& .'T C C f3" .&/'T D C ff"/&0'T E C f"O '`!(T F C f"`!'b"(T G C f"b"'s#(T H C "s#'$(T I C 3"$'%(T J C f"%'&(T K C "&''(T L C "''((T M C "(')(T N C 3")'*(T O C 33"*'+(T P C 3f"+',(T Q C 3",' .(T R C 3" .'/(T S C 3"/'0(T T C f"O (`! *T U C f3"`!(b" *T V C ff"b"(s# *T W C f"s#($ *T X C f"$(% *T Y C f"%(& *T Z C "&(' *T [ C 3"'(( *T \ C f"(() *T ] C ")(* *T ^ C "*(+ *T _ C "+(, *T ` C ",( . *T a C 3" .(/ *T b C f"/(0 *T c C ̙"O *`! +T d C "`! *b" +T e C "b" *s# +T f C "s# *$ +T g C 3"$ *% +T h C f"% *& +T i C "& *' +T j C "' *( +T k C "( *) +T l C ") ** +T m C 3"* *+ +T n C f"+ *, +T o C ", * . +T p C " . */ +T q C "/ *0 +T r C 3"O +`!,T s C 33"`! +b",T t C 3f"b" +s#,T u C 3"s# +$,T v C 3"$ +%,T w C 3"% +&,T x C f"& +',T y C f3"' +(,T z C ff"( +),T { C f") +*,T | C f"* ++,T } C f"+ +,,T ~ C ̙", + .,T  C ̙3" . +/,T  C ̙f"/ +0,T  C ̙"O ,`!--T  C ̙"`!,b"--T  C ̙"b",s#--T  C "s#,$--T  C 3"$,%--T  C f"%,&--T  C ̙"&,'--T  C "',(--T  C "(,)--T  C "),*--T  C 3"*,+--T  C f"+,,--T  C ",, .--T  C " .,/--T  C "/,0--T  C "O --`!=.T  C 3"`!--b"=.T  C f"b"--s#=.T  C "s#--$=.H  C "H  C "H  C 3"H  C 33"H  C 3f"H  C 3"H  C 3"H  C 3"H  C f"H  C f3"H  C ff"H  C f"H  C f"H  C f"H  C "H  C 3"H  C f"H  C "H  C " H  C " H  C " H  C 3" H  C f" H  C ̙"H  C "H  C "H  C "H  C 3"H  C f"H  C "H  C "B  3 "B S  ?  !#K\t;Kt*;t*ttt t t t t t to tm ot\ mtK \t; Kt* ;t *t t t  t  t t t t to tm o t\ m tK \ t; K ttt%@`U#p@UnknownGz Times New Roman5Symbol3& z Arial"hRuRu$I 0z2Q Joe Chuma Joe Chuma "#$%&'(*+,-/  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89qObjectPool 0`0`WordDocument7SummaryInformation( ?DocumentSummaryInformation8G7 #bjbjUU " 7|7|#l YYYceeeeee$ NYYYYYcYcccY ccYccccc |ccc0cccc "#jCJUmHnHsH u## 1hN N!I "# $Z%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@l(f@l(f՜.+,0 hp  TRIUMFl  Title_1113372015 F0`0`1TableQxCompObj hObjInfo/ i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Fonts  @Vssssl,2$7]/I!tdO>@(  xC@ #X#U,R* qN  3 ]#X#X$#N  3 ]X$X#$#N  3 ]$X#d%#N  3 ]d%X#%#N  3 ]%X#w&#N  3 ]w&X#'#N   3 ]'X#'#N   3 ]'X#(#N   3 ](X#(#N   3 ](X#!)#N   3 ]!)X#)#N  3 ])X#5*#N  3 ]5*X#*#N  3 ]*X#A+#N  3 ]A+X#+#N  3 ]+X#U,#N  3 ]##X$m$N  3 ]X$#$m$N  3 ]$#d%m$N  3 ]d%#%m$N  3 ]%#w&m$N  3 ]w&#'m$N  3 ]'#'m$N  3 ]'#(m$N  3 ](#(m$N  3 ](#!)m$N  3 ]!)#)m$N  3 ])#5*m$N  3 ]5*#*m$N   3 ]*#A+m$N ! 3 ]A+#+m$N " 3 ]+#U,m$N # 3 ]#m$X$$N $ 3 ]X$m$$$N % 3 ]$m$d%$N & 3 ]d%m$%$N ' 3 ]%m$w&$N ( 3 ]w&m$'$N ) 3 ]'m$'$N * 3 ]'m$($N + 3 ](m$($N , 3 ](m$!)$N - 3 ]!)m$)$N . 3 ])m$5*$N / 3 ]5*m$*$N 0 3 ]*m$A+$N 1 3 ]A+m$+$N 2 3 ]+m$U,$N 3 3 ]#$X$%N 4 3 ]X$$$%N 5 3 ]$$d%%N 6 3 ]d%$%%N 7 3 ]%$w&%N 8 3 ]w&$'%N 9 3 ]'$'%N : 3 ]'$(%N ; 3 ]($(%N < 3 ]($!)%N = 3 ]!)$)%N > 3 ])$5*%N ? 3 ]5*$*%N @ 3 ]*$A+%N A 3 ]A+$+%N B 3 ]+$U,%N C 3 ]#%X$&N D 3 ]X$%$&N E 3 ]$%d%&N F 3 ]d%%%&N G 3 ]%%w&&N H 3 ]w&%'&N I 3 ]'%'&N J 3 ]'%(&N K 3 ](%(&N L 3 ](%!)&N M 3 ]!)%)&N N 3 ])%5*&N O 3 ]5*%*&N P 3 ]*%A+&N Q 3 ]A+%+&N R 3 ]+%U,&N S 3 ]#&X$&N T 3 ]X$&$&N U 3 ]$&d%&N V 3 ]d%&%&N W 3 ]%&w&&N X 3 ]w&&'&N Y 3 ]'&'&N Z 3 ]'&(&N [ 3 ](&(&N \ 3 ](&!)&N ] 3 ]!)&)&N ^ 3 ])&5*&N _ 3 ]5*&*&N ` 3 ]*&A+&N a 3 ]A+&+&N b 3 ]+&U,&N c 3 ]#&X$'N d 3 ]X$&$'N e 3 ]$&d%'N f 3 ]d%&%'N g 3 ]%&w&'N h 3 ]w&&''N i 3 ]'&''N j 3 ]'&('N k 3 ](&('N l 3 ](&!)'N m 3 ]!)&)'N n 3 ])&5*'N o 3 ]5*&*'N p 3 ]*&A+'N q 3 ]A+&+'N r 3 ]+&U,'N s 3 ]#'X$'N t 3 ]X$'$'N u 3 ]$'d%'N v 3 ]d%'%'N w 3 ]%'w&'N x 3 ]w&'''N y 3 ]''''N z 3 ]''('N { 3 ]('('N | 3 ]('!)'N } 3 ]!)')'N ~ 3 ])'5*'N  3 ]5*'*'N  3 ]*'A+'N  3 ]A+'+'N  3 ]+'U,'N  3 ]#'X$/(N  3 ]X$'$/(N  3 ]$'d%/(N  3 ]d%'%/(N  3 ]%'w&/(N  3 ]w&''/(N  3 ]'''/(N  3 ]''(/(N  3 ]('(/(N  3 ]('!)/(N  3 ]!)')/(N  3 ])'5*/(N  3 ]5*'*/(N  3 ]*'A+/(N  3 ]A+'+/(N  3 ]+'U,/(N  3 ]#/(X$(N  3 ]X$/($(N  3 ]$/(d%(N  3 ]d%/(%(N  3 ]%/(w&(N  3 ]w&/('(N  3 ]'/('(N  3 ]'/(((N  3 ](/(((N  3 ](/(!)(N  3 ]!)/()(N  3 ])/(5*(N  3 ]5*/(*(N  3 ]*/(A+(N  3 ]A+/(+(N  3 ]+/(U,(N  3 ]#(X$=)N  3 ]X$($=)N  3 ]$(d%=)N  3 ]d%(%=)N  3 ]%(w&=)N  3 ]w&('=)N  3 ]'('=)N  3 ]'((=)N  3 ](((=)N  3 ]((!)=)N  3 ]!)()=)N  3 ])(5*=)N  3 ]5*(*=)N  3 ]*(A+=)N  3 ]A+(+=)N  3 ]+(U,=)N  3 ]#=)X$)N  3 ]X$=)$)N  3 ]$=)d%)N  3 ]d%=)%)N  3 ]%=)w&)N  3 ]w&=)')N  3 ]'=)')N  3 ]'=)()N  3 ](=)()N  3 ](=)!))N  3 ]!)=)))N  3 ])=)5*)N  3 ]5*=)*)N  3 ]*=)A+)N  3 ]A+=)+)N  3 ]+=)U,)N  3 ]#)X$R*N  3 ]X$)$R*N  3 ]$)d%R*N  3 ]d%)%R*N  3 ]%)w&R*N  3 ]w&)'R*N  3 ]')'R*N  3 ]')(R*F@ #X#U,+ pN  3 ]()(R*N  3 ]()!)R*N  3 ]!)))R*N  3 ]))5*R*N  3 ]5*)*R*N  3 ]*)A+R*N  3 ]A+)+R*N  3 ]+)U,R*N  3 ]#R*X$*N  3 ]X$R*$*N  3 ]$R*d%*N  3 ]d%R*%*N  3 ]%R*w&*N  3 ]w&R*'*N  3 ]'R*'*N  3 ]'R*(*N  3 ](R*(*N  3 ](R*!)*N  3 ]!)R*)*N  3 ])R*5**N  3 ]5*R***N  3 ]*R*A+*N  3 ]A+R*+*N  3 ]+R*U,*N  3 ]#*X$g+N  3 ]X$*$g+N  3 ]$*d%g+N  3 ]d%*%g+N  3 ]%*w&g+N  3 ]w&*'g+N  3 ]'*'g+N  3 ]'*(g+N  3 ](*(g+N  3 ](*!)g+N  3 ]!)*)g+N  3 ])*5*g+N  3 ]5***g+N  3 ]**A+g+N  3 ]A+*+g+N  3 ]+*U,g+N  3 ]#g+X$+N  3 ]X$g+$+N  3 ]$g+d%+N  3 ]d%g+%+N  3 ]%g+w&+N  3 ]w&g+'+N  3 ]'g+'+N  3 ]'g+(+N  3 ](g+(+N  3 ](g+!)+N  3 ]!)g+)+N  3 ])g+5*+N  3 ]5*g+*+N  3 ]*g+A++N  3 ]A+g+++N  3 ]+g+U,+T  C ]#X#X$#T  C ]X$X#$#T  C ]$X#d%#T  C  ]d%X#%#T  C  ]%X#w&#T   C ]w&X#'#T   C ]'X#'#T   C ]'X#(#T   C ](X#(#T   C ](X#!)#T  C ]!)X#)#T  C !])X#5*#T  C $]5*X#*#T  C ']*X#A+#T  C *]A+X#+#T  C -]+X#U,#T  C 0]##X$m$T  C 3]X$#$m$T  C 6]$#d%m$T  C 9]d%#%m$T  C <]%#w&m$T  C ?]w&#'m$T  C B]'#'m$T  C E]'#(m$T  C H](#(m$T  C K](#!)m$T  C N]!)#)m$T  C Q])#5*m$T   C T]5*#*m$T ! C W]*#A+m$T " C Z]A+#+m$T # C ]]+#U,m$T $ C `]#m$X$$T % C c]X$m$$$T & C f]$m$d%$T ' C i]d%m$%$T ( C l]%m$w&$T ) C o]w&m$'$T * C r]'m$'$T + C u]'m$($T , C x](m$($T - C {](m$!)$T . C ~]!)m$)$T / C ])m$5*$T 0 C ]5*m$*$T 1 C ]*m$A+$T 2 C ]A+m$+$T 3 C ]+m$U,$T 4 C ]#$X$%T 5 C ]X$$$%T 6 C ]$$d%%T 7 C ]d%$%%T 8 C ]%$w&%T 9 C ]w&$'%T : C ]'$'%T ; C ]'$(%T < C ]($(%T = C ]($!)%T > C ]!)$)%T ? C ])$5*%T @ C ]5*$*%T A C ]*$A+%T B C ]A+$+%T C C ]+$U,%T D C ]#%X$&T E C ]X$%$&T F C ]$%d%&T G C ]d%%%&T H C ]%%w&&T I C ]w&%'&T J C ]'%'&T K C ]'%(&T L C ](%(&T M C ](%!)&T N C ]!)%)&T O C ])%5*&T P C ]5*%*&T Q C ]*%A+&T R C ]A+%+&T S C ]+%U,&T T C ]#&X$&T U C ]X$&$&T V C ]$&d%&T W C ]d%&%&T X C ]%&w&&T Y C ]w&&'&T Z C ]'&'&T [ C ]'&(&T \ C  ](&(&T ] C  ](&!)&T ^ C ]!)&)&T _ C ])&5*&T ` C ]5*&*&T a C ]*&A+&T b C ]A+&+&T c C ]+&U,&T d C !]#&X$'T e C $]X$&$'T f C ']$&d%'T g C *]d%&%'T h C -]%&w&'T i C 0]w&&''T j C 3]'&''T k C 6]'&('T l C 9](&('T m C <](&!)'T n C ?]!)&)'T o C B])&5*'T p C E]5*&*'T q C H]*&A+'T r C K]A+&+'T s C N]+&U,'T t C Q]#'X$'T u C T]X$'$'T v C W]$'d%'T w C Z]d%'%'T x C ]]%'w&'T y C `]w&'''T z C c]''''T { C f]''('T | C i]('('T } C l]('!)'T ~ C o]!)')'T  C r])'5*'T  C u]5*'*'T  C x]*'A+'T  C {]A+'+'T  C ~]+'U,'T  C ]#'X$/(T  C ]X$'$/(T  C ]$'d%/(T  C ]d%'%/(T  C ]%'w&/(T  C ]w&''/(T  C ]'''/(T  C ]''(/(T  C ]('(/(T  C ]('!)/(T  C ]!)')/(T  C ])'5*/(T  C ]5*'*/(T  C ]*'A+/(T  C ]A+'+/(T  C ]+'U,/(H  C ]oH  C ]nH  C ]mH  C ]lH  C ]kH  C ]jH  C ]iH  C ]hH  C ]gH  C ]fH  C ]eH  C ]dH  C ]cH  C ]bH  C ]aH  C ]`H  C ]_H  C ]^H  C ]]H  C ]\H  C ][H  C ]ZH  C ]YH  C ]XH  C ]WH  C ]VH  C ]UH  C ]TH  C ]SH  C  ]RH  C  ]QH  C ]PH  C ]OH  C ]NH  C ]MH  C ]LH  C ]KH  C !]JH  C $]IH  C ']HH  C *]GH  C -]FH  C 0]EH  C 3]DH  C 6]CH  C 9]BH  C <]AH  C ?]@H  C B]?H  C E]>H  C H]=H  C K]<H  C N];H  C Q]:H  C T]9H  C W]8H  C Z]7H  C ]]6H  C `]5H  C c]4H  C f]3H  C i]2H  C l]1H  C o]0H  C r]/H  C u].H  C x]-H  C {],H  C ~]+H  C ]*H  C ])H  C ](H  C ]'H  C ]&H  C ]%H  C ]$H  C ]#H  C ]"H  C ]!H  C ] H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ] H  C ] H  C ] H  C ] H  C ] H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]H  C ]B  3 ]B S  ?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqsttttththtTtTtAtAt4t4t!t!t t ttttttththtTtTtAtAt4t4t!t!t t ttttttththtTtTtAtAt4t4t!t!t t ttrttrtrtthrtrhtTrtrTtArtrAt4rtr4t!rtr!t rtr trtrttrttrthrthrtTrtTrtArtArt4rt4rt!rt!rt rt rtrtettetetthetehtTeteTtAeteAt4ete4t!ete!t ete tetettettethethetTetTetAetAet4et4et!et!et et etetttu@gnsp@UnknownGz Times New Roman5Symbol3& z Arial"hMuNu$#U#0z2Q Joe Chuma Joe ChumaObjectPool0`0`WordDocumentSummaryInformation(DocumentSummaryInformation87 sbjbjUU " 7|7|sl TɼɼɼӼռռռռռռ$ *Nɼi` ɼɼɼӼiӼӼӼɼ ӼӼɼӼӼӼӼӼ cӼӼӼ$0TӼxӼxӼӼ rsjCJUmHnHsH uss 1hN N!#"V"#U#$"%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@F#@X@T՜.+,0 hp  TRIUMFl  Title_1113372236,4 F0`0`1Table~CompObjhObjInfo      !"#$%&'()*+,-H12345679:;<=>?ABCDEFGKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Fonts  @Vssssl,2$8N1&k65>I@(  xC@ O r/1-- qN  3 "O r`! N  3 "`!rb" N  3 "b"rs# N  3 "s#r$ N  3 "$r% N  3 "%r& N   3 "&r' N   3 "'r( N   3 "(r) N   3 ")r* N   3 "*r+ N  3 "+r, N  3 ",r . N  3 " .r/ N  3 "/r0 N  3 "0r/1 N  3 "O `!!N  3 "`! b"!N  3 "b" s#!N  3 "s# $!N  3 "$ %!N  3 "% &!N  3 "& '!N  3 "' (!N  3 "( )!N  3 ") *!N  3 "* +!N  3 "+ ,!N  3 ", .!N   3 " . /!N ! 3 "/ 0!N " 3 "0 /1!N # 3 "O !`!"N $ 3 "`!!b""N % 3 "b"!s#"N & 3 "s#!$"N ' 3 "$!%"N ( 3 "%!&"N ) 3 "&!'"N * 3 "'!("N + 3 "(!)"N , 3 ")!*"N - 3 "*!+"N . 3 "+!,"N / 3 ",! ."N 0 3 " .!/"N 1 3 "/!0"N 2 3 "0!/1"N 3 3 "O "`!#N 4 3 "`!"b"#N 5 3 "b""s##N 6 3 "s#"$#N 7 3 "$"%#N 8 3 "%"&#N 9 3 "&"'#N : 3 "'"(#N ; 3 "(")#N < 3 ")"*#N = 3 "*"+#N > 3 "+",#N ? 3 "," .#N @ 3 " ."/#N A 3 "/"0#N B 3 "0"/1#N C 3 "O #`!$N D 3 "`!#b"$N E 3 "b"#s#$N F 3 "s##$$N G 3 "$#%$N H 3 "%#&$N I 3 "&#'$N J 3 "'#($N K 3 "(#)$N L 3 ")#*$N M 3 "*#+$N N 3 "+#,$N O 3 ",# .$N P 3 " .#/$N Q 3 "/#0$N R 3 "0#/1$N S 3 "O $`!%N T 3 "`!$b"%N U 3 "b"$s#%N V 3 "s#$$%N W 3 "$$%%N X 3 "%$&%N Y 3 "&$'%N Z 3 "'$(%N [ 3 "($)%N \ 3 ")$*%N ] 3 "*$+%N ^ 3 "+$,%N _ 3 ",$ .%N ` 3 " .$/%N a 3 "/$0%N b 3 "0$/1%N c 3 "O %`!&N d 3 "`!%b"&N e 3 "b"%s#&N f 3 "s#%$&N g 3 "$%%&N h 3 "%%&&N i 3 "&%'&N j 3 "'%(&N k 3 "(%)&N l 3 ")%*&N m 3 "*%+&N n 3 "+%,&N o 3 ",% .&N p 3 " .%/&N q 3 "/%0&N r 3 "0%/1&N s 3 "O &`!'N t 3 "`!&b"'N u 3 "b"&s#'N v 3 "s#&$'N w 3 "$&%'N x 3 "%&&'N y 3 "&&''N z 3 "'&('N { 3 "(&)'N | 3 ")&*'N } 3 "*&+'N ~ 3 "+&,'N  3 ",& .'N  3 " .&/'N  3 "/&0'N  3 "0&/1'N  3 "O '`!(N  3 "`!'b"(N  3 "b"'s#(N  3 "s#'$(N  3 "$'%(N  3 "%'&(N  3 "&''(N  3 "''((N  3 "(')(N  3 ")'*(N  3 "*'+(N  3 "+',(N  3 ",' .(N  3 " .'/(N  3 "/'0(N  3 "0'/1(N  3 "O (`! *N  3 "`!(b" *N  3 "b"(s# *N  3 "s#($ *N  3 "$(% *N  3 "%(& *N  3 "&(' *N  3 "'(( *N  3 "(() *N  3 ")(* *N  3 "*(+ *N  3 "+(, *N  3 ",( . *N  3 " .(/ *N  3 "/(0 *N  3 "0(/1 *N  3 "O *`! +N  3 "`! *b" +N  3 "b" *s# +N  3 "s# *$ +N  3 "$ *% +N  3 "% *& +N  3 "& *' +N  3 "' *( +N  3 "( *) +N  3 ") ** +N  3 "* *+ +N  3 "+ *, +N  3 ", * . +N  3 " . */ +N  3 "/ *0 +N  3 "0 */1 +N  3 "O +`!,N  3 "`! +b",N  3 "b" +s#,N  3 "s# +$,N  3 "$ +%,N  3 "% +&,N  3 "& +',N  3 "' +(,N  3 "( +),N  3 ") +*,N  3 "* ++,N  3 "+ +,,N  3 ", + .,N  3 " . +/,N  3 "/ +0,N  3 "0 +/1,N  3 "O ,`!--N  3 "`!,b"--N  3 "b",s#--N  3 "s#,$--N  3 "$,%--N  3 "%,&--N  3 "&,'--N  3 "',(--F@ O r/1P0 pN  3 "(,)--N  3 "),*--N  3 "*,+--N  3 "+,,--N  3 ",, .--N  3 " .,/--N  3 "/,0--N  3 "0,/1--N  3 "O --`!=.N  3 "`!--b"=.N  3 "b"--s#=.N  3 "s#--$=.N  3 "$--%=.N  3 "%--&=.N  3 "&--'=.N  3 "'--(=.N  3 "(--)=.N  3 ")--*=.N  3 "*--+=.N  3 "+--,=.N  3 ",-- .=.N  3 " .--/=.N  3 "/--0=.N  3 "0--/1=.N  3 "O =.`!N/N  3 "`!=.b"N/N  3 "b"=.s#N/N  3 "s#=.$N/N  3 "$=.%N/N  3 "%=.&N/N  3 "&=.'N/N  3 "'=.(N/N  3 "(=.)N/N  3 ")=.*N/N  3 "*=.+N/N  3 "+=.,N/N  3 ",=. .N/N  3 " .=./N/N  3 "/=.0N/N  3 "0=./1N/N  3 "O N/`!P0N  3 "`!N/b"P0N  3 "b"N/s#P0N  3 "s#N/$P0N  3 "$N/%P0N  3 "%N/&P0N  3 "&N/'P0N  3 "'N/(P0N  3 "(N/)P0N  3 ")N/*P0N  3 "*N/+P0N  3 "+N/,P0N  3 ",N/ .P0N  3 " .N//P0N  3 "/N/0P0N  3 "0N//1P0T  C "O r`! T  C "`!rb" T  C "b"rs# T  C  "s#r$ T  C "$r% T   C "%r& T   C "&r' T   C "'r( T   C  "(r) T   C $")r* T  C ("*r+ T  C ,"+r, T  C 0",r . T  C 4" .r/ T  C 8"/r0 T  C <"0r/1 T  C @"O `!!T  C D"`! b"!T  C H"b" s#!T  C L"s# $!T  C P"$ %!T  C T"% &!T  C X"& '!T  C \"' (!T  C `"( )!T  C d") *!T  C h"* +!T  C l"+ ,!T   C p", .!T ! C t" . /!T " C x"/ 0!T # C |"0 /1!T $ C "O !`!"T % C "`!!b""T & C "b"!s#"T ' C "s#!$"T ( C "$!%"T ) C "%!&"T * C "&!'"T + C "'!("T , C "(!)"T - C ")!*"T . C "*!+"T / C "+!,"T 0 C ",! ."T 1 C " .!/"T 2 C "/!0"T 3 C "0!/1"T 4 C "O "`!#T 5 C "`!"b"#T 6 C "b""s##T 7 C "s#"$#T 8 C "$"%#T 9 C "%"&#T : C "&"'#T ; C "'"(#T < C "(")#T = C ")"*#T > C "*"+#T ? C "+",#T @ C "," .#T A C " ."/#T B C "/"0#T C C "0"/1#T D C "O #`!$T E C "`!#b"$T F C "b"#s#$T G C "s##$$T H C "$#%$T I C "%#&$T J C "&#'$T K C "'#($T L C "(#)$T M C ")#*$T N C "*#+$T O C "+#,$T P C ",# .$T Q C " .#/$T R C "/#0$T S C "0#/1$T T C "O $`!%T U C "`!$b"%T V C "b"$s#%T W C "s#$$%T X C "$$%%T Y C "%$&%T Z C "&$'%T [ C "'$(%T \ C "($)%T ] C ")$*%T ^ C "*$+%T _ C "+$,%T ` C ",$ .%T a C " .$/%T b C "/$0%T c C "0$/1%T d C "O %`!&T e C |"`!%b"&T f C x"b"%s#&T g C t"s#%$&T h C p"$%%&T i C l"%%&&T j C h"&%'&T k C d"'%(&T l C `"(%)&T m C \")%*&T n C X"*%+&T o C T"+%,&T p C P",% .&T q C L" .%/&T r C H"/%0&T s C D"0%/1&T t C @"O &`!'T u C <"`!&b"'T v C 8"b"&s#'T w C 4"s#&$'T x C 0"$&%'T y C ,"%&&'T z C ("&&''T { C $"'&('T | C  "(&)'T } C ")&*'T ~ C "*&+'T  C "+&,'T  C ",& .'T  C  " .&/'T  C "/&0'T  C "0&/1'T  C "O '`!(T  C "`!'b"(T  C "b"'s#(T  C  "s#'$(T  C "$'%(T  C "%'&(T  C "&''(T  C "''((T  C  "(')(T  C $")'*(T  C ("*'+(T  C ,"+',(T  C 0",' .(T  C 4" .'/(T  C 8"/'0(T  C <"0'/1(H  C @"oH  C D"nH  C H"mH  C L"lH  C P"kH  C T"jH  C X"iH  C \"hH  C `"gH  C d"fH  C h"eH  C l"dH  C p"cH  C t"bH  C x"aH  C |"`H  C "_H  C "^H  C "]H  C "\H  C "[H  C "ZH  C "YH  C "XH  C "WH  C "VH  C "UH  C "TH  C "SH  C "RH  C "QH  C "PH  C "OH  C "NH  C "MH  C "LH  C "KH  C "JH  C "IH  C "HH  C "GH  C "FH  C "EH  C "DH  C "CH  C "BH  C "AH  C "@H  C "?H  C ">H  C "=H  C "<H  C ";H  C ":H  C "9H  C "8H  C "7H  C "6H  C "5H  C "4H  C "3H  C "2H  C "1H  C "0H  C "/H  C ".H  C "-H  C ",H  C "+H  C "*H  C ")H  C "(H  C "'H  C "&H  C "%H  C "$H  C "#H  C ""H  C "!H  C " H  C |"H  C x"H  C t"H  C p"H  C l"H  C h"H  C d"H  C `"H  C \"H  C X"H  C T"H  C P"H  C L"H  C H"H  C D"H  C @"H  C <"H  C 8"H  C 4" H  C 0" H  C ," H  C (" H  C $" H  C  "H  C "H  C "H  C "H  C "H  C  "H  C "H  C "H  C "B S  ?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqstt t  t  t  t  to tmot\mtK\t;Kt*;t*ttttt t  t  t  t  to tmot\mtK\t;Kt*;t*ttt t t t t t t to tm ot\ mtK \t; Kt* ;t *t t t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  tt tu@4Hsp@UnknownGz Times New Roman5Symbol3& z Arial"hQuQu$I w0z2Q Joe Chuma Joe Chuma  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWorObjectPool0`0`WordDocument0SummaryInformation(8DocumentSummaryInformation8@7 sbjbjUU " 7|7|sl Zϼϼϼټۼۼۼۼۼۼ$ 0Nϼo` ϼϼϼټoټټټϼ ټټϼټټټټټ Xټټټ*0Zټ~ټ~ټټ rsjCJUmHnHsH uss 1hN N!I "#w$Z%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@&eB@&eB՜.+,0 hp  TRIUMFl  Title_1113373574 F0`0`1TableJxCompObj hObjInfo   i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Fonts  @Vssssl,2$ԑ;hF!/d@/@(  xC@ O r/1-- qN  3 "O r`! N  3 "`!rb" N  3 "b"rs# N  3 "s#r$ N  3 "$r% N  3 "%r& N   3 "&r' N   3 "'r( N   3 "(r) N   3 ")r* N   3 "*r+ N  3 "+r, N  3 ",r . N  3 " .r/ N  3 "/r0 N  3 "0r/1 N  3 "O `!!N  3 "`! b"!N  3 "b" s#!N  3 "s# $!N  3 "$ %!N  3 "% &!N  3 "& '!N  3 "' (!N  3 "( )!N  3 ") *!N  3 "* +!N  3 "+ ,!N  3 ", .!N   3 " . /!N ! 3 "/ 0!N " 3 "0 /1!N # 3 "O !`!"N $ 3 "`!!b""N % 3 "b"!s#"N & 3 "s#!$"N ' 3 "$!%"N ( 3 "%!&"N ) 3 "&!'"N * 3 "'!("N + 3 "(!)"N , 3 ")!*"N - 3 "*!+"N . 3 "+!,"N / 3 ",! ."N 0 3 " .!/"N 1 3 "/!0"N 2 3 "0!/1"N 3 3 "O "`!#N 4 3 "`!"b"#N 5 3 "b""s##N 6 3 "s#"$#N 7 3 "$"%#N 8 3 "%"&#N 9 3 "&"'#N : 3 "'"(#N ; 3 "(")#N < 3 ")"*#N = 3 "*"+#N > 3 "+",#N ? 3 "," .#N @ 3 " ."/#N A 3 "/"0#N B 3 "0"/1#N C 3 "O #`!$N D 3 "`!#b"$N E 3 "b"#s#$N F 3 "s##$$N G 3 "$#%$N H 3 "%#&$N I 3 "&#'$N J 3 "'#($N K 3 "(#)$N L 3 ")#*$N M 3 "*#+$N N 3 "+#,$N O 3 ",# .$N P 3 " .#/$N Q 3 "/#0$N R 3 "0#/1$N S 3 "O $`!%N T 3 "`!$b"%N U 3 "b"$s#%N V 3 "s#$$%N W 3 "$$%%N X 3 "%$&%N Y 3 "&$'%N Z 3 "'$(%N [ 3 "($)%N \ 3 ")$*%N ] 3 "*$+%N ^ 3 "+$,%N _ 3 ",$ .%N ` 3 " .$/%N a 3 "/$0%N b 3 "0$/1%N c 3 "O %`!&N d 3 "`!%b"&N e 3 "b"%s#&N f 3 "s#%$&N g 3 "$%%&N h 3 "%%&&N i 3 "&%'&N j 3 "'%(&N k 3 "(%)&N l 3 ")%*&N m 3 "*%+&N n 3 "+%,&N o 3 ",% .&N p 3 " .%/&N q 3 "/%0&N r 3 "0%/1&N s 3 "O &`!'N t 3 "`!&b"'N u 3 "b"&s#'N v 3 "s#&$'N w 3 "$&%'N x 3 "%&&'N y 3 "&&''N z 3 "'&('N { 3 "(&)'N | 3 ")&*'N } 3 "*&+'N ~ 3 "+&,'N  3 ",& .'N  3 " .&/'N  3 "/&0'N  3 "0&/1'N  3 "O '`!(N  3 "`!'b"(N  3 "b"'s#(N  3 "s#'$(N  3 "$'%(N  3 "%'&(N  3 "&''(N  3 "''((N  3 "(')(N  3 ")'*(N  3 "*'+(N  3 "+',(N  3 ",' .(N  3 " .'/(N  3 "/'0(N  3 "0'/1(N  3 "O (`! *N  3 "`!(b" *N  3 "b"(s# *N  3 "s#($ *N  3 "$(% *N  3 "%(& *N  3 "&(' *N  3 "'(( *N  3 "(() *N  3 ")(* *N  3 "*(+ *N  3 "+(, *N  3 ",( . *N  3 " .(/ *N  3 "/(0 *N  3 "0(/1 *N  3 "O *`! +N  3 "`! *b" +N  3 "b" *s# +N  3 "s# *$ +N  3 "$ *% +N  3 "% *& +N  3 "& *' +N  3 "' *( +N  3 "( *) +N  3 ") ** +N  3 "* *+ +N  3 "+ *, +N  3 ", * . +N  3 " . */ +N  3 "/ *0 +N  3 "0 */1 +N  3 "O +`!,N  3 "`! +b",N  3 "b" +s#,N  3 "s# +$,N  3 "$ +%,N  3 "% +&,N  3 "& +',N  3 "' +(,N  3 "( +),N  3 ") +*,N  3 "* ++,N  3 "+ +,,N  3 ", + .,N  3 " . +/,N  3 "/ +0,N  3 "0 +/1,N  3 "O ,`!--N  3 "`!,b"--N  3 "b",s#--N  3 "s#,$--N  3 "$,%--N  3 "%,&--N  3 "&,'--N  3 "',(--F@ O r/1P0 pN  3 "(,)--N  3 "),*--N  3 "*,+--N  3 "+,,--N  3 ",, .--N  3 " .,/--N  3 "/,0--N  3 "0,/1--N  3 "O --`!=.N  3 "`!--b"=.N  3 "b"--s#=.N  3 "s#--$=.N  3 "$--%=.N  3 "%--&=.N  3 "&--'=.N  3 "'--(=.N  3 "(--)=.N  3 ")--*=.N  3 "*--+=.N  3 "+--,=.N  3 ",-- .=.N  3 " .--/=.N  3 "/--0=.N  3 "0--/1=.N  3 "O =.`!N/N  3 "`!=.b"N/N  3 "b"=.s#N/N  3 "s#=.$N/N  3 "$=.%N/N  3 "%=.&N/N  3 "&=.'N/N  3 "'=.(N/N  3 "(=.)N/N  3 ")=.*N/N  3 "*=.+N/N  3 "+=.,N/N  3 ",=. .N/N  3 " .=./N/N  3 "/=.0N/N  3 "0=./1N/N  3 "O N/`!P0N  3 "`!N/b"P0N  3 "b"N/s#P0N  3 "s#N/$P0N  3 "$N/%P0N  3 "%N/&P0N  3 "&N/'P0N  3 "'N/(P0N  3 "(N/)P0N  3 ")N/*P0N  3 "*N/+P0N  3 "+N/,P0N  3 ",N/ .P0N  3 " .N//P0N  3 "/N/0P0N  3 "0N//1P0T  C "O r`! T  C "`!rb" T  C "b"rs# T  C  "s#r$ T  C "$r% T   C "%r& T   C "&r' T   C "'r( T   C  "(r) T   C $")r* T  C ("*r+ T  C ,"+r, T  C 0",r . T  C 4" .r/ T  C 8"/r0 T  C <"0r/1 T  C @"O `!!T  C D"`! b"!T  C H"b" s#!T  C L"s# $!T  C P"$ %!T  C T"% &!T  C X"& '!T  C \"' (!T  C `"( )!T  C d") *!T  C h"* +!T  C l"+ ,!T   C p", .!T ! C t" . /!T " C x"/ 0!T # C |"0 /1!T $ C "O !`!"T % C "`!!b""T & C "b"!s#"T ' C "s#!$"T ( C "$!%"T ) C "%!&"T * C "&!'"T + C "'!("T , C "(!)"T - C ")!*"T . C "*!+"T / C "+!,"T 0 C ",! ."T 1 C " .!/"T 2 C "/!0"T 3 C "0!/1"T 4 C "O "`!#T 5 C "`!"b"#T 6 C "b""s##T 7 C "s#"$#T 8 C "$"%#T 9 C "%"&#T : C "&"'#T ; C "'"(#T < C "(")#T = C ")"*#T > C "*"+#T ? C "+",#T @ C "," .#T A C " ."/#T B C "/"0#T C C "0"/1#T D C "O #`!$T E C "`!#b"$T F C  "b"#s#$T G C  "s##$$T H C "$#%$T I C "%#&$T J C "&#'$T K C "'#($T L C "(#)$T M C  ")#*$T N C ##"*#+$T O C &&"+#,$T P C ))",# .$T Q C ,," .#/$T R C 00"/#0$T S C 33"0#/1$T T C 66"O $`!%T U C 99"`!$b"%T V C <<"b"$s#%T W C ??"s#$$%T X C BB"$$%%T Y C FF"%$&%T Z C II"&$'%T [ C LL"'$(%T \ C OO"($)%T ] C RR")$*%T ^ C UU"*$+%T _ C XX"+$,%T ` C \\",$ .%T a C __" .$/%T b C bb"/$0%T c C ee"0$/1%T d C hh"O %`!&T e C kk"`!%b"&T f C nn"b"%s#&T g C qq"s#%$&T h C uu"$%%&T i C xx"%%&&T j C {{"&%'&T k C ~~"'%(&T l C "(%)&T m C ")%*&T n C "*%+&T o C "+%,&T p C ",% .&T q C " .%/&T r C "/%0&T s C "0%/1&T t C "O &`!'T u C "`!&b"'T v C "b"&s#'T w C "s#&$'T x C "$&%'T y C "%&&'T z C "&&''T { C "'&('T | C "(&)'T } C ")&*'T ~ C "*&+'T  C "+&,'T  C ",& .'T  C " .&/'T  C "/&0'T  C "0&/1'T  C "O '`!(T  C "`!'b"(T  C "b"'s#(T  C "s#'$(T  C "$'%(T  C "%'&(T  C "&''(T  C "''((T  C "(')(T  C ")'*(T  C "*'+(T  C "+',(T  C ",' .(T  C " .'/(T  C "/'0(T  C "0'/1(H  C "oH  C "nH  C "mH  C "lH  C "kH  C "jH  C "iH  C "hH  C "gH  C  "fH  C "eH  C "dH  C &"cH  C 0"bH  C 9"aH  C C"`H  C L"_H  C U"^H  C _"]H  C h"\H  C r"[H  C {"ZH  C "YH  C "XH  C "WH  C "VH  C "UH  C "TH  C "SH  C "RH  C "QH  C "PH  C "OH  C "NH  C "MH  C "LH  C "KH  C "JH  C "IH  C "HH  C "GH  C "FH  C "EH  C "DH  C "CH  C "BH  C "AH  C "@H  C "?H  C ">H  C "=H  C "<H  C ";H  C ":H  C "9H  C "8H  C "7H  C "6H  C "5H  C "4H  C "3H  C "2H  C "1H  C "0H  C "/H  C ".H  C "-H  C ",H  C "+H  C މ"*H  C ڇ")H  C օ"(H  C ҃"'H  C ΁"&H  C "%H  C }"$H  C {"#H  C y""H  C x"!H  C v" H  C t"H  C r"H  C p"H  C n"H  C l"H  C j"H  C f"H  C l "H  C r"H  C x"H  C ~("H  C 2"H  C ;"H  C E"H  C O"H  C Y"H  C c"H  C ŧl"H  C ɭv" H  C ͳ" H  C й" H  C Կ" H  C ŝ" H  C ˧"H  C б"H  C ֻ"H  C "H  C "H  C "H  C "H  C "B  3 "B S  ?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqstt t  t  t  t  to tmot\mtK\t;Kt*;t*ttttt t  t  t  t  to tmot\mtK\t;Kt*;t*ttt t t t t t t to tm ot\ mtK \t; Kt* ;t *t t t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  tt tu@ns@UnknownGz Times New Roman5Symbol3& z Arial"hgugu$I w0z2Q Joe Chuma Joe ChumaObjectPool"0`0`WordDocumentSummaryInformation(!#DocumentSummaryInformation87 sbjbjUU " 7|7|sl TɼɼɼӼռռռռռռ$ *Nɼi` ɼɼɼӼiӼӼӼɼ ӼӼɼӼӼӼӼӼ 0|__ӼӼӼ$0TӼxӼxӼӼ rsjCJUmHnHsH uss 1hN N!I "#w$Z%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@*-U@*-U՜.+,0 hp  TRIUMFl  Title_1108639604<& F0`0`1TableCompObj%( hObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph FontP-P Macro Text $a$@B*CJOJQJaJph*B* Body Textx!  @V!!!!l#"#,2$wᆴ+)@2 !" (  B  3 "B  3 "B  3 "B  3 "B  3 "B  3 "B   3 "B   3 "B   3 "B   3 "B   3 "B  3 "B  3 "B  3 "B  3 "B  3 "H  C "H  C "H  C  " H  C 0" H  C @" H  C P" H  C `" H  C p"H  C "H  C p"H  C `"H  C P"H  C @"H   C 0"H ! C  "H " C "B S  ? !"*/;1t!/*1t /1t/1t*;/t*/t/t/t*;t*ttt*;t*ttt*/;1t/*1t/1t/1t*;/t */t /t /t *;t *ttt*;t*ttt##@hsI!@UnknownG: Times New Roman5Symbol3& : Arial?5 z Courier New"hCsƧCs!I ,r02Q Joseph Chuma Joseph ChumaObjectPool'*0`0`WordDocumentSummaryInformation()+DocumentSummaryInformation87 !bjbjUU . 7|7|!l&&&&&&&ZZZZZ f Z~~~~~$| Z+&- +&&~~ @ &~&~&&~r ZZ V0:L&&&&  !jCJUmHnHsH u!!,1hN N!I "0*#,$Z% Oh+'0x  4 @ LX`hpss Joseph Chumaooseose Normal.dota Joseph Chumao2seMicrosoft Word 9.0@@Z@Z՜.+,0 hp  Exambot Educational Services   Title_1108794788$ . F0`0`1TableCompObj-0hObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font  @Vl,2$Tm39H)_!T!@\(  B  3 "B  3 "B  3 " B  3 " B  3 " B  3 " B   3 " B   3 "H   C "H   C "H   C "H  C "H  C "H  C "H  C "B  3 "B S  ? !#t!#t*!t!t!t *t t t !#t !#t*!t!t!t*ttt@}jp@UnknownGz Times New Roman5Symbol3& z Arial"hnRs&oRs&$I --0z2Q Joe Chuma Joe ChumadDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89qObjectPool/20`0`WordDocumentSummaryInformation(13DocumentSummaryInformation87 bjbjUU " 7|7|l H $  N   pE- 0H l l  jCJUmHnHsH u 1hN N!I ">+#--$Z%   n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmpqrstuvxyz{|}~Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@F#@c,@' -՜.+,0 hp  TRIUMFl  Title_1113372392D6 F0`0`1Table xCompObj58hObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Fonts  @Vssssl,2$ZxX1ꅑ4#)ED2@(  xC@ O r/1-- qN  3 "O r`! N  3 "`!rb" N  3 "b"rs# N  3 "s#r$ N  3 "$r% N  3 "%r& N   3 "&r' N   3 "'r( N   3 "(r) N   3 ")r* N   3 "*r+ N  3 "+r, N  3 ",r . N  3 " .r/ N  3 "/r0 N  3 "0r/1 N  3 "O `!!N  3 "`! b"!N  3 "b" s#!N  3 "s# $!N  3 "$ %!N  3 "% &!N  3 "& '!N  3 "' (!N  3 "( )!N  3 ") *!N  3 "* +!N  3 "+ ,!N  3 ", .!N   3 " . /!N ! 3 "/ 0!N " 3 "0 /1!N # 3 "O !`!"N $ 3 "`!!b""N % 3 "b"!s#"N & 3 "s#!$"N ' 3 "$!%"N ( 3 "%!&"N ) 3 "&!'"N * 3 "'!("N + 3 "(!)"N , 3 ")!*"N - 3 "*!+"N . 3 "+!,"N / 3 ",! ."N 0 3 " .!/"N 1 3 "/!0"N 2 3 "0!/1"N 3 3 "O "`!#N 4 3 "`!"b"#N 5 3 "b""s##N 6 3 "s#"$#N 7 3 "$"%#N 8 3 "%"&#N 9 3 "&"'#N : 3 "'"(#N ; 3 "(")#N < 3 ")"*#N = 3 "*"+#N > 3 "+",#N ? 3 "," .#N @ 3 " ."/#N A 3 "/"0#N B 3 "0"/1#N C 3 "O #`!$N D 3 "`!#b"$N E 3 "b"#s#$N F 3 "s##$$N G 3 "$#%$N H 3 "%#&$N I 3 "&#'$N J 3 "'#($N K 3 "(#)$N L 3 ")#*$N M 3 "*#+$N N 3 "+#,$N O 3 ",# .$N P 3 " .#/$N Q 3 "/#0$N R 3 "0#/1$N S 3 "O $`!%N T 3 "`!$b"%N U 3 "b"$s#%N V 3 "s#$$%N W 3 "$$%%N X 3 "%$&%N Y 3 "&$'%N Z 3 "'$(%N [ 3 "($)%N \ 3 ")$*%N ] 3 "*$+%N ^ 3 "+$,%N _ 3 ",$ .%N ` 3 " .$/%N a 3 "/$0%N b 3 "0$/1%N c 3 "O %`!&N d 3 "`!%b"&N e 3 "b"%s#&N f 3 "s#%$&N g 3 "$%%&N h 3 "%%&&N i 3 "&%'&N j 3 "'%(&N k 3 "(%)&N l 3 ")%*&N m 3 "*%+&N n 3 "+%,&N o 3 ",% .&N p 3 " .%/&N q 3 "/%0&N r 3 "0%/1&N s 3 "O &`!'N t 3 "`!&b"'N u 3 "b"&s#'N v 3 "s#&$'N w 3 "$&%'N x 3 "%&&'N y 3 "&&''N z 3 "'&('N { 3 "(&)'N | 3 ")&*'N } 3 "*&+'N ~ 3 "+&,'N  3 ",& .'N  3 " .&/'N  3 "/&0'N  3 "0&/1'N  3 "O '`!(N  3 "`!'b"(N  3 "b"'s#(N  3 "s#'$(N  3 "$'%(N  3 "%'&(N  3 "&''(N  3 "''((N  3 "(')(N  3 ")'*(N  3 "*'+(N  3 "+',(N  3 ",' .(N  3 " .'/(N  3 "/'0(N  3 "0'/1(N  3 "O (`! *N  3 "`!(b" *N  3 "b"(s# *N  3 "s#($ *N  3 "$(% *N  3 "%(& *N  3 "&(' *N  3 "'(( *N  3 "(() *N  3 ")(* *N  3 "*(+ *N  3 "+(, *N  3 ",( . *N  3 " .(/ *N  3 "/(0 *N  3 "0(/1 *N  3 "O *`! +N  3 "`! *b" +N  3 "b" *s# +N  3 "s# *$ +N  3 "$ *% +N  3 "% *& +N  3 "& *' +N  3 "' *( +N  3 "( *) +N  3 ") ** +N  3 "* *+ +N  3 "+ *, +N  3 ", * . +N  3 " . */ +N  3 "/ *0 +N  3 "0 */1 +N  3 "O +`!,N  3 "`! +b",N  3 "b" +s#,N  3 "s# +$,N  3 "$ +%,N  3 "% +&,N  3 "& +',N  3 "' +(,N  3 "( +),N  3 ") +*,N  3 "* ++,N  3 "+ +,,N  3 ", + .,N  3 " . +/,N  3 "/ +0,N  3 "0 +/1,N  3 "O ,`!--N  3 "`!,b"--N  3 "b",s#--N  3 "s#,$--N  3 "$,%--N  3 "%,&--N  3 "&,'--N  3 "',(--F@ O r/1P0 pN  3 "(,)--N  3 "),*--N  3 "*,+--N  3 "+,,--N  3 ",, .--N  3 " .,/--N  3 "/,0--N  3 "0,/1--N  3 "O --`!=.N  3 "`!--b"=.N  3 "b"--s#=.N  3 "s#--$=.N  3 "$--%=.N  3 "%--&=.N  3 "&--'=.N  3 "'--(=.N  3 "(--)=.N  3 ")--*=.N  3 "*--+=.N  3 "+--,=.N  3 ",-- .=.N  3 " .--/=.N  3 "/--0=.N  3 "0--/1=.N  3 "O =.`!N/N  3 "`!=.b"N/N  3 "b"=.s#N/N  3 "s#=.$N/N  3 "$=.%N/N  3 "%=.&N/N  3 "&=.'N/N  3 "'=.(N/N  3 "(=.)N/N  3 ")=.*N/N  3 "*=.+N/N  3 "+=.,N/N  3 ",=. .N/N  3 " .=./N/N  3 "/=.0N/N  3 "0=./1N/N  3 "O N/`!P0N  3 "`!N/b"P0N  3 "b"N/s#P0N  3 "s#N/$P0N  3 "$N/%P0N  3 "%N/&P0N  3 "&N/'P0N  3 "'N/(P0N  3 "(N/)P0N  3 ")N/*P0N  3 "*N/+P0N  3 "+N/,P0N  3 ",N/ .P0N  3 " .N//P0N  3 "/N/0P0N  3 "0N//1P0T  C "O r`! T  C "`!rb" T  C "b"rs# T  C "s#r$ T  C "$r% T   C "%r& T   C "&r' T   C "'r( T   C "(r) T   C  ")r* T  C  "*r+ T  C  "+r, T  C  ",r . T  C  " .r/ T  C "/r0 T  C "0r/1 T  C "O `!!T  C "`! b"!T  C "b" s#!T  C "s# $!T  C "$ %!T  C "% &!T  C "& '!T  C "' (!T  C "( )!T  C ") *!T  C "* +!T  C "+ ,!T   C ", .!T ! C " . /!T " C "/ 0!T # C "0 /1!T $ C  "O !`!"T % C !!!"`!!b""T & C """"b"!s#"T ' C ###"s#!$"T ( C $$$"$!%"T ) C %%%"%!&"T * C &&&"&!'"T + C '''"'!("T , C ((("(!)"T - C )))")!*"T . C ***"*!+"T / C +++"+!,"T 0 C ,,,",! ."T 1 C ---" .!/"T 2 C ..."/!0"T 3 C ///"0!/1"T 4 C 000"O "`!#T 5 C 111"`!"b"#T 6 C 222"b""s##T 7 C 333"s#"$#T 8 C 444"$"%#T 9 C 555"%"&#T : C 666"&"'#T ; C 777"'"(#T < C 888"(")#T = C 999")"*#T > C :::"*"+#T ? C ;;;"+",#T @ C <<<"," .#T A C ===" ."/#T B C >>>"/"0#T C C ???"0"/1#T D C @@@"O #`!$T E C AAA"`!#b"$T F C BBB"b"#s#$T G C CCC"s##$$T H C DDD"$#%$T I C EEE"%#&$T J C FFF"&#'$T K C GGG"'#($T L C HHH"(#)$T M C III")#*$T N C JJJ"*#+$T O C KKK"+#,$T P C LLL",# .$T Q C MMM" .#/$T R C NNN"/#0$T S C OOO"0#/1$T T C PPP"O $`!%T U C QQQ"`!$b"%T V C RRR"b"$s#%T W C SSS"s#$$%T X C TTT"$$%%T Y C UUU"%$&%T Z C VVV"&$'%T [ C WWW"'$(%T \ C XXX"($)%T ] C YYY")$*%T ^ C ZZZ"*$+%T _ C [[["+$,%T ` C \\\",$ .%T a C ]]]" .$/%T b C ^^^"/$0%T c C ___"0$/1%T d C ```"O %`!&T e C aaa"`!%b"&T f C bbb"b"%s#&T g C ccc"s#%$&T h C ddd"$%%&T i C eee"%%&&T j C fff"&%'&T k C ggg"'%(&T l C hhh"(%)&T m C iii")%*&T n C jjj"*%+&T o C kkk"+%,&T p C lll",% .&T q C mmm" .%/&T r C nnn"/%0&T s C ooo"0%/1&T t C ppp"O &`!'T u C qqq"`!&b"'T v C rrr"b"&s#'T w C sss"s#&$'T x C ttt"$&%'T y C uuu"%&&'T z C vvv"&&''T { C www"'&('T | C xxx"(&)'T } C yyy")&*'T ~ C zzz"*&+'T  C {{{"+&,'T  C |||",& .'T  C }}}" .&/'T  C ~~~"/&0'T  C "0&/1'T  C "O '`!(T  C "`!'b"(T  C "b"'s#(T  C "s#'$(T  C "$'%(T  C "%'&(T  C "&''(T  C "''((T  C "(')(T  C ")'*(T  C "*'+(T  C "+',(T  C ",' .(T  C " .'/(T  C "/'0(T  C "0'/1(H  C "oH  C "nH  C "mH  C "lH  C "kH  C "jH  C "iH  C "hH  C "gH  C "fH  C "eH  C "dH  C "cH  C "bH  C "aH  C "`H  C "_H  C "^H  C "]H  C "\H  C "[H  C "ZH  C "YH  C "XH  C "WH  C "VH  C "UH  C "TH  C "SH  C "RH  C "QH  C "PH  C "OH  C "NH  C "MH  C "LH  C "KH  C "JH  C "IH  C "HH  C "GH  C "FH  C "EH  C "DH  C "CH  C "BH  C "AH  C "@H  C "?H  C ">H  C "=H  C "<H  C ";H  C ":H  C "9H  C "8H  C "7H  C "6H  C "5H  C "4H  C "3H  C "2H  C "1H  C "0H  C "/H  C ".H  C "-H  C ",H  C "+H  C "*H  C ")H  C "(H  C "'H  C "&H  C "%H  C "$H  C "#H  C ""H  C "!H  C " H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C " H  C " H  C " H  C " H  C " H  C "H  C "H  C "H  C "H  C "H  C "H  C "H  C "B  3 "B S  ?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqstt t  t  t  t  to tmot\mtK\t;Kt*;t*ttttt t  t  t  t  to tmot\mtK\t;Kt*;t*ttt t t t t t t to tm ot\ mtK \t; Kt* ;t *t t t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  t  t  t  t t t t to tm o t\ m tK \ t; K t* ; t * t  t  tt tu@s@UnknownGz Times New Roman5Symbol3& z Arial"hSuSu$I w0z2Q Joe Chuma Joe ChumaObjectPool7:0`0`WordDocumentoSummaryInformation(9;wDocumentSummaryInformation87 sbjbjUU " 7|7|sl TɼɼɼӼռռռռռռ$ *Nɼi` ɼɼɼӼiӼӼӼɼ ӼӼɼӼӼӼӼӼ ӼӼӼ$0TӼxӼxӼӼ rsjCJUmHnHsH uss 1hN N!I "#w$Z%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@@՜.+,0 hp  TRIUMFl  Title_1108639841> F0`0`1TableCompObj=@hObjInfo i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph FontP-P Macro Text $a$@B*CJOJQJaJph*B* Body Textx!  @V!!!!l#"#,2$|I{(N#6@, !" (  B  3 "B  3 "B  3 "B  3 "B  3 "B  3 "B   3 "B   3 "B   3 "B   3 "B   3 "B  3 "B  3 "B  3 "B  3 "B  3 "H  C "H  C "H  C " H  C ---" H  C <<<" H  C KKK" H  C ZZZ" H  C iii"H  C xxx"H  C "H  C "H  C "H  C "H   C "H ! C "B " 3 "B S  ? !"*/;1t!/*1t /1t/1t*;/t*/t/t/t*;t*ttt*;t*ttt*/;1t/*1t/1t/1t*;/t */t /t /t *;t *ttt*;t*ttt##@!@UnknownG: Times New Roman5Symbol3& : Arial?5 z Courier New"hCsƫCs!I ,r02Q Joseph Chuma Joseph ChumaObjectPool?B0`0`WordDocumentSummaryInformation(ACDocumentSummaryInformation87 !bjbjUU . 7|7|!l&&&&&&&ZZZZZ f Z~~~~~$v Z%&' %&&~~ : &~&~&&~r PZZ P0:L&&&&  !jCJUmHnHsH u!!,1hN N!I "0*#,$Z% Oh+'0x  4 @ LX`hpss Joseph Chumaooseose Normal.dota Joseph Chumao2seMicrosoft Word 9.0@@r@r՜.+,0 hp  Exambot Educational Services   Title_1113376791LF F0`0.`1TableCompObjEHhObjInfo      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~F i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font "%(+.148<@DIMPSVY\_b "%(+.148<@DIMPSVY\_be  @V8,2$jQXg/)@ʠh(  XH@ &41 tHB  # "141HB  # "11HB  # "a11HB  # " a1 1HB  # "+a1,1HB  # "<a1=1HB   # "M1N1HB   # "^ a1_ 1HB   # "n!a1o!1HB   # ""a1"1HB   # "#a1#1HB  # "$1$1HB  # "%a1%1HB  # "&a1&1HB  # "'a1'1HB  # ")a1)1HB  # "*1*1HB  # "!+a1"+1HB  # "2,a13,1HB  # "Q-a1R-1HB  # "a.a1b.1HB  # "r/1s/1HB  # "0a101HB  # "1a111HB  # "2a121HB  # "3a131HB  # "4141HB  # "&1HB  # "1l1HB   # " 13 1HB ! # "m03n0HB " # "/3/HB # # "N/3O/HB $ # ".l.HB % # "!.3".HB & # "-3-HB ' # ",3,HB ( # "V,3W,HB ) # "+l+HB * # "(+3)+HB + # "*3*HB , # " *3 *HB - # "l)3m)HB . # "(l(HB / # ">(3?(HB 0 # "'3'HB 1 # "'3'HB 2 # "&3&HB 3 # "%l%HB 4 # "T%3U%HB 5 # "$3$HB 6 # "'$3($HB 7 # "#3#HB 8 # ""l"HB 9 # "j"3k"HB : # "!3!HB ; # "=!3>!HB < # " 3 HB = # " l HB > # "r3sHB ? # "3HB @ # "S3THB A # "3HB B # "&l'Z2 C S "^-.Z2 D S "l-.Z2 E S "-'-Z2 F S "u-5-Z2 G S "u-5-Z2 H S "u-5-Z2 I S "DX-`u-Z2 J S "-;-Z2 K S "),T,Z2 L S "T,q,Z2 M S ",,Z2 N S ",,Z2 O S "d,,Z2 P S ",+,Z2 Q S "+,Z2 R S "+.+Z2 S S ".+Y+Z2 T S "++Z2 U S "0~+[+Z2 V S "?~+[+Z2 W S "[~+x+Z2 X S "jp++Z2 Y S "xp++Z2 Z S "xp++Z2 [ S "p++Z2 \ S "p+ +Z2 ] S " b+A +Z2 ^ S "$ b+O +Z2 _ S ""+7"+Z2 ` S "E"+q"+Z2 a S "b"+"+Z2 b S "q"+",Z2 c S "",",Z2 d S "",#+,Z2 e S "9#+,V#V,Z2 f S "s#G,#r,Z2 g S "#d,#,Z2 h S "$,$,Z2 i S "$,-$,Z2 j S "$,<$,Z2 k S "Y$,$,Z2 l S "$,$-Z2 m S "$-$-Z2 n S ">%f-[%-Z2 o S "L%u-i%-Z2 p S "L%u-x%-Z2 q S "L%u-x%-Z2 r S "[%-%-Z2 s S "i%-%-Z2 t S "&w.&.Z2 u S "|'/'#/Z2 v S "'1/'N/Z2 w S "'1/'\/Z2 x S "'N/'k/Z2 y S "7(/S(/Z2 z S "b(/(/Z2 { S "(/)0Z2 | S "(/)0Z2 } S "d)B0)^0Z2 ~ S ")P0){0Z2  S ")P0){0Z2  S ")m0)0Z2  S "*0*0Z2  S "*0* 1Z2  S "*0* 1Z2  S "*0* 1Z2  S "+0/+1Z2  S "i+1+61Z2  S ",61#,R1Z2  S "#,61@,R1Z2  S "N,61k,a1Z2  S ",D1,a1Z2  S ",D1,a1Z2  S ",D1-a1Z2  S "|-61-a1Z2  S "-61-R1Z2  S "-61-R1Z2  S "/0*/0Z2  S "U/0/0Z2  S "r/0/0Z2  S "/0/0Z2  S "0m0-00Z2  S "X0B0t0^0Z2  S "t0300P0Z2  S "t0300P0Z2  S "1/!1/Z2  S "L1/h1/Z2  S "h1/1/Z2  S "1/1/Z2  S "1k/1/Z2  S "11/#2\/Z2  S "2#/12N/Z2  S "k2.2/Z2  S "2.2.Z2  S "2.2.Z2  S "43Z.P3w.Z2  S "43Z.P3w.Z2  S "P3=.{3h.Z2  S "3- 4-Z2  S "3- 4-Z2  S $$"l--Z2  S $$" --'X-Z2  S $$"R-o-Z2  S $$"`,-Z2  S $$",,Z2  S $$",,Z2  S $$"TV,,Z2  S $$"9,d,Z2  S $$",9,Z2  S $$",,Z2  S $$"++Z2  S $$"++Z2  S $$"++Z2  S $$"~+<+Z2  S $$"gb++Z2  S $$"S+p+Z2  S $$"S+p+Z2  S $$"(+E+Z2  S $$"z + E+Z2  S $$" (+ E+Z2  S $$" (+ E+Z2  S $$" (+!E+Z2  S $$"5!7+R!S+Z2  S $$"}!E+!b+Z2  S $$"!S+!p+Z2  S $$"!S+!p+Z2  S $$"!S+!p+Z2  S $$""p+E"+Z2  S $$"9#+V#,Z2  S $$"Y$,u$,Z2  S $$"u$,$,Z2  S $$"$,$,Z2  S $$"L%--i%I-Z2  S $$"L%--x%I-Z2  S $$"%u-%-Z2  S $$"%-%-L@ *41 sZ2  S $$"&-2&-Z2  S $$"@&-]&-Z2  S $$"O&-z&.Z2  S $$"l&-&.Z2  S $$"&=.&Z.Z2  S $$"&h.&'.Z2  S $$" 'h.&'.Z2  S $$"4'.`'.Z2  S $$"`'.'.Z2  S $$"`'.'.Z2  S $$"'.'.Z2  S $$"'.'.Z2  S $$"'.'/Z2  S $$"'/ (#/Z2  S $$"'/(1/Z2  S $$"b(N/(y/Z2  S $$"b(\/(y/Z2  S $$"p(\/(/Z2  S $$"(k/(/Z2  S $$"(y/(/Z2  S $$")/9)/Z2  S $$"+)/V)/Z2  S $$"V)/s)0Z2  S $$")0)30Z2  S $$")B0*^0Z2  S $$"*B0*^0Z2  S $$"*B0*^0Z2  S $$";*^0X*{0Z2  S $$"J*^0f*{0Z2  S $$"+0+0Z2  S $$"+0+0Z2  S $$",0#, 1Z2  S $$"k,0,1Z2  S $$",0,1Z2  S $$",0-1Z2  S $$"4-0Q-1Z2  S $$"_-0-1Z2  S $$"|-0- 1Z2  S $$"-0- 1Z2  S $$"(.0S.0Z2  S $$"~.0.0Z2  S $$".0.0Z2  S $$".0/0Z2  S $$"/P0/{0Z2  S $$"1//1/Z2  S $$"!1y/=1/Z2  S $$"L1k/h1/Z2  S $$"1@/1\/Z2  S $$"1.#2/Z2  S $$"2.12.Z2  S $$"k2.2.Z2  S $$"y2.2.Z2  S $$"2.2.Z2  S $$"2=.3Z.Z2  S $$"m3-3.Z2  S $$"m3-3.Z2  S $$"{3-3.Z2  S $$"3- 4-Z2  S $$"(4f-D4-Z2  S $$"S4;-~4X-Z2  S $$"a4--4X-Z2   S $$"o4--4I-Z2   S $$"4-4--Z2   S $$"4-4-Z2   S 88"--Z2   S 88"-;-Z2  S 88"---Z2  S 88"- -Z2  S 88"r,,Z2  S 88"8+,TG,Z2  S 88"q,,Z2  S 88"+,Z2  S 88"++Z2  S 88"b+~+Z2  S 88" +(+Z2  S 88"?*[ +Z2  S 88" * *Z2  S 88" * *Z2  S 88" * *Z2  S 88" !*&!*Z2  S 88" !*&!*Z2  S 88"!*5! +Z2  S 88"! +!(+Z2  S 88" "+)"E+Z2   S 88"T"7+"b+Z2 ! S 88""S+"p+Z2 " S 88""b+"+Z2 # S 88""p+#+Z2 $ S 88""~+#+Z2 % S 88"#+9#+Z2 & S 88"#+#+Z2 ' S 88"#,$,Z2 ( S 88"#,$,Z2 ) S 88"$,J$9,Z2 * S 88"J$9,g$V,Z2 + S 88"u$G,$r,Z2 , S 88"$r,$,Z2 - S 88"$r,$,Z2 . S 88"$,$,Z2 / S 88"%,0%,Z2 0 S 88"%-%--Z2 1 S 88"%;-%X-Z2 2 S 88"%X-&u-Z2 3 S 88"2&-O&-Z2 4 S 88"@&-l&-Z2 5 S 88"O&-z&-Z2 6 S 88"l&-&-Z2 7 S 88"&-&.Z2 8 S 88"&-&.Z2 9 S 88"&-&.Z2 : S 88"n'h.'.Z2 ; S 88"n'h.'.Z2 < S 88"'w.'.Z2 = S 88"'.'.Z2 > S 88"'.'.Z2 ? S 88"'.'.Z2 @ S 88"'.'.Z2 A S 88"'. (.Z2 B S 88" (.((.Z2 C S 88"(.7(.Z2 D S 88"((.E(/Z2 E S 88"7(.S(/Z2 F S 88"b(/(#/Z2 G S 88"(1/(N/Z2 H S 88"(1/(N/Z2 I S 88"(@/(\/Z2 J S 88"d)/)/Z2 K S 88"s)/)/Z2 L S 88")/)/Z2 M S 88"*/*0Z2 N S 88"*/-*0Z2 O S 88"*/-*0Z2 P S 88"f*%0*B0Z2 Q S 88">+m0Z+0Z2 R S 88"i+{0+0Z2 S S 88"+0+0Z2 T S 88"+0+0Z2 U S 88"#,0@,0Z2 V S 88"k,0,0Z2 W S 88"z,0,0Z2 X S 88"-0-0Z2 Y S 88"-0 .0Z2 Z S 88"-0.0Z2 [ S 88"-0(.0Z2 \ S 88"~.m0.0Z2 ] S 88".m0.0Z2 ^ S 88"*/30U/P0Z2 _ S 88"/0/30Z2 ` S 88"/0/30Z2 a S 88"///0Z2 b S 88"0/-0/Z2 c S 88"I0/f0/Z2 d S 88"0/0/Z2 e S 88"0k/0/Z2 f S 88"1.1/Z2 g S 88"1.#2.Z2 h S 88"@2w.\2.Z2 i S 88"\2Z.y2.Z2 j S 88" 3-%3.Z2 k S 88"_3-{3-Z2 l S 88"3f-3-Z2 m S 88"3;-4X-Z2 n S 88" 4-64I-Z2 o S 88"4-64;-Z2 p S LL"A--^I-Z2 q S LL"A--^I-Z2 r S LL" ,',Z2 s S LL"Dr,o,Z2 t S LL"oV,,Z2 u S LL"oV,r,Z2 v S LL"oV,r,Z2 w S LL",,Z2 x S LL"F+c+Z2 y S LL"c++Z2 z S LL"++Z2 { S LL"~++Z2 | S LL":E+eb+Z2 } S LL":E+eb+Z2 ~ S LL" +(+Z2  S LL"*+Z2  S LL"Y*v*Z2  S LL"v**Z2  S LL"**Z2  S LL"* *Z2  S LL"l * *Z2  S LL" * *Z2  S LL" * *Z2  S LL" * *Z2  S LL" *!*Z2  S LL"!*!*Z2  S LL"!* "*Z2  S LL" "*)"*Z2  S LL"H#S+e#~+Z2  S LL"H#b+s#~+Z2  S LL"s#p+#+Z2  S LL"s#p+#+Z2  S LL"#~+#+Z2  S LL"#~+#+Z2  S LL"#+#+Z2  S LL"#+$+L@ )40 ]rZ2  S LL"#+$+Z2  S LL"-$+J$+Z2  S LL"$,$+,Z2  S LL"$,$+,Z2  S LL"$+,$G,Z2  S LL"L%,i%,Z2  S LL"L%,i%,Z2  S LL"[%,x%,Z2  S LL"x%,%,Z2  S LL"%-&--Z2  S LL"$&--@&I-Z2  S LL"]&X-z&u-Z2  S LL"l&X-&-Z2  S LL"z&f-&-Z2  S LL"&-&-Z2  S LL"&- '-Z2  S LL"&'-C'.Z2  S LL"4'-`'.Z2  S LL"Q'.n'!.Z2  S LL"n'!.'=.Z2  S LL"'=.'Z.Z2  S LL"'=.'Z.Z2  S LL" (.((.Z2  S LL"S(.(.Z2  S LL"p(.(.Z2  S LL"(.(/Z2  S LL"(/(#/Z2  S LL")#/)@/Z2  S LL"+)@/V)\/Z2  S LL")y/)/Z2  S LL"*/-*/Z2  S LL"*0+%0Z2  S LL"+0/+30Z2  S LL"!+0>+B0Z2  S LL"+30+^0Z2  S LL"+P0,m0Z2  S LL"@,^0],{0Z2  S LL"N,^0z,{0Z2  S LL"k,^0,{0Z2  S LL",^0-0Z2  S LL"-^04-{0Z2  S LL"-P0-{0Z2  S LL"-P0-{0Z2  S LL"-P0-m0Z2  S LL"6.30a.^0Z2  S LL"a.30.P0Z2  S LL"r////Z2  S LL"////Z2  S LL"0@/0\/Z2  S LL"0@/0\/Z2  S LL"01/0N/Z2  S LL"0/0@/Z2  S LL"0/11/Z2  S LL"h1.1.Z2  S LL"w1.1.Z2  S LL"1w.1.Z2  S LL"2Z.#2w.Z2  S LL"N2!.k2=.Z2  S LL"B3u-_3-Z2  S LL"P3f-m3-Z2  S LL"3;-3X-Z2  S LL"3, 4-Z2  S LL"4,64,Z2  S LL"4,4,Z2  S ``"-I-Z2  S ``"-A-Z2  S ``"A,^-Z2  S ``"P,l,Z2  S ``",,Z2  S ``",,Z2  S ``"+,Z2  S ``"++Z2  S ``"+ +Z2  S ``"+ +Z2  S ``"E+p+Z2  S ``"7+b+Z2  S ``":*e+Z2  S ``"W*s+Z2  S ``"**Z2  S ``"K*g*Z2  S ``"|**Z2  S ``"_*0|*Z2  S ``"C*_*Z2  S ``" C*2 _*Z2  S ``" C*2 _*Z2  S ``"l C* _*Z2  S ``" C* _*Z2  S ``" C*!n*Z2  S ``"R!_*n!|*Z2  S ``"R!_*n!|*Z2  S ``"!n*!*Z2  S ``"!|* "*Z2  S ``"7"*T"*Z2  S ``"7"*T"*Z2  S ``"E"*q"*Z2  S ``"T"*q"*Z2  S ``""*"*Z2  S ``"#*+# +Z2  S ``"H# +e#(+Z2  S ``"e#+#7+Z2  S ``"#(+#E+Z2  S ``"#7+#S+Z2  S ``"#7+#S+Z2  S ``"#E+#b+Z2  S ``"#E+#p+Z2  S ``"#S+#p+Z2  S ``"#p+$+Z2  S ``"Y$+u$+Z2  S ``"$,%,Z2  S ``"!%+,>%G,Z2  S ``"!%+,>%G,Z2  S ``"[%V,x%r,Z2  S ``"%r,%,Z2  S ``"%,%,Z2  S ``"%,%,Z2  S ``"%,$&,Z2   S ``"&,$&,Z2   S ``"&'-C'-Z2   S ``"'.'!.Z2   S ``"'/.(L.Z2   S ``"b(w.(.Z2  S ``"(.).Z2  S ``").9)/Z2  S ``").9)/Z2  S ``").9)/Z2  S ``"G).d)#/Z2  S ``")#/)N/Z2  S ``"*k/-*/Z2  S ``"*k/;*/Z2  S ``"-*y/J*/Z2  S ``"f*/*/Z2  S ``"*/*/Z2  S ``">+/Z+/Z2  S ``"#,0@,%0Z2  S ``",0,30Z2  S ``",0,30Z2  S ``",0,30Z2  S ``"-0-30Z2  S ``"-0-%0Z2   S ``"-0-%0Z2 ! S ``"6./S.0Z2 " S ``"././Z2 # S ``"././Z2 $ S ``"G//r//Z2 % S ``"/y///Z2 & S ``"/y///Z2 ' S ``"0@/0k/Z2 ( S ``"0@/0\/Z2 ) S ``"-0#/X0N/Z2 * S ``";0#/X0@/Z2 + S ``"0.1.Z2 , S ``"h1w.1.Z2 - S ``"1L.1h.Z2 . S ``"1=.1Z.Z2 / S ``"1/.1L.Z2 0 S ``"2-2-Z2 1 S ``"2u-2-Z2 2 S ``"2u-2-Z2 3 S ``"3;-43f-Z2 4 S ``"_3-{3--Z2 5 S ``"_3-3--Z2 6 S ``"m3-3-Z2 7 S ``"D4d,o4,Z2 8 S ``"4+,4G,Z2 9 S tt",-Z2 : S tt"3,P,Z2 ; S tt"^,{,Z2 < S tt"^,{,Z2 = S tt"{r,,Z2 > S tt"d,,Z2 ? S tt"G,r,Z2 @ S tt"D+o,Z2 A S tt"}++Z2 B S tt"++Z2 C S tt"++Z2 D S tt")E+Fp+Z2 E S tt"8E+Tb+Z2 F S tt"+*W*Z2 G S tt"**Z2 H S tt"**Z2 I S tt"|**Z2 J S tt"|**Z2 K S tt"n**Z2 L S tt"g4*_*Z2 M S tt"*4*Z2 N S tt"" *M&*Z2 O S tt"M *j&*Z2 P S tt"M *x&*Z2 Q S tt")*Z2 R S tt") *Z2 S S tt") *Z2 T S tt" ) *Z2 U S tt" ) *Z2 V S tt"!*!C*Z2 W S tt"!&*!C*Z2 X S tt"!&*!C*Z2 Y S tt" "C*)"_*Z2 Z S tt"b"_*"|*Z2 [ S tt""n*"*Z2 \ S tt""n*"*L@ ])4/ &qZ2 ^ S tt""|*"*Z2 _ S tt""*"*Z2 ` S tt""*#*Z2 a S tt""*#*Z2 b S tt"V#*#*Z2 c S tt"V#*#*Z2 d S tt"$(+$E+Z2 e S tt"$7+<$S+Z2 f S tt"$7+<$S+Z2 g S tt"-$E+J$b+Z2 h S tt"Y$b+$~+Z2 i S tt"$+%+Z2 j S tt"$+%+Z2 k S tt"%9,%V,Z2 l S tt"%,$&,Z2 m S tt"&,$&,Z2 n S tt"l&,&,Z2 o S tt"z&,&,Z2 p S tt"&,&-Z2 q S tt"&-&--Z2 r S tt"&-&;-Z2 s S tt"'-'-Z2 t S tt"p(/.(Z.Z2 u S tt"(L.(h.Z2 v S tt"9).V).Z2 w S tt")/*1/Z2 x S tt"*#/;*@/Z2 y S tt"u*N/*k/Z2 z S tt"*N/*y/Z2 { S tt"*k/*/Z2 | S tt"+//+/Z2 } S tt"L+/i+/Z2 ~ S tt"+/,/Z2  S tt",/2,/Z2  S tt",/,/Z2  S tt",/,/Z2  S tt",/ -/Z2  S tt",/&-/Z2  S tt" ./(./Z2  S tt"6./S./Z2  S tt"E./a./Z2  S tt"p././Z2  S tt".k///Z2  S tt"/\/9/y/Z2  S tt"*/N/U/y/Z2  S tt"G/N/d/k/Z2  S tt"r/@//\/Z2  S tt"///1/Z2  S tt"0.0/Z2  S tt"0.0/Z2  S tt";0.X0.Z2  S tt"f0.0.Z2  S tt"f0.0.Z2  S tt"0.0.Z2  S tt"0w.1.Z2  S tt"!1Z.=1w.Z2  S tt"Z1/.w1L.Z2  S tt"w1.1=.Z2  S tt"1.1/.Z2  S tt"2X-2u-Z2  S tt"43,_3-Z2  S tt"B3,m3,Z2  S tt"S4,o49,Z2  S tt"4+4,Z2  S "+,Z2  S "'+R+Z2  S "b+~+Z2  S "S+p+Z2  S "T*q +Z2  S "**Z2  S "**Z2  S "**Z2  S "**Z2  S "&*Q*Z2  S "<)Y&*Z2  S "Y)v*Z2  S "")M)Z2  S "0)[)Z2  S "j))Z2  S "j))Z2  S "))Z2  S "))Z2  S "$ )A )Z2  S " ) )Z2  S " )!)Z2  S "5!)`!)Z2  S "!)!)Z2  S "!)" *Z2  S "!))"*Z2  S "T" *"4*Z2  S ""&*"C*Z2  S ""4*"Q*Z2  S ""4*"_*Z2  S "9#n*V#*Z2  S "e#*#*Z2  S "#*#*Z2  S "#*#*Z2  S "#*#*Z2  S "g$+$7+Z2  S "$7+$S+Z2  S "%+>%+Z2  S "!%+>%+Z2  S "%+%+Z2  S "%,%,Z2  S "&9,$&V,Z2  S "2&V,O&r,Z2  S "&,&,Z2  S " ',4'-Z2  S "&'-C'--Z2  S "&'-Q'--Z2  S "`'--|'I-Z2  S "'-'-Z2  S " (-((-Z2  S "S(-p(-Z2  S "p(-(.Z2  S "(!.(L.Z2  S ")Z.9)w.Z2  S ").).Z2  S ").).Z2  S ").*.Z2  S "f*.*#/Z2  S "*/*#/Z2  S "*/*1/Z2  S "*/*1/Z2  S "*1/!+N/Z2  S "!+@/L+\/Z2  S "w+N/+y/Z2  S "+k/,/Z2  S ",k/#,/Z2  S "@,y/k,/Z2  S ",y/,/Z2  S ",/,/Z2  S ",/,/Z2  S ",/,/Z2  S ",/,/Z2  S "-k/-/Z2  S "-k/-/Z2  S "-k/ ./Z2  S "S.N/p.y/Z2  S "a.N/.k/Z2  S ".@/.\/Z2  S ".1/.N/Z2  S ".1/.N/Z2  S "G//d/#/Z2  S "U/.//Z2  S "r/.//Z2  S "/./.Z2  S "/.0.Z2  S "/.0.Z2  S "0.-0.Z2  S "0.-0.Z2  S ";0.f0.Z2  S ";0.f0.Z2  S "L1-h1.Z2  S "2,2-Z2  S "2,2,Z2  S "2, 3,Z2  S " 3,%3,Z2  S "{3d,3,Z2  S "3V,3r,Z2  S "3G,3d,Z2  S " 4,(4,Z2  S "4+4+Z2  S "4+4+Z2  S "++Z2  S "++Z2  S "++Z2  S "++Z2  S "5S+Rp+Z2  S "R7+}b+Z2  S "}+E+Z2   S "* +Z2   S "**Z2   S "F*c*Z2   S "q**Z2   S "|**Z2  S "_*|*Z2  S "W *s4*Z2  S ")<)Z2  S ".)K)Z2  S "<)Y)Z2  S "g))Z2  S "g))Z2  S "v))Z2  S "))Z2  S "))Z2  S "z)0)Z2  S "]))Z2  S "$ ])A z)Z2  S "$ ])A z)Z2  S " ]) z)Z2  S " ]) )Z2  S " ]) )Z2  S " l) )Z2   S "!l)C!)Z2 ! S "C!z)`!)Z2 " S "C!z)n!)Z2 # S "`!z)!)Z2 $ S "}!)!)Z2 % S "}!)!)L@ (4\/ pZ2 ' S "!)")Z2 ( S "")7")Z2 ) S "q")")Z2 * S "")" *Z2 + S "")#&*Z2 , S "+#&*H#C*Z2 - S "#n*#*Z2 . S "#n*#*Z2 / S "$*-$*Z2 0 S "$*J$*Z2 1 S "<$*Y$*Z2 2 S "$*$+Z2 3 S "$*$+Z2 4 S "L%p+x%+Z2 5 S "&G,&r,Z2 6 S "&d,&,Z2 7 S "&r,&,Z2 8 S "S(-(-Z2 9 S "p(-(-Z2 : S "(-(-Z2 ; S ").9)/.Z2 < S ")=.)Z.Z2 = S ")Z.).Z2 > S ")h.).Z2 ? S "X*.u*.Z2 @ S "*.*.Z2 A S "*.*.Z2 B S "+./+/Z2 C S "L+/w+#/Z2 D S "+#/,@/Z2 E S ",1/,\/Z2 F S ",1/,\/Z2 G S ",1/ -\/Z2 H S "-1/4-\/Z2 I S "-#/-N/Z2 J S "-#/-N/Z2 K S "-#/-N/Z2 L S "-#/-@/Z2 M S " ./(.@/Z2 N S "(./S.1/Z2 O S "a./.#/Z2 P S "p...#/Z2 Q S ".../Z2 R S ".../Z2 S S "....Z2 T S "../.Z2 U S "*/.G/.Z2 V S "U/.r/.Z2 W S "0L.;0w.Z2 X S ";0=.X0h.Z2 Y S "I0=.t0Z.Z2 Z S "0-1.Z2 [ S "0-!1-Z2 \ S "1-/1-Z2 ] S "=1-Z1-Z2 ^ S "L1-h1-Z2 _ S "1f-1-Z2 ` S "1--2I-Z2 a S "@2,k2-Z2 b S "k2,2,Z2 c S "2,2,Z2 d S " 4+(4+Z2 e S "64+S4+Z2 f S "S4~+o4+Z2 g S "+%,Z2 h S "3+P+Z2 i S "l++Z2 j S "~++Z2 k S "~++Z2 l S "b++Z2 m S "o* +Z2 n S "* *Z2 o S "**Z2 p S ")_*T*Z2 q S "4*Q*Z2 r S "&*Q*Z2 s S "&*C*Z2 t S "))Z2 u S "))Z2 v S "z).)Z2 w S "vO)z)Z2 x S "A)])Z2 y S "2)?O)Z2 z S ")A)Z2 { S ")A)Z2 | S ")A)Z2 } S ")2)Z2 ~ S ") 2)Z2  S ") 2)Z2  S "z ) 2)Z2  S " ) 2)Z2  S "!$)C!A)Z2  S "n!2)!O)Z2  S "E"l)b")Z2  S "q")")Z2  S "")")Z2  S "#)+#)Z2  S "+#)V#)Z2  S "# *#4*Z2  S "$Q*-$n*Z2  S "g$|*$*Z2  S "$*$*Z2  S "$*$*Z2  S "$*$*Z2  S "$*%*Z2  S "%*!% +Z2  S "%*0% +Z2  S "i%7+%S+Z2  S "%+&+Z2  S "@&+l&+Z2  S "]&+z&,Z2  S "]&+z&,Z2  S "&,&9,Z2  S "&9,&V,Z2  S "&9,&d,Z2  S "&V,'r,Z2  S "|',',Z2  S "7(--S(I-Z2  S "(X-(u-Z2  S "(f-(-Z2  S "(-(-Z2  S "*=.;*h.Z2  S "-*L.X*h.Z2  S "*w.*.Z2  S "+./+.Z2  S "!+.>+.Z2  S "i+.+.Z2  S "+.+.Z2  S "],.z,/Z2  S "z,.,/Z2  S ",.,/Z2  S ",.,/Z2  S "B-.m-/Z2  S "-.-/Z2  S "-.-/Z2  S "-...Z2  S "S..p..Z2  S "../.Z2  S "..*/.Z2  S "/w.9/.Z2  S "/=./h.Z2  S "/!.0=.Z2  S ";0-X0.Z2  S "I0-f0.Z2  S "X0-0.Z2  S "t0-0-Z2  S "0-0-Z2  S "!1u-=1-Z2  S "/1f-Z1-Z2  S "=1X-Z1-Z2  S "1-1--Z2  S "1-1-Z2  S "1-1-Z2  S "2,#2-Z2  S "k2,2,Z2  S "2,2,Z2  S "2G,2r,Z2  S "B3,_3,Z2  S "3+3+Z2  S "3+3+Z2  S " 4p+(4+Z2  S "(4S+D4p+Z2  S "a4(+~4E+Z2  S "o4+47+Z2  S "~+A+Z2  S "3~+P+Z2  S "*+Z2  S "*+Z2  S "|**Z2  S "_*|*Z2  S " 4*)Q*Z2  S "&*8Q*Z2  S "))Z2  S "):)Z2  S "+)W)Z2  S ":)e)Z2  S "]))Z2  S "])z)Z2  S "])z)Z2  S "])z)Z2  S "A)l)Z2  S "$)<A)Z2  S ".$)KA)Z2  S "Y)2)Z2  S ")$)Z2  S "()Z2  S "?([(Z2  S "M(j(Z2  S "((Z2  S "( (Z2  S " ($ (Z2  S " ($ (Z2  S " (A (Z2  S "O (z (Z2  S " ( (Z2  S " ( (Z2  S " ( (Z2  S " ( (Z2  S " !(&!(Z2  S "R!(n!)L@ 0(4. oZ2  S "!(!)Z2  S "!)!$)Z2  S "7"$)T"A)Z2  S ""])"z)Z2  S ""l)#)Z2  S "#)#)Z2  S "#)#)Z2  S "#)$*Z2  S "#)$*Z2  S "$Q*$n*Z2  S "$*%*Z2  S "% +%(+Z2  S "$&p+@&+Z2  S "O&+z&+Z2  S "]&+z&+Z2  S "&+&+Z2  S "&+&+Z2  S "&+&,Z2  S "n'V,',Z2  S "',',Z2  S "(,E(,Z2  S "S(,(-Z2  S "b(-(-Z2  S ")f-+)-Z2  S "+)u-G)-Z2   S "V)-)-Z2   S ")-)-Z2   S ")-)-Z2   S "-*.J*!.Z2   S "f*.*=.Z2  S "!+Z.>+w.Z2  S "+.+.Z2  S "2,.N,.Z2  S ",.,.Z2  S ",.,.Z2  S ",. -.Z2  S "&-.B-.Z2  S "E.w.a..Z2  S "a.h.~..Z2  S ".h...Z2  S ".L..w.Z2  S ".L..h.Z2  S ".L..h.Z2  S "/.//.Z2  S "/./!.Z2  S "0u-0-Z2  S "0f-0-Z2  S "0I-1u-Z2   S "!1-=1I-Z2 ! S "L1-h1--Z2 " S "1,2,Z2 # S "k2G,2r,Z2 $ S "29,2V,Z2 % S "2+ 3,Z2 & S "43+P3+Z2 ' S "B3+_3+Z2 ( S "m3+3+Z2 ) S "3~+3+Z2 * S "3p+3+Z2 + S " 4+(47+Z2 , S "4+647+Z2 - S "4*4*Z2 . S "4*4*Z2 / S "4*4*Z2 0 S "S+p+Z2 1 S "E+3b+Z2 2 S "7+Ab+Z2 3 S "**Z2 4 S "* *Z2 5 S "**Z2 6 S "**Z2 7 S " *'*Z2 8 S " *'*Z2 9 S "R_*o|*Z2 : S "oQ*n*Z2 ; S "&*C*Z2 < S ")F)Z2 = S "))T)Z2 > S "e2)O)Z2 ? S ")2)Z2 @ S "()Z2 A S "()Z2 B S "(.)Z2 C S "K(g(Z2 D S "K(v(Z2 E S "Y((Z2 F S "("(Z2 G S "("(Z2 H S "M(j(Z2 I S "[(x(Z2 J S " x($ (Z2 K S " x($ (Z2 L S " x(2 (Z2 M S "$ x(A (Z2 N S "O x(z (Z2 O S " x( (Z2 P S " (&!(Z2 Q S ")"(E"(Z2 R S ")"(E"(Z2 S S "T"(")Z2 T S ""(")Z2 U S "")"$)Z2 V S "V#O)s#z)Z2 W S "e#])#z)Z2 X S "<$)Y$)Z2 Y S "J$)g$)Z2 Z S "$*$4*Z2 [ S "$C*%n*Z2 \ S "%*%*Z2 ] S "%*&+Z2 ^ S "@&7+l&S+Z2 _ S "]&S+&p+Z2 ` S "&p+&+Z2 a S "&+&+Z2 b S "4'+Q',Z2 c S "`','+,Z2 d S "'+,'G,Z2 e S "'d, (,Z2 f S " (r,((,Z2 g S "E(,p(,Z2 h S "S(,(,Z2 i S "(,(,Z2 j S "(,(-Z2 k S ")-);-Z2 l S "9);-d)X-Z2 m S "V)I-s)f-Z2 n S ")u-)-Z2 o S ")u-)-Z2 p S ")-)-Z2 q S ")-*-Z2 r S "X*-u*-Z2 s S "*-*.Z2 t S "*-*.Z2 u S "*-+!.Z2 v S "+./+/.Z2 w S "w+!.+L.Z2 x S ",=.#,h.Z2 y S "N,L.k,h.Z2 z S "],L.z,w.Z2 { S "],L.z,w.Z2 | S "z,L.,w.Z2 } S " -Z.&-w.Z2 ~ S "4-Z.Q-w.Z2  S " ./.6.Z.Z2  S "E./.a.L.Z2  S "~.!..=.Z2  S ".../.Z2  S ".../.Z2  S ".-/.Z2  S "r/-/-Z2  S "/-/-Z2  S "/-/-Z2  S "t0;-0f-Z2  S "0--0I-Z2  S "0-0--Z2  S "0-0--Z2  S "1,/1-Z2  S "1,/1-Z2  S "2+2,Z2  S "2+2+Z2  S "P3S+m3~+Z2  S "3+37+Z2  S "3 +3(+Z2  S "4*64*Z2  S "+7+Z2  S " +7+Z2  S "{**Z2  S "**Z2  S "R *}4*Z2  S "o)&*Z2  S ") *Z2  S "))Z2  S "))Z2  S ")))Z2  S "cl))Z2  S "$)A)Z2  S "(H$)Z2  S ":(W)Z2  S "e((Z2  S "((Z2  S "((Z2  S "((Z2  S "i((Z2  S "i((Z2  S "[(x(Z2  S "[(x(Z2  S "M(0i(Z2  S "0M(Mi(Z2  S "0([(Z2  S " 0($ M(Z2  S "$ 0(A M(Z2  S "^ 0( M(Z2  S " 0( [(Z2  S "R!M(n!i(Z2  S "}![(!x(Z2  S ""(E"(Z2  S ")"(E"(Z2  S "E"(b"(Z2  S "<$)Y$)Z2  S "J$)u$)L@ '4/.  nZ2  S "J$)u$)Z2  S "$)$)Z2  S "$)%*Z2  S "% *!%&*Z2  S "%*0%4*Z2  S "i%Q*%n*Z2  S "x%_*%|*Z2  S "%n*%*Z2  S "O&*l& +Z2  S "&(+&S+Z2  S "&p+'+Z2  S "'~+4'+Z2  S "&'+C'+Z2  S "',',Z2  S "b(d,(,Z2  S "(r,(,Z2  S "(,(,Z2  S "(,(,Z2  S "(,),Z2  S "9),V)-Z2  S "9),V)-Z2  S "G),d)-Z2  S "V)-)-Z2  S ");-)X-Z2  S ")I-*f-Z2  S ")I-*u-Z2  S "*f-;*-Z2  S "X*-u*-Z2  S "*-*-Z2  S "*-+-Z2  S "+-!+-Z2  S "#,.N,!.Z2  S "k,.,!.Z2  S ",.,/.Z2  S "--..Z2  S "--..Z2  S ".-6..Z2  S ".-E..Z2  S "E.-a..Z2  S "a.-~.-Z2  S "p.-.-Z2  S "p.-.-Z2  S ".-/-Z2  S "/-*/-Z2  S "/-9/-Z2  S "/X-/u-Z2  S "/I-0f-Z2  S "/;-0X-Z2  S "-0-I0;-Z2  S ";0-X0;-Z2  S "t0,0-Z2  S "t0,0-Z2  S "1,19,Z2  S "1,2+,Z2  S "12+N2,Z2  S "2p+2+Z2  S "_3*{3(+Z2  S "3*3*Z2  S "3*3*Z2  S "3*3*Z2  S "3* 4*Z2  S "4|*64*Z2  S "4&*4C*Z2  S "4*44*Z2  S "C*_*Z2  S "&*Q*Z2  S " * 4*Z2  S "R)o)Z2  S " O))l)Z2  S "A)8l)Z2  S ")A)F])Z2   S "F2)cO)Z2   S "F$)cO)Z2   S "()Z2   S "()Z2   S "()Z2   S "()Z2   S "((Z2   S "(+(Z2   S "(:(Z2   S "s((Z2   S "x((Z2   S "M(x(Z2   S "M(<i(Z2   S "(>(Z2   S "(0(Z2   S "0'M"(Z2   S "0'M"(Z2   S "j'(Z2   S "'(Z2   S "'(Z2   S "' (Z2   S " '$ (Z2   S "^ 'z (Z2   S " ' (Z2   S " ' (Z2   S " '!(Z2   S " '!(Z2   S " !'&!(Z2   S "&!'C!"(Z2   S "!(!0(Z2   S "!"( "M(Z2   S ")">(T"[(Z2   S ""i("(Z2 !  S ""(#(Z2 "  S "#(#(Z2 #  S "#(+#(Z2 $  S "H#(e#(Z2 %  S "V#(s#(Z2 &  S "e#(#(Z2 '  S "#(#(Z2 (  S "$$)<$O)Z2 )  S "$)$)Z2 *  S "$)$)Z2 +  S "$)!%)Z2 ,  S "[%)x%*Z2 -  S "]&*z&*Z2 .  S "`'p+|'+Z2 /  S "'+ (+Z2 0  S " (+((,Z2 1  S "7(,S(,Z2 2  S "(V,(,Z2 3  S "(V,(,Z2 4  S "),+),Z2 5  S "),+),Z2 6  S "G),s),Z2 7  S ")-*--Z2 8  S "*-;*;-Z2 9  S "J*--f*I-Z2 :  S "u*;-*X-Z2 ;  S "*I-*u-Z2 <  S "i+-+-Z2 =  S ",-@,-Z2 >  S "@,-],-Z2 ?  S ",-,-Z2 @  S "----Z2 A  S "----Z2 B  S "----Z2 C  S "----Z2 D  S " .-(.-Z2 E  S "a.-.-Z2 F  S "~.-.-Z2 G  S "~.-.-Z2 H  S "/-/I-Z2 I  S "/-/;-Z2 J  S "0,0,Z2 K  S "0,0,Z2 L  S "0,0,Z2 M  S "0r,1,Z2 N  S "1V,!1,Z2 O  S "=1+,Z1V,Z2 P  S "1+1,Z2 Q  S "1+1,Z2 R  S "1+2+Z2 S  S "2+12+Z2 T  S "12+N2+Z2 U  S "2E+2b+Z2 V  S " 3*%3+Z2 W  S "43*P3*Z2 X  S "B3*m3*Z2 Y  S "3_*3|*Z2 Z  S "3Q* 4|*Z2 [  S "o4)4*Z2 \  S "~4)4 *Z2 ]  S "**Z2 ^  S "%Q*An*Z2 _  S "3C*^_*Z2 `  S ")&*Z2 a  S ") *Z2 b  S "))Z2 c  S "D)`)Z2 d  S "`l))Z2 e  S "`l))Z2 f  S "2)O)Z2 g  S "x((Z2 h  S ""(M(Z2 i  S "("(Z2 j  S "''Z2 k  S ""'M'Z2 l  S "j''Z2 m  S " '2 'Z2 n  S "A '^ 'Z2 o  S "O 'l 'Z2 p  S "^ 'z 'Z2 q  S "z ' 'Z2 r  S "z ' 'Z2 s  S " ' 'Z2 t  S " ' 'Z2 u  S "!'5!'Z2 v  S "!'!'Z2 w  S "!'!'Z2 x  S "!'!'Z2 y  S ")"'E"(Z2 z  S "b"(""(Z2 {  S "">(#[(Z2 |  S "#(#(Z2 }  S "#($(Z2 ~  S "#($(Z2   S "#($(Z2   S "-$(J$)L@ '4- J mZ2   S "g$)$$)Z2   S "$$)$A)Z2   S "%)%)Z2   S "%&*$&C*Z2   S "&4*2&Q*Z2   S "@&Q*]&n*Z2   S "&*&*Z2   S "|'7+'S+Z2   S "'p+'+Z2   S "'~+'+Z2   S "(+7(+Z2   S "(+(,Z2   S "(,(,Z2   S ")G,9)d,Z2   S "G)V,d),Z2   S "),),Z2   S "),),Z2   S "),),Z2   S "-*,J*,Z2   S "u*,*-Z2   S "*-*;-Z2   S "*-+;-Z2   S "+X-+u-Z2   S ",f-#,-Z2   S ",f-#,-Z2   S ",u---Z2   S "Q-u-m--Z2   S "-f---Z2   S "-f---Z2   S "6.I-S.u-Z2   S "S.I-~.f-Z2   S ".;-.X-Z2   S ".-.;-Z2   S ".-/--Z2   S ".-/--Z2   S "/-9/--Z2   S "*/-U/-Z2   S "/,/,Z2   S "/,/,Z2   S "/,0,Z2   S "0,;0,Z2   S ";0,X0,Z2   S "I0r,t0,Z2   S "0V,0r,Z2   S "09,0V,Z2   S "1,!1+,Z2   S "L1+h1,Z2   S "L1+w1,Z2   S "1+1+Z2   S "1+1+Z2   S "2b+#2+Z2   S "12E+N2b+Z2   S "2*2(+Z2   S "2*2*Z2   S "2*2*Z2   S "2* 3*Z2   S "2* 3*Z2   S " 3*%3*Z2   S " 3*%3*Z2   S "_3n*{3*Z2   S "3&*3Q*Z2   S "3&*3C*Z2   S "3 * 4&*Z2   S "3)4*Z2   S "3)P*Z2   S "A)l*Z2   S "P){ *Z2   S "))Z2   S "))Z2   S "))Z2   S "))Z2   S "()Z2   S "((Z2   S ")(F(Z2   S "[(x(Z2   S ""(:>(Z2   S "''Z2   S "Y'v'Z2   S "v''Z2   S "''Z2   S "0g'M'Z2   S "[Y''Z2   S "Y'v'Z2   S "J' v'Z2   S " Y' v'Z2   S " Y' !v'Z2   S "5!g'`!'Z2   S "!' "'Z2   S "H#"(e#>(Z2   S "#i(#(Z2   S "$(J$(Z2   S "Y$($(Z2   S "$($)Z2   S "$($$)Z2   S "$)$$)Z2   S "$)%A)Z2   S "%)%)Z2   S "%)%)Z2   S "O&*z&4*Z2   S "&_*&*Z2   S "&* '*Z2   S "&*&'*Z2   S "4'*Q'*Z2   S "'+'7+Z2   S "S(~+p(+Z2   S "p(+(+Z2   S "(+(+Z2   S ")++),Z2   S ")G,)d,Z2   S ")d,*,Z2   S ")d,*,Z2   S ")d,*,Z2   S "u*,*,Z2   S "*,*,Z2   S "*,*,Z2   S "*,+,Z2   S "+,/+-Z2   S "/+,L+-Z2   S "+-+--Z2   S "+-+--Z2   S ",-2,;-Z2   S "2,-N,;-Z2   S "],-,I-Z2   S ",--,I-Z2   S "4---Q-I-Z2   S "B---_-I-Z2   S "_---I-Z2   S "---;-Z2   S "---;-Z2   S "---;-Z2   S " .-6.--Z2   S "6.-S.-Z2   S ".,.-Z2   S ".,.,Z2   S "/,G/,Z2   S "U/,r/,Z2   S "/r,/,Z2   S "/V,0,Z2   S "0V,-0r,Z2   S "X0+,0G,Z2   S "t0,09,Z2   S "0,0+,Z2   S "0,0,Z2   S "/1+L1+Z2   S "h1~+1+Z2   S "1b+1~+Z2   S "1b+1~+Z2   S "17+1S+Z2   S "\2*y2*Z2   S "2*2*Z2   S "2*2*Z2   S "2*2*Z2   S " 3_*%3|*Z2   S "%3C*B3n*Z2   S "P34*m3Q*Z2   S "m3*34*Z2   S "3)4)Z2   S "64)S4)Z2   S "S4z)o4)Z2 !  S "S4z)o4)Z2 "  S "o4])4z)Z2 #  S "o4])4z)Z2 $  S "4A)4l)Z2 %  S "42)4O)Z2 &  S ") *Z2 '  S "$)'A)Z2 (  S ")52)Z2 )  S "((Z2 *  S "( (Z2 +  S "x((Z2 ,  S "TM(qi(Z2 -  S "("(Z2 .  S "'(Z2 /  S "'(Z2 0  S "v''Z2 1  S ".'Y'Z2 2  S ".'Y'Z2 3  S ".'Y'Z2 4  S "j'.'Z2 5  S "'.'Z2 6  S "'.'Z2 7  S "'.'Z2 8  S "'.'Z2 9  S "$ 'A 'Z2 :  S "2 'O 'Z2 ;  S "A '^ 'Z2 <  S " ' .'Z2 =  S "R!'n!<'Z2 >  S "R!'n!<'Z2 ?  S "!J'!g'Z2 @  S "!J' "g'Z2 A  S "q"v'"'Z2 B  S ""'"'Z2 C  S ""'"'Z2 D  S ""'"'Z2 E  S ""'#'Z2 F  S "#'H#'Z2 G  S "9#'e#'Z2 H  S "H#'s#'Z2 I  S "#(#"(L@ s&4-  lZ2 K  S "#(#0(Z2 L  S "#"(#>(Z2 M  S "$($(Z2 N  S "$($(Z2 O  S "i%$)%A)Z2 P  S "%A)%])Z2 Q  S "%])%)Z2 R  S "$&)O&)Z2 S  S "O&)l&)Z2 T  S "&)&*Z2 U  S "&&*&C*Z2 V  S " 'Q*&'n*Z2 W  S "'*'*Z2 X  S "'*' +Z2 Y  S "b(E+(b+Z2 Z  S "(b+(~+Z2 [  S ")++)+Z2 \  S ")++)+Z2 ]  S ")+9)+Z2 ^  S "d)+)+Z2 _  S ")+),Z2 `  S ")+),Z2 a  S ")+,*G,Z2 b  S ";*G,X*d,Z2 c  S "J*G,u*r,Z2 d  S "X*V,u*r,Z2 e  S "*r,*,Z2 f  S "*,+,Z2 g  S "!+,>+,Z2 h  S "+,+,Z2 i  S "+,+,Z2 j  S "+,+,Z2 k  S ",,,-Z2 l  S "|-,-,Z2 m  S "|-,-,Z2 n  S "-,-,Z2 o  S "-,-,Z2 p  S "-,-,Z2 q  S "6.,S.,Z2 r  S ".,.,Z2 s  S ".,.,Z2 t  S "/r,*/,Z2 u  S "/G,/d,Z2 v  S "/9,/d,Z2 w  S "/9,/V,Z2 x  S "/+,/G,Z2 y  S "/,09,Z2 z  S "0,;0,Z2 {  S "0,;0,Z2 |  S ";0+f0,Z2 }  S "X0+t0,Z2 ~  S "0+0+Z2   S "=1S+Z1~+Z2   S "1 +1(+Z2   S "1 +1(+Z2   S "1*1+Z2   S "1*1+Z2   S "1*1 +Z2   S "12*N2*Z2   S "3 *43&*Z2   S "_3){3)Z2   S "4(4)Z2   S "4(4)Z2   S "4(4(Z2   S "))Z2   S "2)O)Z2   S ")A)Z2   S "i((Z2   S "''Z2   S "''Z2   S "''Z2   S "':'Z2   S "J'g'Z2   S "<'Y'Z2   S ".'J'Z2   S ".'Y.'Z2   S "g''Z2   S "&'Z2   S "&'Z2   S "0&[&Z2   S " & &Z2   S " & &Z2   S " & !&Z2   S "`!&}!&Z2   S "n!&!'Z2   S "!&!'Z2   S "!&!'Z2   S "7"'T".'Z2   S ""<'"Y'Z2   S ""J'"g'Z2   S ""Y'#'Z2   S ""g'#'Z2   S "V#'#'Z2   S "#'#'Z2   S "#'#'Z2   S "#'#'Z2   S "#'#'Z2   S "$(J$"(Z2   S "$[($(Z2   S "$(%(Z2   S ">%([%(Z2   S "i%(%(Z2   S "%(%)Z2   S "%(%)Z2   S "%(%$)Z2   S "l&)&)Z2   S "&)&)Z2   S "&)&)Z2   S "&)&)Z2   S "'*C'4*Z2   S "C'&*`'C*Z2   S "|'Q*'|*Z2   S "'|*'*Z2   S "'*(*Z2   S " (*((*Z2   S "p(*(+Z2   S "( +((+Z2   S "((+(E+Z2   S "(7+(S+Z2   S ")S+)p+Z2   S "V)+)+Z2   S ")+)+Z2   S ")+*+Z2   S "*+-*,Z2   S ";*,X*,Z2   S "X*,u*+,Z2   S "u*,*+,Z2   S "u*,*9,Z2   S "*,*9,Z2   S "*9,+d,Z2   S "!+V,>+r,Z2   S "/+V,L+r,Z2   S ">+V,Z+r,Z2   S "i+d,+,Z2   S "+r,+,Z2   S ",,,,Z2   S "m-,-,Z2   S " .r,(.,Z2   S "E.d,a.,Z2   S "S.d,p.,Z2   S "a.d,~.,Z2   S ".V,.r,Z2   S "9/,U/9,Z2   S "/+/,Z2   S "/+0+Z2   S "0+;0+Z2   S "0+;0+Z2   S "X0+t0+Z2   S "0p+0+Z2   S "0b+0~+Z2   S "0b+0~+Z2   S "1+=1E+Z2   S "=1 +h1(+Z2   S "1*1*Z2   S "1*1*Z2   S "1*1*Z2   S "#2n*@2*Z2   S "\2C*y2n*Z2   S "_3){3)Z2   S "3l)3)Z2   S "3])3z)Z2   S "3$) 4A)Z2   S "S4(o4(Z2   S "4(4(Z2   S "])z)Z2   S "A)%])Z2   S "3)PA)Z2   S "((Z2   S "( (Z2   S "('(Z2   S "(0(Z2   S "'"(Z2   S "F'c'Z2   S "F'c'Z2   S ":.'WY'Z2   S "'.'Z2   S "'.'Z2   S "&'Z2   S "&.&Z2   S "&K&Z2   S "K&g&Z2   S "&&Z2   S "M&x&Z2   S "s&&Z2   S "$ s&A &Z2   S "2 s&O &Z2   S " s& &Z2   S " s& !&Z2   S " &&!&Z2   S "n!&!&Z2   S "!&!&Z2   S "!& "&Z2   S ""&"'Z2   S "#.'H#J'Z2   S "s#Y'#v'Z2   S "#g'#'Z2   S "#'#'Z2   S "$'-$'Z2   S "Y$'u$'Z2   S "Y$'$'L@ %4d,  kZ2   S "$($"(Z2   S "$($0(Z2   S "%M(0%i(Z2   S "0%i(L%(Z2   S "%(%(Z2   S "%(%(Z2   S "$&)O&2)Z2   S "]&A)&])Z2   S "]&A)&])Z2   S "4')Q')Z2   S "'Q* (n*Z2   S "'_*(|*Z2   S " (n*((*Z2 !  S "S(*p(*Z2 "  S "p(*(*Z2 #  S "(*(*Z2 $  S "(*(*Z2 %  S ") ++)7+Z2 &  S "X*+u*+Z2 '  S "*+*,Z2 (  S "*+*,Z2 )  S "!+,>++,Z2 *  S "/+,L++,Z2 +  S "++,+V,Z2 ,  S "++,+V,Z2 -  S ",9,#,V,Z2 .  S "z,G,,d,Z2 /  S ",G,-d,Z2 0  S ",G,&-d,Z2 1  S "-G,4-d,Z2 2  S "-9,-V,Z2 3  S "-9,-V,Z2 4  S "-+,.G,Z2 5  S "a.,.9,Z2 6  S ".,.+,Z2 7  S ".,.,Z2 8  S ".,.,Z2 9  S ".+/,Z2 :  S ".+/,Z2 ;  S "d/+/+Z2 <  S "/+/+Z2 =  S "/~+0+Z2 >  S "/~+0+Z2 ?  S "0p+-0+Z2 @  S "0(+0E+Z2 A  S "1*/1*Z2 B  S "w1*1*Z2 C  S "1C*2_*Z2 D  S "24*12Q*Z2 E  S "24*12Q*Z2 F  S "2&*@2C*Z2 G  S "@2 *\2&*Z2 H  S "@2 *k2&*Z2 I  S "2)2)Z2 J  S " 3z)43)Z2 K  S "3z)43)Z2 L  S "3l)B3)Z2 M  S "%3l)B3)Z2 N  S "m32)3])Z2 O  S "3)32)Z2 P  S "3)32)Z2 Q  S "3( 4(Z2 R  S " 4((4(Z2 S  S "4(64(Z2 T  S "((Z2 U  S "''Z2 V  S "''Z2 W  S "'8'Z2 X  S "8v'T'Z2 Y  S "J'g'Z2 Z  S "'<'Z2 [  S "'<'Z2 \  S "'+'Z2 ]  S "H&e'Z2 ^  S "&&Z2 _  S "W&&Z2 `  S "W&s&Z2 a  S "W&s&Z2 b  S "W&s&Z2 c  S ",&H&Z2 d  S ",& H&Z2 e  S ",& H&Z2 f  S " ,&$ H&Z2 g  S " &2 H&Z2 h  S "l ,& H&Z2 i  S "z ,& H&Z2 j  S " ,&!W&Z2 k  S " !:&5!W&Z2 l  S "}!H&!e&Z2 m  S "}!H&!e&Z2 n  S "!e& "&Z2 o  S "7"&T"&Z2 p  S "q"&"&Z2 q  S "q"&"&Z2 r  S ""&"&Z2 s  S ""&#&Z2 t  S "#&+#&Z2 u  S "+#&H#'Z2 v  S "#'#J'Z2 w  S "#.'#J'Z2 x  S "$Y'-$'Z2 y  S "-$v'J$'Z2 z  S "<$v'Y$'Z2 {  S "<$'Y$'Z2 |  S "Y$'$'Z2 }  S "g$'$'Z2 ~  S "g$'$'Z2   S "$'$'Z2   S "$'$'Z2   S "0%"(L%>(Z2   S "[%>(%[(Z2   S "x%M(%i(Z2   S "%[(%(Z2   S "&)&A)Z2   S "&2)&O)Z2   S "4')Q')Z2   S "')')Z2   S "')' *Z2   S " (&*((C*Z2   S "(4*7(Q*Z2   S "b(_*(|*Z2   S "(|*(*Z2   S "(|*(*Z2   S "(*(*Z2   S ")*9)*Z2   S ")*G)*Z2   S "s)*)+Z2   S ") +)(+Z2   S ")+)7+Z2   S ")(+)S+Z2   S "*E+*b+Z2   S "u*~+*+Z2   S "*~+*+Z2   S "*+*+Z2   S "*+++Z2   S "*+++Z2   S "++!++Z2   S "++++Z2   S "++++Z2   S "+++,Z2   S "N,+k,,Z2   S ",,,,Z2   S ",, -,Z2   S "_-,|-,Z2   S "|-+-,Z2   S "-+-,Z2   S "-+-,Z2   S "-+-,Z2   S ".+6.,Z2   S "r/p+/+Z2   S "/S+/p+Z2   S "f0*0 +Z2   S "0*0*Z2   S "0*0*Z2   S "Z1_*1|*Z2   S "1&*1C*Z2   S "y2)2)Z2   S "2)2)Z2   S "2z)2)Z2   S " 32)%3O)Z2   S "{3(3(Z2   S "3(3(Z2   S " 4x((4(Z2   S "4(4"(Z2   S tt"(%(Z2   S tt"0(M(Z2   S tt"'"(Z2   S tt" '5(Z2   S tt"R'o'Z2   S tt"v''Z2   S tt"Y' v'Z2   S tt"&'Z2   S tt"&'Z2   S tt"&'Z2   S tt"&:&Z2   S tt"&H&Z2   S tt":&e&Z2   S tt"H&e&Z2   S tt"s&&Z2   S tt"W&s&Z2   S tt":&<W&Z2   S tt"K,&gH&Z2   S tt"&,&Z2   S tt"&&Z2   S tt"0%M&Z2   S tt"%&Z2   S tt"%&Z2   S tt"%&Z2   S tt"$ %A &Z2   S tt"O %l &Z2   S tt"R!%n!&Z2   S tt"`!&!&Z2   S tt"n!&!&Z2   S tt"!&!,&Z2   S tt"!&!:&Z2   S tt")",&E"H&Z2   S tt""W&"s&Z2   S tt""e&"&Z2   S tt"e#&#&Z2   S tt"e#&#&L@ F%4+  jZ2   S tt"s#&#&Z2   S tt"#&#&Z2   S tt"$'<$<'Z2   S tt"$'$'Z2   S tt"$'%'Z2   S tt"$'%'Z2   S tt"L%'i%(Z2   S tt"x%(%"(Z2   S tt"$&x(@&(Z2   S tt"&(&(Z2   S tt"&(&$)Z2   S tt" ()(()Z2   S tt"(4*(Q*Z2   S tt"(_*(|*Z2   S tt"(_*)|*Z2   S tt"d)*)*Z2   S tt"s)*)*Z2   S tt")*)*Z2   S tt")**+Z2   S tt"-* +J*7+Z2   S tt"-*+X*7+Z2   S tt"X*(+*E+Z2   S tt"+p+>++Z2   S tt"w++++Z2   S tt"++++Z2   S tt"++,+Z2   S tt"N,+k,+Z2   S tt"N,+z,+Z2   S tt",+,+Z2   S tt"-+4-+Z2   S tt"4-+Q-+Z2   S tt"4-+Q-+Z2   S tt" .+(.+Z2   S tt" .+6.+Z2   S tt".+6.+Z2   S tt"E.+a.+Z2   S tt"S.~+p.+Z2   S tt"S.~+p.+Z2   S tt".p+.+Z2   S tt".S+/p+Z2   S tt"/E+9/b+Z2   S tt"G/7+d/S+Z2   S tt"r/(+/E+Z2   S tt"/ +/(+Z2   S tt"/*0 +Z2   S tt";0*f0*Z2   S tt"0_*0*Z2   S tt"0Q*!1n*Z2   S tt"1C*/1_*Z2   S tt"!14*=1_*Z2   S tt"/14*L1Q*Z2   S tt"/1&*Z1Q*Z2   S tt"Z1 *14*Z2   S tt"w1 *1&*Z2   S tt"1)1)Z2   S tt"2)12)Z2   S tt"2)@2)Z2   S tt"12z)\2)Z2   S tt"22)2])Z2   S tt"2( 3$)Z2   S tt"3(43)Z2   S tt"3M(3i(Z2   S tt"3>(4[(Z2   S tt"4'4'Z2   S ``"{(0(Z2   S ``"''Z2   S ``" '5'Z2   S ``"''R'Z2 !  S ``"'<'Z2 "  S ``"'<'Z2 #  S ``"'.'Z2 $  S ``"' .'Z2 %  S ``"' .'Z2 &  S ``"&&Z2 '  S ``"&&Z2 (  S ``"s&&Z2 )  S ``"W&H&Z2 *  S ``"WH&se&Z2 +  S ``"s:&W&Z2 ,  S ``",&H&Z2 -  S ``"&,&Z2 .  S ``"%<&Z2 /  S ``"Y%v&Z2 0  S ``"%%Z2 1  S ``"0%[%Z2 2  S ``"%%Z2 3  S ``"$ %A %Z2 4  S ``" % %Z2 5  S ``" % !%Z2 6  S ``"`!%!%Z2 7  S ``"`!%!%Z2 8  S ``"7"%b"&Z2 9  S ``""&"&Z2 :  S ``"#&#&Z2 ;  S ``"#&#&Z2 <  S ``"#&$&Z2 =  S ``"#&$&Z2 >  S ``"#&$&Z2 ?  S ``"$'$<'Z2 @  S ``"x%'%'Z2 A  S ``"%'%'Z2 B  S ``"%'%'Z2 C  S ``"%'%(Z2 D  S ``"%'%(Z2 E  S ``"%(&"(Z2 F  S ``"&"($&>(Z2 G  S ``"'(4')Z2 H  S ``"&'(C')Z2 I  S ``"4'(Q')Z2 J  S ``"'2)'O)Z2 K  S ``"'l)')Z2 L  S ``"'l)')Z2 M  S ``"'z) ()Z2 N  S ``"'z) ()Z2 O  S ``"b()()Z2 P  S ``")&*+)Q*Z2 Q  S ``"G)Q*d)n*Z2 R  S ``")|*)*Z2 S  S ``"**-**Z2 T  S ``"X****Z2 U  S ``"f****Z2 V  S ``"***+Z2 W  S ``"***(+Z2 X  S ``"++/+7+Z2 Y  S ``">+(+Z+E+Z2 Z  S ``"Z+7+w+S+Z2 [  S ``"Z+7++S+Z2 \  S ``"Z+7++S+Z2 ]  S ``"i+7++S+Z2 ^  S ``"+E++p+Z2 _  S ``"+S+,p+Z2 `  S ``"+S+#,p+Z2 a  S ``"#,b+@,~+Z2 b  S ``"@,b+],~+Z2 c  S ``",b+,+Z2 d  S ``",b+,+Z2 e  S ``",b+,+Z2 f  S ``",b+,+Z2 g  S ``",b+,+Z2 h  S ``"Q-b+m-~+Z2 i  S ``"-S+-~+Z2 j  S ``"p.7+.S+Z2 k  S ``"p.7+.S+Z2 l  S ``".+.7+Z2 m  S ``"/*/*Z2 n  S ``"/*/*Z2 o  S ``"/*0*Z2 p  S ``"-0|*I0*Z2 q  S ``"t0Q*0|*Z2 r  S ``"0Q*0n*Z2 s  S ``"0&*0Q*Z2 t  S ``"0&*0C*Z2 u  S ``"0 *1&*Z2 v  S ``"!1)=1 *Z2 w  S ``"L1)w1)Z2 x  S ``"1z)1)Z2 y  S ``"2O)12l)Z2 z  S ``"#2A)N2])Z2 {  S ``"2(2)Z2 |  S ``"%3(P3(Z2 }  S ``"3(3"(Z2 ~  S ``"3(3"(Z2   S ``"4'4'Z2   S ``"4'4'Z2   S LL""(M(Z2   S LL""(>(Z2   S LL""(>(Z2   S LL"P'{'Z2   S LL"l''Z2   S LL"''Z2   S LL"''Z2   S LL"''Z2   S LL"''Z2   S LL"g''Z2   S LL" Y''v'Z2   S LL"o'.'Z2   S LL"&'Z2   S LL"&'Z2   S LL"qs&&Z2   S LL"H&e&Z2   S LL",&W&Z2   S LL",&H&Z2   S LL"+&W,&Z2   S LL"H&e&Z2   S LL"e%&Z2   S LL"%%Z2   S LL".%K%Z2   S LL"g%%Z2   S LL"%%Z2   S LL"q%%Z2   S LL"xT%q%Z2   S LL"F%q%Z2   S LL"F%c%Z2   S LL" F%A c%Z2   S LL"O F%l c%Z2   S LL"l F% c%Z2   S LL" T%&!q%Z2   S LL" !T%&!q%Z2   S LL"C!c%`!%Z2   S LL"R!c%n!%L@ $4E+ n iZ2   S LL"!q%!%Z2   S LL"7"%b"%Z2   S LL"E"%b"%Z2   S LL"q"%"%Z2   S LL""%"%Z2   S LL""%"%Z2   S LL""%#&Z2   S LL"9#&e#,&Z2   S LL"#W&#s&Z2   S LL"#W&#s&Z2   S LL"$&<$&Z2   S LL"<$&g$&Z2   S LL"$'%'Z2   S LL"$'%'Z2   S LL"%'0%<'Z2   S LL"%'&'Z2   S LL"O&(l&"(Z2   S LL"]&(z&0(Z2   S LL"z&"(&>(Z2   S LL"&0(&M(Z2   S LL"'(')Z2   S LL"')'$)Z2   S LL"')'A)Z2   S LL"'2) (O)Z2   S LL" (A)7(l)Z2   S LL"7(])S(z)Z2   S LL"7(])b()Z2   S LL"()()Z2   S LL"))9) *Z2   S LL")C*)_*Z2   S LL")_**|*Z2   S LL"X**u**Z2   S LL"****Z2   S LL"**+*Z2   S LL"!+*>+*Z2   S LL"w+*+ +Z2   S LL"+*+(+Z2   S LL"+ +,(+Z2   S LL", +#,(+Z2   S LL", +2,(+Z2   S LL"#, +N,7+Z2   S LL"@,+],7+Z2   S LL",+,7+Z2   S LL",+-E+Z2   S LL"_-+|-7+Z2   S LL"-*.(+Z2   S LL"S.*p. +Z2   S LL"~.*.*Z2   S LL".*.*Z2   S LL"d/*/*Z2   S LL"04*;0_*Z2   S LL"0)1)Z2   S LL"0)1)Z2   S LL"1)/1)Z2   S LL"1$)1O)Z2   S LL"2(@2$)Z2   S LL"12(N2)Z2   S LL"12(\2)Z2   S LL"N2(k2(Z2   S LL"2(2(Z2   S LL" 3M(43i(Z2   S LL"3'3(Z2   S LL" 4'(4'Z2   S LL"4'4J'Z2   S 88"''Z2   S 88"'%'Z2   S 88"<'g'Z2   S 88"`&}&Z2   S 88"`&}&Z2   S 88"&&Z2   S 88"&&Z2   S 88"s& &Z2   S 88"T:&qW&Z2   S 88"q&H&Z2   S 88"&:&Z2   S 88"%:%Z2   S 88"+%H%Z2   S 88"W%%Z2   S 88"s%%Z2   S 88"%%Z2   S 88"%%Z2   S 88"%%Z2   S 88"YF%vc%Z2   S 88"gF%c%Z2   S 88"8%T%Z2   S 88")%T%Z2   S 88")%T%Z2   S 88")%F%Z2   S 88"%08%Z2   S 88"j %)%Z2   S 88"$%Z2   S 88"$ %Z2   S 88"$ %Z2   S 88"$ %Z2   S 88"A $l %Z2   S 88"A $l %Z2   S 88"!%!F%Z2   S 88" "F%)"c%Z2   S 88"7"T%T"q%Z2   S 88"E"T%b"%Z2   S 88""q%"%Z2   S 88""%#%Z2   S 88"#%+#%Z2   S 88"s#%#&Z2   S 88"#&#&Z2   S 88"#,&$H&Z2   S 88"#,&$H&Z2   S 88"g$e&$&Z2   S 88"%&0%'Z2   S 88">%'i%'Z2   S 88">%'i%'Z2   S 88"%.'%J'Z2   S 88"%<'%g'Z2   S 88"%Y'%v'Z2   S 88"2&'O&'Z2   S 88"]&'z&'Z2   S 88"&0( 'M(Z2   S 88"Q'x(n'(Z2   S 88"`'x(|'(Z2   S 88"'('(Z2   S 88"(])(z)Z2   S 88"))) *Z2   S 88"))) *Z2 !  S 88") *)&*Z2 "  S 88")**4*Z2 #  S 88"J*C*u*_*Z2 $  S 88"*|*+*Z2 %  S 88">+*i+*Z2 &  S 88"@,*k,*Z2 '  S 88"m-*-*Z2 (  S 88"m-*-*Z2 )  S 88"|-*-*Z2 *  S 88"-*-*Z2 +  S 88"(.*E.*Z2 ,  S 88"6.*S.*Z2 -  S 88"6.*S.*Z2 .  S 88"a.*~.*Z2 /  S 88"a.*.*Z2 0  S 88".*.*Z2 1  S 88"/_*G/|*Z2 2  S 88"G/Q*d/n*Z2 3  S 88"/ *04*Z2 4  S 88";0)f0)Z2 5  S 88"X0)t0)Z2 6  S 88"X0)0)Z2 7  S 88"t0)0)Z2 8  S 88"0)0)Z2 9  S 88"0z)1)Z2 :  S 88"1)12)Z2 ;  S 88"1(1)Z2 <  S 88"1(2(Z2 =  S 88"1(2(Z2 >  S 88"12(N2(Z2 ?  S 88"k2x(2(Z2 @  S 88"y2x(2(Z2 A  S 88"20(2[(Z2 B  S 88"3'43"(Z2 C  S 88"%3'B3(Z2 D  S 88"{3'3'Z2 E  S 88"3'3'Z2 F  S 88"3'3'Z2 G  S 88"3Y'4'Z2 H  S 88"4<'64g'Z2 I  S 88"D4.'a4J'Z2 J  S $$"''Z2 K  S $$"''Z2 L  S $$"''Z2 M  S $$"g'A'Z2 N  S $$"3Y'Pv'Z2 O  S $$"P<'{g'Z2 P  S $$"{.'J'Z2 Q  S $$"&'Z2 R  S $$"5&R&Z2 S  S $$"D&`&Z2 T  S $$"W&s&Z2 U  S $$"W&s&Z2 V  S $$"W&s&Z2 W  S $$"T%q&Z2 X  S $$"c%&Z2 Y  S $$"q%&Z2 Z  S $$"%%Z2 [  S $$"8%c%Z2 \  S $$"8%T%Z2 ]  S $$"%F%Z2 ^  S $$"$$Z2 _  S $$"$0$Z2 `  S $$"j$$Z2 a  S $$"$$Z2 b  S $$"$$Z2 c  S $$"$$Z2 d  S $$"$ $Z2 e  S $$" $2 $Z2 f  S $$"2 $O $Z2 g  S $$" $ !$Z2 h  S $$"!$!$Z2 i  S $$"!$! %Z2 j  S $$"!$)"%Z2 k  S $$"7" %T")%Z2 l  S $$"T" %q"8%Z2 m  S $$""8%"T%L@ $4* 7hZ2 o  S $$"#T%#%Z2 p  S $$"+#q%H#%Z2 q  S $$"#%$%Z2 r  S $$"<$&Y$,&Z2 s  S $$"<$&Y$,&Z2 t  S $$"J$&g$,&Z2 u  S $$"u$,&$H&Z2 v  S $$"$:&$W&Z2 w  S $$"%'&J'Z2 x  S $$"2&Y']&'Z2 y  S $$"O&v'z&'Z2 z  S $$"z&'&'Z2 {  S $$"&'&'Z2 |  S $$"&'&'Z2 }  S $$" ''4'"(Z2 ~  S $$"4'(Q'0(Z2   S $$"C'"(`'>(Z2   S $$"'('(Z2   S $$"(((S((Z2   S $$"E((b((Z2   S $$"S((p((Z2   S $$"()($)Z2   S $$"(2)(O)Z2   S $$"(2))O)Z2   S $$")A))l)Z2   S $$"9)l)V))Z2   S $$"))*)Z2   S $$"-*)X* *Z2   S $$"*&**C*Z2   S $$"*4*+Q*Z2   S $$"L+Q*i+n*Z2   S $$"+_*+|*Z2   S $$"+n*,*Z2   S $$",|*#,*Z2   S $$",*,*Z2   S $$",*,*Z2   S $$",* -*Z2   S $$",*-*Z2   S $$"&-*B-*Z2   S $$"-n*-*Z2   S $$"S.Q*~.|*Z2   S $$"a.Q*.n*Z2   S $$".C*._*Z2   S $$".&*/C*Z2   S $$"9/ *U/4*Z2   S $$"9/ *d/&*Z2   S $$"/)0)Z2   S $$"/)0)Z2   S $$"/)0)Z2   S $$"0);0)Z2   S $$"0);0)Z2   S $$"1)/12)Z2   S $$"Z1(1)Z2   S $$"12[(N2x(Z2   S $$"@2M(\2i(Z2   S $$"2'2"(Z2   S $$"2'2(Z2   S $$"%3'B3'Z2   S $$"43'_3'Z2   S $$"43'_3'Z2   S $$"4'64'Z2   S $$"(4&S4'Z2   S $$"a4&~4&Z2   S $$"a4&~4&Z2   S "J'g'Z2   S ".'3J'Z2   S "&&Z2   S "&&Z2   S "`:&}W&Z2   S "}&H&Z2   S "%&Z2   S "%8%Z2   S "q%%Z2   S "%%Z2   S "q%%Z2   S "q%%Z2   S "T%q%Z2   S "F%c%Z2   S "e %)%Z2   S "s %)%Z2   S "$$Z2   S "$$Z2   S "}$"$Z2   S "Mo$x$Z2   S "jo$$Z2   S "o$$Z2   S "o$$Z2   S "a$ $Z2   S " a$ $Z2   S " o$ $Z2   S " o$ !$Z2   S "}!$!$Z2   S "!$"$Z2   S ""$"$Z2   S ""$"$Z2   S "" %#)%Z2   S "#c%#%Z2   S "#q%#%Z2   S "#%$%Z2   S "#%$%Z2   S "<$%Y$%Z2   S "<$%g$%Z2   S "Y$%u$%Z2   S "u$%$&Z2   S "$&$,&Z2   S "$&$:&Z2   S "!%H&>%s&Z2   S "[%s&x%&Z2   S "i%&%&Z2   S "x%&%&Z2   S "%&%&Z2   S "%&&'Z2   S "&' ''Z2   S "&''C''Z2   S "n'''(Z2   S "n'''(Z2   S " ([((((Z2   S "((()Z2   S "(())Z2   S "V)2))O)Z2   S ")l)))Z2   S "*)*)Z2   S ">+)i+&*Z2   S ">+)i+&*Z2   S "L+ *i+&*Z2   S "+*+C*Z2   S "k,4*,_*Z2   S " -C*&-_*Z2   S "4-4*_-_*Z2   S "-4*-Q*Z2   S "-&*-Q*Z2   S "(.*E.4*Z2   S "~. *.&*Z2   S ".).*Z2   S ".)/)Z2   S "/)9/)Z2   S "/)/)Z2   S "/)/)Z2   S "/z)0)Z2   S "0O)I0z)Z2   S "0O)I0z)Z2   S "-0O)I0l)Z2   S "-0O)X0l)Z2   S "I0A)t0])Z2   S "X02)0])Z2  S "0)0$)Z2  S "0(0)Z2  S "0(1)Z2  S "0(1)Z2  S "1(/1(Z2  S "1x(1(Z2  S "1x(1(Z2  S "N2'y2(Z2  S "N2'y2(Z2   S "k2'2(Z2   S "2'2'Z2   S "2'2'Z2   S "2'2'Z2   S "43Y'P3v'Z2  S "3'3'Z2  S "3&3'Z2  S "64&S4&Z2  S "4W&4s&Z2  S "4:&4W&Z2  S "&&Z2  S "e&&Z2  S "W&s&Z2  S ":&W&Z2  S ":&W&Z2  S "'&R:&Z2  S "D&o&Z2  S "`%}&Z2  S ")q%F%Z2  S "cT%q%Z2  S "8%T%Z2  S ")%F%Z2  S "$+ %Z2   S "+$H$Z2 ! S "W$s$Z2 " S "}$K$Z2 # S "<o$Y$Z2 $ S "<o$Y$Z2 % S "D$o$Z2 & S "5$"R$Z2 ' S "$D$Z2 ( S "$$ 5$Z2 ) S "^ $z 5$Z2 * S "^ $z 5$Z2 + S "z $ 5$Z2 , S " '$ D$Z2 - S " '$!D$Z2 . S "`!5$!R$Z2 / S "!D$!a$Z2 0 S "!R$!o$Z2 1 S ")"o$E"$Z2 2 S "T"}$"$Z2 3 S ""$"$Z2 4 S "H#$s# %Z2 5 S "#F%$c%Z2 6 S "$%$%L@ 3{#4* gZ2 8 S "$%$%Z2 9 S "$%%&Z2 : S "$%%&Z2 ; S "[%,&%W&Z2 < S "%s&%&Z2 = S "%&&&Z2 > S "%&&&Z2 ? S "%&&&Z2 @ S "$&&@&&Z2 A S "&'&'Z2 B S "&.'&Y'Z2 C S "&J' 'g'Z2 D S "4''Q''Z2 E S "Q''|''Z2 F S "''''Z2 G S "''''Z2 H S "7(0(b([(Z2 I S "p([((x(Z2 J S "((((Z2 K S "((((Z2 L S "(()(Z2 M S ")()(Z2 N S "9)(V)(Z2 O S "V)(s))Z2 P S "s)())Z2 Q S ")))2)Z2 R S ")))2)Z2 S S ")))2)Z2 T S ")2)*O)Z2 U S ";*O)X*z)Z2 V S "J*])f*z)Z2 W S "i+)+)Z2 X S "+)+)Z2 Y S "+)+)Z2 Z S ",)#, *Z2 [ S "-)B-*Z2 \ S "|-)- *Z2 ] S ".)6.)Z2 ^ S "E.)p.)Z2 _ S "/A)/l)Z2 ` S "/$)0A)Z2 a S "0(0(Z2 b S "0(0(Z2 c S "0(0(Z2 d S "!1x(=1(Z2 e S "1>(1[(Z2 f S "1(1>(Z2 g S "\2'y2'Z2 h S "k2'2'Z2 i S "2'2'Z2 j S "2'2'Z2 k S "2g'2'Z2 l S "2Y'2'Z2 m S "43'_3'Z2 n S "B3&_3'Z2 o S "3&3&Z2 p S "S4:&~4W&Z2 q S "S4:&~4W&Z2 r S "~4&4:&Z2 s S "4&4:&Z2 t S "4&4:&Z2 u S "4&4,&Z2 v S "4&4&Z2 w S "4&4&Z2 x S "^e&{&Z2 y S "lH&s&Z2 z S "%&Z2 { S "5%`%Z2 | S "q%%Z2 } S "q%%Z2 ~ S "F%c%Z2  S "8%c8%Z2  S "$ %Z2  S "$$Z2  S "$$Z2  S "$$Z2  S "$+$Z2  S "$:$Z2  S "R$}$Z2  S "R$o$Z2  S "#$Z2  S "[#x#Z2  S "j##Z2  S "##Z2  S "# #Z2  S " #$ #Z2  S "2 #^ #Z2  S "^ # #Z2  S " # #Z2  S "n!#! $Z2  S "!#!$Z2  S "!#!$Z2  S "!#!'$Z2  S "!$"5$Z2  S "V#$s#$Z2  S "s#$#$Z2  S "#$#$Z2  S "#$#$Z2  S "#$#$Z2  S "$ %-$)%Z2  S "$T%$q%Z2  S "$c%$%Z2  S "$%!%%Z2  S "i%%%&Z2  S "%&%,&Z2  S "%&%,&Z2  S "%&%:&Z2  S "@&&]&&Z2  S "&''.'Z2  S "&''.'Z2  S "''4'<'Z2  S "&''C'J'Z2  S "Q'J'n'g'Z2  S "''''Z2  S "''''Z2  S "'' ('Z2  S "S('p("(Z2  S "("((>(Z2  S "("((>(Z2  S "(M((i(Z2  S ")x(9)(Z2  S "+)(V)(Z2  S "s)()(Z2  S ")(*)Z2  S "f*$)*A)Z2  S "*A)*])Z2  S "+])!+z)Z2  S ">+l)i+)Z2  S "Z+l)w+)Z2  S "+)+)Z2  S "+),)Z2  S ",)#,)Z2  S ",)#,)Z2  S "@,)k,)Z2  S "k,),)Z2  S "k,),)Z2  S ",),)Z2  S "|-)-)Z2  S "-)-)Z2  S "-)(.)Z2  S "6.z)S.)Z2  S "E.z)a.)Z2  S "S.z)p.)Z2  S "d/)/A)Z2  S "r/)/2)Z2  S "/)/2)Z2  S "I0(f0(Z2  S "t0(0(Z2  S "0(0(Z2  S "0x(0(Z2  S "0>(!1i(Z2  S "1>(/1[(Z2  S "1>(/1[(Z2  S "10(/1[(Z2  S "=1(Z1>(Z2  S "1'1(Z2  S "1'1'Z2  S "1'1'Z2  S " 3&43&Z2  S "P3&m3&Z2  S "3e&3&Z2  S "(4&D4,&Z2  S "a4%~4&Z2  S "4%4%Z2  S ,,"3,&PW&Z2  S ,,"%%Z2  S ,,"Dc%o%Z2  S ,," %)%Z2  S ,,"q$$Z2  S ,,"R$:o$Z2  S ,,"W5$sR$Z2  S ,,"e5$R$Z2  S ,,"e5$R$Z2  S ,,"'$D$Z2  S ,,"<#g#Z2  S ,,"##Z2  S ,,"##Z2  S ,,"#"#Z2  S ,,"#0#Z2  S ,,"#0#Z2  S ,,""#?#Z2  S ,,"M#j#Z2  S ,,"##Z2  S ,,"##Z2  S ,,"#$ #Z2  S ,," {#2 #Z2  S ,,"$ {#A #Z2  S ,,"^ #z #Z2  S ,,"!#5!#Z2  S ,,"`!#}!#Z2  S ,,"`!#}!#Z2  S ,,"!#!#Z2  S ,,"!#!#Z2  S ,,"!#!#Z2  S ,,"q"#"$Z2  S ,,"" $"'$Z2  S ,,""$"5$Z2  S ,,""$"5$Z2  S ,,"#5$+#R$Z2  S ,,"9#D$V#o$L@ "o4z) fZ2  S ,,"#o$#$Z2  S ,,"#o$#$Z2  S ,,"#}$#$Z2  S ,,"#}$#$Z2  S ,,"$$-$$Z2  S ,,"<$$Y$$Z2  S ,,"$ %$)%Z2  S ,,"$ %$)%Z2   S ,,"$%$8%Z2   S ,,"$%$F%Z2   S ,,"$%$F%Z2   S ,,"$)%$F%Z2   S ,,"!%q%>%%Z2  S ,,"0%%[%%Z2  S ,,">%%i%%Z2  S ,,"[%%x%%Z2  S ,,"[%%%%Z2  S ,,"%%%%Z2  S ,,"2&,&O&W&Z2  S ,,"@&:&]&W&Z2  S ,,"&&&&Z2  S ,,"'<''Y'Z2  S ,,"'g' ('Z2  S ,," ('7('Z2  S ,,"p('('Z2  S ,,"p('('Z2  S ,,"('((Z2  S ,,")()(Z2  S ,,"*(*(Z2  S ,,"-*(J*(Z2  S ,,"*(*)Z2   S ,,"!+)>+2)Z2 ! S ,,"L+$)w+A)Z2 " S ,,"+A)+])Z2 # S ,,"],O)z,z)Z2 $ S ,,",]),z)Z2 % S ,,",]),z)Z2 & S ,,",]),z)Z2 ' S ,,"_-])|-z)Z2 ( S ,,"-O)-z)Z2 ) S ,,"-O)-l)Z2 * S ,,"-O)-l)Z2 + S ,,".).$)Z2 , S ,,"*/(G/)Z2 - S ,,"9/(U/)Z2 . S ,,"/(/(Z2 / S ,,"0x(;0(Z2 0 S ,,"f0M(0x(Z2 1 S ,,"00(0M(Z2 2 S ,,"0(1"(Z2 3 S ,,"h1'1'Z2 4 S ,,"w1'1'Z2 5 S ,,"w1'1'Z2 6 S ,,"1'1'Z2 7 S ,,"1g'2'Z2 8 S ,,"1Y'2'Z2 9 S ,,"\2'y2.'Z2 : S ,,"2&2&Z2 ; S ,,"2&2&Z2 < S ,,"3&43&Z2 = S ,,"%3&B3&Z2 > S ,,"43s&_3&Z2 ? S ,,"3&3&Z2 @ S ,,"4%64%Z2 A S @@"&%,&Z2 B S @@"3%P&Z2 C S @@"3%^&Z2 D S @@"A%^&Z2 E S @@"l%%Z2 F S @@"T%q%Z2 G S @@"}$%Z2 H S @@"$ %Z2 I S @@" $)$Z2 J S @@" $:'$Z2 K S @@"##Z2 L S @@"##Z2 M S @@"#.#Z2 N S @@".#Y#Z2 O S @@""P#?m#Z2 P S @@"B#^#Z2 Q S @@"3#^#Z2 R S @@"$ 3#A ^#Z2 S S @@"A 3#^ ^#Z2 T S @@"O 3#l ^#Z2 U S @@"l 3# ^#Z2 V S @@"l 3# ^#Z2 W S @@" 3# ^#Z2 X S @@" !B#5!m#Z2 Y S @@"5!P#`!m#Z2 Z S @@"!m#!#Z2 [ S @@" "#)"#Z2 \ S @@" "#)"#Z2 ] S @@""#"#Z2 ^ S @@""#"#Z2 _ S @@"##+# $Z2 ` S @@"#'$#D$Z2 a S @@"#5$#R$Z2 b S @@"#D$#a$Z2 c S @@"#D$#a$Z2 d S @@"#R$#o$Z2 e S @@"#a$$}$Z2 f S @@"g$$$$Z2 g S @@"$$%%Z2 h S @@"%%0%8%Z2 i S @@">%8%[%T%Z2 j S @@"L%F%i%c%Z2 k S @@"[%F%x%c%Z2 l S @@"i%T%%%Z2 m S @@"%c%%%Z2 n S @@"]&&z&,&Z2 o S @@"&,&&H&Z2 p S @@"&,&&W&Z2 q S @@"&e& '&Z2 r S @@"&'&C'&Z2 s S @@"|'&'&Z2 t S @@"'&''Z2 u S @@"'&''Z2 v S @@"(')'Z2 w S @@"d)()0(Z2 x S @@")0()[(Z2 y S @@")>()[(Z2 z S @@"*i(;*(Z2 { S @@";*x(f*(Z2 | S @@"*(+(Z2 } S @@"+(/+(Z2 ~ S @@">+(i+(Z2  S @@"i+(+)Z2  S @@"+(+)Z2  S @@"+(+)Z2  S @@"+(+)Z2  S @@"#,)@,$)Z2  S @@"2,)N,$)Z2  S @@"@,)],$)Z2  S @@"k,),2)Z2  S @@",) -2)Z2  S @@",)&-2)Z2  S @@"-)-$)Z2  S @@"-(-$)Z2  S @@"-(-)Z2  S @@"-( .)Z2  S @@".(.(Z2  S @@".(/(Z2  S @@"*/(G/(Z2  S @@"*/(G/(Z2  S @@"/[(/x(Z2  S @@"/[(/x(Z2  S @@"00(;0M(Z2  S @@"f0(0"(Z2  S @@"f0(0"(Z2  S @@"0'0(Z2  S @@"1'=1'Z2  S @@"=1'Z1'Z2  S @@"1'1<'Z2  S @@"1'1<'Z2  S @@"12&N2'Z2  S @@"y2&2&Z2  S @@"43,&P3H&Z2  S @@"43&_3H&Z2  S @@"B3&_3H&Z2  S @@"3% 4%Z2  S @@"3%4%Z2  S @@"3%(4%Z2  S @@"4%64%Z2  S @@"S4T%o4%Z2  S TT"3%^%Z2  S TT"T%q%Z2  S TT")%F%Z2  S TT"5$`$Z2  S TT"o$$Z2  S TT"o$$Z2  S TT"a$ $Z2  S TT" R$)}$Z2  S TT"85$Ta$Z2  S TT"T'$qD$Z2  S TT"#$Z2  S TT"#$Z2  S TT"# $Z2  S TT"#:#Z2  S TT"W#s#Z2  S TT"s##Z2  S TT"{##Z2  S TT"KB#g^#Z2  S TT"Y3#v^#Z2  S TT"Y3#v^#Z2  S TT"g3#P#Z2  S TT"v3#P#Z2  S TT"%#B#Z2  S TT"#B#Z2  S TT"#B#Z2  S TT"#"3#Z2  S TT"?"j%#Z2  S TT""#Z2  S TT" " #Z2  S TT" " #Z2  S TT" " !#Z2  S TT" !"&!#Z2  S TT"R!#n!%#Z2  S TT"R!#n!%#Z2  S TT"!%#!B#Z2  S TT"!%#!P#L@ \"4( eZ2  S TT"!%#!P#Z2  S TT""{#"#Z2  S TT"+##H##Z2  S TT"# $#'$Z2  S TT"$'$-$R$Z2  S TT"<$D$Y$a$Z2  S TT"g$a$$}$Z2  S TT"$o$$$Z2  S TT">%$i% %Z2  S TT"%T%%q%Z2  S TT"%q%$&%Z2  S TT"&%@&%Z2  S TT"&%&&Z2  S TT"`'s&|'&Z2  S TT"n'&'&Z2  S TT"d)')'Z2  S TT"s)')'Z2  S TT")')'Z2  S TT"u*>(*i(Z2  S TT"*i(*(Z2  S TT"+x(/+(Z2  S TT"!+(>+(Z2  S TT"L+(i+(Z2  S TT"Z+(w+(Z2  S TT"+(+(Z2  S TT"+(+(Z2  S TT"+(,(Z2  S TT"+(,(Z2  S TT"2,(N,(Z2  S TT",(,(Z2  S TT",(-(Z2  S TT" -(&-(Z2  S TT" -(&-(Z2  S TT"|-(-(Z2  S TT"-(-(Z2  S TT"-(-(Z2  S TT"-( .(Z2  S TT"-(.(Z2  S TT".(6.(Z2  S TT"p.(.(Z2  S TT".(.(Z2  S TT".x(.(Z2  S TT".i(/(Z2  S TT".i(/(Z2  S TT".[(*/(Z2  S TT"G/M(d/i(Z2  S TT"U/>(r/[(Z2  S TT"/(/0(Z2  S TT"0'0'Z2  S TT"0v'1'Z2  S TT"!1J'=1g'Z2  S TT"\2s&y2&Z2  S TT"2H&2e&Z2  S TT"3%B3&Z2  S TT"3%B3&Z2  S TT"_3%{3%Z2  S TT"m3%3%Z2  S TT"3F%(4c%Z2  S TT"(4)%S4F%Z2  S TT"D4%a48%Z2  S TT"o4$4%Z2  S TT"o4$4%Z2  S TT"4$4$Z2   S TT"4$4$Z2   S hh"$$Z2   S hh"$5$Z2   S hh"oo$$Z2   S hh"5$R$Z2  S hh"##Z2  S hh"##Z2  S hh"##Z2  S hh"##Z2  S hh"##Z2  S hh"m#:#Z2  S hh":^#e{#Z2  S hh"#3#Z2  S hh"g"#Z2  S hh"""Z2  S hh"""Z2  S hh""""Z2  S hh""0"Z2  S hh"""Z2  S hh"" "Z2  S hh""$ "Z2  S hh"A "l "Z2  S hh"O "l "Z2   S hh"C!"`!"Z2 ! S hh"}!"!"Z2 " S hh"!"!"Z2 # S hh" ""7"#Z2 $ S hh"7""T"#Z2 % S hh""#"B#Z2 & S hh""3#"P#Z2 ' S hh""3#"^#Z2 ( S hh""B##^#Z2 ) S hh"#P##m#Z2 * S hh"####Z2 + S hh"####Z2 , S hh"Y$ $u$'$Z2 - S hh"%$% %Z2 . S hh"%$%%Z2 / S hh"%%&F%Z2 0 S hh"%)%&F%Z2 1 S hh"$&F%@&c%Z2 2 S hh"l&%&%Z2 3 S hh"z&%&%Z2 4 S hh"&%&%Z2 5 S hh"&%&'&Z2 6 S hh"|':&'W&Z2 7 S hh"'e&'&Z2 8 S hh"'s&'&Z2 9 S hh"'s&'&Z2 : S hh"'s&'&Z2 ; S hh"'& (&Z2 < S hh"E(&p(&Z2 = S hh")')'Z2 > S hh")'*'Z2 ? S hh"*'-*'Z2 @ S hh"f*'*(Z2 A S hh"u*'*"(Z2 B S hh"*(*0(Z2 C S hh"*(*>(Z2 D S hh"*"(+>(Z2 E S hh"*"(+M(Z2 F S hh"+i(,(Z2 G S hh"z,x(,(Z2 H S hh",x(,(Z2 I S hh",x(,(Z2 J S hh",x(,(Z2 K S hh",x(,(Z2 L S hh",x(&-(Z2 M S hh",x(&-(Z2 N S hh"-i(-(Z2 O S hh"-i(-(Z2 P S hh"-i(-(Z2 Q S hh"-[((.x(Z2 R S hh"E.M(a.i(Z2 S S hh"."(.>(Z2 T S hh"*/(G/"(Z2 U S hh"/'/(Z2 V S hh"/'0'Z2 W S hh"/'0'Z2 X S hh"/'0'Z2 Y S hh"X0v'0'Z2 Z S hh"t0g'0'Z2 [ S hh"0g'0'Z2 \ S hh"0<'0g'Z2 ] S hh"L1&h1'Z2 ^ S hh"L1&h1'Z2 _ S hh"1&1&Z2 ` S hh"1&1&Z2 a S hh"1&1&Z2 b S hh"N2,&y2W&Z2 c S hh"2&2&Z2 d S hh"%3%B3%Z2 e S hh"B3%_3%Z2 f S hh"m3c%3%Z2 g S hh"3F%3c%Z2 h S hh"3 %4)%Z2 i S hh"3$4)%Z2 j S hh"S4$o4$Z2 k S hh"a4$~4$Z2 l S hh"o4$4$Z2 m S hh"4$4$Z2 n S ||"$$Z2 o S ||" o$'$Z2 p S ||"a$5}$Z2 q S ||" $'$Z2 r S ||"#$Z2 s S ||"##Z2 t S ||"m##Z2 u S ||"B#^#Z2 v S ||"%#:P#Z2 w S ||""#Z2 x S ||""#Z2 y S ||"""Z2 z S ||"""Z2 { S ||"""Z2 | S ||"""Z2 } S ||"y""Z2 ~ S ||"y""Z2  S ||"[j"x"Z2  S ||"[j""Z2  S ||"\""Z2  S ||"\""Z2  S ||"\"y"Z2  S ||"\"y"Z2  S ||"\"y"Z2  S ||"\"y"Z2  S ||" \"2 y"Z2  S ||" \"2 y"Z2  S ||"O \"z y"Z2  S ||"^ \"z y"Z2  S ||" \" y"Z2  S ||" \" "Z2  S ||"!"!"Z2  S ||"""7""Z2  S ||"T""q""Z2  S ||"""""Z2  S ||""""#L@ !4M( [dZ2  S ||""""#Z2  S ||"""##Z2  S ||"""##Z2  S ||"##9#3#Z2  S ||"V#3##P#Z2  S ||"#^###Z2  S ||"$#-$#Z2  S ||"0%R$L%o$Z2  S ||"%$%$Z2  S ||"%$%$Z2  S ||"%$%$Z2  S ||"%$&$Z2  S ||"&$@& %Z2  S ||"2&$O&)%Z2  S ||"z&8%&T%Z2  S ||"z&8%&c%Z2  S ||"&F%&q%Z2  S ||" '%&'%Z2  S ||"4'%Q'%Z2  S ||"C'%`'%Z2  S ||"`'%|'&Z2  S ||"`'%|'&Z2  S ||"`'%'&Z2  S ||"S(&p(&Z2  S ||"b(&(&Z2  S ||"d).')J'Z2  S ||")g')'Z2  S ||")g')'Z2  S ||")g'*'Z2  S ||")v'*'Z2  S ||";*'X*'Z2  S ||";*'f*'Z2  S ||"f*'*'Z2  S ||"+(+>(Z2  S ||",0(,M(Z2  S ||",0( -M(Z2  S ||"&-0(B-M(Z2  S ||"Q-0(|-M(Z2  S ||"-"(-M(Z2  S ||"-"(->(Z2  S ||"-"(->(Z2  S ||"-"(->(Z2  S ||"-( .>(Z2  S ||"-(.0(Z2  S ||".(6.0(Z2  S ||"(.(E.0(Z2  S ||"6.(S.0(Z2  S ||"E.(a."(Z2  S ||"S.(p."(Z2  S ||"S.(p."(Z2  S ||".'/'Z2  S ||".'*/'Z2  S ||"9/'U/'Z2  S ||"U/'r/'Z2  S ||"0Y'-0v'Z2  S ||"f0'0J'Z2  S ||"1&=1&Z2  S ||"12&N2&Z2  S ||"2%2%Z2  S ||"2%2%Z2  S ||"P38%m3T%Z2  S ||"3$3%Z2  S ||"3$3$Z2  S ||"45$4a$Z2  S "$ %Z2  S "$$Z2  S "$%$Z2  S "$3$Z2  S "}$$Z2  S "}$$Z2  S "a$}$Z2  S "5$ a$Z2  S " '$'D$Z2  S "$55$Z2  S "o##Z2  S "##Z2  S "FP#cm#Z2  S "TP#qm#Z2  S "#B#Z2  S ""#Z2  S "+"H"Z2  S "+"H"Z2  S "j"<"Z2  S "?"\"Z2  S "1"N"Z2  S "1"N"Z2  S "" 1"Z2  S " "A 1"Z2  S "$ "A 1"Z2  S "$ "O 1"Z2  S "l " 1"Z2  S " " 1"Z2  S "5!#"`!?"Z2  S "n!1"!N"Z2  S "n!1"!N"Z2  S "}!1"!N"Z2  S " "\")"y"Z2  S " "\")"y"Z2  S ""\"7"y"Z2  S ")"\"E""Z2  S "7"j"b""Z2  S "E"j"b""Z2  S """""Z2  S """""Z2  S """#"Z2  S "V#"s##Z2  S "e#"##Z2  S "#3#$^#Z2  S "%D$%a$Z2  S "%a$%}$Z2  S "%o$%$Z2  S "%}$&$Z2  S "$&$O&$Z2  S "O&$l&$Z2  S "]&$&$Z2  S "&8%&T%Z2  S "&F% 'c%Z2  S " 'T%4'%Z2   S "&'c%C'%Z2   S "Q'%n'%Z2   S "`'%|'%Z2   S "'%'%Z2   S "'%'&Z2  S "'% (&Z2  S "((&E(:&Z2  S "G)&s)&Z2  S "d)&)'Z2  S ")&)'Z2  S ")').'Z2  S ")')<'Z2  S "*g'*'Z2  S "*v'*'Z2  S "*'+'Z2  S "+'+'Z2  S ",'#,'Z2  S ",',(Z2  S ",',(Z2  S " -'&-(Z2  S " -'4-(Z2  S "|-'-(Z2  S "-'-'Z2   S "-'.'Z2 ! S ".'6.'Z2 " S "a.'~.'Z2 # S "a.'.'Z2 $ S "a.'.'Z2 % S "p.'.'Z2 & S ".'/'Z2 ' S "d/Y'/v'Z2 ( S "/'0.'Z2 ) S "-0&I0'Z2 * S "0&0&Z2 + S "1s&/1&Z2 , S "/1e&L1&Z2 - S "1%2&Z2 . S "\2%2%Z2 / S "2q%2%Z2 0 S "2F%2c%Z2 1 S "3 %438%Z2 2 S "m3$3$Z2 3 S "3$3$Z2 4 S "64D$a4a$Z2 5 S "4 $4'$Z2 6 S "4#4'$Z2 7 S "$%$Z2 8 S "%}$A$Z2 9 S "Aa$^$Z2 : S "#$Z2 ; S "'#R#Z2 < S "D#o#Z2 = S "m##Z2 > S "q"#Z2 ? S """Z2 @ S "":"Z2 A S "+"H"Z2 B S "N"y"Z2 C S "!"Z2 D S "!"Z2 E S "0![!Z2 F S "x!!Z2 G S "!!Z2 H S "!!Z2 I S "! !Z2 J S "l ! !Z2 K S " ! !Z2 L S " ! !Z2 M S "n!!!"Z2 N S "7"#"T"?"Z2 O S "E"#"b"?"Z2 P S ""?""\"Z2 Q S ""N""j"Z2 R S ""j"#"Z2 S S "9#"V#"Z2 T S "9#"V#"Z2 U S "s#"#"Z2 V S "#"$#Z2 W S "Y$3#$P#Z2 X S "u$B#$^#Z2 Y S "$^#${#Z2 Z S "%#!%#L@ A/!4' $cZ2 \ S "0%#L%#Z2 ] S "x%#% $Z2 ^ S "%#% $Z2 _ S "%'$%D$Z2 ` S "$&a$@&$Z2 a S "2&o$O&$Z2 b S "@&}$l&$Z2 c S "O&}$l&$Z2 d S "&$&$Z2 e S "&$'%Z2 f S "&$'%Z2 g S "Q'F%|'c%Z2 h S "'%'%Z2 i S "7(%S(&Z2 j S "E(%b(&Z2 k S "S(%(&Z2 l S "b(&(&Z2 m S "p(&(,&Z2 n S "(H&)e&Z2 o S "(W&)s&Z2 p S "9)s&V)&Z2 q S ")&)&Z2 r S ")&)&Z2 s S ")&)&Z2 t S ")&*'Z2 u S "*&-*'Z2 v S "*'*J'Z2 w S "/+Y'L+v'Z2 x S "Z+g'+'Z2 y S ",','Z2 z S ",','Z2 { S ",','Z2 | S ",','Z2 } S ",' -'Z2 ~ S "&-'Q-'Z2  S "-'-'Z2  S " .v'(.'Z2  S "6.v'S.'Z2  S "S.g'~.'Z2  S "p.g'.'Z2  S ".J'.v'Z2  S "/.'9/J'Z2  S "G/'r/<'Z2  S "/&/'Z2  S "/&0&Z2  S "-0&I0&Z2  S "0e&0&Z2  S "0W&0&Z2  S "0W&0s&Z2  S "h1%1&Z2  S "w1%1&Z2  S "1%1%Z2  S "#2q%N2%Z2  S "12q%N2%Z2  S "\2F%y2q%Z2  S "y28%2T%Z2  S "2 %2)%Z2  S "2$3$Z2  S "2$%3$Z2  S "43$_3$Z2  S "{3}$3$Z2  S "o4#4#Z2  S "4#4#Z2  S "4#4#Z2  S "A$l5$Z2  S "##Z2  S "# #Z2  S "# #Z2  S "%#B#Z2  S "#%#Z2  S ""#Z2  S "8"T"Z2  S """Z2  S "y""Z2  S "\"y"Z2  S "H1"eN"Z2  S ""1"Z2  S "Y!!Z2  S "g!!Z2  S "!"!Z2  S "0!M!Z2  S "?![!Z2  S "w!!Z2  S "w!!Z2  S " !!!Z2  S " !!!Z2  S "!!!!Z2  S "!! "!Z2  S ""!E"!Z2  S "7"!T"!Z2  S ""!""Z2  S ""!"#"Z2  S """"#"Z2  S "##"#?"Z2  S "#"#"Z2  S "#"$"Z2  S "#"$"Z2  S "Y$"u$"Z2  S "$%#$P#Z2  S "$B#%^#Z2  S ">%{#[%#Z2  S "i%#%#Z2  S "%#%#Z2  S "%#%#Z2  S "%#%#Z2  S "%#%#Z2  S "%#& $Z2  S "%#& $Z2  S "$&$O&D$Z2  S "@&'$]&R$Z2  S "z&R$&}$Z2  S "&$'$Z2  S "')%'T%Z2  S "'T%'q%Z2  S "((%E(%Z2  S "E(%b(%Z2  S "(%(%Z2  S ")&9):&Z2  S ")&9)H&Z2  S ")e&)&Z2  S ")&*&Z2  S ")&*&Z2  S "*&*&Z2  S "*&*&Z2  S "*&*'Z2  S "*&*'Z2  S "*&+'Z2  S "+'/+'Z2  S "+'/+.'Z2  S "+'>+.'Z2  S "!+'L+.'Z2  S "/+'L+.'Z2  S "w+'+J'Z2  S "+<',Y'Z2  S "#,<'@,g'Z2  S "N,J'k,g'Z2  S "k,J',g'Z2  S ",J',v'Z2  S ",J',v'Z2  S ",J',v'Z2  S "-<'-g'Z2  S "-<'-g'Z2  S "-<'-Y'Z2  S "E.'p.<'Z2  S ".&.'Z2  S ".&/'Z2  S "G/&d/&Z2  S "/&/&Z2  S "X0H&t0s&Z2  S "0:&0W&Z2  S "0,&0W&Z2  S "0,&0H&Z2  S "0&0,&Z2  S "!1%=1%Z2  S "Z1%w1%Z2  S "1%1%Z2  S "#2)%@2F%Z2  S "y2$2 %Z2  S "3}$B3$Z2  S "43a$P3$Z2  S "3#4#Z2  S "S4#o4#Z2  S "4m#4#Z2  S "4P#4m#Z2  S "m##Z2  S "^##Z2  S "^# {#Z2  S " B#'^#Z2  S " B#'^#Z2  S "3#5P#Z2  S "'3#DP#Z2  S "5%#RB#Z2  S "D#`3#Z2   S """Z2   S """Z2   S "Tj"q"Z2   S "qN"y"Z2   S "H!e"Z2  S "!!Z2  S "!!Z2  S "!!Z2  S "!!Z2  S "gw!!Z2  S "gw!!Z2  S "K!h!Z2  S ""=!Mh!Z2  S "0=!Mh!Z2  S "M=!jZ!Z2  S "/!K!Z2  S "2 /!O K!Z2  S "l /! K!Z2  S "z /! K!Z2  S " /! Z!Z2  S "!=!5!Z!Z2  S "5!=!`!h!Z2  S "n!K!!h!Z2   S "!K!!w!Z2 ! S "!Z!!!Z2 " S "!w!"!Z2 # S "T"!q"!L@  4' bZ2 % S ""!"!Z2 & S "#N"#j"Z2 ' S "<$y"Y$"Z2 ( S "g$"$"Z2 ) S "0%%#[%B#Z2 * S "[%B#x%^#Z2 + S "i%P#%m#Z2 , S "%{#%#Z2 - S "%#%#Z2 . S "%#&#Z2 / S "]&#z&$Z2 0 S "l&#&'$Z2 1 S "&$&D$Z2 2 S "&'$&D$Z2 3 S "'}$C'$Z2 4 S "Q'$n'$Z2 5 S "'$' %Z2 6 S "'$'%Z2 7 S " ()%((F%Z2 8 S "b(c%(%Z2 9 S "(%(%Z2 : S "(%(%Z2 ; S "(%(%Z2 < S ")%9)%Z2 = S ")H&*e&Z2 > S "*&*&Z2 ? S "w+&+&Z2 @ S "+&+'Z2 A S "@,&],'Z2 B S "k,','Z2 C S "z,','Z2 D S ",'-'Z2 E S ",'-'Z2 F S "4-'_-'Z2 G S "B-'_-'Z2 H S "m-'-'Z2 I S "-&-'Z2 J S ".&.&Z2 K S ".&/&Z2 L S "/&G/&Z2 M S "/e&/&Z2 N S "/W&/&Z2 O S "/W&/s&Z2 P S "/:&0W&Z2 Q S "0,&-0H&Z2 R S "I0&f0,&Z2 S S "f0%0&Z2 T S "t0%0&Z2 U S "t0%0&Z2 V S "0%1%Z2 W S "1%=1%Z2 X S "h1c%1%Z2 Y S "w1T%1q%Z2 Z S "2$#2%Z2 [ S "2$#2 %Z2 \ S "2$2$Z2 ] S "2o$2$Z2 ^ S "2R$ 3}$Z2 _ S "2D$3a$Z2 ` S "3#3#Z2 a S "3#3#Z2 b S "3#3#Z2 c S "a4B#~4^#Z2 d S "4#43#Z2 e S "##Z2 f S "#3#Z2 g S "%#A#Z2 h S "{P#{#Z2 i S "%#B#Z2 j S "#%#Z2 k S """Z2 l S "+!W!Z2 m S ":!W!Z2 n S "s!!Z2 o S "w!!Z2 p S "h!!Z2 q S "Z!w!Z2 r S "=!<h!Z2 s S "Y/!vK!Z2 t S "0 M!Z2 u S "  !Z2 v S "l !Z2 w S " !Z2 x S " !Z2 y S " !Z2 z S "&! C!!Z2 { S "R! n! !Z2 | S "`!!}! !Z2 } S "! !"K!Z2 ~ S ""/!7"Z!Z2  S ""!#!Z2  S "+#!H#!Z2  S "+#!V#!Z2  S "#!#"Z2  S "$y"$"Z2  S "$"$"Z2  S "$"$"Z2  S "$"$"Z2  S "$"%"Z2  S "%m#$&#Z2  S "&#& $Z2  S "&#&'$Z2  S "4'D$Q'o$Z2  S "n'o$'$Z2  S "'}$'$Z2  S "'$'$Z2  S "'$'$Z2  S "'$'$Z2  S "'$ ($Z2  S "(($E(%Z2  S "S( %p()%Z2  S "b( %(8%Z2  S "(F%(c%Z2  S ")%)%Z2  S ")%)%Z2  S ")%)%Z2  S ")%)&Z2  S ")%)&Z2  S ")%*&Z2  S "*&;*,&Z2  S ";*&X*:&Z2  S "u*:&*W&Z2  S "!+s&>+&Z2  S "i+&+&Z2  S "+&+&Z2  S "k,&,&Z2  S ",&,&Z2  S ",&&-&Z2  S "_-&|-&Z2  S "|-&-&Z2  S "-&-&Z2  S "(.&S.&Z2  S ".s&.&Z2  S ".s&.&Z2  S ".s&.&Z2  S "U/,&r/W&Z2  S "d/,&/H&Z2  S "r/,&/H&Z2  S "/&/,&Z2  S "0q%0%Z2  S "0c%1%Z2  S "0T%!1q%Z2  S "1F%/1q%Z2  S "!1F%=1c%Z2  S "=1)%Z1T%Z2  S "L1)%h1F%Z2  S "h1 %1)%Z2  S "1$1%Z2  S "1$1$Z2  S "2$12$Z2  S "2$@2$Z2  S "k2a$2}$Z2  S "2R$2o$Z2  S "25$2R$Z2  S "2'$2D$Z2  S "2 $ 3'$Z2  S "{3#3#Z2  S "3P# 4m#Z2  S "3P# 4m#Z2  S "4%#D4B#Z2  S "S4#o4%#Z2  S "4"4"Z2  S "4"4"Z2  S "4"4"Z2  S "m##Z2  S "P#Am#Z2  S "%P#Pm#Z2  S "AB#^^#Z2  S " "'"Z2  S "Ry"o"Z2  S "}\"y"Z2  S ""1"Z2  S "c!!Z2  S "c!!Z2  S "!!Z2  S "+Z!Ww!Z2  S "WK!sh!Z2  S " !K!Z2  S "!/!Z2  S ". Y!Z2  S "K g!Z2  S "  Z2  S "  Z2  S "  Z2  S "  Z2  S "  Z2  S " $ Z2  S "z Z2  S " Z2  S " Z2  S " ! 5! Z2  S " " )"!Z2  S " " )"!Z2  S "" 7"!Z2  S ""/!"K!Z2  S "9#h!e#!Z2  S "V#h!#!Z2  S "#!#!Z2  S "$\"%y"Z2  S "%y"0%"L@  4& aZ2  S "!%"L%"Z2  S "0%"L%"Z2  S "L%"i%"Z2  S "$&B#O&^#Z2  S "&#&#Z2  S "&#'#Z2  S "4'#`''$Z2  S "'a$'}$Z2  S "'a$'}$Z2  S "'a$'}$Z2  S "'a$'}$Z2  S " ($(($Z2  S "b($($Z2  S "($( %Z2  S "($(%Z2  S "))%)T%Z2  S "9)T%d)q%Z2  S "G)c%s)%Z2  S "V)c%s)%Z2  S ")%)%Z2  S ")%)%Z2  S "f*%*&Z2  S "u*%*&Z2  S "*&*&Z2  S "*&*&Z2  S "+,&/+H&Z2  S "+W&+s&Z2   S "N,e&z,&Z2   S "],e&z,&Z2   S "],e&z,&Z2   S "],e&z,&Z2   S ",s&,&Z2  S "B-e&_-&Z2  S "Q-e&m-&Z2  S "m-e&-&Z2  S "|-e&-&Z2  S "-e&-&Z2  S "-e&-&Z2  S "-e&-&Z2  S "a.:&~.W&Z2  S "*/%U/&Z2  S "G/%r/&Z2  S "/%/%Z2  S "/%/%Z2  S "/%/%Z2  S "0%0%Z2  S "f0c%0%Z2  S "f0c%0%Z2  S "08%0T%Z2  S "0 %18%Z2   S "/1$L1 %Z2 ! S " 3#%3#Z2 " S "%3#P3#Z2 # S "B3{#m3#Z2 $ S "m3^#3{#Z2 % S "3B#3^#Z2 & S "3%#3B#Z2 ' S "3# 4%#Z2 ( S "3"4#Z2 ) S "~4"4"Z2 * S "4"4"Z2 + S "4"4"Z2 , S "4y"4"Z2 - S "4j"4"Z2 . S "3"P#Z2 / S "y" "Z2 0 S "D1"`\"Z2 1 S "!"Z2 2 S "!!Z2 3 S "!!Z2 4 S ")!F!Z2 5 S "qw!!Z2 6 S "=!Z!Z2 7 S "=!Z!Z2 8 S " !+=!Z2 9 S "s !Z2 : S "  Z2 ; S "K g Z2 < S "g  Z2 = S "MX j Z2 > S "I t Z2 ? S "$ I O f Z2 @ S "O I z f Z2 A S "l I f Z2 B S " I f Z2 C S " I f Z2 D S "&!X C! Z2 E S "}!t ! Z2 F S "! ! Z2 G S "! " Z2 H S "! " Z2 I S "" 7" Z2 J S "b" " Z2 K S "" " Z2 L S "" " Z2 M S "" " Z2 N S "#!9# !Z2 O S "#!H#/!Z2 P S "#/!#Z!Z2 Q S "#/!#Z!Z2 R S "u$!$!Z2 S S "%1"0%N"Z2 T S "%y"%"Z2 U S "%"%"Z2 V S "%"&"Z2 W S "$&"@&#Z2 X S "O&#l&3#Z2 Y S "l&%#&B#Z2 Z S "z&3#&P#Z2 [ S "&B#&^#Z2 \ S "&m#&#Z2 ] S "&{# '#Z2 ^ S "&#'#Z2 _ S " '#4'#Z2 ` S "' $'5$Z2 a S " (D$((a$Z2 b S "b(}$($Z2 c S "p($($Z2 d S "($($Z2 e S "($($Z2 f S ")$+) %Z2 g S "V)%s)8%Z2 h S ")8%)c%Z2 i S ")T%)q%Z2 j S ";*%X*%Z2 k S "X*%u*%Z2 l S "u*%*%Z2 m S "*%*%Z2 n S "*%*%Z2 o S "+&+&Z2 p S "+&+,&Z2 q S "+&+,&Z2 r S "+&+,&Z2 s S "+&,,&Z2 t S ",&,H&Z2 u S ",&,H&Z2 v S ",& -H&Z2 w S "-&-:&Z2 x S "a.%~.&Z2 y S "a.%~.&Z2 z S "~.%.&Z2 { S "~.%.&Z2 | S ".%.%Z2 } S ".%.%Z2 ~ S "/%/%Z2  S "0F%-0c%Z2  S "-08%I0T%Z2  S "t0 %0)%Z2  S "0$0$Z2  S "1$/1$Z2  S "/1$Z1$Z2  S "1R$1o$Z2  S "15$1R$Z2  S "2 $#25$Z2  S "2 $@2'$Z2  S "12#N2$Z2  S "y2#2#Z2  S "2#2#Z2  S "2#2#Z2  S "3"3"Z2  S "3"4"Z2  S " 4"(4"Z2  S "4"D4"Z2  S "4#"4N"Z2  S ""#Z2  S """Z2  S "3"P"Z2  S "?"j"Z2  S "D!`"Z2  S "R!o"Z2  S "o!!Z2  S "!!Z2  S "!!Z2  S "8K!ch!Z2  S "T=!Z!Z2  S " !=!Z2  S "!/!Z2  S " !Z2  S "+ H Z2  S "  Z2  S "f . Z2  S "f < Z2  S "X K Z2  S " 0; Z2  S "[ x- Z2  S " - Z2  S "  Z2  S "  Z2  S "   Z2  S "   Z2  S "  2  Z2  S "^  z  Z2  S "`! !; Z2  S "n! !I Z2  S "!; "f Z2  S "!I "f Z2  S "7"X b" Z2  S "" # Z2  S "#!# !Z2  S "#!#=!L@ d4& `Z2  S "# !$=!Z2  S "$=!-$Z!Z2  S "g$h!$!Z2  S "g$w!$!Z2  S "u$w!$!Z2  S "u$w!$!Z2  S "$!$!Z2  S "$!%!Z2  S "%?"%\"Z2  S "%j"%"Z2  S "%y"&"Z2  S "&"2&"Z2  S "O&"l&"Z2  S "z&"&#Z2  S "&B#'^#Z2  S "'#( $Z2  S "7($S(5$Z2  S "(D$(o$Z2  S "(R$(o$Z2  S "(o$($Z2  S "9)$V)$Z2  S "V)$s)$Z2  S "s)$)$Z2  S ")$) %Z2  S ")%*8%Z2  S "-*8%J*T%Z2  S "J*F%u*c%Z2  S "*c%*%Z2  S "*c%*%Z2  S "*q%*%Z2  S "Z+%+%Z2  S "w+%+%Z2  S "+%+%Z2  S "+%,%Z2  S "@,%],%Z2  S "],%z,%Z2  S "k,%,%Z2  S "z,%,%Z2  S ",%,%Z2  S ",%,&Z2  S " -%4-%Z2  S "B-%_-%Z2  S "a.%.%Z2  S "p.%.%Z2  S "~.%.%Z2  S ".%.%Z2  S ".%.%Z2  S ".q%/%Z2  S "/q%*/%Z2  S "/q%9/%Z2  S "/%/F%Z2  S "f0$0$Z2  S "t0$0$Z2  S "0$0$Z2  S "0$0$Z2  S "0$0$Z2  S "1o$!1$Z2  S "!1a$L1}$Z2  S "/1R$L1}$Z2  S "1#2#Z2  S "2#3B#Z2  S "3"3"Z2  S "3"3"Z2  S "641"S4\"Z2  S "3\"^y"Z2  S "l1"\"Z2  S "l1"\"Z2  S "#"N"Z2  S "!"Z2  S "Z!w!Z2  S "c !Z2  S "  Z2  S "  Z2  S " + Z2  S "Wf s Z2  S "eX  Z2  S "sX t Z2  S ". K- Z2  S "g  Z2  S " Z2  S "Z2  S "?Z2   S ""?Z2   S " $ Z2   S " !Z2   S " !5!Z2   S "!5!Z2  S "`!}!Z2  S "n!!Z2  S "! " Z2  S "" 7"- Z2  S ""; "X Z2  S ""X #t Z2  S ""X #t Z2  S ""X # Z2  S "#t 9# Z2  S "s# # Z2  S "# # Z2  S "# $ Z2  S "$=!$Z!Z2  S "$Z!$!Z2  S "$!%!Z2  S "%!!%!Z2  S "%!0%!Z2  S "L%!i%!Z2   S "%!%"Z2 ! S "%"%1"Z2 " S "%"%1"Z2 # S "%?"&\"Z2 $ S "&N"@&j"Z2 % S "&N"@&j"Z2 & S "z&"&"Z2 ' S "&"&"Z2 ( S "n'B#'m#Z2 ) S "'{#'#Z2 * S "'{#'#Z2 + S "'#'#Z2 , S "p(#($Z2 - S "p(#($Z2 . S "( $('$Z2 / S "('$(D$Z2 0 S ")$)$Z2 1 S "J*$u*%Z2 2 S "f*$*)%Z2 3 S "*8%+T%Z2 4 S "/+F%L+q%Z2 5 S ">+T%i+q%Z2 6 S "+q%+%Z2 7 S ",%#,%Z2 8 S ",%2,%Z2 9 S "2,%N,%Z2 : S "@,%k,%Z2 ; S "N,%k,%Z2 < S "],%z,%Z2 = S "|-%-%Z2 > S "-%-%Z2 ? S "-%-%Z2 @ S "-%-%Z2 A S "-%-%Z2 B S " .q%(.%Z2 C S "S.c%p.%Z2 D S ".)%/T%Z2 E S "/%G/8%Z2 F S "9/ %d/8%Z2 G S "9/ %d/8%Z2 H S "G/ %d/)%Z2 I S "d/$/%Z2 J S "/$/ %Z2 K S "0R$0}$Z2 L S "0'$1R$Z2 M S "1'$!1D$Z2 N S "1$/1D$Z2 O S "1$=15$Z2 P S "1#2#Z2 Q S "y2%#2B#Z2 R S "2%#2B#Z2 S S "B3"_3"Z2 T S "_3"{3"Z2 U S "m3y"3"Z2 V S "{3j"3"Z2 W S "3N"3j"Z2 X S "3N"3j"Z2 Y S "~4!4!Z2 Z S "4!4!Z2 [ S "?"j"Z2 \ S "{!"Z2 ] S "!!Z2 ^ S " !=!Z2 _ S "! !Z2 ` S "  !Z2 a S " !Z2 b S "8 T Z2 c S "X  Z2 d S " Z2 e S "<Z2 f S "<Z2 g S "YvZ2 h S "Z2 i S ""Z2 j S "0Z2 k S "jrZ2 l S "xrZ2 m S "rZ2 n S "rZ2 o S " d2 Z2 p S "$ dA Z2 q S " r Z2 r S "C!n!Z2 s S "!!Z2 t S "q"" Z2 u S """ Z2 v S "# +#; Z2 w S "9#- V#X Z2 x S "e#I #f Z2 y S "s#I #t Z2 z S "#f # Z2 { S "#t # Z2 | S "#t # Z2 } S "# # Z2 ~ S "$!$/!L@ 4c% H_Z2  S "$/!%K!Z2  S "i%!%!Z2  S "&!2&"Z2  S "&!2&#"Z2  S "@&#"]&?"Z2  S "&j"&"Z2  S "&"&"Z2  S "4'"`'"Z2  S "'3#'^#Z2  S "'3#'^#Z2  S "'^#({#Z2  S "(#(#Z2  S "(#(#Z2  S "(#(#Z2  S "(#(#Z2  S "(#)$Z2  S "G)5$s)R$Z2  S "s)D$)a$Z2  S ")D$)o$Z2  S ")a$)}$Z2  S ")}$)$Z2  S ")$*$Z2  S "*$-*$Z2  S "*$;*$Z2  S ";*$X*$Z2  S "*$*$Z2  S "*$*$Z2  S "*$*$Z2  S "Z+ %w+)%Z2  S "i+ %+8%Z2  S "i+ %+8%Z2  S "+%+8%Z2  S "+%+F%Z2  S "+)%+F%Z2  S "#,8%N,T%Z2  S "N,8%k,c%Z2  S "],8%z,c%Z2  S "],8%z,c%Z2  S "z,F%,c%Z2  S ",F%,c%Z2  S ",F%,c%Z2  S "-8%-T%Z2  S " .)%(.F%Z2  S ".%E.F%Z2  S ".$.%Z2  S ".$. %Z2  S ".$. %Z2  S ".$/$Z2  S "G/$d/$Z2  S "G/$r/$Z2  S "0o$-0$Z2  S "0#0'$Z2  S "1#/1#Z2  S "!1#L1#Z2  S "1#1#Z2  S "1#1#Z2  S "1{#1#Z2  S "#2#@2B#Z2  S "\2"2#Z2  S "B3N"m3j"Z2  S "P3?"m3j"Z2  S "P3?"m3j"Z2  S "3"3#"Z2  S "3!4!Z2  S ""1"Z2  S ""#"Z2  S "!"Z2  S "!3"Z2  S "w!!Z2  S " /!'Z!Z2  S "' !D=!Z2  S "D!`/!Z2  S "} !Z2  S "8f c Z2  S "Ff c Z2  S "Ff c Z2  S "qI t Z2  S "- X Z2  S " ; Z2  S ": Z2  S ": Z2  S "Z2  S "Z2  S "Z2  S "dZ2  S "UrZ2  S "[*xUZ2  S "GZ2  S "$ O 9Z2  S "  GZ2  S "  GZ2  S " !*&!UZ2  S "&!9R!UZ2  S "`!9}!dZ2  S "`!9!dZ2  S "E"q"Z2  S """Z2  S """Z2  S ""#Z2  S ""#Z2  S "H#s# Z2  S "-$f J$ Z2  S "x%=!%h!Z2  S "x%K!%h!Z2  S "x%K!%h!Z2  S "%K!%w!Z2  S "&!$&!Z2  S "&!2&!Z2  S "2&!O&!Z2  S "@&!]&!Z2  S "z&"&#"Z2  S "&#"&?"Z2  S "&#"&?"Z2  S "&\"'y"Z2  S "'j"4'"Z2  S "4'"`'"Z2  S "E(B#b(^#Z2  S "E(B#p(m#Z2  S "(#(#Z2  S "(#(#Z2  S ")#9)#Z2  S "+)#G)#Z2  S "V)#s) $Z2  S ")'$)D$Z2  S "-*R$J*}$Z2  S "f*o$*$Z2  S "*}$*$Z2  S "*$*$Z2  S "*$+$Z2  S "+$/+$Z2  S "!+$>+$Z2  S "w+$+$Z2  S "+$+$Z2  S "+$+$Z2  S ",$-%Z2  S "4-$Q-%Z2  S "-$- %Z2   S "-$-$Z2   S "-$-$Z2   S "-$.$Z2   S ".$6.$Z2   S ".$E.$Z2  S "a.$~.$Z2  S ".$.$Z2  S ".$.$Z2  S ".$/$Z2  S "*/}$U/$Z2  S "0$-0D$Z2  S "-0 $I0'$Z2  S "X0#t0$Z2  S "0#1#Z2  S "0#1#Z2  S "!1{#=1#Z2  S "L1^#w1{#Z2  S "1%#1P#Z2  S "1"2#Z2  S "2"#2#Z2  S "2?" 3j"Z2  S " 31"%3N"Z2  S "3#"43N"Z2   S "B3!m3#"Z2 ! S "3w!4!Z2 " S "4!4=!Z2 # S "4!4/!Z2 $ S "!%!Z2 % S "Ph!l!Z2 & S "=!Z!Z2 ' S "=!Z!Z2 ( S "  !Z2 ) S " !Z2 * S " !Z2 + S "  Z2 , S "8 c; Z2 - S "Z2 . S "Z2 / S "eZ2 0 S "rZ2 1 S "GrZ2 2 S "<*YGZ2 3 S "K*vGZ2 4 S "K*vGZ2 5 S "9Z2 6 S "Z2 7 S "Z2 8 S "?[Z2 9 S "Z2 : S "Z2 ; S " $ Z2 < S "$ O Z2 = S "  Z2 > S " !Z2 ? S ""*E"GZ2 @ S ")"*T"GZ2 A S ""G"rZ2 B S ""U"rZ2 C S ""U"rZ2 D S ""d"Z2 E S "s##Z2 F S "##Z2 G S "##L@ 64$ ^Z2 I S "## Z2 J S "# $ Z2 K S "$ -$- Z2 L S "$ -$- Z2 M S "g$I $f Z2 N S "0% L% Z2 O S "%!%/!Z2 P S "%K!&w!Z2 Q S "]&!z&!Z2 R S "&!&!Z2 S S "&"&'1"Z2 T S "'#"4'N"Z2 U S "&'1"C'N"Z2 V S "C'N"`'j"Z2 W S "C'N"n'j"Z2 X S " ("(("Z2 Y S "p(#(3#Z2 Z S ")m#)#Z2 [ S ")#G)#Z2 \ S "+)#G)#Z2 ] S ")#)#Z2 ^ S ")#)#Z2 _ S ")#* $Z2 ` S ";*$X*5$Z2 a S "X*$u*D$Z2 b S "*5$*R$Z2 c S "*D$*a$Z2 d S "N,$k,$Z2 e S ",$,$Z2 f S ",$,$Z2 g S ",$,$Z2 h S ",$-$Z2 i S "B-$m-$Z2 j S "Q-$m-$Z2 k S "-$ .$Z2 l S ".$E.$Z2 m S "(.$E.$Z2 n S "E.}$a.$Z2 o S ".a$.}$Z2 p S ".a$.}$Z2 q S ".D$*/a$Z2 r S "*/5$G/a$Z2 s S "r/$/5$Z2 t S "/#/$Z2 u S ";0#X0#Z2 v S "f0#0#Z2 w S "0{#0#Z2 x S "Z1#w13#Z2 y S "Z1#1%#Z2 z S "1"1"Z2 { S "1"2"Z2 | S "1"2"Z2 } S "2?"2\"Z2 ~ S "21"2N"Z2  S "2#"2N"Z2  S "3h!3!Z2  S "3h!3!Z2  S "3h!3!Z2  S "3Z!3!Z2  S "3=! 4h!Z2  S "3/!(4K!Z2  S "(4!D4/!Z2  S "(4!S4/!Z2  S "4 4 Z2  S ||"K!3h!Z2  S ||"P !lK!Z2  S ||" !Z2  S ||"  5 Z2  S ||"' R Z2  S ||"oX  Z2  S ||"oX t Z2  S ||"I f Z2  S ||"cZ2  S ||"Z2  S ||"Z2  S ||"Z2  S ||"rZ2  S ||":GWrZ2  S ||":GWdZ2  S ||"Z2  S ||"Z2  S ||""?Z2  S ||"jZ2  S ||"Z2  S ||" Z2  S ||"l  Z2  S ||"l  Z2  S ||"z  Z2  S ||"  Z2  S ||"  Z2  S ||"  Z2  S ||"C!`!Z2  S ||"R!}!Z2  S ||"!!Z2  S ||"""9Z2  S ||""*#GZ2  S ||""*#GZ2  S ||""*#UZ2  S ||"H#Ue#rZ2  S ||"V#ds#Z2  S ||"#$Z2  S ||"#$Z2  S ||"$<$Z2  S ||"$ $; Z2  S ||"L% x% Z2  S ||"% % Z2  S ||"% %!Z2  S ||"%!&/!Z2  S ||"%!$&/!Z2  S ||"&!$&/!Z2  S ||"& !2&=!Z2  S ||"$&/!@&K!Z2  S ||"&!&!Z2  S ||"&'!C'"Z2  S ||"`'"|'1"Z2  S ||"|'#"'N"Z2  S ||"'j" ("Z2  S ||"("E("Z2  S ||"E("b("Z2  S ||"(#)3#Z2  S ||")3#9)P#Z2  S ||"s)^#)#Z2  S ||"s)^#)#Z2  S ||";*#X*#Z2  S ||"/+$L+D$Z2  S ||"/+'$L+D$Z2  S ||"L+'$w+R$Z2  S ||"+D$+o$Z2  S ||"N,a$z,}$Z2  S ||",a$,}$Z2  S ||"-R$-}$Z2  S ||"-R$-o$Z2  S ||"-R$-o$Z2  S ||"-D$(.a$Z2  S ||".D$6.a$Z2  S ||".D$E.a$Z2  S ||"6.5$S.a$Z2  S ||"~.'$.D$Z2  S ||"/#/#Z2  S ||"/#/#Z2  S ||"/#0#Z2  S ||"/#0#Z2  S ||"0#0#Z2  S ||"03#0P#Z2  S ||"0#13#Z2  S ||"/1"L1"Z2  S ||"=1"Z1"Z2  S ||"Z1"1"Z2  S ||"1\"2y"Z2  S ||"121"N2N"Z2  S ||"@2#"\2N"Z2  S ||"N2#"k2?"Z2  S ||"\2"21"Z2  S ||"y2!2"Z2  S ||"2!2"Z2  S ||"%3!P3!Z2  S ||"43w!P3!Z2  S ||"P3Z!{3!Z2  S ||"3/!3Z!Z2  S ||"3 4!Z2  S ||"3 4!Z2  S ||"3 4!Z2  S ||"4 4 Z2  S ||"4 4 Z2  S hh"I 5f Z2  S hh"Z2  S hh" )Z2  S hh"GrZ2  S hh":*Z2  S hh"sZ2  S hh"Z2  S hh"Z2  S hh"YvZ2  S hh"gZ2  S hh"v~Z2  S hh"bZ2  S hh"b"~Z2  S hh"jEpZ2  S hh"jEpZ2  S hh"xEpZ2  S hh"EbZ2  S hh"EbZ2  S hh"E bZ2  S hh" E$ bZ2  S hh"^ 6z bZ2  S hh" E bZ2  S hh" E bZ2  S hh" E bZ2  S hh"}!b!~Z2  S hh"!p!Z2  S hh"!"Z2  S hh"!)"Z2   S hh")"E"Z2   S hh"7"T"Z2   S hh"""Z2   S hh"e##9Z2   S hh"e##9Z2  S hh"#U#rZ2  S hh"#U#Z2  S hh"#d$L@ 45$ ]Z2  S hh"J$g$Z2  S hh"!%- >%I Z2  S hh"% % Z2  S hh"% % Z2  S hh"$& @&!Z2  S hh"O&!l& !Z2  S hh"z& !&=!Z2  S hh"& !&K!Z2  S hh"&/!&K!Z2  S hh"&=!&h!Z2  S hh"&h!&!Z2  S hh" '!&'!Z2  S hh" '!&'!Z2  S hh"'!4'!Z2   S hh"n'!'!Z2 ! S hh"|'!'!Z2 " S hh"((N"E(j"Z2 # S hh"("("Z2 $ S hh"("("Z2 % S hh"("("Z2 & S hh"(")"Z2 ' S hh"V)#)3#Z2 ( S hh")P#*{#Z2 ) S hh"J*#f*#Z2 * S hh"*#+#Z2 + S hh"*#+#Z2 , S hh"L+#i+#Z2 - S hh"i+#+ $Z2 . S hh"i+#+ $Z2 / S hh"i+#+ $Z2 0 S hh", $#,'$Z2 1 S hh"4-$Q-5$Z2 2 S hh"B-$m-5$Z2 3 S hh"E.#p. $Z2 4 S hh"p.#.#Z2 5 S hh"~.#.#Z2 6 S hh".#/#Z2 7 S hh"9/#U/#Z2 8 S hh"/{#/#Z2 9 S hh"/{#/#Z2 : S hh"/m#/#Z2 ; S hh"/^#/{#Z2 < S hh"/P#0m#Z2 = S hh"0B#0^#Z2 > S hh";0%#X0B#Z2 ? S hh"I0#f0B#Z2 @ S hh"0"0#Z2 A S hh"0"0#Z2 B S hh"0"0"Z2 C S hh"0"1"Z2 D S hh"!1"=1"Z2 E S hh"1#"1?"Z2 F S hh"1#"1?"Z2 G S hh"P3!m3=!Z2 H S hh"P3!{3/!Z2 I S hh"3 3!Z2 J S hh"3 3!Z2 K S hh"3 3 Z2 L S hh"3 4 Z2 M S hh"3 4 Z2 N S hh" 4 (4 Z2 O S hh"S4f o4 Z2 P S hh"S4f o4 Z2 Q S hh"4- 4I Z2 R S TT"A ^ Z2 S S TT"^  Z2 T S TT"X t Z2 U S TT" ; Z2 V S TT"D` Z2 W S TT"Z2 X S TT"8GTdZ2 Y S TT"q9Z2 Z S TT"eZ2 [ S TT"Z2 \ S TT"Z2 ] S TT"S.~Z2 ^ S TT"S.~Z2 _ S TT".SKpZ2 ` S TT"(SZ2 a S TT"0 M(Z2 b S TT"0 [(Z2 c S TT"xZ2 d S TT"Z2 e S TT"Z2 f S TT"Z2 g S TT" 2 Z2 h S TT"  Z2 i S TT"  Z2 j S TT"  Z2 k S TT" &!(Z2 l S TT"`! }!6Z2 m S TT"}!!6Z2 n S TT"}!!6Z2 o S TT"!(!EZ2 p S TT" "E7"bZ2 q S TT""E7"bZ2 r S TT"E"Sq"pZ2 s S TT""p"Z2 t S TT"""Z2 u S TT"#9#Z2 v S TT"$9<$UZ2 w S TT"g$d$Z2 x S TT"$$Z2 y S TT"$$Z2 z S TT"$%Z2 { S TT">%[% Z2 | S TT"%- %I Z2 } S TT"%I %f Z2 ~ S TT"& @& Z2  S TT"2& O& Z2  S TT"l& & Z2  S TT"& &!Z2  S TT"& &!Z2  S TT"& &!Z2  S TT"&!&/!Z2  S TT"&/!'Z!Z2  S TT"&'K!C'w!Z2  S TT"&'Z!Q'w!Z2  S TT"C'h!`'!Z2  S TT"'!'!Z2  S TT"7("S(1"Z2  S TT"E("b(1"Z2  S TT"(?"(\"Z2  S TT"(N"(j"Z2  S TT")"+)"Z2  S TT")#*%#Z2  S TT")#*%#Z2  S TT")#*3#Z2  S TT"*#*3#Z2  S TT"*m#+#Z2  S TT"!+#>+#Z2  S TT">+#Z+#Z2  S TT"+#+#Z2  S TT"+#+#Z2  S TT"+#+#Z2  S TT"+#,#Z2  S TT"+##,#Z2  S TT"N,#k,#Z2  S TT",#,#Z2  S TT"-#B-#Z2  S TT"4-#_-#Z2  S TT"|-#-#Z2  S TT"-#-#Z2  S TT"-#.#Z2  S TT"-#.#Z2  S TT"p.#.#Z2  S TT"p.#.#Z2  S TT"~.#.#Z2  S TT".m#/#Z2  S TT"/3#/P#Z2  S TT"0";0#Z2  S TT"X0"t0"Z2  S TT"!1N"L1j"Z2  S TT"w1#"1?"Z2  S TT"1"1#"Z2  S TT"1!1"Z2  S TT"N2!k2!Z2  S TT"N2!k2!Z2  S TT"\2w!y2!Z2  S TT"B3 _3 Z2  S TT"B3 _3 Z2  S TT"_3 {3 Z2  S TT"3t 3 Z2  S TT"3t 3 Z2  S @@"  Z2  S @@"P; lf Z2  S @@" Z2  S @@"'DZ2  S @@"UrZ2  S @@"Z2  S @@"Z2  S @@"Z2  S @@"Z2  S @@"Hbe~Z2  S @@"sEpZ2  S @@"sEpZ2  S @@"sEpZ2  S @@"(SZ2  S @@" .(Z2  S @@"v Z2  S @@" Z2  S @@"0Z2  S @@"[xZ2  S @@"jZ2  S @@"Z2  S @@"O l Z2  S @@"l  Z2  S @@"z  Z2  S @@"  Z2  S @@"  Z2  S @@" !Z2  S @@" !&!Z2  S @@"!!Z2  S @@"!! Z2  S @@""("EZ2  S @@"+#pV#Z2  S @@"##Z2  S @@"##Z2  S @@"#$Z2  S @@"#$L@ 4# \Z2  S @@"-$Y$Z2  S @@"g$$9Z2  S @@"$*$UZ2  S @@"$9$UZ2  S @@"%>%Z2  S @@"L%i%Z2  S @@"i%%Z2  S @@"$&I @&f Z2  S @@"]&t z& Z2  S @@"& & Z2  S @@"& & Z2  S @@"C' !n'=!Z2  S @@"n'=!'Z!Z2  S @@"|'=!'h!Z2  S @@"'w!'!Z2  S @@"'!(!Z2  S @@"7(!b(!Z2  S @@"p(!("Z2  S @@"(!("Z2  S @@"(!("Z2  S @@"("(?"Z2  S @@"G)j"d)"Z2  S @@"V)y")"Z2  S @@")")"Z2  S @@"*";*"Z2  S @@"*%#*B#Z2  S @@">+B#i+m#Z2  S @@"+^#+{#Z2  S @@"+m#+#Z2  S @@"+m#,#Z2  S @@"#,{#@,#Z2  S @@"@,{#],#Z2  S @@",{#,#Z2  S @@",{#,#Z2  S @@",{#,#Z2  S @@",{#,#Z2  S @@"-{#B-#Z2  S @@"-m#-#Z2  S @@"(.^#S.{#Z2  S @@"~.B#.m#Z2  S @@".3#.^#Z2  S @@".3#.^#Z2  S @@".%#.B#Z2  S @@"/"/"Z2  S @@"/"0"Z2  S @@"/"0"Z2   S @@"t0j"0"Z2   S @@"0N"0j"Z2   S @@"0?"0\"Z2   S @@"1"/11"Z2   S @@"Z1!w1"Z2  S @@"Z1!w1"Z2  S @@"Z1!1"Z2  S @@"w1!1!Z2  S @@"1!1!Z2  S @@"2h!12!Z2  S @@"#2Z!N2w!Z2  S @@"12K!N2w!Z2  S @@"2 2!Z2  S @@"{3X 3 Z2  S @@"3I 3t Z2  S @@"464 Z2  S @@"464 Z2  S @@"64S4 Z2  S ,,"; X Z2  S ,,"; X Z2  S ,,"; X Z2  S ,,"3 ^- Z2  S ,,"A ^ Z2   S ,,"Pl Z2 ! S ,,"P{ Z2 " S ,,"Z2 # S ,,"R9}dZ2 $ S ,,"o*GZ2 % S ,,"S~Z2 & S ,,"EpZ2 ' S ,,"+(HEZ2 ( S ,,"+(WEZ2 ) S ,,"Z2 * S ,,".Z2 + S ,,".Z2 , S ,,"YvZ2 - S ,,"YZ2 . S ,,"Z2 / S ,,"|Z2 0 S ,,"nZ2 1 S ,,"_Z2 2 S ,,"_Z2 3 S ,,"_Z2 4 S ,,"$ _A |Z2 5 S ,,"2 _O |Z2 6 S ,," _ Z2 7 S ,,"&!nC!Z2 8 S ,,"C!|`!Z2 9 S ,,"R!|}!Z2 : S ,,"`!|!Z2 ; S ,,"}!|!Z2 < S ,,"!!Z2 = S ,,"!!Z2 > S ,,"! "Z2 ? S ,," ")"Z2 @ S ,,"""Z2 A S ,,"""Z2 B S ,,""#(Z2 C S ,,"#E#pZ2 D S ,,"#~$Z2 E S ,,"#~$Z2 F S ,,"$$*Z2 G S ,,"!%G>%dZ2 H S ,,"i%%Z2 I S ,,"%%Z2 J S ,,"%&Z2 K S ,,"2& O&- Z2 L S ,,"2& O&- Z2 M S ,,"]&- z&I Z2 N S ,,"&I &f Z2 O S ,,"& & Z2 P S ,,"'/!'K!Z2 Q S ,,"((h!E(!Z2 R S ,,"b(!(!Z2 S S ,,"(!(!Z2 T S ,,"(!(!Z2 U S ,,"(!(!Z2 V S ,,"(!(!Z2 W S ,,"(!(!Z2 X S ,,"(!)"Z2 Y S ,,")!+)"Z2 Z S ,,")!+)#"Z2 [ S ,,")"9)#"Z2 \ S ,,"G)#"d)?"Z2 ] S ,,"d)1")N"Z2 ^ S ,,")?")j"Z2 _ S ,,")\")"Z2 ` S ,,"f*"*"Z2 a S ,,"*"*"Z2 b S ,,"*"*"Z2 c S ,,"*"+"Z2 d S ,,"/+"Z+#Z2 e S ,,"+#+3#Z2 f S ,,"+#+3#Z2 g S ,,",%##,B#Z2 h S ,,",3#,P#Z2 i S ,,"|-3#-P#Z2 j S ,,"-%#-P#Z2 k S ,,"-%#-B#Z2 l S ,,"6.#S.3#Z2 m S ,,"S.#p.%#Z2 n S ,,".".#Z2 o S ,,"G/"d/"Z2 p S ,,"d/"/"Z2 q S ,,"/"/"Z2 r S ,,"0\"0"Z2 s S ,,"2 !12=!Z2 t S ,,"2 !12=!Z2 u S ,,"12!N2 !Z2 v S ,,"y2 2 Z2 w S ,,"2 2 Z2 x S ,,"2 2 Z2 y S ,,"2 3 Z2 z S ,,"B3; m3X Z2 { S ,,"B3; m3X Z2 | S ,,"3 3 Z2 } S ,,"4U4rZ2 ~ S ,,"494dZ2  S " Z2  S "3PZ2  S "rZ2  S "oZ2  S "Z2  S "Z2  S "FSqpZ2  S "TSpZ2  S "cEbZ2  S "(EZ2  S " (Z2  S "Z2  S ":WZ2  S "Z2  S "|Z2  S ".nYZ2  S "C_Z2  S "A ^ 4Z2  S "^ z 4Z2  S "  4Z2  S "  !CZ2  S " !&&!CZ2  S "}!4!_Z2  S "!C!_Z2  S "!C!nZ2  S "!Q"|Z2  S "T"|q"Z2  S """Z2  S """Z2  S """Z2  S """Z2  S "#+#Z2  S "#9#Z2  S "+#H#Z2  S "##6Z2  S "##6N2  S "[N2  S "ZN2  S "YN2  S "XN2  S "WN2  S "VN2  S "UN2  S "TN2  S "SN2  S "RN2  S "QN2  S "PN2  S "ON2  S "NN2  S "MN2  S "LN2  S "KN2  S "JN2  S "IN2  S "HN2  S "GN2  S "FN2  S "EN2  S "DN2  S "CN2  S "BN2  S "AN2  S "@N2  S "?N2  S ">N2  S "=N2  S "<N2  S ";N2  S ":N2  S "9N2  S "8N2  S "7N2  S "6N2  S "5N2  S "4N2  S "3N2  S "2N2  S "1N2  S "0N2  S "/N2  S ".N2  S "-N2  S ",N2  S "+N2  S "*N2  S ")N2  S "(N2  S "'N2  S "&N2  S "%N2  S "$N2  S "#N2  S ""N2  S "!N2  S " N2  S "N2  S "N2  S "N2  S "r  6 r  6 r  6 r  6 r  6 r  6 r  6 r  6 r  6   r  6   r  6   r  6   r  6   r  6 r  6  r  6  r  6  r  6  r  6  r  6 r  6 r  6 r  6 r  6 r  6 r  6 r  6 r  6 B S  ?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst<t<t<t< t<  t<t<tq"tmV*utEVutV-ut V utViutVut<t<t<t< t<  t<t<tq"tmV*utEVutV-ut V utViutVutetetP{tPmtB_t t =t =ttt;tS~tEpt tt ttQ m't 5tCtCty'Ctk'Ct@']Ct'Ct'Ct'Ct>Z5t 'tf tttt^+zt3Ot3Otb$t7StEtttQMnxt&0C[t"t"t"t@kt@]t h$t Yvt K vt . Kt  .tL w t  t e t W ttu I etu I et - ,t - t  t9 d t U qt"S tptMqtHt0 < t"= t0 Z t$xj t["  t & t?' tj S t7"T tn  t "t ? t  =tJ "> t  jtk t? t& 't]( t0 Tt"a tv@@@UnknownGz Times New Roman5Symbol3& z Arial"huu$0z2Q Joe Chuma Joe Chuma  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89q  FMicrosoft Word Picture MSWordDocWord.Picture.89qObjectPoolGJ0`0`WordDocument"SummaryInformation(IKDocumentSummaryInformation87 bjbjUU "7|7|vcl ޴,,,,,MMM]______$ NM MMM],,g]]]M,,]]M]]]]&],  0y]]]0޴]]]] 0 20 40 60 80 100 -1 0 1 2 3 4 5 6 0 20 40 60 80 100 -1 0 1 2 3 4 5 6 uvwy{}B*OJQJ^JmH phsH jCJUmHnHsH u:vxy|}v 1hN N!"#$%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@@՜.+,0 hp  TRIUMFl  Title C A? "2 R^p$ *wzC~ QO`!v R^p$ *wzC&b'b'D xڥk obQdv 6q{, N^vfMQa˚a.Va˚a.nJ%/ee` [ sLQa˚a.ޓ)j3lY3-Yi$s\6Ö5\|.+}SfزfeeF F F F F F F F F F F F F F F jfp'7C-2)+NnZ20EmZPKzPK;jIjɭ)-Yi$wr3Ԓ Sf% o d1l6Ù5z6Ù5zҔJ\ά֓Y院6Ù5z'+mSf8fXOZH֓Y0Em3k\VpfͰʶ)j3TnrzeJSV* t` t9:LQ.ħr3Ӷ)j3[SZHNf(PNWSibv*7C96EmkTmk)+p%)j3X3'3EmktOVڦp`Ͱd7ra  +鹬MQa%=mSf(d ʔT}  rݾ> f-=-jsx_nB6EmBvkJKVɾ9 j/7G!뛢6G![(dۦ̚a63kYSV*RV̚av"+=S>>l9fOyE٧aZl _bKCW B_bɉ6m&'LNe0{ahי+bl39fr/={N!c{H:9aehw.ov3[hl39fr說=dr⯩Xcɉ6m&'JLN6s2%wخvM8/űGv)`rʱߚcɉ@6m&'ZLN ;KLNe;{wl39W؞='n=$l1휰=i.v%>|l39Wfroer/cɉ_6m&'~9LNi+.v"w =$l^휰s&'~LNUl39[ fr* 09k fr7/3`{Lks&w->`D~ufr7#/I`ɉߗvɉ_6Em&'~LNn5 l39&w-_`D~u+s;29fr79/u`ɉ6m&'~9m&'~LNZgɴ l /`;'l7.3m%$خ_,6cm&'~LN KLN }l39)frT/`ɉ]63m%-خ_nv W^~vɉ_6m&'~=LN l393294frj/`{L۵ s8&w-`D~/u+:fru/`ɉA0`ryo`ɉ_6m&'~LNi A. v7=$l<휰LNJ"l39FfrwįaɉDvɉ_J6m&'~U ۳de63m %Nخ_v6m&'~ LN6s&'~1 LNu)l39Sfr◨S!;'wVaD~ u W߽rkX {{0/19Yfrr{Zfr2^ a39ymoaxn39;]Ю399t]fr23a39麥/lϞh"w ٥[vN؏gAyvŰ]'ѱ]&'~c LNZny LN{dDVʰd]Ftɉ_46Csm&'3cLNn RѱSaN؏‡ѱѱS.a;'. +#Dd J  C A? "2>Gjo+go0ba2_O`!Y>Gjo+go0bv\\'xڥO{n7pw޹ BLݥ"Э#)BA׻I BH"ApaހPhAiPysڹn \ ' AA0Lw@pw0mo~ܙgKG3үG//ǩvXϣG(~On .Wˏ?u;RH#(X=c||m㕹_׿ .U`G GҾnѣAҹ3ۿ~?3'}(Qr|Gx 2#c繣wy{n=7s cX~WeEVzP2k e:Tu(9YقR|;e(+kP~lCit=YAU eITʨO[*EYiAȲ/e%#d侔їܗ2d侔їܗ2RF_2r_KFK}})//e%#%bIK$KIK$KIK$KIK$8R/%/ R/%/ R/%/ R/%/}-їܗ>ҖG_r_K[K}i}/m/}i}/m/}-їܗ>ҖG_r_K[~f.e.\(+-(+҃ҔܗpڗpJNVTe%}  ee ڗpJQVde:.e.AP$2}9̆҂"+=(MY gk EIe6l)+ PEIe6,6LdzaOVrP2T}/y/u%/їܗ:RG_r_K^K}}/y/u%/їܗ:RG_r_K^K}}/5/]&tїܗ.RE_jr_KMK}}/5/]&tїܗ.RE_jr_KMK}}2U/*EYiAȲWLFPԾLFPr*+AtUde(+kPԾLFP %+U/Qʔ\*/GїHQe"ZYAiL8]e(j_/QNVTe%&MYY25(j_/QQVde:z2% EK}}/Y/%+dTЗܗ RA_r_*KVK}}/Y/%+dTЗܗ RA_r_*KVK})}/e/,tЗܗRA_r_:KYK})}/e/,tЗܗRA_r_:KY}I ЗD}I ЗD}I ЗD}I Зo8,A?ܟ?ܟ?ܟ?ܟ83JUY(+-(+҃Ҕ/g>^g>^-(UY ܗxPV֠}7eeJKVܗ8eJ.CڗXi`(+-(+҃Ҕ`|MV}9s*+At0ޔ(CYY4r0.6L㞬LeBQ@_ r_KAK})}i// 4ЗܗR@_ r_KAK})}i// 4ЗܗRp̷w_aNז̷o[vLvCƳ'(.x>ʶ{3 glMwP];)x]mm<{gMv dzlmWs<>ʶ[:}?eۅ>Dvwdznk<eۍ~rg/P#mW~<;KvdzlS G(ۮym7<eۥ!>NvȳOP]%eʶ[E}킑g(ycڑglg).#y9ʶ{Ie%>Ov[ɳmkv5ҵ`l%-ƶ &cIok{#o1*lߗ ی݃w{&9DeuKۛ ~o|*c/D{oED?` ث26l1t7"1c/& cWat|{O1uiA]{^(ۮ ΙmQQ_2!u{MN7K~hL};&tߔb]=}mP}{?a/T>@n*1o.k}'aۍU߾fyշ;c%==mWZ}ΙVߞ'tѕby {bv 0aRo?@~, ۮaۭY>BKfַ2~hl;]mS~Wa3~~?J=LLئ}s~ uL {6=@ Qc] aof}a3>Gqy®f]m׷Km7}ine`~ӽ`];g}yN~@؛fط/6 ;,fNEduN~Dvط_!l {,$&3~ml˚oNvcٷ Y^a{L$lΙf~Egߗ{<ۄ=N7~_&Yw ;ݏfIvUڷݚd}}Nw~0U!afa7a3{~B3)ߟv6afaof= !lߟBt .faof%aofaOǧ~$%L]s_c}MDd rrJ  C A? "26C)[Gן\?o/uᑼ>p%#^y;UIoi:{Iܹ-rzS>{_n|t~=w&|#{hlo|? ~LsO:euuީw7ZReeaoskV yonJY}>lJ1Z([(/CVE[5ZJ&ܚ!R)wXeM)E+uQؾ NecrG2h%x-Ze[(l_H_9Z)eKh xˀJ+}#}jR.C&ؾdigKV}=Y/Y:K%{t_~U/Yǟˢ}$R fd(l_X8K%/%Y/Y"J]Lۗ%

-}I辴/ ݗ%Җ$t_җK[}iK_/mKB-}I辴/ ݗ%Җ$t_&igd&JVݗɠ. ۗ`۠2TEa2Q=G+}/F0RgV} /(l_&\Ae2G!o}iH_ۗh%EaҐ%Z!})s>*aҐ#:*Ey](l_җbJ+}iH_AV*eŀh8} D)J]2Ea2{+t_Fê(l_FhX˨^2* ݗѰ) ۗp,\2.e4E+t_FÊ(}t2 ݗHeA2h%-ZeA2.JU/ җpVʢ|_ήeCςg$\(l?#*,gA3h"J]L<鏦y?њ(%Zɻt(laoOTOʢo<ݗ~?O?j? G}r<ݗ"J]LzƴspL b}@lcڇ[oa ;}iݽiClc[/ {>}ʏi[o)֋@}NiAldg[o vҐiCl?dSWLzȴ/"^02KwL֎L;AldW[/#U{I} i_Gld7[/.-;L}:iEld[/9}Ni?Dle Lz7ʴiMʴ눭7L1b)~zʴ"^2b*^Elhe[\v i@le/[/e+YiAleo[/pb].`e_C췐, d/~ z̲_A에,d1nA^g7,{e7 [YS֫ee?lpfuֻgwZCd4^lf![Y+k}e߃lfw![Ymm} e߀lf![Y5֫p}Ve_l g d]9˾ ;Y%t}2e [Yd;>zβ,,d<>zϲOC̳S,z_ϲOB^ݳ,8d>>zϲNk~}Ɵelgه [Zd@>z;вs-dAl>h![oZ>Kl_h{![Zv֡elhd]Dv{D[o(ˊlh{[0v6mlh[8v/`uG>zѶs m `}Hliۇ[oIa }mݵQ}1n8`m}b4$`ym}h)POv"63!,`OȱM?{6)ع {Flߗ+n7u>~'R}b*`{HZ뀝n"zqԶovvHm6`H,{."zԶvMCNP~/ZH`w]jw[b#~ n)`y {{gb#~AKn` ߯&67PH+n zZ-﷈RݑkNn~B!k/;bi;Q; \߫=6uM.杻wM b*i?FtwgԂi?Bx$]۽ {[jش";b{@#Z6{n zqشo#vvMb@o ,6눝.zش"vMN~'=M2bwH/^S}[jcٴK="S1>Cjٴn7>zٴ vvM4b@O!ڄ6bK@O"ޏ6]SҦ}ӭi{F-PQs#Z5ÈR֦} N~D!m9N~@lmڽmޏ6}=6M;7hM;5m{; Z6m.}qo f$$If!vh5 5 5 #v #v #v :V l65 4Dd ooJ  C A? "2cjSJQ~O`!cjSJv0*0*xڥlul.B(iĬw $-FF镈 ^ele\BY^z {e ="D%=Oyk{.w~}lXrȲBd+zӯSxؾ㭯]cuۯʴE}zz':GV9><>9Ȋ^͏ڎ e\Zgmv[pӇvzt {Urë}&di;5[kږmۯ6kj΃;-ZtltqۙפQˊigX>JOh^T:Bo?[ͯ}^ Ȏu O`gƻ!ͯz/oy X|J^iJ~[t;+R *JcRH9*ˤdJ[i,*)VWjDW|VE'=*p1T>ÖkiR2j%e[5R&EۗE˰5V hH}&Jm_/VVakITIe2lͫ)ھ,R_ZɓҮ.C,}G ھ dJZ)ˀ,2`Henu}sh2`/U+ioAݗJ/vˀ]"Eۗ;,2`IiW!.2K}Iھ-:egJ^kjL/ԗ=V h2K}Iٓj%G/ԗU+i/e/*)ھR_RZ),%eJvubaھtw鲺/t[,I&gFHiut:9R}tIɪWVөK}tJh$/NvubaYݗ KɨJm_&/ΌZ)ÙT+9R}t8Y:%R%Eۗ K3VJh2A}pj%OJ %X1/q=Kwqu_nm_n;K͑K]&%V޸/qJ/qW%H%&qu_nvubḺ/9KKtͨJm_rԗwFH%G}iq'Jm_rԗ7V^VhjD/9K[T+yRe-/uKVݗz9ZJt|@ۗ:%KUN}ɪRd}S_ԩ/Yu_ԗ/uKVݗ:%KUN}ɪRd}Feu_R2j%e/2Iev} h2ҭzRD=}򖛅*irJm_>Yݗ!D/C^"XVe˓Ү.C,\VB}I{ھT/i/VRvګ2)ھT/ioFHB}I{j%zTKn}%R%Eۗ %ͫ)ھT/iV򤴫 Ӟ/5K@JF9u_z2)ھΜ/~m_zVwNݗ^?G/]zNݗ^-ΩWI}Kh'9u_z<)29u_/=/ԗ?VRv_S+eR}3j@/ԗRHH--KYKg/*)LSzyR"E۟iO_T+yR刅=?`ĚR',Q+){JݟdP&E۟dL h Z)uA$=R%I}IUR}I}/ɠD/ L 򤴫 }$m_ƨ/ VRv"2)ھQ_Z)%LQm_ƨ/s Z%%%R%Eۗ1K"W+%R}$ZɓҮ.C,LھሕW%HɨW%ˤhN^ݗ ,Kyu_0 m_pVI{yu_J/AG'Jm_E} <)2|d>n}h=2} `eَ6ߛ Whd;|FOlX#'6߱6697l#ۧ6Ǒ9}6`-<`|wG3Z/6/6_̀|dW~d{l_|H/l$l$W64`! |HvVll`$lk$7kvl2l|/I6_Qͷd^K}`& `u&~fll?|I6_}ͷd{BlFAc{5).6ߘ6_Qa+U]l]%d;W]l~%o6Ē/e;d`U-> |kKl% \yZk]7${:^}q${+`҂|LO8bdtb1>bֆ|sLO; do܈|LIe}ͷ$™dub36ZCsAl&ٛ6!6_NsEl&矏|eM{{oI 6_d͛I"6_o~n}ň͗$KI"6_.Cl'ٗ_|ANlAl+'鴹ڜd_}5b :޶ 2d_{-b:Alb'ٻv!6߶oDlx'7݄|Oo:dg7$/I#6ד;Dl'w݅|OEl'܃|Oys{5?ɾ~=>|Oxd W%oJ}%{~;c%{j &d?bB.JW %{f֡d? bD~y滈Q^k-Q|CQ'/+$bE~ h6hbh h?|Q|Q| RAl)"6_? 6ߒ9 '滓gs;Zy_C@_G~fnd_dؿ"vSGw.}ycحnwdn 2ٷ {nn*W7@7Bvl~w@v"O@("dfcsӼCvme@vh/Լ; Ǩ!;5wxlThԼ=6K%g-d}S ddh ռ߇!{-Jː>L{~5 w!FyoW~7G2n]Nw(b6wbߍw;Kyo#2n؃^wcd*bߍHy/!v"nأdb+@ϙ۫knB۰{|O!vw ]lW;}bhG,G;ZbM]~]wE{lW߿^~w7b_>ׇ=y^]AD~{ w vl݈V%"v-loCl8,/;v%[;Z'6 ,羏ђy}3"7"vKS7 vl.e ɒ=}=b~Ș۫k޿klcYF~;m1VAhټߣW!6_tt:βgdGg~?Td-E{_Lђ/vJK/v5mG7{}v\6la+`؆dno~;ڻ6wv[S{;6% e;ڒ];(`G~'{mnK[vmw_l->kl[<E'GQ-?Waޠ߫-m"WmDd GGJ  C A? "2`xc{vxj? \q<֎O`!4xc{vxj? \qV x x xڥֻJALxFB"h`hMVU0"X *3^&ΆnηO@2\zv?ýrR:}9 Y!D$W1Ɩ\nUbvr49\=q3Wĵ^\f?a{6aW i9+ V6My⮝@Ui:+4XqKNܗ<.]?V簶Ֆij=sޔ=fΟ8gj=/) iڸ KN,_G5ͻSfL&.W.pzޚW_>~ m x+|3ncfW0֐*UXXI)UJ+yP-` (R%茎J#U|XPj&U@ުJi_/ZXI"0U+ P}jqZEڗaK6(V2H2 }ib% J@\۪IҤA}i҇@8Eڗ&IO"K^eҤ'@I/+QkHܗ&=/Mz=$KEڗ&= Ҥ'A s}釾Dti_ሎ1Xɂ"K?%(ҾC_"zXI"K?%JԊ#b%/З>(V2H}i% .ύҾmpBڗ)Ŭ/5Fi_j:pJ i_j*3+KEڗJ\D/5Fi_j;+KEڗ#d}1eYq_/Ն/]Зj#&V"zQ+YP}邾T}b%/]Зj[$@ RmJԪ6FJi_/ƠXɀ"KH$(q|n!l:}}Nq_p˻S?|o(Ҿ*SEY%.VV/~3/~of@oNq_f >SܗҔa+,,(Ҿ$/fXI"KRiv(Ҿ$/f\DJsDA%}4Ji_ЗJ3-Ve𹕦/%K\ܗR1X~sX+})A_⾔/qq_JЗ/%K\ܗ%.K }R})A_⾔/qq_JЗ/%K\ܗM+b +(KEڗ(b@Ū[x=}iH(8#b%/-V]ʀ"Kt⾴XIP2ܢ/9KԒ%}Z1ѣVAdA%}Z}b%/9K+޽i_rpD{=JGJi_rЗ5(V2HDXIF-i_v6 K%&V"/a; /a%l@%lW⾄(Ҿ/a8} yP} /a;/a; eB_mi_z/vLDz VH }J i_z/vXI}jʗRKSo<(BAEڟ^O+IPrz[ڟӦr@#Oɂ"Oȩ3z 9)P 9Uf?!'M=⾄<(ҾGܗEڗtz} 9IP2q_:/AGڗKЉt b% /З'VRH} :b{tTڗTZAgDAtJi_:/A'-VeAGmӒ8(1ѓ8ni_H)P}q*3)zoB-*Q+)AqĠXɀ"GtRM?=}1tgK?_lo[//xC `xYMdxowWh(۶mi(qk(u]wl({%`x݆'L eO8a%ʮ`x}>ƫ9K2lCٓ&MbxaZj)ww({x({饗fxYf{(a= P.˰e/r /Q/ϰNe QvUUƛB+2l4D+C+3lJD٫ [Eꪫ2l`D٫ƻF=ee{qkG3lDkHk2lDk+Jk3lDSNexq;L 6^gP(İfe: /9Q˰ez >Qi6ނ_a(` 6ލje{qkR]SSðeo /OQFmİeo TQvmm-U]WWǰeo& \Qnʰeof obQoΰReo gQ[nɰeoV omQ[oͰeo6 rQnl/nn;7({gxًwa({wdx6p8̰beN Q;̰e. oQʰe7440lOFٻƫe3leF{ g{2l{F{54ʞ>}:iȰreG"(a5{6^}هaE6w}6iۏa66t8a7>6:aU8>6ފC9a9>C6ޕ;L^e~ oQG2eϘ1a:>#6^3g2lmGٳfbx񎲛6h4ʰ:e0lGGuKz}G3lGs ƫ{={l(cex̙ðne*ۋ[;a?ʞ;w.=o<);1lHmmm oRϰ eϟ?aA>6^O餓6^*O>aB>S6^5SO=aC>6^@O?a]D>3ŭ%Rgɰ"euY /+RgͰ"eqW);H0lHsƋ}2lHw뎔}3lH\pK}2lI]tƫ}3l%Iٗ\r }饗2l;Iٗ]vQLC_~9.+a7%e+dY+7bصF﫯aX\s î2K~_{ ;z:]lea7ñd2ɰ`RnlGGnK~_ ; zotJeod`nbnɼNپ曕7kdJ]]] QZ[[oaעQʾ-nG);J18!oa{;v3,;3a{K뮻67ロa)es= BU˰B*ew} ZmoM5< `d؍zzagV?̰kߏ<NG}aW9F{zzvl~2"~vcgy``N ; z3 :9Fx z|I]^p=V吏zaІ-e? Qǰ[~gY]Vp)a{۸~g6^̥E18ѥg}a{~v3ԥa{K~6ߥ_|a*/eK U/̰т/e+ ­ꫯ*k~vmS믿ΰF\.ǰkъ0e Voɰ0e[ ;v){ppa{ mSoͰ%c~; S˰h{=m!gh!?]0](5e~ 1Xaݨ~ cVG}İkJ3e nV'|°3e ;v)>cz?s݌6)/`RzK)bi*M_570v@M~-îpz;e-UgaM?nԓ~ ۻVO?İk 6e0loal.J ;v)f޺z݌6)_ez7)giM=::ʰ7eC,eM*{e_ύ MDd GGJ   C A ? " 2d:*Ƀ+I@ަO`!8:*Ƀ+IV x x xڥֿO@ġqf0:M6t@"Ԁ++d 8 ']Rk>w"nFFa c5(thXb~w'TW)r͒ǭx_t&`._q=8k[Es!H6a.ey{7]le:컇: iϦgcBD<;w J6 ۋViV^իo81mr_NeIC3噺v L6):)}I9<%mR|c'$Ni_/ 4=%b[J͓bdQّHDÖ3HeGQ [N&8-ʎbCۃRLeq [6J4l9Ty*X,mJG]*4l93Uv\ְ$UٕJEÖUeWաAk-gn6*o[Av 6$a$&f$$If!vh5 5 5 #v #v #v :V l65 4Dd .qJ   C A ? " 2m!MeI՗HO`!͗m!MeI|9) Z `H7x e78k ldP[d22Le(ClC e(!SeL )]zs?]5ouQ(8YG8չn>ꍆ84xUV{s)[-tOs57^6 n].]|OsۚUW܎fzK=oνΒy}%]n.n)zOs*^4$rJ+tj4>e[s&v{}>4[sˉ۹4vB47Yq/s蛯wZ{!47Jer4757hn ;7=]nnWەd&5>euFǽ-wkˢJ47ŭDsعiiw͹<Ch,nDsk[榻57hn&;7=ͽsq/sGܚ;^4w;ܮrL^ovzsovFǽi4MDsڹ {qczL473ssOkSU4[{wgON^65fOBl(<8{a~b/dn gpw<'Hw(` ^9k_59΋\®%ĮU\b^ r/9 {^ ;>yd*/*G cv*ٟa]σ:966CF5x!vW~]7w = bO%zИs͕z<_|Tm{ }U_ ~p!\>O)]6IT . =T|?5yySgg!J΋MYLKLwacGkbC#YL!?A{~+j=v:~ӟn#!N_ w|1vSB~kǂ=in g{O/(_2?R _7P 3> ;tx1I ;<?0Ec I>E`jjhI>E`4 x1x$"W&ڽA8^kCh@f/0 Ŀ +GOi <]įbe@+.65Av~*uIfG`c / ;Z)d {}dǃ~=\^k!v}?kPя].xbW_J> $#7m&k Ms>X:\+ɧp$C"<p3"'yaICd63!fSH!ݛO`~1rE9L(s߳vt19+.:Í#LΣC-B]<1#"Lev?sm"wn>bS> Gs/qvG6'57ĮsxIfG`'7N9 l;x >O˽c4b)}Z;d7S$9ڭ}zYlk9Z uC쌜\_Y!Sk8/.c$& WԱ]k<\bW:i̱x@kOmݐC쮼[;HF{{ԗ/$9{ la|4"uC}Z! NľqHy8Nnf#@ 4f$%.I2PrHz]Gkoy%-5Lfavsוd;2dvG<Ȯn=]f`p/S b7ǘn ?6yI`jhI.L`/1x$_%?+g&BE>`NB1A&a??m\IJdI~oh!2Sȟ$H_>bW)]͏_-R~ h{__X{>b ~~^k@G׃L~U/Hw`;? b{3/92G v@\ 0$3dDu͘sbAX|b)0gC̽l."~lh?WGekE ޝ/~Tg'$5{ _sFI0m%q. ?q$i7n r7A <-!vq0/sc%kr |ڍxoQ:a_84ǩ*֮ So$&7et d?g cWv)Z nVKr"*6Vm 9V}!vvnSq] ;/w15D;0 cm9v/=Fv s?m8ES?Khݝ~yngu>Q3ɺZ{?OC%WO]FI֧MA]>N/)ľ_X{^Egx>Nc~ CWJmBB&*~Ҥ㼒^.y  &K'Ǔi$+][3{I:3IFSG |U{I:nl4(}֔4G;?:f;?$A֞L̎~܏E]cAv)k?;Z!e {N֞c^c>N? X:ľj~15fxp 0˫خIg?܇x0:@Dv\ҷ$Wph.(3'F%Buok}V~Ax߇kyH5+x3?S[g(؍ ?"׸[A \-e!vvq$ggin$ 쌼%IH`_i Ϲ'}b$r[oPo$W#toQ4`mR8;ŭ]dWv<ĞKPaj LrrZtP i쫮t&;tf8;(Fe} -9 ;Kb'wuS`M}bg1:dD7@:Kt$&K:N.03Րr 85Ie$_%q-+% W sM%*؋yMtܰ߅iL, gL.h0®hsvs3Jztkec^d%Q{ԜaĄfbo7%ZIEdEєGMCTgMOs؞\0s vZ?7>ٯ'Av3kI<~O1۬&پſbNN1@WM^k}.޼l4k_%<3bK`Yi 0皙î܌bXW5M㰂 _2msMfNn bdxw'9V~blNa\0{pf={G=m65jݹvf;sgDgsg Ga / v? ) 욜-/[ [إ'@ \#YN`gnč!vFl{?sw{+io]ّA [HPSXooI`OHGxo Ciׇ&5^7t!Ʌd3]Ov C!xZH2P"{Jt9^0jI`/zrzHϡdWYi $r+ƹңz!e՘c3zԘs~dWԫ8>N>jdD_;5I.}bgot$ H3S1NN?L%9 ʍ$$2J2;b]WtIߒО+[݇Dx ? L%Izt$$ g832{7S$im n3Ԭ5} ffAfeBM1@v!a_5_LIگ6nZ)>kNd?\H2;" >s)e8@ ZS,ck+LyzT 0ǝ~ b4o$?3bl$Yn$Y#9t5 {gI62&DCa]IJ`3ª&'ĮhʆϙjXX҉$KiWxSxWt""\I'ný:VKLK^N R? vv.fd1vV.!y a!{?MsXֻh)bU{2zLJUTb:֮ ;"$ [{nM;: ǭd!ݔڔJaFd+MfPOݓb#3T} =>^=҉Zc;HIfA`Ob/1Nz3F`z=ҘslةwMva~C[D`WZ/؍Cx'eT\bg2M% GM*YWH`?iFrIB`W4K 뙽\Uҏ"1YLG`N3&45$=#"-Z왦fifI+"3LߘfYךs{IemAFDd7,{S ͼF~d7ٻ6 .1]^X{ٟ` 2i}cLslx*ar`̓ђ܌t F `$#~n!̠`c3 ncANfwH%O'M0y*DxO+d8ٿ(Ğ,pV4 v/.u#}&Q aN 29b{m1ӾuNNoإC|?@쬜MŞ3r6a}*y}I=boDwkhP ؋h;BQt#YK`wx 0vyح@Ы-ѹo֮ Rjz3ĮAӽr4bW^ :_$v .0wUk'AWfg {*G}Ah=C!v*x=y>~qD8+#:vQ%BѱՀC.F"/=K{({Hzx%9Ɯla{+ԫi\}b-b_}:M v^.K1!~:Hh C=%Y:=> v,_ Lf'3!vi JW%M~d1U%.kjH]SǴ1!p3'3 2#!f- SE4g:OhvĬ?]O$?{b>f&-L0Iv. dDǝ~~ nU[$:x#(H z櫠Y kA$":!v!9!؏G¬& iMsML٥Cn!6.1{{1 OiDQn r(V-4w q®vq^Y JպO켼 _ =D{vQ% rN{2sGJ2;"{HB@!zHDvn2e5W/RSiIE`^h_O؅K;} ctڇ@v2+Y꾱0vUkR-ɾ>ST~0AWy]2ʒ<ؐSB!vzY7ݓ^׭$y=>N$=VÎ|^(-ɣ\>L>m+8>Ci%'5#t2|0;5W#҄.~ HqUy61S]do$"IjC^@{0##ܙwrK}Gq8>×y"ĮiM)j0vSMSW-$6M:N"{'AVլӦ9ǘ إZ;df* {~?3=GG4AWId^I RȔ5DǝAE``%+I=+Z A b?j~ @l ϳ`=$ѹ3~f{ 7!6~3\Y9^˃ùĞ_C%=ׅ%ѵa qd)EbzFB(FY]Cd?N 6%z5r; O}N9$gBzE؋;ؓ;jVn"Շحiۀ>Mi } 12}ikU(J5"Nomb'Pn/N(-D]b?F Xzv;uPz)@˽5^SaOLiIHd6ggUt [;;Ȯ`ߓbI.Z|滪ZCm*tkhX sإ9^QœA4;5%}Ky ),YKO`3sMUIK`a.FdLzam6iu@vk7b77NPלɂjm]SAI׍i[~OB杠`lcľ~x@ 9ٟG%ڻn:[HduHc锳E;Wg=[?j:k>EŝF\N- TM"'wK] uv[Iv1S1XII`g^zIo.酒N$^4֮ o:1ٗ^7x?eNjAf羱3N [;;Nv1tS.(MǓCuHxSaB:d,"OS#Is>]$wb"Hq?L$}ޤCb_4uةy6[Ht J%ɶ-8IG)<{s.i!vG.8Ƶ'Wأ Z{QdL^#yH`o㥼gC7*}O~s|خIiγ2ۘ,N2?3s:&d]8]49L{h3 vi39'+YkT~!c+X]v$hvW5A k/3sD'xN9/LAqIO/1 i2Xc98ft9g9  i 8@최/\Y KraaQ*~ma.]!csTbImSO;{;MV9iJ%E>JKEΔbn{zbwrnI'nJMڒvSw]i6Cbgc 3%7}v*JiIG`G޻E(wQاukon.nwe{m@"kO;o>j$"Z;.n< ~'Xl'f=Pa>;3wz<>/a}b_Ү>C:]W8vC^r9m8+rR̾\KaAis]}%G!=$* Y{ b4GG#l:F@-] v^H֐Yq,sy*n?{~=Gr_IC`OI!3٤S3&_Ф1v1k?KF~b?iy$g2g0Ⱦ $!5ɬ}d6;d*$ 4楀MȮix9&_1113378114TN F0.`0.`1TableFCompObjMPhObjInfo      !"#$%&'()*+,-./012346789:;<>?@ABCDGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font $'*-036<BHNTZ]`cfil}~ $'*-036<BHNTZ]`cfilo   @V?2$ Xאq:r"$Ɋ)m ٠b#|y*""$>_ 6z[@T:@v,,(  B  3 AB  3 A<B  # "<B  # "<B  # "<B  # "<B   # "<B   # "<B   # "<B   # "<B   # "<B  # "<B  # "<B  # "<B  # "<B  # "<B  # "<B  # "<B  # "<B  # "~<B  # "}<B  # "|<B  # "{<B  # "z<B  # "y<B  # "x<B  # "w<B  # "v<B  # "u<B   # "t<B ! # "s<B " # "r<B # # "q<B $ # "p<B % # "o<B & # "n<B ' # "m<B ( # "l<B ) # "k<B * # "j<B + # "i<B , # "h<B - # "g<B . # "f<B / # "e<B 0 # "d<B 1 # "c<B 2 # "b<B 3 # "a<B 4 # "`<B 5 # "_<B 6 # "^<B 7 # "]<B 8 # "\<B 9 # "[<B : # "Z<B ; # "Y<B < # "X<B = # "W<B > # "V<B ? # "U<B @ # "T<B A # "S<B B # "R<B C # "Q<B D # "P<B E # "O<B F # "N<B G # "M<B H # "L<B I # "K<B J # "J<B K # "I<B L # "H<B M # "G<B N # "F<B O # "E<B P # "D<B Q # "C<B R # "B<B S # "A<B T # "@<B U # "?<B V # "><B W # "=<B X # "<<B Y # ";<B Z # ":<B [ # "9<B \ # "8<B ] # "7<B ^ # "6<B _ # "5<B ` # "4<B a # "3<B b # "2<B c # "1<B d # "0<B e # "/<B f # ".<B g # "-<B h # ",<B i # "+<B j # "*<B k # ")<B l # "(<B m # "'<B n # "&<B o # "%<B p # "$<B q # "#<B r # ""<B s # "!<B t # " <B u # "<B v # "<B w # "<B x # "<B y # "<B z # "<B { # "<B | # "r } 6 r ~ 6 r  6 r  6 r  6 r  6 r  6 r  6 r  6   r  6   r  6    r  6    r  6    r  6  r  6  r  6 r  6 r  6 r  6 r  6 r  6 r  6 r  6 r  6 B S  ?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$qt qtqtqtqt q t)  t _ t ! tn  t0  t g t$t tttt tW t t P t  t~_  t}!  t|qt{qz{tzqtyq56txqtwqtvqTUtuqttqtsqtrqtqq<=tpqtoqtnqijtmqtlq#$tkqtjqtiqBCthqtgq  tfqopteqtdq* + tcq  tbq  taqW X t`qrW t_, W t^9, :W t] W t\T, UW t[, W tZn, oW tY, W tX W tW, W tV, W tU0, 1W tT, W tSJ KW tR, W tQe, fW tP, W tO, W tN  W tM, W tL', (W tK, W tJA, BW tI W tH[, \W tG, W tFv, wW tE, W tD W tC, W tB, W tAqW X t@t?z{t>t=56t<t;t:TUt9t8t7t6t5<=t4t3t2ijt1t0#$t/t.t-BCt,t+  t*opt)t(* + t' t& t%W X t$W t# , W t"h , i W t!  W t  , W t ,  W t , W t* , + W t  W tD , E W t , W t^ , _ W t, W ty zW t, W t, W t , !W t, W t; <W t, W tU, VW t, W to, pW t  W t , W t , W t , W t 1, 2W t W tL, MW t, W tW X t^ t^ t@@UnknownGz Times New Roman5Symbol3& z Arial"huu$0z2Q Joe Chuma Joe ChumaObjectPoolOR0.`0.`WordDocument@SummaryInformation(QS5DocumentSummaryInformation8=7 bjbjUU @7|7|ml444hhhhh thCBBBCCCCCCC$FD fFN5C4B1 BBB5CCK-JCCCCB4CCBCCCC64C pJhhCCC`C0CCFCFCCHZ 0.00 0.20 0.40 0.60 0.80 1.00 0 1 2 3 4 5 0.00 0.20 0.40 0.60 0.80 1.00 0 1 2 3 4 5 %B*CJOJQJ^JaJmH phsH jCJUmHnHsH u2 1hN N!"$#$o'%@=q*Ɋ)m ٠b#|4WwR?*xdۚƿ3uKF[BJF)PQJ(!J PBL)RSJ(RJ RJ8Pʞ}Z}ϳܙ=8Ϳ;oYjcwh/ok?ӟw;d3/I}e??VoC;_U~G=Zz P#M5mzbOϺ_TvUO+-) ;{=0[Nj)^_^ KdU$"UEzKzz%_%l7l*b䄦~Fo)?qn n B Ä^wP+( bKVW-LœECL- J}%}{埕ylpvp6b+Yx3bK@J5"IC ƥDiZC IY$,u]2Ej`{dK3-!aRIqr̴5鬡%2dގTT0a .[,Fs) cd1"1'tNӼs-ak]o 򱈗uX '@HHōyCm-OZZ[5IXav /˺la$U4R̟OU$I0@*=4 BKZ ,!Kl]h]%,$50^ e,I('S$j?B ] !+v;[k_tՐuh>U,^Һl1b`9R]"xb01OH0$Rɔ ]u%rL0SٺEkP8av/i]4%[)iITTy<`$YI$@5MWm]%hjEm&ɨZ*BrJbvP<Hbn0*2뚦P7{FXrDFKl])svUus 3rEQ5- eW*`T0OT177nuS#,%V{պlu^ ^Һh,٢PKU*F3*TT[(q;莡PwF®~[+jYx] īh]r X 4KڕE3R )O&I$f? ǽغNP ,غ+b[mTbhAjW*iT)v' $bt àGP =J ?Vhx%.t-۲fVe^z+KlʻvګTYH1b< ERc#IIO5= aHDFJl1n ] Zr&^Wg!X] -N*RU[x|wTzZZZLx-;S&S_px%"XԷTi KUU^! i CQۚ1a*ȧv^+uLFE-iZ, 1X,^ziE' /5H2& εV㳈v-ρ׈e]tҁ YRْHMk]1,^Ѻ֒u%$LDsm@D:ԙUk/uR5-fIXfb!ȼ7D/'R٠YBS')+jr~kʮ\~h 5XٮT4RބQNI$(ROg$DD:;> L)^ҺXdCE-Zh Ҧ%P vCQֻ x=֬+&#Ey L |WzTaKƢe-iuKUθMU2^,-'R&N'70kiF5 <`-ԴhRsU6'B׾)YW.RSA'N>I!AMT5 [raXb-!YhJzgЧE뢥>Ũb.E5'"^0:́vxu.¢Z$[[W[Ҵh'iH; $DNb2$U٨RcxЉ|׳js,V4-V0X/`mY =c1Uj,Q5t<f`x=KF`]%-Ub]wZ}HTYV'uXLlI UU#XH",10|'%|ūʺakeKC6UbhKvRīh]9[ bT  Ne70PաGxᾅ}KVxfmN*R-Z0&N4t$h(6B"rD5خkz\kڷ@rV-[_a,Bd[TECAa$"*;?f<#GѽacU^VldkX !UC@ABV s` |Q=ARgnɸ]ؙA۾:/vEk'ш<E% Xn`W00܄cK^yn9|s+姪[!F(SȈdf !%ڽgʾ8鵻x)[[lš- ,MEAњ/UpG$U9Z;5kj!JleLTm5A[-6*"k`K=x5ĺlm׳! i9*Ri>}+)YV|C>+i]Xe>MlvGS| S3ad>7zHSCbG8ǫNFl]rP19jWٮ<}hA ¾!¤!$pgVUx ^ -몭\NXW%[,=]yz4of3|`U!F$m`|T/r^𥡁r[.{V򱥀r0ջ@՛y>xk NYFT[ /E!xKƢ\rȮU@f/$tXFSi^ LGY*VZ/ ƫUX2R±(+W-[_ْSVǢ``z>՚S2e\257a_*^ծ9J.j]8e681[L,seYJ@(,iͯnU>Z~FuYKO1aV ٢B Vy L|v  &WW ix^njVW[5N[`}*iE ̗5e6Յ]g ~9R{LF aV &XyTh 衏 Y$#r>5ynS NO81/k>[}([[dN7`o{}"[b`|z8 L] *o|+^r^ٵH{ `m;}$A7)"?$Q.d  uW'/~srҋ/llZlIhX*XVx 'SmUЗǏN53K>񣺨벁,e_I֭ՙ-_ ͦg¨UI"+jqΌ"wopŦUٔ=j2RzWI DY,>/<'`=`]E{c?UTZ^/-50p*UTؼ/oV%:^ 5_~ċ-ȑFZpAbiu=Z ]6Bm~k#"iLO|kJtտىe`&[zy[Nzxd|%vbt@ΞzcaYޯ$€Ѭx뗝%Hf'u`jS ~)qG:ju/?^rނ*g ,VN Jec4+cD%k#կvQ]nBkDԂq/w/Y歸4eLOR,TY v*v//o|dS`LnM~`Cuzb/R{JSҴ{r*u!!v3|ݿ֮xnM5PȂ]T5aH]jbF!{mcʦULbd9.]' iPi&{V_!A?Sed9EgGg옖' 0-4~Lrje }( 1{GVOD;e` #E}7ؤWpTFbeY4\ `'-8l5:i`XtNTnhXlƏxѹ r /:SL0- 94qhpv)i`XnlKcY>|u+_pSlNx6,#ListӒ~1u6h. pFl9e&-7#?螏cg}%LiӒ>@lYsm"jRDv ̊HÖN:%+/oUJ !=39SeZlށVs>UIgjgQC>j[59#ҹ4S8=ö) % /u$q) 㑜,tӴhi8l)m3SxYC>j;v30l/ R$^#%'x^rx8:HC`Z˄-iQӚKՇt$T6JHoLrGV~u[uPkl0jOYh!3K'.٢sZrtmZAۚ)/PX>~,fhExݶ/o{1OOS_y;`"`ixr(|t"^f:4iHūؽ܄ε5ݱܪ_݃-t^PgVvNu,66i~hf | lZ'^L2gR=_lҖ N^WXċ9&.f([2Mk<ꔡt/kbYe@ȪmUhWH}inb=r'Ua$X_L`-b#DG:Rcx {TwʛG5|/UmzԞzPTUr_N`-Df+_@dW|i hZ'|bQf|x]mebT(n{07GcgV٭h`-%·bn}hu"הmn6H^Q{;^_#Ks SZUeb-z%:v~=lo?bWZz ĺnv^yC-0XXl@\51>(%fU{Fs`m!XsbG AT紗vċ [O5K@ZAqX[#]Z!%"S}Gq?i'^|TWsL ^Pm"k.5fQMְnx-D{Q%̹S涫 '^m݋/ziȃ| aknΆqE@<9ZR+ ^f&M$.aZVy3w^7w|Kn)F*XGL8Aΐ#AC]+ iZۀyve꽐l7̪.-7w|t/lE5lʔb4-#ɽFx+E#Ƌ֯}T<%21^g5&͏5xMWvI5$lklkl0R [CFRͥ%,1^/O8VmZhz¨]-@ǚ ?z}:>u(j[טf]9l^b{-d5'ԭxCbν'8^UK V+ք-YcPuZVzQ.|شjZ?^v c%_*aE;%XlA#*"u0?a]d쀗47*uL:ڶkX*!XX'kآ!7U=ɺdx-jxR 쩶HZbaHpАz8a.& i,~%#ؘщWUW+s&Ex5^4uiW{ VDuhEq|;R/ivtwϭe9rI(6U٢xrH%U}Ox6zEqq]KXk+$^3l1^x+W՝sJx9KeW*X #n뢥%/v/xQt%^o? qP$]QF[S6*}u w/g>>71 xY+٢|sT(WkR:f'*R͖e]2^wm^hk^v^8-+u|TXpi8\Iվ#uROUsh7\K-Ou8 A}B֡J!Xx Aj Ly]4ėTvu4`:d&Nl`eT@2qxu= x}B9xR `Qj(|Z*^Ltf$ ְ1cK]ztQHshI{Z3^4u݄uϣ_QQUÄ֡qb|]~_[-5-^ u}A [^UxuR*u)K=n]]C/)ҩ0֡Cm*^eqc뗟^SgKwqJnɺPx-xB<' sSUgQu(Qu | صj?ab WxWTt!D^@+ρ[ʞZUTߡvmCeZ~Cjݎ̺xUh3jQ)TE OAV:W.WqĦ;VU_-';;U߂}>%aq0fZ2buTn޺Q{;8K8R:kq;6TAPqԾ&MK-W;#>/ /E'VvOyBH} _ݺڿ*{R^qܹ?vrHCU1%Xܐ>\ȹioڱxԗILKҥ{'-R̨Q[:QkZk%۱ˊ׬w6 )D~~̀F1*0k:8XNq`-c̽qq`:+a%#^7ی ab\Y)E7IRbF%T,9^VCƉxA\W{A >+JS !hrfn>39qT8t}AZ%XشT T})YW1+'&yT9.9c>:H;ul`Ԕ쪎EjWS4V-qV(8q}qU2.kƪcކ~G(dds2%v̢ ֨kb Fʢ"|~ں`!xIu)U*YYJ@ VV1w2ʰZ {lrKK LP= !fK #˟,TQQaFʊB*۴| bb2pMaIb݋%,rIz$@N2FNhE!jTE4U}Os/?a.Jl`9" ]-BGH2tPƨ 'jQ̥QQamWf1i9٪m]dxQACxކ0(aURQPf¨HRI;O'TU«@:U5`(GUǧz/%5rDfh]@(31RIzU@A ,`Z-Y<օ^m ,G$ E瑆NGbbI*Dy.Eb (Aڱ"XNӒl+͒ F{Xzl 10I6a BGPLL &iQ>,]IiadDZh%#(^* KoŊ}6)M@,b(47J0l9 #RJF! DEkU{ K{‹5E#,mziˆPtI0i<RRJV-+V2x^;5ja>$6Zmڬ`b4=&)I剺Ԑë(UEd JXT[V lq(F}/d Å#б)1$mITI* VNCfZ-uKMFx1ȝǑq0dK5}HV$1He"S!*"cK".\v{K%,8^LX2lmPO> b *Ս-O2 LȝG|Q{n<8L>,J(1 0*a< aKƢxpc, =**"*(JC II&'˫dWb}D[~l ?ڰ_DA(0\$4JcȃOsmH,iXyNOToęZ?p_C0‚CDEqCѡ0&5-I0O)ը0U L<ҫPX'iܡP4Mh: d2H:&IxHu UkZ ['|N vh֔i3B3B % $yHT V[Y97%M ԬYMs6= a[9g_;|I 5]ZZv`DSFHhZ [W̿w|2@^ph jYEM| 1x 5-k_4?y~-)_ZZ2$I0Y>_jQbh `xTi)l?*\/jӕ_j~K}Mu' Uf+~m[B7ntݭk]נgT|Wc*!%*^<F@=>_ 6z[@T4WwRx;nA^d! !&A>W G"RR"g ^>ߪFZku}YcUJXۇ~o}?>RVUyX.϶qd7糣?r>log??Sys7vuN_G r(JW1-llѳl-[4--GKjBL+gP`\ڊ :lcBŠU[ă-oʖ^phNE6e2-x54q>&( =}[MFY 8^CKl鶌c j8ixyc0xMee\( /哗[rˏ-xy\ f ^~x_z^>m]/|g[-̹-xV^^օӽ +*lem;a ^J`[:Y~ж%̫`}n+U;v#lHa^g+uji-l ñlTya+m}a؂RjjKZR.Q^ȼ$%/%^JpGUyaˬ-GےCWD[:8\W%kD>PV}^㲂*M[^KܠJӖK^muB='HUĄAJӖ$ ¦gR[k96 6p?=F W +{g Wdl]8τ͸`9n@d$v);8d$vFFb_?ctb> `|GӨ,ȮMiHԃޅ}ilԙ޿cmS7PwgGbϥ$ TgCiC#A %)u([aנ\n_f/tnrP_PSٱ!m C_ rhM# {>NEK);)i}m!}Sgع_ltsC=AbLٻlW|bɂ|b~N`>[ \* 55֮`is9=? Qd%(A?`(/ۃ~=Fݏr5+?d_$vs~$#ȧH\:,O08 )'C<8 ȧHI )MiZ ! n}~ w@(Iy^N٢9N$2Q`]-}r0{(Վz$@jwlᆳNAFfv:G/}O vk4$vSԦMr*INeTE,&jCCz }RbO{Cy xue=@@y-+2{X/kT}A?̮ /2_S?a0]{!WK] X u>C숎kz}JO vzW`vr a)VЕ ;lGu&b4@^N?47ЯB!~J[c\/Q]p,s" {Y$_\WA^td-$ ~l{ǁ\{75Y bk&sgG<bfً= bKf׭} b V!.f A kìdOPvA6/ٻ|X{?W5lT0ss~bd.`oQ94 7#JkσhЌA6sPGnW܌n .E8~4ܛa,?s0-$A>C Cim^m;i 1N r{.8 'ӃHz { ~l(kQ:GĮArV_!Q Ab'(Nޗ.F^NgzA؅隓NBH;ľ˹;ϟHs. u%Oq7 2Н'Bz;Q/sk=^;AnFb7}jsZĮwze=2>/{ei(]Ygv*sX;=ky,ĮGJz`[] $:nY#>!`ѽu$g/8Ğ!Ğ[u VdlO>CU#Z?t=IST֘kbG]w]#VTbZG!vzJrz5M4bwDӓiu%{ t ݈ j:5[IA@X@A%z&L%XLb;8BAhm~}2usv1O_@K i]ݫ{~?Lrv^j$.裑حtW_ncZ:nj:Įxeu ]Y7!vj>^tH8rb cWEuO7T{zBUdG)VssK=+ȧ'WTY}Fa9u-Qc t}bw/Ƃ n Nnz~{olA>}N_NN;g.3P5 SJAEj!vjlW sB vSZGݚ6Qd GQw=q"Q~DC5T >{?5T d7-T b_|zCl9Nc!vj^ğA쬼S D"!v)֦bW8/5)O@F\d$vsc #AmvӐ@^<ʴI~tPo'}vb}d'utd׃\# >/ J :$vd[0d[$v^=tPCf ۇɸPx9*Spb/ ӿ!Nf{9}Ρ \ZtgI:-,H*T4G T"*AGH(`M.ٽQ(DDcsJcnkS:$ q]]&:u$vDz;ľuNOBպ;[?"e;U?.M1 +T^]Nz U.=![|(._r!vn,r ^ b@YU 9dWv)lc JBX=Ed$v~Ve֋ v> }HH&躑;~bwփuK6?0{^y{^9'ޑ?_)Ǚ9NϿEƜC|Yg"}LQMT. sגW!c4b=/(>MrvOJkIT' n$"jAFbo>ނi$odv$Çh"^w9Z+pSLŐ5)!k<= vskj2 2{A|4&[Nfv/N;ph +e>r|o;!vNd1d־^݈ 5k/kBPEV!(ϥ̱SPAiG# V#[{ +n;_ Ӊs/'y_{:!dw{{<}&Y؇ƀY0 W`3;x]Oj+/X#Mv/DKjG $SQHSt_3ݱvȐlvN;ؓt CnADbЭܷt}Cwv!vmЭe֞ +n5Ďק'A_xtJa]?T+ {$9T[@6Nf ;Ia G]d'X;b_SdR[?j<ȞSJ 2;A}E-I:N'XkLfgڙu2]T $v ~B'hI=]DẒoIjWt"Izn,H GoZܘNޕqw_94Vv^RA.LbЕk ާf/}Lקy6]6QIb=u(W$vO*)Ke]b&(ȅIԊGR}yukh/!@C2ALb602]v84͜\ kS:6-0w1y.ţLIb'xk' >/X~kiS^$q ;!艒mdOP=þ!kڋr/k|g猵CvmIt48F az AW ~Jn!b*Өxj&R]ݐօ|)LK v oB̽?@d["*]ӏCӺItPׂhn7}={YAe?TA׍Ğ;Qtw~E=t9Gb׵ƺ,.EIx=_s @ه`vn},-*пAPPY<}M{z;^اTOALb{{T">yߪi{:mR;@ekَZ΁־%]fUAG 3=Ja>j9MR?5 N slȩPw޷$맴y!vsWdgA8fgy]E;:kt%n~&uf-X~i~0׶h " #ZGNRz {Rn%bH4G 2 {-i4d{']tbkE;؇)4;}1e6U%Tb&A¼87?t IR\\b'pa__ٽdv$gvya?qO3c4!Z҆Y = 'Q=H2P8r"~d?&QT1#HT[؄ހMiDJb7ĮCh8.I߆ie7kBRQ([th. u5=Rןݱ]v_ =Ir>?@Dނ̎SVdvdvmkWe@v^t"/vz RRrP! 5uU/*T!)A5U k$::UboV}/U{J-@{}AUV W#Y nck5E-jr Ie{ԝH{: !suf= b3u6];N׹$gWu% ABfײv$g-i7in4[wZ߅18%k_)tHbG v<ĮAխ]drPBEbOH \:œBPBw!PCsH!eiNS{@kw%2s@Լ/[ګ!vV>o"AvKf/T־sS;@\O'Q$Ȯjx7rJsl槂Kb d;i~ZS~,{Lwk 0$~(ё)a>K΂|l؊ 1o9Nӂ.IqA)L/t'}5dr{u׃!v=1zKc/CGOog~Av=M՟@Iz3Dς#Nm;Qt9I]ooRA%kNcAMbWݲAaWEg#;^sd$vz7z5b_Sݓs}Q٧1Iv~NATzo =TfsLUسUbOUkIj7Xǽ=QC=Q2;|>]AvqkP?ˮjj [Cj?wgwO[_qfEGO>R!kr,ANOj/P!*B:}2;i)N՘&Ɯ?;?԰$gt AέŵdC6:Uҙ 8ݛ2{M'{^@O s?k- sorI*)@pk0UXAPbڜ_ӓ Ԋ]eE%%ĮB=`vCǯ:$v_˝iĞN8Zc{ři bo:f _(wR@4 5h>O;1ZdN)Nem1v͜)Ave]b'n 'X{(h;9⟦>3oct쫲( pvj:Y9=6!N[SIv--]7|dvd;)=23f!} /=) ާUY THK4z  쨒"C3VؓCZc><$v }Bu[q3Ǔ^vAGľ E5QؿqS/={:d *u] YTE,Ab{)CU{_#Z:Z{ MF n{ޛjzmj:t9lV-% l__So ' Ǫ+j "'*Wd[$TH?CTԳTq^ ^ޤހ?z1I5d/)Q.!BؕTFJrv] zd!S-*nQco=ROz8a,EJQ}Z?lN 3PuTE%h,Ki/[MgRaܦأi3@.ĞNu8*(P[iY-DǩC3t=G=Ͼ'!ao {?]qXt:N(o|/Ө<ĞK̓IZ96 hݓvk[I.}Њ04tH{ЀN@PXN?؏ѫa,U1- 9S!uIbI!ZKkχ;*b/* u`{C2"t.r[ 5#}Q-]/ܯUmq[;?z;u[aoBzRNc=bҟ;E^T '+γ_p3kEعu:k;%? .>ޫM; We5b{ >{7U6X^U@teAEbW;JlĮXȾlc Q]72; "3X{tdvkmn6zj9nY{ ~KP-N]]Qm[V]VcC!CwO'=jmwF}QO:UG4:7UtH3j,ȐȮP;A^:.^_D{>Ի!2x> W5$zjbӕ',NEn 3PdނyhgHblڟCq$vi@&>ݗTb&z@4ތD=֘Ib/fk(:cdv*Ebo2A?nf: n YNmp$ & z]d4־S`}l JAQzЇj@fwAAKv,aOحiIЀ@UP%91 zt$v U SRq}H~'I}pb]S}4{1(I:z @E(;Ȯ[Fe]Nw ;m!j$vSMع)'!T6Wu?zQ= &UboV/U}Jt?d1$l5D ٓ܏ԇ{c{Z!%?TR]]r yk+-Un!ʪWZ"˪Sj$~^mW !v ګAakHv2O} .0v]X5PϪ:%ȧU9u=Z~AHjziq~Hн";?Q@|c>[UHFPi@m((B+9$) Y@$I%H$IJ 4*I@Gy8S{z֢Z,:w~vSy^!ȟֱaw|@{/[}c _ؿs&sA؁.h.qά+_Yu5N9um+=wE#dSLY[G#kBtw6N7n Ȉunz]\v3s +f6CGMz/`F4~^>5=iʂ$l7keA7)U~^7 ![Hbgލu7o0۽ړboWfV<.oFͻ>.by(sXpY_1L:z>EbC:!5_k6XA=bkނ^jcM/[bw{v>² .c;f%C̳AYytxA r'yVG_x=_h{[[2;K3%%g(Wqj B9IbسAJ?Q]<bT-,&݀V]7w]WEy f(A0Jb֎x ]y]A^џtNl ; c쇭d?e@vUk?c1_19.Z#@츛RpZAQWfs쥫q݄Z3kqOYB7y!ĞgP%=Q| bf(#mvri}[\+ٿߴCzIA:)+ʶJ8n٭/B엵oUm"Dno)]@쉺;HW؟wYZOtWA {A}zMn{Cz+>vAlc!}^n1~ڼ6CgG^b0_z}KdEWݜM{\-ɶvkX[Q ЮkgAkO'~49.Ū@Xes*9W9~eQJb{3usW|i@v_?;K>7C?q?#>fy?O5r+}w׉־?UkA׺DD؟4Q/nL}q`n4Og s贐If[H|Sx[B<(ʽBLdZFSJxKlsG9;>{gSD}4\]u2W$v!ާxTEba퓩2e!IJtAǩ>KcOGdAM!QڟAtv/;ȾP~kgEwcy7cg2R}q ٫dRW;'%&pQ%`vn㹼Ƭc\WϾb~T[ON⾺(ugex.*vI0 ֵDٮv;ޡ 莢ܘľhc?_]4d df`nĞ%T~b/2.Wr%3O'&︝ȍ 99#ALsA[ v+6DEn;] b_u fIz;LAug؟Y4=b9uo'u>g: b?h2>QiC"fW0Nb?mnxEHI7ǒ̓ gAdkGYo~OoԅL_ O ! bSmzF_׊2;u`+@s0] bktTgmnd/h;얺 ĮDYzO(ꉺ3윚8}bg~N_ؙu\?sp A!X`?}[[2RÜ=A{yU5سF Q'Rt{_r:ݸjObV"7qOyUtJO,v>AOn*R AI{#-\Mt{ E|vxFbomIDb?l@v~k?c .o9vEdIx(>HxP)bǸJ!v3rqίLFҧ{* *_~MAvkg~2{^Ly}.koa_״qGٛs.P.Rc}jB8=Q*WL.ܳDQ+]肢nv'.cZWf(سxϽ of@31;y άs":Ngew("7Z4Ij_tk+Cؿ>g{DYO/3+! 9o@/:;4ƮkI% [ṉ$Kc{->bbo}R>暖اt~(k$YCTFR8Ȯ1k66^w :=_"1EљnZtD_&:!K-|QgLt[%䋩s+8S9 ͭdQ>E;naW-Kuv;6!&1?Sv-oNc̮vfU/B$Σ /\]ŋEч8 gBAMGiAK A+!ڧ6)tJ{)xjJCDy(jOe=ޣAt;>܁Ğm9܁΁l־[[[$d~2{; /MAtzt$IA"щnz.= P ]Z/!FzN/RShȞb;hCNҴawvn q*,^ {47<bf*σKxɋ 6>jVn|b_|YD3.WdKΩq~B&N{N!Qo맽Ѣ?tko?i7[:Zg {RFO`vc{9}J?; 0vk? ZTgͬa֩>{6^@wLt{vm| s-eD$״F|QgLtSן&$YCl ~;d ]NAjA;Ϋ;Yts?88S ϼ3ë!Jy|5< n8_8J5)3 uHb''] j#oZUݑPsQGbFnK=bMT>&}t߃߬S*)}$8;E ~d7v X%Ɯss\v?:0N&O?!(J}E3ڧ!?]٦賧R !?T*G2iGU5f}Eϥfs2NeGiM !v!.f+qSR4Lb7խ]kAvltN<޴u E{4ӖGBaeۣy#̞[Mh[t{-_3 ӹ+\5{930;Ϊqn;e}٭-nwyv:YA0~@[4.=\?ԭA\dtk}["Eѯc5k7ZM=셱f?Ye^o {l'*N 7kb OAϵe%g?S=]WGz$vM=Q7>Z$ꠊnW-BMfE Aܸ<5#!> Y~}Om91QSDVBk!(I `v_ݖQ=*DEuRl KS/D[[}@v.ٍqQ&]Fp z1\ƀ9@{'Atk:Ctڿlzy݋;GtQJDBm Zs/der$L;+]MA,v%or݀j,s>O5'+Lc ӏ@|$s Ğ}۳wGU39Wrkg۸ BC\ɕ@vC;;Is eu v+}a7yj,Qt~k[7N {ugE?$DgM&?Ǧ$v]k=d f?Yo1}$6Zؿņr3uNŶd\t]&~]w[W|̵x_IA%YClKU }O vVIt;.~$[K'Y{>o sz4H?sQ4_M"OX_ԉݮIaEQ'YX0;q$ם9Muv/;P=!4b=C5tF/{+YM! mvSg3ξA9qG.fRHҽݎqms**=spWIŐǍ7Ğf Q$MQ+ݴBT_2mEs {4pEy.Nb{/ww7r;ʝ !ng$h[u%^{W@g{ v^,Χ/~Bgt. {D1ik/7jU^ԟ@[^ ~@vX_ٯY)~~oBzs%>}ka4~;QĎ$!9W\>[ϯ@솺_Ici3Bz,Ns=b[ It;,&dm`j;!w8ȵ ,!@{$ĞdQf'=xNt_ qݒAvm +2l¢b_abax=U`/NZQ&ͼ͹Hk :evdnJ؋)I ɬLQ=ꨑT b']ijC v[L5i1}jfESإItbgή憐HfvERk+S_)vw+); m ; b'D銵E)A?Bj] O vEzNRs=W偢۽(:F en]{4[>J*m0$ Q'}h_87"u1oB.;O3iEvni22Pb$fDE%SM%n$$=C ^¯3E=#ǝ'EQ /:ǚ=S?;.l< I/^!2.ߴ -~bWc]]!vDh/*@حk/CW}N؏Ś د~dd _}߫~2deMjSN)~]Ǭ!|Ut;= vx;ľg|d_O1'9mpPK6r++)=S^|Ut ZrJ2EE?s Ey5j!ylp7u;iZFA썴$\N3[nC`jYkk躳Τ:{KAv`k{1S3žGqj)LUQ*ݏXnAzY*rnS*(N2u(=a֎yɣl)]PuR}FM#j8^Jt >g;EFO ;Rcc 3w/yz1k?#j ľZ#}Ucj)cαGb%O+Ӿg^8S Q4*]f4bwؽ(E]/if$Z"*7Rm\nvf(#>J]j R9@ v:^lH4*+=b&-;M&]}(_ص9[QԷIncQ*ݍm$ĭ^bO(Q'Rt{>OtW%<ݝɣ!Z^.;n[%䯢y/>(.!vuPʊR0l@5a=c veߛ vaGcUU,ȏD3>;_w!v?˓!e^$f3;y>ǭ?k`1`֚|Y?E'p`Hr34h}}ή;b'Ѡ'] |bKAvQOtPxrC)():C1:r@3W vzv{ZJDY )kK2 ˁf֮_`~.RoBjٓy1.DӼKf̵$3$״ڣ 9.@C6nKdSE;R4+Jiav?n:z;i Kc.G n]ӹٙ\y܂bWBnQ s[vTg7n-n QgLt7v͈n G,7'@mxk{Y#3콜 ! Q}ykxG,ľέbg <_ԏΩ:@XQDb7 [d/Г v>ڳ!v^}%Yu{}1ڹR};'ľ= ~\FE,g/@8K08w0T؉A(!Y#v%^b.`w :2"A[ [rנ> 0ţ<dxMssA/عyg/Ds (7#yv68%d);$k˩RSp518QGOt{( fr ; l}Ano rQGbOPf9h WrNoy{-rLu !ne?[~=ٗyw'B@9^h^Rt;M;fE$@Xks=d/$ڳK!uN11״~ b}bo!~b3<ǬxYD?8Ʊ_(&*G 3 wU[(l|jbW=.DSp3a8NىnO&H\vWd=-lNCCؿQ {ViKKz45}7nO9#iYdfEqdΓ.@eU.*z@2CJdׁYuQKM4\]P!qNWKR}@} iH`/Wǒ=C@c%=E5R{zH% 7A*wVc ]Ⱦd;2W'c8iBygCC)1VfE h?$K$ZC%0U7;Jfr v6h*@ 816JK> ͽxIߒphIfr 8o;O H}iQ?9`T'))=6 ;HrJvݕ:m$Hϡڇn}fH]=YGӜ.O \ũ\f;x S!rC,꣎vnPmW nڬFC-sJ͇OjI`P!U!4-&Y ]zj65SB6j>?Z\FuO Ok]H=cC9v>fmM{ k|>Atc;XF;H^1zoi_ߣg^8{?{ޮ&k̚nޯBl}Z`qkOuv.+N,&^ҭ%kQKSCԓv[oQݕF64b'|S=hJ]{ ]2$9&ɱ/WI0Nrݴb̎Ȟ&Hv-( &[Mҷ$Ϲ$y ݎw݉{-$sv.u<z8 bd q{o ߴ{南t9 W}bŇ al _C-X;/~ڏ yk{kd昿_,H y{%[;3>J2R{>WsqsMi @A<# vKNKDk~-IKd])ȧ!vuNdv J2i %sv$&QrpzBt)B!v/J ;Pb gxR6rjJr5uJѼTg?G_9%h.JGG$Y#}QUǔ "7j j$C"dID`OQ߫=RSoKj !NBJSInKZjJu%?z>C`Qt]AeWl m~F2CJld./ɐ쏭=1~`̹괵CFt{H2$w=\w%=:{Ǫ@3^2;}\%Y }U1ub(6;-6Av٩(S& PK҉$KS'Zq]MIߒOMUIn{FFt-{#qQa*Rek ;wRTgDדdv$ ٫Ⱦ^[ID`֮x̟/)Ğ ĞbS0= ~ڙAcs"܌Ȟc{h?Ye_0c#Ğƞ?a U^ύnw亩}~ǬOm݉-$HǂsA&ɼ/:6AvbY>Jb/ I^R\F2M`wasRd֣!ORXUe],<f@=*IKoN9$=urb}7t<'v%;Te^*UboQu]b/Rǒ=D}zH>Iϫ􄰫r+K7jWj8ȞMJr3;S #7A&,Ⱦ@vUO2KLZϏ啫Qvl+ATyS5ׯ;6{e{ߖtwa8kS $#w+2qOGz35tQ#RA\iQTbQK޴B4Ӕq-1$Y ݑT{Ź}\*s%y;J/%1,MtShľF34b3ji0"Nܫbsn<]# %]3{\.ybW^II׍O{.ks dnZݒKnv;~k,%{&GG`o.ڇ9f{j K2kL`c8} aǬdvTh?Kt ~d7vf\hbcX$#%/ĺaݍJ:zv'~oR~c~\/ZhגdDvī<bqڀL ΐ $/Q8%@T?AUS[^L)4bO`2$YêЮ@iS]N&adFڴnw{;KR]9HrLvdMӹ6B꺳KTk{S`Fޠe*;%9&=)pY='IO>W,HSϫmή4W!v)ud0=@\=ݫ^A3Mtbߥӟ/SOGmwyk[c~=dϮzbǫd +O?CT~L$:E*sݩt9Ƭ*}F6UE0M9$*F|Ni&FBDidD ֚]vdٍ钩I)-[.B6.N{#OJw7͇@%rw;ܫtb^&N!b %pkH`W7 bW^Ik$oI`7֞xx:n?x$v;>5t9>qX[nZ[/k̛R}?b%qyf74~-ɼ/ѹa$#Avu-YB[|WAt|J}9Kp Qz MwC=T "T)XME! j̠z{* FR=C/ĮOg kA):9,As#,&7s@M7!&1ڣCnkGgQ?awNW+CuVE]' 8ޗ)TL5gIFD`WU[{>ίPJ} GTH~Q9aߥj ,~Ϧ:S2ľ|@91 /8_aS}~tbs2򏎠Idv]}wNksd_94N$Π2k s^0ĮN$g~F#uyg}3>t#zj"L"]W} ۨ%0}UvA媘1{jb6ZJ6GT_l<h54]3q[B}پ[BVQK <N;iBtA[w9w} v {W)5_vu{x%]Uˁ~d7 [0˱߃y$"+XIICl (8ȹ|]`M?{Ed7%5_xO<b_~ '踿vA=D:cȕqTgs0{(u R ݏbڵhcPA2Jt3(EAm0*K\Uev1]9ޢe-ޭz d3v?}@2@y1RC!vZcd.@K%إ)29*䖠-5tI ۆ@~"h;E2_M`\INI`j=רwyzi dM b?|b"DIHd7v * u}ߛn/!v>>.uٿY0ȾT s>3q#4O!  {4bc̥ >f%B^GQ` =KX;?N炞LnLAMIEt05(E#A̠i9N(m Eug$#c.BlEU#ٿ/cBTO5wS][3msM⯖dF/dZ/dbϐ $㉂!n!=b@c֚Ylhm_ %+RuHu5,ɧ*ޢ Tn dVIBIc%ٗ;ĞZ#T=DVRE _Q5ok׼w9;{Z鼯fBjC2K`wP$v=(_!TzL2WK`ǫ*dԇO?tNB펦/{uy>r Qj:U?vޤV{8/`$$>I=2Ʈj y~K5ٯX;=bu&=ߓdDB=HW{s'9?Ìy#<^<8iI oI`wMNUQmЮGG`?{%DkyL]T&SDycg1]*iW vļ"%vj fGG`FBjA jY@-j'cV {:j6KUdv#*NWU{Z S]>.Dصh[A4ݭJ!vWm#9'gң8{v7A=4 n 샴A!QڟBt;@{A /Υ: 3X:~,vYՍgA~d[1ړG1̱s?:(d;!IU ^AO!b~_c֚łHTbA~ P ii^pEM18fg3qB S\?V HU-|Wudӷ`og jdޗ:U]Jd&_% L>|~pA#Dk۝b/sN!4I>pvIC`W* >s*TI}7zTb'P7^OhC$r3qIonA'ztbn#IE6E弁^Lx3H_z$Ny'6I6H2${Bc!kgO여]dbA~#ٿw{S s__csUHka.TʟAk8/ iS[$tܯG!v}U%v-JT  ҔRL"k'º,_M3!US־ $7#iNqInF`Wۜ$iKr{S]mrJB ^輣>r:8$7ĞLW8!s5w֩$yEwBMM%v]IzV;5dN~y8} csc"~dvq󚵛W"O\^EK!v?)'~bDd  J   C A ? " 2=-)ݠ{{}|Y=EO`!=-)ݠ{{}|Ym L`=xUWC7 mp`pci aCdڠŀdpbdEb'#Tɟ٬(%bpHXqQjav3e}{8߹u{˯r}ws*Q_7*Qo[Ǭ)@ԈuM% k7 lxw4~r_j>Rݟ~ӤhV 5~H=yNE?SgL{ꉢ/o?vЃ~C?#G;(ggk毾,tFLQtTs'W u.Q?#>?:'+3U?o^jEprhb Q5VjjT\ׯj9RUfghr]s4ϻ'|<__4{t_Lϱ|y<3 `,8Da:h86qq$0z7&!yox %)w<rD U,THAP(zxbd|@f;1i }~Beʁ#]rт`1TQH9<$FŠ wv6L+o_nfPE-eMxf+,*!RA0a Q3A"f1}E~,t ,*l} LjAEB!sG|,dc:R?ϜR4-,TBx"`BeHB /2XbA,Q.8gq6l Ö 9d^ru+- ,GPAD1Ġs"R,4l1 &,è1Q6xA0bbraBIrÃ2X b2dݍ$PPx(+#]2bx0Q qX bX sKzl1AsыZ;҅b X UP ybH1BCqCZ"ec:XNX֮FfG f0[Z%]bx U30}rx " 2CAcb#بQll$ ģp6a%mC:WPђb$ ɁK*?<=((@l&bՑ2/anьDP 폦 ^Pl9% U))'&G($ APh %[Alc{ԑaK.F3v5 Xe"d+5D#Z,T$HAPer`I0 A %;I.;-¶`:LeK6j,`c>lgDn*l7ȕ UGUdl,ekK#8(vu+]Nr qCB劢*RR>101dȏc'x'K5l:T4^)[ؔ#׉,^t9H,mbB#$h*e Ϧ=r=0xlmj1LEأ4[nUE=e>Prw]u* )GD8/`qX=-+0-Dlb@xq!ʍ / w B)9X^Bq9*cYl4^7Bc*֥x C&]_Q#r5r-(]!5[([P4( W( +8 !,s4ս]{m!kZ} c\-]3u=īki!z [P+b䊢8'8p;,gLZGڊU@ Hw,)NccA,^5^31(;SolACEX\9TQũ,^3jڑJWhe+X%Ha0gUr8#*]bB-[2 +rH:Vhgt-)rCV,C-R"`h'_umGt%-Q*+*g8rF%e#EL4)>0bU^PP[t([ve]iA7B\tB9K9u,^12E}X~FSKEXiCDE+XPǝ!A/!#RH-RPŢeaZx(obZʖ [N-Z A[88qy}e>4O TW@~E#`9%}xd \<[NTe,\#qK_e)[UJHkDsUh1X>0Mx.t`- [[[Pl7|rCx:mu$⥝b ReAjN#b%0s(̍B1-"-:L IC3j[LR5'j07Xh#2dHWKLxT(XgBJP/bqUD-lAYTNوf13%BKǂx%+[[X(ruE1tkihel1ekUU*nW1fl^1?:+DF/u TuT6[^@i0l-䊢*ii*ʹ,reTZ"`3G x[L%ԭPȲuHFjj#bjJ؀esk|+~4IZB޺^;xQ%l] dK\[X[T7>aERE& Gfc^3Fx[ud<`+FTScf[l+-3&{(൛gj[(X՟ {RTEqPaf[VO-0  b/@u/vzej [(f z]Sq=CX?]e>G,Ǎ0?zVajhИ*ln[,R UWEW3E HG l#݄tW(khUDl] gtCl|Е+MՕ(KXGOa rGjc%PlnrOS8*FR]Tq #{ ADoci<=ruLK_r[}0S]yEU\ nBt;T~>2x1HIWh%dȖ ZbE(:f[].^~CCS(.h#Ė⒱sQtJ}s&B0 GtƐ1k QW-’ 6jol>)[8Xj:E'7s GX~XkwxEu s /mm\l]g vͧlej,,5XUPK骰?K2p7A yGZ/T]tHMmg~PTUq,0! |AR^!}99KSu\W//:EP®fz`OX0ό?R}TEM= ˖*:EPŒY]?FP1=6ӹ*yo`.x޴8k<:A"L>9wgJ0SQ>B8  !bva/~G;2$QeՏeZXϨ8 #@ h5?9L&M0:AB`l4DXЭ>6[WR(گ>(;k BCgFB ^Nی籛]Q/~7 XOD>Y$AөE^HG8ƈcE_^L*r /IrŒhdˮ~,QlCedڡm?J*w13$`~D'Rxm#rzaQ>0[ [N~n`퉢gC-ch)v8%U!z10 w=!l?Rӭt;u=ꌶt $1DXlQl]w=sk 0F4dZÎahڏi3UpM0f*#U~x9^΀#ZxgH(CD y-:vz4vϏZQ2fCv(H?a6(bgfHS~?R嗃r /g6];P`o9-g7Zf`ShvFyg #cv5f{0ϤhW"ǩFjWQȂ* /h^3Cl9eKYXۣh#lcdh 6N]tO#_~#˙v啮Ӂg{ꁆ- a`VP`mU d Lؓ)^Rx!'ndn%*_0&[GtxvJv8Id>?Ӵ2kKmV12f{/v"V`hGGgxɃ'k  D [7/Z *6 dJmOXס:N_?SXQMHf Z# /jy.Z [AS1-P^loZ{{8}ýʬ)YI.`|6 кX d(Zٵt]A}ք!'-6:D㴼5\ V`h,Gt]ƣ=.dO2^x9Fy!;ECh2ua:d*ƣ]~8ŷZUKf5>lB2~x8^N+LvG(-} ђa (Z>!m2 zEVEzk|Je/χe 6*7rJx^lJxXU [+?{Z:s4NSh? &}x9m;QڰňkU+hg6êc?[nnƇ r;O^ft;}޽a-k2\` .ki0z66g!H  ]iB:G7x.{+JZSe퟈,RT-Oc٪,g En{(1 e:&l^9Jx(Z6[h9%CQLP ^S}.H0|!7G ^6^fp|0;lCZ +Am ;sC%Vw/tR^Bjq-bTVUGl!~vE|fӃϔ_ VS^fl6%6g~!#Z[TeTbXlm(^ÁxyѮde+˯|11+t:YeܘeӂPŢl,fi[S4^LEjEJL^zx[⏦{"29x9: XnpX|-mvG<<4@l,bi^vZݣ9J`T+2tr=Izr&ОUa'A: 6nQ%5l:5D#ZSXL㵼^hu_'%sj/Pv}aG/^F/=mNmY66-hhEk Dhf:&ƣSݟWYdݶ(^vuѮ}}3iV-GSO˩7`S [N hUx12R,^|uoqr>"{=ݶfno㑺AC폳6Qie1a2ȴ_ Q\Y8x ڙŋ5N[$zwA|g&hWt17^[٩h`mLZ$h91W˯%2ez̺q--c^Nǩw@k&b`mZJ=-McPfǜT˺co:]~Y^:^i<:}d7pCU#s6i`J2lن0DSǠ G69ߟoYhY)󚻘7x*r#:9';ޮx9;' JCr-3U| LA̼xmQ/aޕ2{=I #:A5 ݛTkJP-!Sp nL Бh? Wʼ&* !^6Z݃/{hHvZR,ز28W1Cv_h9ΕκYm {"MςN e7so}K? WtZ(XU[^C\h tLS1=/^fF]~ˀIVu轐jK=p\(?zo0^0a[BZe˞TtچEaTRK<^v3N G^"7?27w 6b` `-څe!.⑚j5(hy<^s Z ߽,^YfZV[GǧM%<>OJL3l ^Xil"+=.ŋ$u[SB C2r倵P,u%jJ6bU.g^{#ӭ꽱V3kFvJ:!X lF"lyѯ>OKk!]1^PE/T>(V5Tplu,!lٍbm際J6^0B6Ibm 𚖽hKAHkŖ=н#.x.rⵊ^ċww>Ë) BRp+A[h41U=V0e3 x[x4_fe(^CRi%8lBeGt9mƖ%ǃ j^W=xQ+0x1{[=Cu )m4X3hέbTղlQqz86 Uk5^x:a+W3T dvTT F^h> - /"Gv U\ 繝eܚHUؚ^Z(`^/+T̜S{N|H*W+Ll1P ^([32y5צ@_p^!l<^ENʑIbw0Q艐0Fё.tAߠ4flktjny=zjJ5%hj)Z -)к>^y^;4 .)9E˯,UF4XN-9a=bC*XUuq޷+ z-.YHE嗜~$c>_~*}ق vI<ᓮ=;-axxme8/sq -՝ʡjJJUz j9a6Xb/r`þAxZI6츊 `UTViz3 HDKΖتё.z|5xh"WSBPS9a`-Z9]r9xy'JM1vp5x=w֗`ɉI }>Ԑ CB#ZryWS7jc~/G{vtgo5սAOuTSqχ' ,nXr mqg9^T%%%:Lohm8?Z>=pv0c9آJ.-h%`]6y3V4y u5 =8Wި J]l%#E=}F6l6J+tP7qB^a'U\!^ hŖ-G{"([ܚ3jčlᵹ0^#wt-˓FJe-MD -![hUrQoγs◾m6{sOˑWx'Kݨr*H#`ͱVIuAV gz]|=T8-ud"&vsR (l`ȕ*!Bܐ}X\HhoںgԋY v}A O&.4w[qҵ2ucr*U|A:z tV%dVu 傺>^A I&;Z_{=fل9BEV^`Q+1K]^%7>Fܛ6L@{%(gk=cbH09Aﹲŷ {y9R(RP~,*Jlo/Zp)Ď θ Kjq^Qpav]UͣA``aŋli>:Zbq[`>hڛ kw]Nպ48-$[@#F ?gT +rP"Z^^N͎qk6͵nvV}GvOa{ EN8'B SWTA,hݪ]ӱa0+VG8i"47eB_8xYvץyfCw /e4y^U**F 6ml3± 9^A#BNlCYrMՅa l(#PE冔hb+]3.Ψ (yHדJ,l<1Hʑ+, mB a.g]#cX@Q Hj,V xBUJ1AG$`nh4D:#^EB (q̒.u.kX OD1HQȕ,T`u[ / ^J!bzxm"709󄪔j/U*X;Vb 1Px;cKlC,gX)9ꅚ!MlP(Yr0 *Uh bl˖9Bz6KAa㌅S{fc/ 2 I]ɑ(I * )zkQ[^fKNX8uG#`"w:(@}Y FA$}%Q)(TUh,xZuy&YqAdgxl‚ @! #/I&l}y2u*` j0[AK:^J[tf,؇qcd1BI:#T*[lbDa \Q/9az.fLW`"m {@%`cYrA467:PPPer`%C --XH9#Sx$,}P/&2AqɣYB"ƆFǦ0ȒLLOl I6LO6R(Uhŀa> M[Ŗ+bۉDPŀň>,wbgH(2BQ,vxAʡϖ d[]AW}Wz!򂅰U>H>}jVFw֏([K?c*_ܒ2:-d2JJ(*d.F%[%Vw#ZVIHqVo T J:ūD .Jbڌd]dJJ:Në䣣J8:ǫ" `/g-*1j)acVUjƖi**a)Ɯ kjڀVVlxu(XXV:ړëdux-[B-^=B-t/^%X#ϖ(* z#QJZVīd+a%oGWɖV ߎ«ֿ)݂WVEV~l6qdk+lxQf++jcFVWV%^V XW۳UU OKJZxQKF.g}]KJ%{iKJ |uKJdl}uK;^ %ax$ֽ%^/x-au=AhYxu[2wektY.ʰ5Ŕxu-^cV]Mz})`]_F֝x[1FVUAv3^ق6ƫu ^VIXU īyV*GIظ hEyQ|=תԪhYhG?/@yWyWEoΝ3I/U 7_㼇Mr'0/㼗 \ﴊ/*ay_YJK 8; ݜqOȻ:8S\$yyVzUjXމաz_57$y70]q~8y?P O㼏Wsz8sWI RyeMS ;X?ﻓ@O4Wl-?W_OH`Cqo޿N]`KqKZy_U{[}~[={}[mnk>qGz"q?/p4ytLLȟ$_ &h~?08 ~908$ 8y8e4lEE6ۿۿC; ]㯳򾦾&(FAyS?q/y_($׃~-{P?N~.(; }OMs﫭Vzwn|s &y'{^Eu((`;AyV/|uMBy$PP`oN5(q޻ 5yo+*!yT"y[\{&~_N+Ay׻P?Ln ʻ9By&y/{_IP_EB?}>?"yOy.ITw{J?(qޕ>ꮠw\͋{KP޾zҫGGg{{u;ayߛ$IO fg^`oyݛRroWzoΘCWM̟mIyy+$nn-'jS`gLH+p}:NO˟w~-yuw ]Pyi8xr({-8 5IWΞ4T=)$y?}qUI\ss_N`oyUz&2yMy&ϙ}$yy[y_8?>$罫@޵]H~Kwq?-pǒ?8s6ۡ)v载ۿ oB\6>xok}MFAyS7`3!}Pާ_8By8(9>AyWPBy_\΍wn$䠼=qޞByͼ!zofރIf[6\})(Bk}((}P7'y8݅ޚ}UP⼷l Jͼ&W'|~9ޯ_By0ɻ5(8 ]]8}$y:ByMB})PK`z'?)I޿tBy?LPOy$>]Y( {gռhy틯W>J^Ef܅Xkc^Q?ԙ<ӟU+֑3Em}5L13m>S=zk|ZLg\b)9ogi㟯7.L+֑3=:a}}L13m>S= ' H~~O߉;uJĝ_j?Gs^?ý{5 jί-\mp4g {T[;13jzUGWg{Y#ggoޙʝ$u ZIpeq4:g+2G=# c$gx.JhQ D2GpstO4s":) o?7fe+&Q/:4QXGJtBc$g|z!z;b)9{3:FrgG*֑38i}m3kuLTIT>2c4Yro|7ǟ&W#%g_ggiѬ>d:RKz+j/Wf5 # }|0sǗ>TgP^3GH||I c$>ʽfޟG.Jxz?[Ƹf)3|8>N1gxK #;?{Dd)#^  C :A"gradientExample1"lz3Ȣ6"Hz_@=@z3Ȣ6"xY6W\lBzxizefYw,c`fv"֤HtIpQ&%˖,l$H )]J2.* 2)^,iW iIi&ux|{>}eI9_{klΖ`po`'/ 2_~pgz _xma?ښu0|M&>y߯ ~fૃ_pϾ~k~on8ۇ+m䭾0dgj~П _C=ݏO~?'o?_ůSw0]5|S?1=q_~6~߹h 4o}?5/!_|f~qO{}8 ct~ny.|8o-|^5ܻkWkG|w¯GK=>>oiyKgyK~ 4w[yK=>oiZo 4do 4 4x[pi}?>oi}ow[{>oiZ߷[qss-M{v3-M{zS-MyK=4{\>oi 4-M2|Ҵ/4yK8|t -MyK= 4yK>=|tS-MyK=N 4-Mxui}>oi{>oiZ߇[qhi}>oiǁ[{>oiyK=v 4-M1|Ҵ4cyK=4--M<|Ҵ7 4q/ 4[a4[~i}>oi=Xx,|ִη5K߶5Kȶ5ۚdۚmmMf۶|[tm[tl[|[tl[~<,|ִη5K߶5mmmM|[tl[5,|ִۚoۚ|[tm[tl[1, ִ'ۚoۚ|[tm[2,|, ִ/η5Kȶ5mmM|[tm[tl[>9, ִϷ5Kȶ5cmmM|[tm[tl[>8, ִϷ5Kȶ5mmM{|[tm[tl[9, ִϷ5K߶5mmM{|[tm[tl[8, ִ_okmkZϷ5K߶5mmmM{0, ش6666Ńo{MfƦfcxmc~YtM@c=76c_ct=M{wc=^ilZ߻i}hlƦ{lklZ[i}onlǦƦrc=666bc=646\c^tuM{mcp>gyf0pW?su^ۍ=_e|k8_|}Ώ >+_}>VG3g͵k׵g hLОea=zJ92Q:>Ͼ*y>UKQg!c9OGkNGqIw~y:~ڟc5s;Kmt&G[Ոg"?Z&3[FdsɹG{[R=G}9^lsd>gt,5:fɹG;[Hӓ):z߯ZZXY==FYV=li?sKYB-U)tOF[e^#-k)~}ۉ;͟}iKuڒs|αbrŹFZ˨ #Nį3H6XmX=S,ig{57՚F| Xq>3:~rpSsV2Z%sMx7H_K[9nםn eOӹ`tFGc(F[m+&}!eQNmYs<:7[KzٷgPq^y?n()-N2Z%=.kLpoAoL-dߞE;l4鏙1-CV0tNYYrYs,8pm%il4[+M?Gsr,cV4FS>luYc! [؛l̬-pҟt|K+dt }hϜ9.K&[c#<-f- mg Wgw2ݿKntv+Z>k\,m1ڒ#lcŹZ-l%̬bΜ=7h!ӽx;5gY=15mf\cǥ cm~QigȜt]Qnz.pVG8eimׁehOjr% 6(O,di:c;r >s&Yko6i\-zjn251Ǽjt?pˬ+8yL54Gkf 9MXqX]9ei%,qÜ0It߮8=L.>jlԹNs&K3e%9-\cs\4H7KXyJ9 s0秓3\9EZ'6SrwHFcZْ).GF[ْFXg/9o ʹ8'?^iXv[{v,Sk_H>Kٙ9eɚ\X5Z܍k5<04͋ʹˊ>XhBYuV_4a4oh}3es\Fzl8'j6[KkiWsU \C{~R>Me%6럵>cYce.'Xr8`lk6X%]4k07|?4_BdUj.9=.5OsY:i9>[m2YqIxuDL])L 3L5[rշq;c5MsV[3d''kLZlZ=9ngFͬb3 JdnӑV2N#{ڒ=VKZrZk4>[rs.eoVo=z|zzS1s۳D澞؍ 6츳=^?*s2u9fQk,;Z{#܍jۊ7o}ܘRO9\jJ q׵vVs|l>acM&.mpw#̵zkub+0wnc=56f#|.qD{b50ڛ.[Mzqkp {Z̵xr)1Gɷ׺=Mu$im:h=15"أO^ZMa5}hd459f%%.m{j]}üܦ6oKY3[muI1s|mV5i,KK}hM~rɒǒSPIܾ̓Oۘ3D}MkuI9))5݈7[{.tlv^9[ɾj͵X0om3G.u;5r-NsVk̾u53z#օ`ٺo54w`}R>kl19cbk^(]弧ո1G.V[v5GR Xgڛ%,m1:g);kl0:g,;c6G1|8KB3u8Y}fS}ZY:rZZpZgfo^dMF v-aw  BY?LvVst -͑6K.{s&;:\˼-lu6lGd6gS]#Z l Q ښuDifiQ>sٙ뛽6Geeə8◕SB7fsvّc6"*#UXm1Zs^c]"[묩=֒\ejXeim434(\rrk[9ڹ+c^q̮ WpEҌ:i=,}xu!l p}Qv\35}:9FGlΚ mqʘɥ=mqjnfd^f~]LΆ}voDEҌ]jz%5M2BuFbAJX ,SSN:)K[dh9ٙ뗱#eɥ=ZL90Ҙ)1#{WX] -NsF[Oltezj/f5"u՚LvV-GsdhV9̬14.c&{3r9C399s1;F'foN̦z2cku}\{mf23-sy,l5<=>sR9'$f|.[ѽ"\ָY.כu)DH35[;X,F75zhm˘5 ӈG^x} $껅559vv:#v.[s]k)[[i,WZ Vp:'GGZQsF|upȊ> Z}Sas弾g?l5ۻG] kRgMu!X_QVg5S{贶gњ~Y*52FkMVe``o:{:B(o#N]k{B^OfkޮzՒڽ,e495Ϝ `,^=";^CslYszm=4aRv^"^[mm5td' Fs_ȘI>5zG?lśzuُs tإHݵ'[[{غt,m5ڒs)c^S,k˭=[mZu댳C y|z yklQBٚA4V? ?<&Ktښ[/gd.Wi-n^j뜳`)kNdىhaKנGzMu!>>.[[zH::SG9uh\5̕$_ӣljQ˧]k[}`f?rNgo^ ׁZa()={!Rw-]-=YGX-L>t޵CMߡ1dL8h"VUaEsky-uؚNĹ{p2>xmBl- Vڛ5GӚҥVg3ɌwoHuׅVUz9sw.:zi>#xְ:]6SvQNGھCk4knˣxa5{,cՏYۓָw6OpZ() lFFz̬'rG)szihh s0S`:'^ku}*7Mas'cu>"9z 5FѮ/XMLu\G=N[4ehSFYkL:V?tXY_Xc[CNUjx]kfk:]uNv}8Ae6^s{F޲ٞ~أ՞xu؞͝kϾKz`5h~HQ{yhtwHF{̝527F57[kkȳJ[]_1鯣26Wm[ƎZ?f\Bup/u"f5骥CڎZdF[SM̍~\uo=Y:7b3flm/ҳs Z_̱YWj*SKR9]:.Ksg][ 5O^ilE\'o(c0^G3rbE$jR=gyH4<`}4z.7w^O%^kB3V̌Efknf}1jd Z꨽N{;iMC3 K6縛]^&^c{CҵFFiߵ[AV?ES`2yL՘ZӃh=V`ZڧgTQ铙N륩#5:^i鼾x wv!:s#ۚo3:)cK˦-5$j9:>"ҷ+3G?N57[kk d8:27k{_Ϛ zBvw}VîZԔ 8}4Mc}<Mkj]}|˭)`CkiI0R" H.$2[kZk~a5_[W]unt9N[0=t릩΃k125kTwM[jصZ_X5|-l,cO+~okmw:'yVkjOv޼O9:MuXX7ׅy Yiu5ts\ms*% kz]#_K/Ee_ͭ+j;#3M5{>r朎yaLeB`lokϹ fkk s>Uv"{!Ҟ =Rol͝!V͓z:^nՉ>8ZVw>_Mךߋ:lNf/co 5[{E5:h$g'd1U [X-k.[k0Xڒs+yelnaG^+zk*c3{C8Eefl}XmVy3cqq\l9ikMgMY xelKή5v%mD^s"k\:q:鷐y;߃2ڭ\jksxZ6cO#fx}"533/ ^׸e[26D$jӚ,v2o,Z:Zek9VSN_ 5_[̞b̖ЉP";lmƎs}O/݋=vi:؃{KlAdu)xa൷QmgKuslMƆ)|l]jk~g4f^׃rn슇#C粵h֘-=Ü*yr|5s;ؚ{lt2^$cN5-=Lu~t޽kV{~Z5l Zax5[r{ak3da_uv JtuG^l=Q:' lA"r]CgwA[s)el)[{K\2[T`'xjd}Ժ{h엜{N갹Z#wTg Klуh5)'/#V{ָ$7NDn{Dt5Ux]ww=融T/"u"^SY[dj.KXugﭴ:26w~&[sVSGgEח=~̍e>l*c[tY"{8^7ًznU؏Z_̵:F󮱳݃=leѲwOkX欞rX}1KʜMm̾>kM]̎Ly}34HHsƲvvֵ8 ˭.kkˆٚA,V_&̦"D=e?v[{]K]>3g@e"}ٛuG ^lA4{A,V{35ڻw K0 s0T=jU_bֺ٭M&&ccfv;<#5G׹q|hD4HlK'Zfk5\_Z-e='zs5+#ۃ</j<0ʹ=iLfmn>luGO'1.B^KZA\Lu8:k=؃V{A+ 05 ӉH{$e#tؚ="W:Ϲؚ^$^`uڃp5ku$=Y[I0..q/CekpV_6Z}ٚ-"=;sQak9^/ԉDmEjxfkjQYS{5VsNt֖ͥ{Yz\sPۃi;H< 2c[zlm]躙]kZ' w"9c_vמlM1bjn]e?4v=ƕVOAjv\:kh54Sa.82lxvO>lifH:*[K=e5hPsڻXy7{.h+2ibצg9i=x' t"%z˶zmBl1J=]c~t=V{uaX{ 19$c2ذîo٪W u"ͶzlzhtRƜ~ ͱ{YzL0ZXjˏ{

4cSakk:5[kzkKb\zmulu-ٚZ)_c:l뛂Ouǜ9O=&kkܾ\ݷqN$鰽^õFlQcڃPĔB0շ={zkZۃx:},l٫="=dl}:5HO-emsJN$]wD:lt{3b{l^Lj1R=C![{)[kڣZ}~՗:ژ^GZYkX9kܞ؉hkPfSתSeבpk=ُN밑="X]v:&[$= {1 3J{@Z]"[Szmung-y-ekj,ScNUzelln_özxeƖIQ̶tެe1tu؊|{Cv30[gPkTdG}|\2^V֘KZY_֜\N瘡њXs26u*7ksh4c?":l3rٚZc=wAp"ek:xHz9ou>l]kju?\N!2lZ^;3@ҽgv݈fm(˚$בt;z֘v!R>5ƈ p^./LWTVfk1%.h֒fllM?:쀌X]2kkݖ)z.cwHTw'Ak{՞.ĺhkul}'#[{=Zdll{o{95'k[ܾH87{C.d֧@kTKaWm[r.8dkDŽՑ{A"zjӇ2[r c\-+B=B5'kKd.gwk:.GekA޽.D(+jY[}&5[s^s=HQ55g55N[ukOƶ^alk!<;#Fuڅp5FI;kC52uFl]gulYBZ:wߞ>1Vc:}(\~9kD"{MVۈt#z7kS^NITMk 5A޽Lv!Rz{z-tf[^[~=`ߞ^^kjH35lml܌m1[{sfGfm#9H4Hedޘ^/55B4ٚڿw.҅XarV{Z+[{~ڻrQ`5;vz\/=*26g6^tGb>29^燀F ٪ ۻw/ 3R~=:xv5v/joS.idkj2u1}\щPE"XS'mڵ;۔װN_Cҽ!ƺ,[cs joÇ+{@V֞3ןKc5YO>Z9t1HMz.ypO gYڎG}})VpB}!\Q=wyT(PVOgY,{-=j^=;#fSn4\ob^D2;bOrr9#yHn[W)[4fkOg-Ymٷu/RVîԝ5vs~K\Ɩz1;Gl\Gbuۓ=kawZ#]_5=HzFꝂ0[K=㜭KZ]_ ҽ%ٯS-"g~J^zfmEG㶔w x-5d+cuD"3Ctn)[{v B2f8_±"ٵdܖV:^5օ 4jutr+ 5쪩= poug8[{~i^uZsZ32 cFv#i?6u~ܿ={Fj} .ֹ=jkb]&Zٚ\՚ =9ӳZik-?8O6m;R#-fhO_hBlm]c ƺjn][ sewZ5[kX[:l]ӷVKx-uj6t[ӑkۑfex鮹.]o֖Zۇx25?K sJ:k޽Κ={AJv }ymDgFl6n[j=~;.s譥l:x}Pͭ)JzdjgVGd.uizҘ5VSy4^dZl7cmR-Azԅdki^Øz}3hdjg?VZ.d60[{Q=HNX*go9^c=gE,Y:fΏF27CzBڲy=+xadjK3ˬGTkjzٺջ밹-漶dlgnZ$wL2;uFj5{Խ8:7Dl&S5Eudz\z}zw`^C:l.cKתK$ 3:f^ڃp^{:li͑[Ozj*S_F25m5uF 5Zu#Y/b=%[[{\.f056)#֜j{pxN:.[gDfo.ak|zd;LM)ǩVK\.$:k5嵶ɵ:]H="SʿrbvQb]\g5Qڿ݋F!(eDz<]~H?^DekZ1Zc36Q^kͶzAًpfp[Iڅh>&[sB{cg5uۣWLY}Fw}3?ڒ)jVw)筞S"ٞ=9nsg0{t!:2[sB{u[GϚ;L.䢣 O׳FOY0jZ_Zmq:h#icv)$+e͈]Hd La{; ^Gu=zs5ŕV[ԉBg]s=G%z`VWXuZv0ךFUk$+I]k͞lMߣzkÞ:lM԰8Zek52zFL%5u_Fmgei5r~]Jf8.[g4fk^#ky=ak뉓\^i7[Gd>x ۷gt"Zs9ғXQ⾾/1]ȞkduF![Pםwk\rkOmYsfj&h4(h:k՚lG XmuZ2z+ac/"٥\KnO>%KܨIv!ҞkCNîӽ֗s;ll}h>WǠ d(ٚZAE9Nkelli rcqYܶ^KkkO]#C3:5vm {ˉҚ㍌5LjCi5]cb7=HXƺ~_7A pji.KsFoIcgk~y: f!iwmB{ll]1{uu3љ)lBڒ9DT;kj/ =Noe漶q;϶Jٹ5օl5v!uF.[#[c"Bk>AZo"uזlmA{0jk؃p 5Nt8ڼ9(-9#}}f짟!iwmB,{lîcz _vҚg }l- Rg:kl?X7)k!-gS|֥{Ed.Fs351R=fjecՖ/zi >#zj}۷&KoCڼynKf[al_uvfQ=H %s[Dmwm7jARp^9WZmsjZΩ)\KڛXƞCzgX2u/f[V~ϊM/c3C ]vv*3dki\Rc괧f꣨9]g3*[S>T:-Y}hMbYc{A̱$jxMcvͳ"ֺAc{;Ѕ``xߣk|-uؗLⴵdV笙xmo'[KF[ƬC >kl}۷ +\Y/RDYDtkHޤsђ{5Ɠ#f{3%Ok,SYfuZ~9]ufQk4t$vwml=V[uN/}}p_ }}X?[5CN>xm-ft$ajg^S1Tv!+Zciۂ {A4Zw0^s]7Uzk²Z}Ʒ>l zkK>d\5O NVzm;_.c44ej^\ޣӅpZt kx9={??Đ7;E ǒ3D/2ᴴfCˬDtt]vFh'ךS5.זlV[{sHdNt!9z s/=d*fcA/1ۚpt!3.Dd4t5owzoڒ^Gu"ڽ.D㵴7M<[sglg.eGٺ69lm/=VZ{]v*՚A<^`uזmDn'k&[˸ vn*>`>tG{*c_-tgeVgمH{sl8}GZ{9Y:kZ-VތE" z&[kOuu*{Oƾbva~B"a4Vk+5Vo3=^G;zzֽ!ٚ'u} Έe c6E"ڌ}p=b+g) \۷]_:뾽ukNDuEJt!^>eܟQZgL+3|;t^[{2NwV[f匛#w*e,k=7YsS9cc{NUژ.ds} w=clz}2vW5׹P{)VGy<󹼢qR;a>0bݴ WZm=&kOb|\+@Pb6^[^X~S{uF)[{^DZ{2vډW!J5NYf^kG/مZH0pߞt\l5ՃxMZ5cvNƖ|jyMe QdkY!+}!2JN&.5yB=}c-tpQu)#zm5ۓfcVi;g |kkƖu3"w8>J:]Mo9mӒ^zko [ [m:W23uskel\el+f콎-u" 4w w~.K}uos}+m7^mg !3rٚzK5̖9)-:`֗dkw+2f?6DN1.^KPǫ=7q[]kj}QYc= 1rkdv۞^Dez}trm#[{p>;N$yhޯtzչ}.ijZkkjl/Hu޽ՅDdk҃Ւ^RתVuwl-u!ٚwQdlck:duz2Kp.D8Ǹm1[c]jl/zM8fq"̶ZlmFٚ9$[C5{GjAZeOid>z&^Bl-1vZkl;* ]Hd^.[oϘW([oJNUcAؓ9jg̲7Iۧt)cQk'[SV&":k9bBlAJ8b7s:w0]Gx=iց]HldMl)c[Ně%wVxmۅ\Q]B(^[q\gM .ĒVoluݞF"͖(1ٺ`<8ꮡXe~'rԐs3f23z u45=6ꛌ51䨲 uT5psqD^Wt0[\gY?[c^o&:N및Y7 fk26(u"teVZ2D":j%u1ǂk͵}Y.P[+ yn]^Nwh-jڌ}Kw!#X&ƒs6FOuFh5kAlXgo12|u5fv&!csi'";&FoߕV[el5HKYr<뵴3v鑮/}xŖ"Vk{m_+[sٚYg]ǞQAQ~s9!kGg\cŀ ;hnꥷ NLZ㵶݅^O9Ʋ5$ ^G\FӧqYkzA5F*[l}Wl}_G%9=Zw0zctr_qkw!Q^cٺO#v"NΟֳT%s:k)[k #=|:O&[eH~o~҇p{2ck#*iYn+> \W[ IaZs.5{v+W0 0:j\殓=\clúl}}gG=|ɽ&cG(nu]kKW"[[:l=%jN)ϥ4u~edkXl-Ko:7l ?CEGN~%h=.=<nvz}ᵵV +t"TmuĔC2)t^%%[k~UᵵTb"-ns獥fkMI{j>luwedk~gx {FoǕV䭛5#)iudgekZ}xjMex:#:'[KǤNϏnu)5\.$HD%)exm)D^S=&[Sg]H5%=f.QR1cS>G-="'Yv.1-c5׃X5Cj;m1jkt!fZFjBښ`댕d;WZٚ~TbV[{*[ZcvdcxKvU ly {luF :wF}L-=udڵl/ߤ j˾=#օX؇S1#\njZAlB'=SH aޖ܏!}tuFʌy_1113379930V F0.`0.`1TableKCompObjUXhObjInfo  i8@8 NormalCJ_HaJmH sH tH <A@< Default Paragraph Font  @Vl,2$ȡL2ޛ^|K@jFF(  E@ O %*P0 N  3 "O %`!&N  3 "`!%b"&N  3 "b"%s#&N  3 "s#%$&N  3 "$%%&N  3 "%%&&N   3 "&%'&N   3 "'%(&N   3 "(%)&N   3 ")%*&N   3 "O &`!'N  3 "`!&b"'N  3 "b"&s#'N  3 "s#&$'N  3 "$&%'N  3 "%&&'N  3 "&&''N  3 "'&('N  3 "(&)'N  3 ")&*'N  3 "O '`!(N  3 "`!'b"(N  3 "b"'s#(N  3 "s#'$(N  3 "$'%(N  3 "%'&(N  3 "&''(N  3 "''((N  3 "(')(N   3 ")'*(N ! 3 "O (`! *N " 3 "`!(b" *N # 3 "b"(s# *N $ 3 "s#($ *N % 3 "$(% *N & 3 "%(& *N ' 3 "&(' *N ( 3 "'(( *N ) 3 "(() *N * 3 ")(* *N + 3 "O *`! +N , 3 "`! *b" +N - 3 "b" *s# +N . 3 "s# *$ +N / 3 "$ *% +N 0 3 "% *& +N 1 3 "& *' +N 2 3 "' *( +N 3 3 "( *) +N 4 3 ") ** +N 5 3 "O +`!,N 6 3 "`! +b",N 7 3 "b" +s#,N 8 3 "s# +$,N 9 3 "$ +%,N : 3 "% +&,N ; 3 "& +',N < 3 "' +(,N = 3 "( +),N > 3 ") +*,N ? 3 "O ,`!--N @ 3 "`!,b"--N A 3 "b",s#--N B 3 "s#,$--N C 3 "$,%--N D 3 "%,&--N E 3 "&,'--N F 3 "',(--N G 3 "(,)--N H 3 "),*--N I 3 "O --`!=.N J 3 "`!--b"=.N K 3 "b"--s#=.N L 3 "s#--$=.N M 3 "$--%=.N N 3 "%--&=.N O 3 "&--'=.N P 3 "'--(=.N Q 3 "(--)=.N R 3 ")--*=.N S 3 "O =.`!N/N T 3 "`!=.b"N/N U 3 "b"=.s#N/N V 3 "s#=.$N/N W 3 "$=.%N/N X 3 "%=.&N/N Y 3 "&=.'N/N Z 3 "'=.(N/N [ 3 "(=.)N/N \ 3 ")=.*N/N ] 3 "O N/`!P0N ^ 3 "`!N/b"P0N _ 3 "b"N/s#P0N ` 3 "s#N/$P0N a 3 "$N/%P0N b 3 "%N/&P0N c 3 "&N/'P0N d 3 "'N/(P0N e 3 "(N/)P0N f 3 ")N/*P0T g C f3"O %`!&T h C i7"`!%b"&T i C l;"b"%s#&T j C o?"s#%$&T k C rC"$%%&T l C uG"%%&&T m C xK"&%'&T n C {P"'%(&T o C ~T"(%)&T p C X")%*&T q C \"O &`!'T r C `"`!&b"'T s C d"b"&s#'T t C i"s#&$'T u C m"$&%'T v C q"%&&'T w C u"&&''T x C y"'&('T y C }"(&)'T z C ")&*'T { C "O '`!(T | C "`!'b"(T } C "b"'s#(T ~ C "s#'$(T  C "$'%(T  C "%'&(T  C "&''(T  C "''((T  C "(')(T  C ")'*(T  C ï"O (`! *T  C ƴ"`!(b" *T  C ɸ"b"(s# *T  C ͼ"s#($ *T  C "$(% *T  C "%(& *T  C "&(' *T  C "'(( *T  C "(() *T  C ")(* *T  C "O *`! +T  C "`! *b" +T  C "b" *s# +T  C "s# *$ +T  C "$ *% +T  C "% *& +T  C "& *' +T  C "' *( +T  C "( *) +T  C ") ** +T  C "O +`!,T  C "`! +b",T  C "b" +s#,T  C "s# +$,T  C "$ +%,T  C "% +&,T  C "& +',T  C "' +(,T  C "( +),T  C ") +*,T  C "O ,`!--T  C "`!,b"--T  C "b",s#--T  C "s#,$--T  C "$,%--T  C "%,&--T  C "&,'--T  C "',(--T  C "(,)--T  C "),*--T  C "O --`!=.T  C "`!--b"=.T  C "b"--s#=.T  C "s#--$=.T  C "$--%=.T  C z"%--&=.T  C u"&--'=.T  C p"'--(=.T  C k"(--)=.T  C f")--*=.T  C `"O =.`!N/T  C ["`!=.b"N/T  C V"b"=.s#N/T  C Q"s#=.$N/T  C L"$=.%N/T  C G"%=.&N/T  C B"&=.'N/T  C ="'=.(N/T  C 8"(=.)N/T  C 3")=.*N/T  C -"O N/`!P0T  C ("`!N/b"P0T  C #"b"N/s#P0T  C "s#N/$P0T  C "$N/%P0T  C "%N/&P0T  C "&N/'P0T  C  "'N/(P0T  C "(N/)P0T  C ")N/*P0B S  ? t@`@UnknownGz Times New Roman5Symbol3& z Arial"huu$I %0z2Q Joe Chuma Joe ChumaOh+'0 (4 P \ h tUsing Colormaps and Gradientssin Joe Chumarmoe oe  Normal.dotm Joe Chumam18 Microsoft Word 10.0@̒x@##=@@@+` ObjectPoolWZ0.`0.`WordDocumentSummaryInformation(Y[DocumentSummaryInformation8 7 bjbjUU " 7|7|l H H H HHHHHHHH$JI jKN9H HG" H H H9HHFNHHHH H HH HHHHHH HHHdH0HHKHKHH jCJUmHnHsH u 1hN N!I "##%$Z%Oh+'0p  , 8 DPX`hss Joe Chuma oe oe  Normal.dot Joe Chuma2e Microsoft Word 9.0@@D@D                         ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v ՜.+,0 hp  TRIUMFl  Titlesxä1[vyXbZYk%c[s,;풖eޱ ,[c_#:F.[uF ݵ6[K:a{:Q]|z&f93'==t!ڵFZ/J=&[c^s[Ӌpf=snfk N.85Յ`BF5/+e_Hye =l}-rٮ] cZAl fl}nM涮QAޚB05F)[Sp_q^'ѥf_xԇ<4z=9P?J)gl5ˆ.Tgm҃lu!֌cv_{\ܶdk i{=!3]Ӆ煤Pٚ>×3B:u} ^ ЬOGIc6wхH5Jk5Tr:lv#mu;wOɾA̞nmZڅ^zc=|:㝤yD6uȆ ==->/Y Bl D%-"n fOPz.ןl9>i1:[W|vehhUҺGrəaRjMƼ2v} g7v sα:S#uF k$[o@5v} [gg!wND{D>K:5dD3v.D{ : rڃX26eԍ@k6яDY]kko3]]chE$[c`{umeGGF:c؅`AԅP^瘝ڹfK^׶ZZ'ׅ5Z$[מka3R^MG9^|dyw4mĔ_u.䜢 5փk5փ`B(k5Ѹn$k͵Qٚ[c$N;l1>iFla2dhv<^CBek:k묱DӅ@s]{Nfm5؜_1dӯęNua_ [2[Sמc{uFkæ=}ס>SF3z/aV{l dkV0Vs]lmֆnמ]lZ]3fkjQꮱ3ClM]#×3^O%C`'B9zl񹛷L} [s"'WKlӗه݈r3X~b>x=cׅ`^[{3s7ojZ`l 0: N\'kv1}e-{LA3BZw@NM&ښ$^O&C;͓ꭕg[:!&[Gt!׈.dB`o݇Ւ׹fvȜ~DҔRvI![}!i:8}:[מH]r%C&[GD::;Cyoڳ=;U 8mu٘۵լ1tէs*5Θ~o uz} \^O^7zٜ|'-f=lM3z恵]gL549lyؘZkgS?v QZZMu#}!#[cg3]Ťt96 օH{1:bϵgq:uښV{1[0:k{9e#@5/ؿ`|Xo =.2zץl|\7vGkQsZԒTmqR!5nGh er1v]9[c`3^^_aq^[m~bG.sVGe댖=|Z#̶]{rvzd0c[8ZYs>5Έu!;CJChuIfS2lmW=|sNGx͙͹htOGqԽ5Nk>)5Bl63Sg."G$ko!̓>obf397҅x-{4NG[1[r(FB@GrٚkkG/$Yבڜ}6s^Gv!ujk۹v15ݎ07eC9#^Ot!pqrLsj6ވ])VG22R3F epZn}MK-ݏ]Yc4v^DNl.;:9=6C:֖ug;iaFkXm56llԋYc8fk䜐:#օ^ZkOf|jќVo6dk댖=|NcVs^Gu볛(LS;s2kn5@XN .鮱H !wsGiek:cĞkjEil^3^֒^OufkEwݗגolPs~n4i.θ_^{ݎΕ՞ ^[֜+¹-yc5.D5WcR"tp1Se!9lDK8хh ):wq:z(k=WpJm}Kw"ڬm5b5nPZ:#ׅ[kz}8v9'G?6լ~Na5[k\{=D]ۗٹ' kfKNkr5e58! 5wL]k׻C󞎃{K{Csw3AL\G`ԃH5x=;qԍD8yVV-{]c.9.ƈ֚lt-ȵךXwm1s̄Ym\bkdHx k'JN[^Sf[ݶfmVc5փ{Blݭ3"]Hyԝ} ֮5j8f[X \s3m0{ ]չt垽֬9m9Vc5Alt!]w ^w6jüksYڮZ=Br#ZsG]r?I}|h^k3>2\欆^_E:k5B7 {Cך!\ӹ$Vgֹu˅ ؝vf"}x}-kr6efjհ5]{x¹kWfk:cnw˧= ~r;:sGYgZ-VkS5ZBk!ڵF\PNQ9%lB,u))wX=mlKֶmuZcEEg==X~OF)[c]5Zx-bs0XЃh5օ5z>|v/T[c85{&A~w-2v -i Y=k.뮑d!;!Z9p9՜==ݵW ^ShK$Vky5BP?rSN o,[_Ez*[S]H]#^{Xs&cdjjmZ^S燜c[㶦'1;^]HIY[c6giW+Iuz-#vי{CХF͜c5\ou!3">3p;o=[kvN3>Tg1l ]K^x NL.=5z}~{[kikׅl^Huט]Yk9j_*l5hBj{}l~*k">Ͷdּu#lK:=gwZ:tZc U uFZg^\5_Yٵ?S{F}qYYj"[c^?TxXkL뚓eUcz-b'[G{W5wOĞ(NT_ȹ=fkn>awC^s^9'5kuV 5ZJ~S'u;rə#|zY=kfoHZ㱊ӛQ^suNr#s[sg'^[Sc_RxS!dVcK5vas;mmG"]:ck -0%%VclmZӉѝkd(gq0kuE5׉`fsYokz]򾼳'̶Xekn;^;6@Yek>n洧;KUӇPz}pΎEjfl}1V{܎{ToMYM!|>,[s\J.Z]2[k3u/g^He=B28]v#{k쨬}=^OW}dI\7|w3C>n?MC:]j.[:=Տs.ϳ2d\mdv[VYҵz׭svvT?W1;q:VWr`V3ˬs:kٚnDׯ3,8d:w_ȸ؝{Mdkש٩۔NMVGgZ8} lK?R*k0sHϽk7Xd.aCGekߍszCӜ%쾯_?R#kGy_ץmnΛQ^frdRVkdllo7}񬿨GXmqxLQvGY_W!X~ m߆Y;z#[ovdhNk.uٻ7Xfa<09NSr`0cÜ"o\Y{rx纄˔>%Xco3.d5)_皭٩.S6skgj8ݗ} ^LκԙQ=$DZX,ЍtW^f=L\n:'Kr%{]b?vں1[ku S9k^%6K*nc5&c0;z%ck.m2fOvsVs3uQٺ{԰Y[4q6[k~=} OƖzm#L.esm=Fӵ.u͙]gv^s~Civo:h%s\fϑF[Ԕ'z]>'q{h5>D2acj~DIKed99>|di%5bvi8gjjXƶiv8L(ivM#2s6K>0%7cS}1p;qV^Nxcvm#\ϵ朮a%[S^Vsܞ>\qxel)av8,ZKz19ܬ9k;euMskf> sΌke_jAćR9\isϹF8/K]ܮZٵ}Ϋ3gNnDh5{P^G]bZ#]YsѹNdj#2lۥ2r:[5e6Տ)`vuj!ٖ~%Lv9fQF:݇Ց^6}h>9-li_8 f[v--0r͑>k8ku)K]YבFkg&?X{NS>`0{oAKzl5>GtՒތiݗבF{=9k5[vI=V.[lmiե6ۑ)itT.ivjّHM=ɥ].Vk.em1}޿=fww :dVkmqZkgs3N״qk\Z}iq4sM챹ѥzkv)/1Ky(iGu}M{͵/s 8\R9Zks%u^>duMfUkWrkw-o#u7\s αquYsn"W+Z] krΆv"p>xnkc%lХt䞾zKM$&VïA[6H{#58bVm%dV.}~WڝwF[mF8k>G]kdJ{=Udמs($V_G}l}-l oKao9{LlYs9Nװ:>fO^FF=VՒ:>Gtչ^GxhpN'-ZΖ27߾=a,|c2v^Jݪ5]liw#jri9:>⋾׷koϊ}ZqV.tĽ֗7e4Y6s\ׅӫV6iޖ48>l.et--lh55% _mOk{[sll5Z{? f{d9js53߸{ؒ}iq5:eui9^Sfw3̟ϴi?sa b8ShZ=^{̾ޘ^,i>γck8\=N[x]M=úG~#,_U?[rQ>{:m:Rnڋؘji.{:ӷ}Xms^k{=.ngBjsp髳:ϒ5L9iQfO6!^Z>;UV=gKauϊۥN~Vꣅ|n8 _3&op{k>>3翗S? ^iQQ _oo~ -x};;xOO G^N_xsNߏ|/׿^ x?^π|׿^x++&x7-o;;x??6_;XN_&x_2x4x4xo7G? ^iOx/w(xe/׃׃^-o'].x"x"x,x,x$x$xya׿^ x/2xK/ Kr0;i6h~~>fk"ON}>?9ŏ6 o]7g?|}п;xtggϵ2u'oo`~_O~η?'?;ݳ⇿}W˯5/~/|?^xُ>ѻ^?Χa_,/z4z7.5[?0k ?_>Q.>G.}} |oW?ٿK]~<`a/.{@w~Kv/p?840~~5M3{ޡ?3=F_>~>9-30 || \ \;V|g=>] 9#3/3xg \ |#3O~6Y^>_?f?E}~p? 3k9}^0Y9\|>%|5|zs2?s?F_\P~|W>O¿3~.f~~%τ-χ?58vcz?P}~%3-8vc4f?O>!|q3kcK_ g`g?ۍgc_ |37.?5~bmspy~k}[91|NZ;Iwzk.ۆ?ӣ5/3я3|fK N,LkH~f~=3~L?3 ɟONIGt~ 9t3{ _O~?'d0 Dd)#^  C :A"gradientExample2"~ x8EK4*Z <_@=R x8EK4*0_Y5WMmB x՜pTGwM5i'A0`Ab"6t$6Ѓw'0:P6Mg4 2h:daD--I~ƛy~oqX>>!B(gCy>1ΊV3qc "[&ӥq,QqkO/a e &8<"½"%!y?OO|Q̳gW( EJ?@(zw*IE?+ ߠ*uxog( E/URE_η^+oW튾O)E?wN)(DOO)x?K>]ߩ;=dzP?+}/VŊ^襊>Kᛥw)ߥ蹊E(U_UK绠g* E?GVj}W}oUEoPZEUe 2E/S/S>צC}?FLUD\4cSmJ;(6v(vʲCBC>)c>|/0mϱsm<wN" gc݃pέ1Kxπs[sG9ee=ܚ?y}cAA{P `iQO~? 7ZkךL ~.nBBLMk݋p:p­5b~;nG㈿a_G7pX¹>Prwpw!]ܝڏw=!wwݑpn/a aBŀnq%>r7p7!M/pkvL#; `?^ݏWo]p'igFrp 5ܐ{e^?O]i]pW:p?+h ^ݤbb؁;"Ho;poV$π;sn wz^n"n/Y"57\ {l πۇpܵ??s"܅Z s#Zxk➻ .r?*ǗǗ=w](;p܏'@;pe~r7p7!MΑNj݊pjWZXXsݎpkw7Ktpw#ݎ%7#^o%q;^+w6Œ{>O]/Ӟ&^Oc~~_\_Bk3wqōy{\.<;e} >n!~HE wTϽ_?yx k3nC܇~#}Xw3ݬ~IzxL =w#ƂA;>-%?+J=wܯG_ w@_?*XsGzkr?2Gf>nsg{\o!rng?(çTˇMlMͽ,|#Ozm/k"k~/t̻X; M%xD#`MU!}%yYC%PκXy{/zU@^V-5"D H{u_Onɑ;`".,ےM+ü2L/eTB!sjDxYvߐv RxB)|s,?ל$tg䙁PQ|ɲL>`>[!/oť'B)ΥK^.['B'Cu ,s^0TYm;& O[iz&3ጁ:ͱl*?Tό ,S~H/˛Ca\ׇE)F~D*?4ge?LU?Dey5~~$*?FOč&݊d_s=)-~TŘ;x9c9nm]]k/,En-D| Dd)#^  C :A"gradientExample3" ~p$t8'WdN l _@= ~p$t8'WdN@Y5WMmBl xݚ lTUZ`UЊmv]+F VTW.K#ն|l| _EB hDCU .1mXc*LP XMyw;ǹsi&y`.1] thS92 z @ތ٥ '. c6d^R u\\X۱^&ϕ; %؇p[,}.W2FH~J>6m}Jύ|lύa{X>s覾[B/};ѷ}/ AC*U7u[@ D/&z1+nv^Oo&z3}=&DC=}]D"@Hn)O$:Km)?Etgu[%}.}gDH7藓/'zs!z?B#9_Bj$dONv$NI7xKڷ!z^Mj!C '}uO:VgXx9'y} #<~.U }.%qNV.ϺO z֫Xp. ڊqζz.` K:3uitnұn{cijXG]O} aX8Dk/1l8ߤ1ۊq^L?~=d9 s%oKe8vr,s xֽa-l|[̜ 㜬8zH9Yxc,0*Y8_8'gmN 㜬 Xdw8'g 9Y<4st,sYuV8'nuBk,sxp]ñ0ZWqNV-U8'gE|qNVϺ^ɮ/sV2%70zgMCsl8'kZd/s^Y+}㜬-&?4]72>´QW86 CN^Esn/&+m9cy%; E;1n;-z]ٷrɓRRGNFFX9:.1<@}SS<#wwG{%[4aO'}Qec=~wVǘ^e ?sFĒy36SLi6wӤ{Μ?wƍz۽3t\ϒKiO,eu8ݴ sau,&;p|htPl/}yV~(JU_fDkÅi50sƇA-4~h;?Ƈα?~X(swx,M1 aׅ(x"]qOC ''x"_xFO]O "' I故CαyĬZ&eڡ뇊slQ1~(4~(aJ? НRJcK䯚dHv:qǟM9p2IwE?G5z>s_3fD2.ڍ1u|G% oyM͒ҥkί9z{km3Go7-c0'h~я󃝋oo<[7U.+ Dd)#^  C :A"generateGradient"m 0w0-]>]]I _@=A 0w0-]>]][Y5WMmB x͜{pUwcP -L m&$$Xi%5%֠KLZ HpSE 0E:"8m(88B'T2R*L*VQ wɹeo;s=9}c"eC2{+ .sP88Ɍu` ''y}i/@~UK~I?-%FIo׳$=KI I%,铥HI_%$}o=G;!'/HI1)V{Iߧ>}0}%}}=ٯJחJI#酒^($}zI-HzJz'IE_ ;#GH>I';$}or}+E$}ϖ IbI/HI[nI |:^6QEDE36']'Cj:E;Cɾv]$EZ0DV SZ/]GwlUЂ'L8+XQ/$WHO g"} A=#|Wn"yG&@>Qv uHm\G}DNknvX'ã^lR:\E_e^a}+^խAQv1wqV9<`H߰"Ez}*ŘՋnj򀭊ZwH3'1iY)kHEZJ}kWQUh^UqC ^AQ<(P>0nGUqC )OoG [Qa~<`H}D:L}0_\:<`9Gr/97lU\oV0熭Z7cзv}x|an&OvGcGUqC ~{}}#}֜*nh}r#p8Җs͹a ^sXۖ{snتq{s۹ ϛsV -u_C͹ag͑92[/sV --#yD[ڕܰUqC ν@ϵro]m [7 7.w;Usnتq?pv97lUTܷwܻ6sV -#{C͹a↦ol}Ü*nh둨Orj [7 [E]ܰUqCSXF{Y`97lUЂ7qo>!{̹aĽxG͹a8ν1FCb}97lUЂlq>[sV M5N^$z!sV -yޯNsV -pr8[/>1熭jd%}7]ܰUqC E=q|7\0熭ZLOf;O/sV -bqDr'qOq{dݤnRpO5,s>K_:>>~Ɨ;_>>~ZppUp?L'9?m[ý[ÝNrj6 6M|wv9?ق{{{ ;p(Dk-jjK79^oXfLýL]B;S,^^.U[pWkO,3,ghg4iX/x‚B]OϗXphKKh?g=N=N\eψ-  Gg=:'{,4y :ڃVxZ? ~~ OUrXphs'i_ǎEfXpgh3giEP,4i &ګ˓ONp(;&yǩInF3 nf %n/Hk oA*Y+oM|RV{'[u Òo§_ ?uKU:Gw!^)\C+W8ԇ^]Y-?f ,w*GډΩK!V3>Q4ԗMnCHF26'Yq6x@"3#1e%ZRtm9-[~QDuúE (jaR 4 z"PgY-1k"fep i`)#$QnyG~,>/S03N gvaW?_2W7=Uy{,^7+BLEczh<" [EZǜQjGS?L:KZ8Za'?aE<ꇃ;nuc8nxX>#~⏇ _YǑow}iL08+\εD_1ELdSLDqLDv,W1xӱV1s-1ѻ-b"ZۍXlLD5~e_E<=i܌6XmX8/ˍvۛZ92<ʰ4v O`Cxz_UN4uJ-1/eAq~QV=螩`#;idwLb?|-yk>]7Klހ#m9O"yӧ$6o֑lHl޷#[xd5ۼG[cE6aE6o}Rd?l@vMd}|5l%@1Rd^S`w[# dϊl\?Klg@G""odE6Il@k"o*|gE6_e ;/VOl@":`#7 !2#"EM`w[ Aͷ%ȾOd |;D6_ {d*7loA"^Yd- v |7D6_ {dlAvDd=׋lAvdlA|^Knqs 1Table7 SummaryInformation(^!DocumentSummaryInformation8)8CompObj.j.՜.+,0 hp  TRIUMFU~7: Using Colormaps and Gradients Title  FMicrosoft Word Document MSWordDocWord.Document.89qp@@@ NormalCJ_HaJmH sH tH Z@"Z Heading 1$x@&@B*CJ KHOJQJphJ@"J Heading 2$d@&@KHOJQJD@"D Heading 3$@&@CJOJQJF@"F Heading 4$$@&a$;@^@"^ Heading 5"$(&#$@&@CJOJQJF@"F Heading 6$&#$@&@" Heading 7t<&#$$d %d &d 'd -D/@&M N O P Q 6@CJ@" Heading 8L$$d<D&#$$d&d@&NPa$;@<CJOJQJF @"F Heading 9 $P<@& 56KHDAD Default Paragraph FontVi@V  Table Normal :V 44 la (k(No List >'> Comment ReferenceCJVV  Comment Text$ Ed$x^`EO" Block Quotationq$XX$d %d &d 'd -D M N O P Q ]X^Xa$@CJ@B@"@ Body Text $a$@CJO Block Quotation Firsta$<$d%d'd-D M NOQ]^`<@CJOJQJO" Block Quotation Lastp$$$d%d&d'd-DM NOPQ]^a$6@CJOJQJDC@!RD Body Text Indent h`h<O!"< Body Text Keep$2""2 Caption@fO"f Chapter Label$&dP;@FCJKHOJQJdO"d Chapter Subtitle$$dh]6@CJKHpOp Chapter Title$$pdh]p@B*CJ,KHOJQJphNON Company Named< ;CJ&KH$FL@!F Date$a$5@CJOJQJPOP Document Label $h 5CJ$KH8X@8 EmphasisCJOJQJkHB*B Endnote ReferenceCJH*Z+Z  Endnote Text$ Ed$x^`ECJV @V Footer'!$$ !$dNa$OJQJ2O"2 Footer Even"PO2P Footer First# !$dN@8OB8 Footer Odd $ >OR> Footnote Base%CJD&D Footnote ReferenceCJH*:Qr:  Footnote Text'xJ@J Header($ !;@<CJOJQJ@O@ Header Base)$ !2O2 Header Even*HOH Header First + ! 5OJQJ>O> Header Odd,$ a$TO"T Heading Base -$x5CJ$KHOJQJxOx Icon 15.$d`<&`#$-D /M a$5@B*CJOJQJphT T Index 1 / x 0d^`0 CJOJQJL L Index 20 x d^ CJOJQJD D Index 31 x d^CJD "D Index 42 xd^CJD2D Index 53 xd^CJBB Index 64  `^``BB Index 75  ``^```BB Index 86  `^``BOrB Index Base7 xdCJT!T  Index Heading 8$d ;B*CJ$KHph@O@ Lead-in Emphasis;CJ>(@> Line NumberCJOJQJkH4/@!4 List; h^h:2@: List 2< 88^8:3@: List 3= ^:4@: List 4> ^:5@: List 5? pp^pJ0@J List Bullet@ & F hh]h>6@> List Bullet 2 A8^8>7@"> List Bullet 3 B^>8@2> List Bullet 4 C^|9@B| List Bullet 5CD & FdD&#$&d(dPRCJdOd List Bullet FirstE$P]a$@CJOJQJZO"Z List Bullet LastF$]a$@CJOJQJD@r List ContinueqG & F >Th.TfBE@qB List Continue 2 H8^8BF@qB List Continue 3 I^BG@qB List Continue 4 J^BH@qB List Continue 5 Kp^p^O^ List First L$PP^`a$@CJOJQJTO"T List LastM$^`a$@CJOJQJ1@ List NumberN & F h>Th.Tf]h^`>:@> List Number 2 O8^8>;@> List Number 3 P^><@> List Number 4 Q^>=@"> List Number 5 Rp^pO List Number FirstuS$P>Th.Tf]a$@CJOJQJO" List Number LastmT$>Th.Tf]a$@CJOJQJ<-@!R<  Macro TextUxOJQJ2)@2 Page Number5O Part Label=W$d@&P#$-D./M a$B*CJOJQJph\O"\ Part SubtitleX$$hxa$6CJ KHOJQJ~Or~ Part Title?Y$$$d &P#$-D./M a$@CJ$OJQJ.O!r. PictureZ$FOF Return Address[$a$@CJTO"T Section Heading\d;@<CJOJQJ^O^ Section Label]dh@B*CJ0OJQJphPJ@"P Subtitle^d5;@CJOJQJh>@h Title'_$dd&dPa$5@B*CJ0OJQJphbOb Subtitle Cover `$d $dN @CJ,KH6O6 SuperscriptEHH*T,"T Table of Authoritiesb !JCJT#2T Table of Figuresc !J0^`0O Title Cover~d$$XXd`$d%d&d'd-D M NOPQ]X^Xa$5@CJOJQJ.  TOA Heading@e$ d<<$d(dNRa$5@CJOJQJ@@b@ TOC 1f Bd@ CJOJQJ&@ar& TOC 2g@@ TOC 3h d@ CJOJQJZZ TOC 42i dh&d(dPRCJZZ TOC 52j dh&d(dPRCJ66 TOC 6k   ^ 66 TOC 7l  ^66 TOC 8m  `^`66 TOC 9n  ^,Oq, TOC Baseox8&*6x8j"jDj/=Q:<Lu,d 2 ; P B ^ f  !=EFbijkl&/8AJS\ed~ <P9#M[oNao !!!!""A"B"J"v"w""""""""##$#+#[#\#k%%%G&&&&`'t'(()&)?)E)K)^)m)))))))***&*:*++++++++ ,#,>,k,o,},,,,,,,,-$-h.T/e/w//01m284444444535@5V5e5r55555566"65676A6C6u666M7f7p777777777 88*8=8J8[8j8r8y8000000000Z0000U000U00U00000U00U0(00U0000 00 00 0 00 000 000 0 00 000 0 0 000U0U0U0U0U0U0U0U0U00U0U0U0U0U0U0U0U0U00(00U00U000000U0U0U0U0U0U0U00U0U0U0U0U0U00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Z0(000U0Z00(00Z00U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0(00U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0Z0000U0U0U000000U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0Z00Z0000U0U0U0U0U0U0U0U0U0U0U0U00U0U00U00\>0, /=Q:<Lu,d 2 ; P B ^ f  !=EFbijkl&/8AJS\ed~ <P9#M[oNao !!!!""A"B"J"v"w""""""""##$#+#[#\#k%%%G&&&&`'t'(()&)?)E)K)^)m)))))))***&*:*++++++++ ,#,>,k,o,},,,,,,,,-$-h.T/e/w//01m284444444535@5V5e5r55555566"65676A6C6u666M7f7p777777777 88*8=8J8[8j8r8s8t8u8v8y8\>00\>00\>00\>00\>00\>00\>00\>00^>00^~00^>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00@c88u\>00\>00\>00\>00\>00\>00\>00\>00 89u\>00\>00\>00\>00\>00\>00 00%\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>00\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0\>0^>00\>00\>00\>00\>008Z*>x@!%&).3Pj/$A**#+.3m:>x@"$'(*+,-/0124w@#B Z \ f ~ !9;F^`k%%%u666x8:::::::::::8  @ 0(  B S  ?x8 _1113372292 _1113371971 _1113372219 _1113373558 _1108639587 _1108794773 _1113372376 _1108639823 _1113376762 _1113378098 _1113379915Z ~ 9^%6y8@@@@@@@@@ @ @Z ~ 9^%6y8( ( D*( .+( E( D( LZ( \*+( .Ui65Y5h5555y8Ym:5]5l5555y88*urn:schemas-microsoft-com:office:smarttagstime 13145051HourMinute 5 7 #%24;=DFMOVX_abd&&q/s/r8y8 9Ebh685)7)U)Y)d)h)))V*X*++++++%,),,,,,,,T/Y/e/k/w/|/44444444445 5+5/53565P5R5V5Y5e5h5v5z555555555r8y8333333333333333333333333333333333333333QR k%%((****!*&*+-A6B6u66q8r8r8s8u8v8y8r8y8||}d~v2 udJ*p.̧6qs` !%xwָ)pE|Z0QL8GDD{aO9I WxwָaC_fq@ Tbxwָ.+cM{Pp 8ހrt:v^`.^`.88^8`.^`. ^`OJQJo( ^`OJQJo( 88^8`OJQJo( ^`OJQJo(hh^h`. hh^h`OJQJo(*@h@h ^`CJOJQJ.@h hh^h`OJQJo(@h^`.@h ^`CJOJQJ. hh^h`OJQJo(@h ^`CJOJQJ.@h@h@h"~}| D    p %I W Tb aC_< QL   .+c` rt{Pp)pE{aO{aOt {aO {aO$ {aO|  `@h h^h`CJOJQJ1P `u@h h^h`CJOJQJ! `@h h^h`CJOJQJ: @h h^h`CJOJQJ&| @h ^`CJOJQJ @h^`CJOJQJo(H @hh^h`CJOJQJo(1 @ ^`CJOJQJo( @h8^8`CJOJQJo( @h8^8`. @h^`.0 @h^`. @hp^p`.e$,OB f !Eijk!!!""A"B"J"v"w""""""""##$#+#[#\#y8@dx8P@Unknown G: Times New Roman5Symbol3& : Arial?5 z Courier New?& Arial Black9Garamond;Wingdings5"GenevaWTms RmnTimes New Roman"qh*sff!+u&b .U .U!24d~7~7z3QH(?OUsing Colormaps and Gradients Joe Chuma Joe Chumad                 extrema-4.4.5/doc/Data_Analysis.pdf0000644012702201742730000136722211274636625016214 0ustar spangspang%PDF-1.3 % 600 0 obj << /Linearized 1 /O 603 /H [ 1747 800 ] /L 388754 /E 150841 /N 14 /T 376635 >> endobj xref 600 45 0000000016 00000 n 0000001251 00000 n 0000001606 00000 n 0000002547 00000 n 0000002987 00000 n 0000003028 00000 n 0000003058 00000 n 0000003290 00000 n 0000003731 00000 n 0000003753 00000 n 0000004350 00000 n 0000004372 00000 n 0000004957 00000 n 0000004979 00000 n 0000005645 00000 n 0000005667 00000 n 0000006197 00000 n 0000006627 00000 n 0000006848 00000 n 0000006870 00000 n 0000007407 00000 n 0000007641 00000 n 0000008211 00000 n 0000008441 00000 n 0000008884 00000 n 0000008906 00000 n 0000009444 00000 n 0000010040 00000 n 0000010261 00000 n 0000010678 00000 n 0000010909 00000 n 0000010931 00000 n 0000011595 00000 n 0000011617 00000 n 0000012212 00000 n 0000014890 00000 n 0000031393 00000 n 0000031472 00000 n 0000043304 00000 n 0000043511 00000 n 0000079789 00000 n 0000112331 00000 n 0000133184 00000 n 0000001747 00000 n 0000002525 00000 n trailer << /Size 645 /Info 595 0 R /Root 601 0 R /Prev 376624 /ID[<97615b64a5d0081dee0ca3f53150f27f>] >> startxref 0 %%EOF 601 0 obj << /Type /Catalog /Pages 598 0 R /Metadata 596 0 R /Outlines 81 0 R /OpenAction [ 603 0 R /XYZ null null null ] /PageMode /UseNone /PageLabels 594 0 R /StructTreeRoot 602 0 R /PieceInfo << /MarkedPDF << /LastModified (D:20030505124753)>> >> /LastModified (D:20030505124753) /MarkInfo << /Marked true /LetterspaceFlags 0 >> >> endobj 602 0 obj << /Type /StructTreeRoot /RoleMap 103 0 R /ClassMap 106 0 R /K 496 0 R /ParentTree 563 0 R /ParentTreeNextKey 14 >> endobj 643 0 obj << /S 590 /O 774 /L 790 /C 806 /Filter /FlateDecode /Length 644 0 R >> stream Hb```f``rAb , SFF~l?U.ubĐa ƌ1Ӂ!vk3 0`\NL7YӾjSzgq3 z8xzu]\TKXG#l+'LUq٦\JC(~J!e͘Vn?%̘YE/ Lx̛$PXMHީWD*US<;/rr{VD3n& 5AaPȗ S.bt#c҃ IPu/> /ExtGState << /GS2 636 0 R /GS3 638 0 R >> /Font << /TT6 607 0 R /TT7 616 0 R /TT8 621 0 R /TT9 623 0 R /TT10 626 0 R /TT11 628 0 R >> /ProcSet [ /PDF /Text ] >> /Contents [ 609 0 R 611 0 R 613 0 R 615 0 R 619 0 R 625 0 R 631 0 R 633 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 0 >> endobj 604 0 obj [ /ICCBased 634 0 R ] endobj 605 0 obj /DeviceGray endobj 606 0 obj << /Type /FontDescriptor /Ascent 1100 /CapHeight 718 /Descent -309 /Flags 32 /FontBBox [ -194 -307 1688 1083 ] /FontName /PEIMKP+Arial-Black /ItalicAngle 0 /StemV 222 /XHeight 515 /FontFile2 637 0 R >> endobj 607 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 333 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 778 778 778 722 667 833 0 389 0 0 0 0 833 833 0 0 778 722 722 0 0 0 0 0 0 0 0 0 0 0 0 667 0 667 667 667 389 667 667 333 0 0 333 1000 667 667 667 667 444 611 444 667 0 0 667 611 ] /Encoding /WinAnsiEncoding /BaseFont /PEIMKP+Arial-Black /FontDescriptor 606 0 R >> endobj 608 0 obj 517 endobj 609 0 obj << /Filter /FlateDecode /Length 608 0 R >> stream HlKo@+޵TUNo rR /oƳ377ծۻMêf/0G  O]}8>c98zG'vײm-h7t<|\CZa*u^m\ί2JxA{-V)VU𯫁Vv֗a߶lY0+)ˌHsR/k[h,KM7^HNuХn\GJnJi֡aZqSSCFo>PNÎ:z{W`&$(A GǗ6gNȲ D1}1joPd(H|6a4\7RT}1H5YGV`)P$ٚFm";bd%> stream HT;vd1D^[GxI { u-#&ϫ˦)VhFͥ/uɥo%䷮MiZKƻHoK*}to=1֒KEͪĒ;{`k}p{[^ҹѨ,p?vw;\1[O.mtz=y; X4 sRӻ1G#/q u7Ä oX1iم[W<N-qzOuWJX>fPg7\)e:z<nح;hj0TQ!pŐ,;5T+]l93ޗoMH}Yg9擥=H|ǴDjľRO>@Oeg%s> stream HlT10 s˒-c(3FZs5Dqk 5s4,?tBm'`]w1Sn;Xe\x_ztSIv 7v6mILboLt1+HW=_L0Q1d`t| En,'^P!+ a d]OK̋\,N͢[+8?F$={,{qVUlHtQ^հA RdQlcr %b&E7Lr7WcU}KA{P {۰rZ`pr=i8 NUpW|vJ^ܹI=<|Ў*l4,TPaxAAT`ʶ6xL$E`A +PW=8ڿ#ӀGEO:j ==w7 [-c ptMˀA lf:Ϥ<= W'ԣ942Kw44=ROTZ, endstream endobj 614 0 obj 450 endobj 615 0 obj << /Filter /FlateDecode /Length 614 0 R >> stream HlT0O@ a+1X pl% 尼B @>݇_=02=jn^7~[=)c(4ND.({`A(@ \R4_odc%D̉ G)٭Ivv {fnEMs@܈D!=Yb=hgK'&]ūltՑZ Ha6KtObx$}*Ƚq4DQW,+W6&!YNdi>l$X D|! (A)c}WxK5qK=:HqK1٘JZj^جny}+wIߔdt9ڍ6aZr-q/IFõD䞽\LteսORm񱎘 Z endstream endobj 616 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 278 0 0 0 0 0 0 0 333 333 389 584 0 0 278 278 556 556 556 556 556 556 556 556 556 556 0 0 0 584 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 0 0 222 0 0 0 0 556 556 556 0 0 500 278 556 0 0 500 500 ] /Encoding /WinAnsiEncoding /BaseFont /PEIMNJ+Arial /FontDescriptor 617 0 R >> endobj 617 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2028 1006 ] /FontName /PEIMNJ+Arial /ItalicAngle 0 /StemV 0 /XHeight 515 /FontFile2 635 0 R >> endobj 618 0 obj 457 endobj 619 0 obj << /Filter /FlateDecode /Length 618 0 R >> stream HlTq-1 WFq@?DKּvf HW(-Q2 Q>x6gۘ ^FwNUm+4 0g X3}m\7[Z)I~NdZ`3SŨjW7)%.(ְ$7Y(0ICSIgD*1-"9f@li 6K o?b:˱ݿqWVDhS;:M+2hBṵMy/qvi4rQ\9Li#Qo> endobj 621 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 250 333 0 0 0 0 0 180 333 333 0 564 250 333 250 278 500 500 500 500 500 0 500 0 500 0 278 278 0 564 0 0 0 722 667 667 722 611 556 722 722 333 0 0 611 889 722 722 556 0 0 556 611 722 722 944 722 722 0 0 0 333 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /PEIMOF+TimesNewRoman /FontDescriptor 622 0 R >> endobj 622 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 34 /FontBBox [ -568 -307 2028 1007 ] /FontName /PEIMOF+TimesNewRoman /ItalicAngle 0 /StemV 94 /XHeight 0 /FontFile2 639 0 R >> endobj 623 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 500 500 0 0 0 0 0 333 0 0 0 0 0 0 0 0 722 0 667 0 0 778 0 0 0 0 0 0 778 0 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 0 556 278 833 556 500 556 0 444 389 333 556 500 722 500 500 ] /Encoding /WinAnsiEncoding /BaseFont /PEIMPB+TimesNewRoman,Bold /FontDescriptor 620 0 R >> endobj 624 0 obj 458 endobj 625 0 obj << /Filter /FlateDecode /Length 624 0 R >> stream HAo0 <6PEI@C ءK@ ,(l#J\=$#a % ' Xz U! Tgpl;$.u{Wh]K2d?l*߆9krz+"R"s s6mm]6?S/G+i=lgZ@KIqЄ}Sw/Cd:~5H!|t=dr }CZnpi([GFs 'w" endstream endobj 626 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 600 0 0 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 0 0 0 600 600 600 0 600 0 600 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 ] /Encoding /WinAnsiEncoding /BaseFont /PEINCP+CourierNewPSMT /FontDescriptor 629 0 R >> endobj 627 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 34 /FontBBox [ -139 -307 1063 986 ] /FontName /PEINFJ+Garamond /ItalicAngle 0 /StemV 0 /XHeight 0 /FontFile2 642 0 R >> endobj 628 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 219 0 0 0 0 0 0 0 0 0 0 0 313 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 698 0 0 0 0 0 0 0 0 406 510 417 500 417 323 448 510 229 0 0 229 771 510 510 510 0 333 365 292 490 469 667 458 417 ] /Encoding /WinAnsiEncoding /BaseFont /PEINFJ+Garamond /FontDescriptor 627 0 R >> endobj 629 0 obj << /Type /FontDescriptor /Ascent 832 /CapHeight 578 /Descent -300 /Flags 34 /FontBBox [ -21 -680 638 1021 ] /FontName /PEINCP+CourierNewPSMT /ItalicAngle 0 /StemV 42 /XHeight 421 /FontFile2 640 0 R >> endobj 630 0 obj 584 endobj 631 0 obj << /Filter /FlateDecode /Length 630 0 R >> stream HSKO0W̱`+N,Q{CxrUl7ZrqLqIRBB|UP++KQ\|@PJ *J"h)*BX$h?WdU9j)pP<WMq45Ph HI, P2UB^ϳL]^.GU'RPB!vDA2wS;}`F.fRX[R'_T4c(ɢy9 T,r`wƃ(FJNd0C?yӣtꭏfmsmk$b^.vID㠝iWVTsj׫J+q|^tb,\DT+OL.D4WxәB`9ȃ{әUU(|Yq^SJkXWRu:dJ5NGîw&lޯ' 9RW5*MR&,I3> stream H_o0ߑnuulu4ЮZyȤCH~Z dtϽ?ιxga"%D1eBBcHŘAL@MҖX:.H&7{{8?ݎo@ػQI -kw8Ɓ<~PȰ[Nt1\"Nk"ߑ(&z/ 7w)<4%ŤwE8![\R|ȥ7IYIrk&!\"_V?|A1;6Jٍq*n^7;L}>3>=sj9XW6El;߹Z4@$P^M< endstream endobj 634 0 obj << /N 3 /Alternate /DeviceRGB /Length 2575 /Filter /FlateDecode >> stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 635 0 obj << /Filter /FlateDecode /Length 16411 /Length1 30500 >> stream H\T xTϽ̈́ldCyGR$Ȗ@2 , B hd R [/4@EEk !lb?߇Xy=3P }{{Y{BHd\vVs7t\Q :В鹼5`7]Zy6zFiWZTIi@e%ⶐ5y]+xݻrv͟ߙź!ӫ\M;)VqwDާpU4sswլٜ7?s}%\ﱫ@, 4C7Z݉(%y+ܼwlʱV Z ":ÂI,%rT(}ق6}q=(ҼX*?et,F UXEc9sb X̀Ns܆8(?1!(bj3o__#-cNQ[F9E!3%AA訰\HeiX' 8Di, =8F {݀}8Ԋ#sف($Y'[ΈR *)}Qj9۝l-3-+H2.G@ԗsLpL(g`gNDh[f(H<[xBRfѫ9}#T()VW* Ӻ`ʡ_PQ=NN1BL/LV#H K;I+эZ ]\MR "-7Aל}+52TP:T I!N9ӭN&+6/2g݇xY,}1'D#<'r;ъR5xqo.&;, s-xԛu 54R+pI9gi)L3Ix'?_F;"^d"U<psWxn@!~K\ 0Z8lfJ7{9N̜8V.=-}iS2lt@r~}NJ'y'qX'zDGEFޭkΡ!AU3 4#Pѣ|k#CcQ:VWLciv_3&i)HIJfeZ+Mq2*C׌~>ϯ!ll9"24 49(`wAzzI`R" bΈJ~FD86 pRF0 _s##fOJ4(H/44:*H1,F+UZsQ0؃bd!]]7ÈxRkqDkSs||".ɡW2c4&; Z!5_%W;| 褏<|4}ivh Nf ]=ɭMTNRbsX6v~<ʔrSz'lO7Ը0]w~%.|O7v#!"t>S1տ8U;LÇl֕?/oxEk ya,q_k(هp_AQ]W{tm1hQeZVQM(45vL\E\!j,PҀ6LBM':6#4&hw{o]NIOܯs=fM/\\qjKmOY{{776i23iC)ˣo HVx]%儴d.ɚEP7f!4"&gȠ.oxR|+%SSoS>tmf,k@捈j0`^a8>fM&D<RSrbɜ_ٹQ e9glq@d\?HthnZJn4݌lLKE;sNഛg'rkJMJJK[ӔրR]uP]:*jNҒɨ uVe-+YHa,;B*\֮yBe9::aRcr C#dI:_erZS, TV;FL}!X@Ӌ(쥰L; 06C^>}>Xmj`P2vp_Ǒމ^dazEQMMB(s9h4SGP_Qpr/.[ O8ޡyb&R1WU^p.6I^.`{Y,yكl RIZ~^u]_m ƼD`_iB<,67*]XeR\$ꫴEM CK~ X ,jmf8BZr/_cҍ) b̿x(B?)zd U5_7wa_bOT܅}=])_:_9&XS8lԈ6 d@g`@TYTMWؔлC&cZQ֙iyRTa#1 [ZLq8,㻂^1g=Kw "s<TT >8efpILؼ(a54;+v|Mt cSi.?}ZMztX^ZŻ{y]\t+NgnuVt|W'ޢ>.˃ Ӫcf$ނbw&$ O8 i 靮y+vO|!,=@E'Ǐ<}P^ji6D(vSO4R/Q%oM1%xu3|;& 6ޱ1觊5|~@x5<wK7˻9c~Ώ8Gr{At+ |'jgjR{I}MŰNef^LF/AN*u=Gh׏k_&ϏLs=qb:-7*Zyn7o>hm7O|)_{UT8^=?t b6`)?nƂ,VR5=&ڬ݂;CDf81pV?(Z/^âjXI4U+]kے^֫AXmipq?"N&׆6"*?1Or;9GY+(]KՁf5~[=\`/lx:y\60-"2/S,WkWD9j҄sr_ ɭ@>`KP5pʒvKo{0Y]P=<OIaϣؿ; cd3G;Kv }IDE"΀rhK}|,=b[ֻe%D8q'i7Cd=i7x u/ ʼn!;C&1撍{pgd:^a8GR-C]@m@__1wqW\ pxŀϷ=.s.q~&|x't/,9y2!xGv}rU!|: P!up{OF<o!CmTE2q+_ UDSVkf?C:vY}!? @'~ _,R;'πw!nź-1-?-b>0?"hM9fc{!ل$m9N)@>gX,@!@r!SRL[XU/6ʜS2e֬+L?. & cc|}=??gY~~6Ϗ96s,%h_ٙ_h3نy^mHPBf h~`G.x-P|}lRj߳A+[aVSߊgy,Gde+eY^eWUPl/NDbr`,e'JBN 0h+U B&P( & e qa]cW-jld_wq@`_\aW~{ q,0XeK(_/}Nj0 ae߁L0g2)P.Hdhupt9G9%e9ULw(iPNG;hx 72)Yh@+ sI fgF%R>d$%Կ?{??>b%= 䣝,kў~t)czZ ]@?`e"GqQ2UaIɿ$oJDۧhXc*75k ~ODq+?w7gƿgH8{1MI[{fx2õ}P|2΋_x5'Ň¥a:oDas6*}/7NĶ.Ad1㍭jg0I7E NaaٴDžuxVլ5csJ13)oz.[-=R6bohބo*Dؑk*=R-5;}$w0q6}'$p!wOxB[&5[cFxsG("X3oJg&eAA/rx=l4E5#`xbm [A[}%4@}iOΣ`C_wtܿ,} U \Dxif'$2-h1ɚ7̈́1I[ ߔٰi`V,:**L]Z&ͬ;cr.Q4]"Xs; o; j쭫'!gκSVeL}cw40yަ.=o9{b2%.> Pw32t?4ζ9 BV+#s8(+Kl( *V?wtcٹ226|⥎^6wsNB>A|o/evݶ!;Ek>eŋ"H%Q敢.(X_dڭyjѿخ(3<3]%z5% W)\qr[!ASĄL&)O(48¡ڸP,YUdDJQeB9B%5M|?k5?qzb/k diz)  Q~c# T2Qęf^D/J>.J+bV;OxgYd-h= $rdZiGlRXzvqIYohhǿ C?;;܊&;ixjB؀AD6"Ag7I:lh t"2K—ׄKl\s.! SU6 Y 2:4+ȧ(** A3a+ QId#>۝VPE6$eWUֲk|8f Do 8P[yKpHr{ /ԗz K2}>[InHx]zn/-v`h傫QdA+Mj'ĩBQ[SOy2t+SX~$i\69߾iS{K0f?d2uoeuī>q7j|3i%S!ETw0bGK BPI bd@^&L8uw(Je䛮'g:nyǃulmIk3I.94t]Q4ܵB4Q0Mv׌^o)GsFH4G$ vYUKLx<Ğr525 K456v' ͤ"ˤ|cٓY E_u5"DU宍 {!ܣ0neSC? @+d:i(FBF$ʊ-BN5i/9~Z2f+@v:ܘ(F0dqQQ\i)Zw#kI3Ir ;8{JF)nq]`5*Q ^͍Ue@}fL^^W'0>OcK͎'.4psEwNǒ.Ex0%k'?AQ5\T݊t: f7 "B* lQb ExPGDUGҗeO簃7CP}\ukMaYjXخ4^ PBy#+0̋,,PRqYx@9d5 LX]%crt)QD|W, Mip-d@g{nj;P5r5$b5xձk'c=\Y^Bw6pPguTiiWt`U@ fIq\9aZ*VUتBiNimbvGM?em6D:d*MGwG5u&&77ܛĐAA> C:pm X*A@mguUGz֊LSJe:SY9Vu:Vy An{o  xVγ,a-@M+R1A))y9U\R-SK745xN=B_=8q}vTzzÉN<=shbGջ^yqϮwzY⻑| nͤ< N@' 2j3Ӕ1̙>!ebȊbHD\N"veȡ$C7d'vILީfi(?Q?Re5i\R=V^XűuquD>pܑoyxbgo2[gR&0<'U.@uBHYE{a ؏'jG&t/дyKf̘;|OUѩ3J(āHے3"`%%R,5u[*UaWa擷7|moJiŭ_4lKt$u_Cd ;H(`q-PS5^ڵXE,b0tcD 8{7<(CU9 F@4 y_lt@ٍp LY:3;L =:ّ ͅPQx=٥g&nsNnJCt5Sog؍tcFX`-VQ02k2jҏGִ0SYp[{WZô!O#iy2va k(Uȭm̌:h X=3{vϞGҜRZY_"n#v:P<ޮɫhJg݌۝u>lrwbbG@0_p4W ʰ/wp=,SV\Ĥj*4︇AϠiN^cNQy XTV.pn%P 6: I s #5 )l\D8l2\ĸg=̹q .'6@A0 [*B<^@}Tqqvׂ©4CQL8rC|j 2DLD$scpHe)Ja_ o=U|Mh.^7ko VK gVLfG _9;[M$`U&)hmNNUk굴k%X"h%^( v>R[*GvEqu;xijkT+]J >cRC13i3I[RlE%Iu)MM11Sh!26zɔ~?ϋ}{EQ{K -zűYnWv*Gwwwdٔw˟'<;<c`1W0Gb~0|E  !dStQLa_lGgy7MrA3;oŇ;'-]5} lȟ)FI??_|פy7syߝ_'c+\~Cۈ}P?^gfCH Y)Ie0*+إb$]h7W׽׍yf$ wlLnVJ;W5W˕umt˭"T0R5(IV5OjH8ӤԀd'2t$Q«_0qM&_R?4jnc!~yϧ+GuϬ"O݇'0-ݱpx,t$U_#U̎K[>z'y˯^߾_sqbݷkY?3:P|0[b#L-H ˤf,|cn 0D1zU<Qxҙ +*& kD| _v|vC sWu&kW?kV$=AH`?*T]yX8 z~aHxFN;UaB#9YNpr?FĢ/r0½_~p^'&ZRT:h]&,un9METܲ;fa,R)9Ky(j!xR/Y _ '1FmvLNHE`2kXlu-lqlg!گ4-ӯ+;lepvEoK2[#0& cfW5AÒ*|A!'i#=SDȋS- !k { nv -̦jPKf Y+Mby_?=6}ጧ66-/&ZYIb@~9ϵZ\r%*ʬuz9J9RBfh֨mz N[X*7p͎fq,ؒdBbCt xތ\l2 [r 8a7V,ë||(BD1ȐNf?&LВTL 2ʃDԻȁG,i|z8ҍ ū1>J7Ǒo~ㅡS'v8E%cgP>RΟ;ϝ5Ou&u*FH0ooFyQW* Z%PU^[CыJb5ZD,q5Uj-^TK7UIs*40@lPDhMNG)Q nKH^ߦF$Lf-NZ! ylB/b`&S\od=S\"P\зdqnmE?x (|KUSupݞCW8];e[mx||wx\8sҹ!ZZ)8`X(sb  Ŏzߚ/b:VʕRbJJ)"-RܢxJc%{*c+FiMMbeڃws$nv͆ .͂ A-ARq ֬2!ŢlO[8inmAfz=[:ΑEpN $!\Pƚ@K0 !J =9㎲DyS,)BQK,k`+5o \xȀ;TrtSU]rh_N(ԦJ;{oޜWxe喝mཡP[t+ן؆w/I/Zh{>=kw7jJc5ϭz4Y@h9aiP:ej@a\N&BȐ\(H@fJcEgNf.Sn`vz}=>xK>8&ARJy+JR92%^}21M"1.^;T›!1l6.Ć}>bR`ط?e'Lݷ3>s/aӏteu5}:+P'vά%=!k  :BH(&) LLP% .8`X#]ꤏbYxM{$g6G{6dr\>%W(6 AvFU;yEv,?h5:D/?uޓϑv^H=Q!L>طٚ4nN b6b;ge˞aM}]ۄS#Zlœ_rHpd1o .9S% ca+p',fy7OX9R+?zsM>^3.e^l/ub׫C frr@=%iylߐxG1c3U#:nD\K@AQq l֩Qu$=$Iqj3uCtU EWpVY:S4QeQĪPGdb}P]詂T%Ҙpcw >bC/M41.MgZi ndv@|315&J-^# 2z#9D8'"xC U9hɅXb[NA`n4ljF~14OQȰ͜Ѵ6Svsazgl#J)`Ze[ڲ;2D3$1Ne+E,ܐxffA[͐1jZK복zO͘oכۥѿc?8|GӧX]ŢB~5u|7uypv͹fLS )S ׸OK obEJ1-v&&ƄuQ ` wgLcOrQ9*ĵZ&.Պ#mu#FQyS[0M81.]B1H](Z#Yo٤w-G#֬~{cs4o)D0Ksefa?M~Ov`R7{þuz/dٷG7K\9} F&k] > l#W@ON"܊8b(@| $/yn"`.<_|Cd'Ъj'q _AkW)-f\o3v]AaY******$f#$!Ϫ{|? #x> ޴w1tl Vܾc* 6c*ኲp~^,4} ,o_+k'>հej+JAw",x!_EsYX$( Ȯ pv,Lf`pedePs"CCC*C:0Lr"HUH3$3}"6/0䙁|''e8X,F31  ЃqW2  h2zh{nFO> endobj 637 0 obj << /Filter /FlateDecode /Length 11740 /Length1 19036 >> stream HV Tg&Va%q$!"m-IH4Ʉp'`]ѾեAUѵՕuG[o@XEm}o}v}o~p rժDU 'MV[3i m}$g(a[x$A=ϖoyI i|si^'&Z#/a_1D|Kf%=׳ͤA7{BPpZt%6n##9VY?$&΁&Fn=t`x Vzo DN))v\**bNz0L9IX\.sx`Y>O/p|w @6se)'N;I:Xpw dM'\]pU-C[ڏqX1TJ:cgrBo-a7MVR4L%b>E:bBg b$R1'4YuɚՄd `IQxXvpjLVT*D(W(e4F/9I8) ?@cqb>{5;iI=Ϋ ;<}Q?_y2σ8uͳnL&|]s(~IgVOK3~Yg"\)eܵ[~[f4W6K\2i]ęnSM+XlTԯ\ʻxwKi7{qL 'w9]6Y+K+kդǵ twy[GmS*|jvLx꨻e֝#\LؿRЖe5}~j-X?$uf=R4TȜ/Үګs:R^hy?MĄc|ֺb[4e3-{=>"kr[BxpY{=Xy֙vcoX뚛PA~%P8.KxP a7tf&bz2v *%9%%ɐaHYd6&}F1Œ"dH!C LR&*&RAIL]K5L-GHśM4PfEpSL;I!8:)WGH+, pƞ'deBܓ! :ʈZ&Rܭ/NDJ> -w@I{grk(.r`Y M5'o O-SiGdPAMKh&Q~Yu|[<,kS5_.νrVon,{iI ąhYc^&.P?{-uɵgǦf8riw Ʈ]{6>ܔ>kߙ+sǍ7Rpx5o.ޒ4qݷCwǹufSvD^t#K'ȍw{7;pYz0NE9>cj_O(zKs_h$~1ܗAg,rTbq'>c#FQQ18{+&DAaMy&&ab#(kDa'B u\h)XH!5 Rdͥ|P?0А&Ő6?2nhf DJÑI GLf y[ jeAzb' b_#|L圊a,2Q&@J*(Qp~ZlvSf422wfhPCDLJBRTJ*"YJQCyj s8YBcXgSUQPj%LK@*u;UJ!(!"՚ B<3)IcLZߙ/֨LH /  R$h= K@jv}mV]ZףkkWUV=KMv;3cooU0f)A&0Bk4|Dv)F+ zc3mh]89-T1؝O\@,4MFXm }N'Y鈂Bx>;IGTa.*ٺ)К <2^c aUBC#MurCM(iIUIa;J+kh1}!DAã~ptd@@>.*᱂K{j&)DM4iE>&ɄJ_v{p/ΕWǞz_slf=Kf ]04}ŕ8l*~g(gsuI\x~󖻷\5F]Sw⃲)+swa_YtFڄ aenD"2rK|Tc/!1F1jܵ:*(T ~-~!9yW.3<@Sw@٨U!A @5ŕ'j>ٛW6ؓ=nmO\.&eK.@)x`~p3fnx_,\u?R3QPRl{{wioqozQdBo.h8ak;efpiW?}[槗jίX?"|}Kow?I>~T|<1![e{s\nпkޟ#wv\ӫ:r%%6p)@\uk]3[[]׺ kwنnptW|Um$zpkAo\ʇ5WyuSP븐(#Fd#jR)TS?5sgGIƒQ;O>T;_}l~O2WYVʱ|g1[*6.mT{?Ñah H&!ڮɛPn,~w"]E>f3ZAGn 1Ky+ȡQaG7!B7D ٵ{܍*"D,~BИ_XP1,ᣘ?+XE %+C(kLLơTn-Ok\_eVn.߹_{pFE"Kn0zlru}Q𒧡&n;8Mgx#N[ 5-6>x&"3n@zt}7`!jG;p(N58;w$)L!_OBYisRgJQ)3gO!ɉEGɦDFL N OcFPfgB&-|ʳ8+V΢` 52J6N*j=n/`Q(!)5ى4aQCYMCa*]^MUl$Un~2oGS"H.NL@N@ @05ch && VKsj@ApBF9=,b^( a֗by*6Ƣv™tHQUPNl`ҕ&Α4W+|# AW ɹBKA@@el04`s`DΪ2"8a"Xk-K$(et|XJDrb{M[9mt5y[;xt%1Y0t9I',!"3F!yGsj#W^!}3O6:._/D-p)EhhG_4mP}^wvewyYju l@Vl 2*ՈJPhAEBĪXL_f֬DҚɇ3CۇN/`?>vq˹{>^kf]0ߔ_.8P elWXnp)c-B8 Gtch3P/2}P>b.Kk Bm6J$ eY/E!CKCtg=B'j?פsSʃԍ!+QDY:eg̃ϾYfS{[5Hg01emƠ6%8ݦ~Zhk~5+)cNќl47(j`bl.[1qDnIPB0褯o!0&!(|F [`usrprp7RKǹkIw|v>``oZh<yo,fSƌR|+ (Nc͒]Qh"_R1wղw%%=dH|WZw3%S)?`.|E5#Ԭ\:j49w.uF۸w :ʠ|r/_}ٷs9lqs{r d ŜR,,ܓ>?3Ƭ9)~/G|Hs)T<s>;9뢏4.ш!i% 2|I~-sx^ǰY?hݻa^|dʐ<Y5JsߢUJf>7c mfzhKswcnT/K>fSCס<Ĺٴݙʿ{٨f1vۯ;йGg(=0<xGV5󒙃x>᩾ޚLJtکiӰMJf/|܇O2ϑvls>w``c+!c>}:aگ_Zl:[FyŒZ ~|;M~[ck0&>:#d O8_oA!Ƶ6=o` ΙomP-z5/qK*pr:>ԾA^V9B韉03%~msY[xWDYJ W7.ijm.H9+LŠAӗϿߗ/wgϝvĞvioFтv_v~[{Mjkݽ߽]Hx[vz'ZD̛7{no~zS5v}-{\tC`􁣠t.Pۍ2pOˌe 3"o٘8 NmrCyƻ6lc7e}({׻n4Iڶe4F 45Qlm0^eDzs*r)3M/KZWyiyA7:gq<p*v,r~AFNn^חd83]t{ڌtMˊtST;8o;մZ^6ùfA6>,:[4% .u85`]^o@k\zuD7^Ʀ}~T#!zܰ!X?P)`C ' 6P::^zCO3;/&E0Y0KZͬw|`dONJ#/ k'Ud҉J]E@HXT/h2ʿ拃Rtzh]%$(4^ZQtcC֯17T@#wQԛᨐrT%ߑvέ9?2/:AUyjo=}>.e 8PIP8 =\H,ըE\ّ`i\Q,O.y.+^;^}{W~}[ݪm֜~|o9R:mkKmi>\tu7/d/O:hJ]|&VEcڱ4FnOdWޫMS$ʊGHb4TؕSB(.nU$4EY-'LadT&G{vٞ96ŰkrGBH_]տ 3nXl_H/?CRVLJsߤ9/F IE#Eh"v$aL N@4܎?R P?o]&MWV=tbcK-c,a/11g̍ W@c}Tv@ HI !BC B&ȴ-Nu' Lg<}gy~sEL&b٬xEhZ[&%hhX=E*.btB(.5|1!8H|a]pmaml_%z|+-seu##:~^;|xǙ_O09V~KdDEK,@-Ύd"&r 4sp(uc|qId\N{ ',f+5®^':})DaX2ͳt^-Ȕ53@ŰiCrUk{zvM!tst$1E#Ό˅:0Gt]lN/0-mE̼l1(a!_ױ.,MC[5C[=W-qg/nigUO}u*&V`8#\Lj'uk=c&3o6JJ| WГ%،g}VWM3ZXO5dL\`4o}\\CbH|pNFK-Ņ91:F5L b6b\ϘNp0G̺&#b3> {P${\[ǹ\4=])/cW^~L;wxǓ8'~̱1ۧJ{4̮z~ک>C71BKQ9=5ʤy ,7/s,Ca:Qr TH=%tx EcH \x-:a'ĀUNy&~)6ty@ՠ;CItɡЖ$J}LjA8Nz/Id&f8[q{!~A?3\-ݦ–\f~?P8&ӄb,'Ō HHFt["jxyX}H"h$Oa sa)|[;k7A;gȧ0j#Zvy҅_xc焃gMFI4K(*G vngcJ2#oV@4ICn$gD؉BIW2RgD>wCjD).St O˓!Ɲ;Q/֘{]̝7+|wrmʒW9)ޔyf(_ZsV 4'_uMW$ers->Nnϊ9|UR<JTFSVTs Ơ%  ~;1@E,6qU$[T,l1--([囤P|D|Fҥ+VU ^ #׼8N_"6W1ғ(e.i 8г>;& X,$rLNV1* kͨE, YQ-ɐJR3NgSA15|h ɷ>I]Eѫ[\(̍oYG==jׅ?]RӜ[z&0tX)aFt>naf$穦tN9(|HYDb,t1+.XŨǖ2A#m0'q"K {ԘӽK+k:yZ%-$eL$&[Zfŷ'ޯ]8aq)rxF `WU訋[e+];I:aG/ªh4=NpGdYiXixB Qe9n#\ `dcxl<zøl)H lon=2@NxG @]6oF,߰Wplj`Om׾_8WqT33)S֟4Y5j nݕV-ZVdaXԮC` "P3l- N!0%Ii:SLp MaHPiJfhL&32ޣ{^&~,Ek&2q6`O@-IE @!>Ex([.):Vv4$<4DYٵu j ʊ綾<=upYiΰՅ nbeR)s A6J4({,_%!S[lJ(1 O,{b}I ,Ft2KYrZ)j1Vajn1M\Mo˔S0y~Eg?Enm:43[;f͊޻J`Ń,O)9[|jկ1߸psk6v2Ss vem6u?>Cu.J9aXq V UT 2]që9M[k. 7DT/z/%bvɥ*:-mY2MZhxT+tMY;qmc ls 10^AkxN}MJT-hUB9~[V2aIͰWÙ}JUn$9=fS\qŝ==z0a=Ls<)&뉭^fj۠@+s#˵);rjp5ЏbI_3]D'k{پum,YP7>a$# 틕8SRұ GL3wrm0Qjض=2 M2+7_xҍt|9Z|RճSo,s+y8Dpφ___Eje3d+d7M=3EƤ"cR9ǁsıtFP"O2.K]A]Qq!uaӪzM5˖NohN( b},^FټvPg ՝D17_`uHVI)%N}OrU6` :bvR-TgFxʍIiQu,2Q ?zeS/lb &A&xS :lX r%x]s >crM{:m=As.?oڿnʆĞ;ѝoH2ar\` 5!`I(&,4KCBf4_4u&G[ ':kH &dâ `B\*tKqX޿襃nf}Iof w{]^֒p(bŬ3|"-{4RVERT.^ϏOkDp[}H'N,o\'ٿ˪5gS-\"h9LN"ym\DAϠ.zEx[EG RRb) <OjH} eX.v gGx IgA]>I\OX X> OI t ` dU;+ &Ml0ᖱW%+V!.>z> endobj 639 0 obj << /Filter /FlateDecode /Length 36186 /Length1 56580 >> stream H\U PG^ x#⇑C9h(x`LdPuI%UJ4`BbwxbD7kL-azV*z{_ K!2~RxTfrzz Y`w4ly4 苙 u|"ˑ]{ nEY+_̶:;Ef<'&;) 7lwvT\ۀNZ@z -nw5Z5s`u婛ғg&xL8:Ƈx)HgET V$`7htn"ɸA]y>'c:^|pD(T,Rg5nmj@,tEN "TB kZ!؇˔X,үۇ|,T]Y#*fuw@^8yh Oq*PP[OD8!#0kq3yN5 Ho=d\W9{)"EX8[C*C9S2SUzkꦼ]4fO)}x'h}zT2p<.0[bv; > B ϧz/z.ڱ9X6rn0gIv9^`\(Q q4im@ $|<@:e躊啺kT q$/ 0 E  ]✸!uZusU3WHOQͧz(;K _e\%+YHQ]1]s]TzsA01@"~0?%X2zوḿI\wO˜sy崖>#tN-$bp/EXΨqO3Q) )=զzs9ɜvaKpKz \=\6)jG3ӕr+`c8Ӹ ҹʧ6F(XHeLi ;eRc -ޡ5nplUg|I~Dp /ȆƋb (|BsqP\_I'=$ -T ׆jSlT;]ЮiuݦQSOS)Քgbtl6S̙%rg+ǽ|P4}%rLb̗k7z=5R̕s.(B"&?,qK<w5/,S2^Z7/j^Z~W+ޤ:q\R'ԤW 0M|W<HӢ/|(X^*qGZO6jZ_L5-i.+h1=SttI##/JEc?ŪL|lLYx[۰ѴOd4UU~=C4Bz.FN>쥡Cb3 ŨȈa!Z| >{񂷥{7Ϯ]:wء{;7Iפ ڬ3 éXZV;wӑ4+>N#g{fg=~P 5lVy&ji^`M7m6۾Z4:;cΜ&߮bplwHLGch"†f?=`B?dnaMb߼XfOnL`c &5m0OČȈwdSSB)-U}|;}cRºMTs.54㪱GrÓ5-u )v!/ى`N$} a>HiA "$M4؝YQa3A|bi M}a q?+`-+ NEE!neՕBht^Ga|N@ۺX&WP#ZO4j2\qh\–uԣջkQ#l-LPG! ch c8%p%J(To\|sT*G2T=k]b;ڕv跙a_@g?A/8gyj]EyX'QZQ^ D|#6(}>>v>um1o.dŘeV›-4 X7Y>DٿL)o:9WZsIlS@ӰxZ]<Խd0)[E𦓖0̳noTwzo=pa:54MD(^?` È/Ya0 gk#h{'`{чc>Oq`sTO(L& EgCw Ɲ&󃹡>)>nFlcxJ|Jmy}d,-#a/y]u22Ts3ʐe}2P&h>s֎#>|&SHE8vtbG)J[>V7v\Qg=@ Q%KY 3mxCe~^RrXÚk]vm8L mȶdd[qK7װeJk#rovۥ xV<-'s~ƮֻhI|='W1w/}Vc18O0x|Mies\R$\G3UcALX# |?@nwT*od3\~l^fȱ,S%93s _ݏ<{~}L?AQs@oΙvV\ac?vf3tN Ҝ]VRhNgAΧqp;S/4uMms| Vޛ<^@$%F^ ;wmG aE&}Hm YuzԱWν{E GhsB54nE^X *UU⽠;0#ܼt7)>s[a^?檧Zo Z+]Q@ɳ4K(*F*CG~*W+iT~9jZls4wdl `'[(jY}{繡'N~AU|o؟CۛD1p AMCSyu <R UZ=qZ.~ʷؿmo 7.B_Xb(@؆S^D9mBs].䫴X6!.VG: k?.qY/[/*C޼ꛂ|ގUf>?UF)zrQ^xm@۵xv 8^>gl0SG?v\ y8iЃ@rS!ϐrlτF_nv'#cb"L3;ͳ$}̪c9n ڛ4KF^x5޽xTp͡y*ll[ ԫP;ԮkOWHrg׳nuq o 8&` Z&Ncm(]5ʤc2f2Jg:N(W$(}]Dty={A5S9 0_YN gPNo L#b]1O{0?S 4LJkO=&'u.=1w;cQ;u%Ж\Op\!!.Eho~c}` #JO  D[79n#_ObW`|؅_c;:k[ׁ~'Gs_`?sOxy:K܇:$Mσ8w1s*PK{EM)hQP?qŹq3yR@Q;ն5&Q4.w91)G&j y\! n[ՠ[V$V?O?FoZ<+,U.,b1Kpʋ&^bIgCru$_Aq#xN\8;u['C#zorY?N3p\zbU>+6W ?/A{*#N6̜Wxŗü,N+c|/.RgB8+ҳRb6]5%E\{}=Ñ8P82& dhA**EHWCɪe4^MוEK'ˊRhQe_uؠ´7+Xx,{64&R17zs-cښƨ[6~64'#oNߜѷјn^!e\Q>j+;*v|ydWZ%#"Ә aئwiyWmIa0%d.#°SM'-l4 2Xj `(;nN18m7Eul?dz?b5؆Wب`UII C% ;&vekZؚLBWp`(hH]1! iYZh!f:Q?4L;\s}ySWk[\Q`|dm}~o,$?|lPȎ\ۮR+}gzmިk>FQ_sO{bޞhɩ7d={l6B7k`){ʊSYq*kJ*Ȋojijj޲HO!Yj]SHnYZoS*#ʂ,LX“ų%&$"!#J2p:#Ґxvm[wgVJva)J$2$Hc҄t\2.6\򐭞!ψg39QPƖS4@44@PC}?wwۉH@gkȁxh, HPE K;v \ AAf"%S$50EYl ep#73s1h& _*Qe`f(^NEsuuUT"lܰ!.wJ:]V΂mrZ7Z2vE_45 Fg;yDTk#hQ+b9p!5PcݠۃaxQnX_:tד ȌdK#F9#Q6O:O+F-S܂$$j\M%p[~2VX-B?ko9\D~ȷaO8~Ÿ;sС txC\P=1 J,ՠb7(F8a6Հp WCcK7Lܶ~<}w^x?ojCϳٷMjR͸T.F.B5ChHm(V@!%S@5PʡkWgNi4(aw0I;LLiTaf)\ĝqᐿL8dsѲ 0+ sESXgt[Fb'x>} ;ߔ/^ݕ? EdGry鲟1=`x,W)հ zkuXgp\[DȐ 9S=6x & RLk`W*5>!n3j.-|C]ցi];%ж0Qvnte.0p+Nx_ /o?{U ՟VJJixS z쁠 rP/V(%:寕 ٵVmw ;Uic4gcc++5v+?tPwwonv~cad!'1h"I FdRcKGM$m:&Mft:fLGjҒ'i>N{}<թ|nwYV_R][(GTVUĺ](c-Tx̧.&OԷTJpqG0%WfҠT)Ɯ<(SA18E%䙈u=I5LI|xDt dXsUs,з7_eO- e**(9󕷻#*|V+خBYe=*C, R\|Ņ?@m3'7k'_ԗpS{ 6|S;&@K˫D.%|@ ҉gGtyԷlb'k.W-mwxxuԵ };E,E]u p1͛XV1ȰYgql3ic3 X4mCh,ofY"^ bͺ%o_n\e$Zbus4eUq JyV무W؍-.d^$Ih@#Ip&LO9ys0\p#nSڌƲ4.s.ҜϚ谚t u<@pd̍L I"tBXGaRck ǦbLLː|Y *% ( ߔ;9 uO0Np zzYbF.,_?b0DmB!,&lB<ݺHS]/!uў+O`֑}7Dڎڲ.혻rEbu]HUk_E3lþqj~ލ~ ^Cp*'X'Xtg+7eM )Oۣ"'=ohc۞ ,Y?`V<|)<s Zעxu~ntk ǩH[5,ݳho7ޓ՟<3d?5<y3f"͌g 3NKQ^ش܌O1 !TD&EUU<%!dTQzYcpTS~>!b p.59?3@`vV0/Ƚ0ϵ;C C /ʎ5,\ O`YԄ w;!3te3JI (, RXw7=K47J7n8JM.\wb|fۮGG]S{j8ٸnUEmzhمjFi55'}:H*IwD' w]Ѯ2jBVh~(^]Cfz$sJMfUC(t-izFuoH{Rt%Dya-sez%>P_J@(Cx< *i_dqy(&5?L{779~9'Vzt ZK:i&N.H!j$ȭG2B{"&gဟ80[%&r`X蛺Liɜ8)eF*]('#~wϼ+Wd%^kI([|`CuH{ 4V9i̅| d=̶>0&eYIyFZ!׆Huw7ۤտGN1CRܛ?Ŀɮ&3|ľ;wwg_86/KJQKK$ hh; %K6u"`*bhtn4j6! Ж@~kٲ}y3'E&{.eݍߕ3^ Wr!aqYyu70Rhr NŒ<ys_O;<.ð(+6;*p%B0xXs, ~U<[rOX_TPat?ky`و5)u>/J?P.*^H0l0`\[3Zڳި gfn\H0aIL,l>cl' r [-E,Vώ/+%[-$ڎ%*8 o]/2v}͠IQz -KZ G{pøb/WŃEF̋-=Ѣ.I,v}~ɦES՞jzu~#5,K}8 M&ۣ3˹==aɫ&9E c ɦ&Bn2!gM)Bk_,BtZЊ^}d{:ArU %-e~f.z{pȃ$r$HԬ $ cdF7|&.&K@{,bk@jԴeu,sUzdql.|Crвw -O VF[;yx&Nݲ\]k̈ hQJ8Et7I Gϵ&l̵d'kcF{(p}/PCrhsUbg bX!NOLj'p.%N`Uc3F*~eW%L~}U"^Z0gC2 ?Μ?9|7y+!<b!|΃\ײj@L3k B"׹V1 /FzB,BT*f0f dX;Kz{G%uQw_ R#Q(51f:V +&)*4y$jH)U2f@B 48~Rə6eV&5囜&iE)4h@#k.~4?)]$n3"? ]?~44)AAh=@o !7TO# Y\ɶCZcw{v띙]{f<>Xwl6 0#ny PB FJK)~PƲ҇BET#qrڴ"HEi*)% ~K3;ssw/Oo 6u. No5Q%Ӂܿίn>Yҵ.{T%Ŷ}܎R]iC 6y65V'"ȺAOSR'??lcMw/ dS}?%Q"?SW^i*7pqˋz}|=kr}mr%!.PTbhPH֌~i7>}ap/l0ьlwS:?|m۽ ډ6·.mNJ7PDXqʕha02!x яCbYl^ j IGFTg/poGs6ZAiY5vijIxh~"?#nJ󛖥kѵFԵEtgFB0iѵv3̝-lo}1x)dYذ&I#[#7Njlΐ*A?`ޖ?%)Mz$1]67XfN$,a B8ӿuVGavi;AJ LSi3=F5c>A`sw̅MFӍf%1-E$Ru fDAyE%5*OYzWU'yc7&~9CP:z>s9irmn6qs$ &03Z=_Y$C)~jڡ[!p5* Zd/6nj l+dג' t3G4`F @rQ+ 6B8;yMWا>4߈sϲJw4^rXe*:CL,]w>ήboP~mxoyᐽ=CCCSWU @W|ֽTp%J5&7(Eh._U7-^Ky]z"ER,I`, S\#$bB, K>ãBZ- c"ōlxH%x l$hb2A0}Ei:Cgbcn{_ڞ~:w;ꏩt~@ fa3 .0 7T);PNB+MhmI?;tO yeDxé@+o-O\4vyŚrR#Bjœft}&#C3gURe,cv|riԷhucS\,U,z.q~" $ _MGˏ x~ܳW/*m:p(5-F[G6kxIЫ{wyҦ*?y,uٌDC 14p9P @ N_B̻J~ EIϏdeh((l>1Gv6qqَξlNGl*ŸY@Ҙ hIt[!ئ`ֵae@ђZ7n(LNkPA˴U(޻Q|>gw>؉/>oρ`хeãs',JRl"g9}#Lbן h}KQz(t:yV"\^NRaӵt9UVhޭnQ]] DhG+9'? ^N~^n$4;4$(YblLkWV+@Vn>,E鋐e:ڂS?/Eݦ7 e2H`8GM8 ]n՗nj+fHۚ>f,݄TA(fnj4 FC)- 5-S=4:dr"e J!t 8PR¢hk@)#X(!Hhzeq- gpԇn6_LЉ?UbUmCOzy1ξܪ4 v\8 8 bR=yQ!]Dl }R 4daIɹ vXily6EkpG)&Hi^ĽGW68>|Z:"8p/H/`B\%k>P2  ρ%X,!lVLj~(#S7aqNYMY>< 3zA^mY ppnUjKҠZ(`h:n̩,]dS>XݼQ|gX Ky۠4Yxw[ [c[E{^nW(@ &('`zge)s]'M03ȴXxN(F`fFK9,er$1ȉAt!-Oa`I<*wEOQt떄!({{( B+iIE'i_z:6?6_jt#W[MVߙkomhU]31:}3`5U>ZԨ bRfuXJgԲwuBOZ$ a9/ !Y"&<,^OUV0&h3(qt&oa!TNކn 2) 0QEP~8h3!ŭ͌[63vv?[ng5{vVA]vP_[I~6wo57ؔJ2&ݙ&r\ \)ըYԣ~ԲR|9p5X7g6Bg.慿^7!-/V؊mއ+!j*Hꟾ|C#۱**%V_X>%<ց7PwᾓN1_T]"4#<4o۹'A~!ɀʇy *pP*ZccqOl;<z+rL&DΑ34Ąר}>O&C]2ͯ vʏP[hAs M֑ߠȸ\$ZKe 2fOB y#d7rBeF1F;m4~P < J,0NS;A>O38 きo?~?ģ}RBs$p8Iɯl |3+L :vLC8/;5?[f NEQ!#Y#PKKSL]M /kóZu|e1&Wُ}~/Ng\N(/+dDm0RKڛ@ q!-2!@R 0V|!>b\`[8\ YSBv zP1:zu=*X]-![:mǺj\ˮ!m;ʍcQiTJ;q%qBvu!z@;8⿓xy/;-z;vZ=蜄EzAI\LwpW,-$&pt\Ko~B'CCi_w7o)#J9tsE$ kPHbs"yR}c ~HH+ RZv:4[SYnW41/tI ݭDJ0-&N !tJ,+ XBb6j R x~ʞ-ov-,X*(QJϗ&[%gaB:I# ̓/^iŖ;1R}>_%VD~D u^qyAC>Q1 v[K%!SJã @h$Q|$Ce6~K&f{ým0^ _z]@m%:HS4 mJDٓ=5j/\#5r3Ԣ,~&:"SJ%DujV 4,ۿae3!/&Y K/3G%. |[:rؕ^ޫRU,拾=׌k9y&3cdfkkk\c##czrS'ޭ&GCoEY)C> - QիzJ^)w1i,C xmU:X%\EIAU#h )Z/*B3&G"I˚H_,[ц".2ZF Y=:YE!;읙ng[{TOY 2CeD In6&Eg\smaxrFaNtc/D-k[FZJFXFjP߷5{׳(k,ġP =DD8iNA{έ^/N7ZC޷y#Q E~+wR#ς`*&rk>;#AZwbCWܜeJƶG ==h=nq&Βp[#av39jsE<46FuN)0SSw-ci!L&F4a*Rf,E67<ðltf̨cs9ˌ1iD:V26x[ t|Nxm$w^WY#֤5e8k'̮7O,~N.ˉJa E4E|&[!u7B>݆oAbڍev9?r"~3]@)v) H*y$4/o$c60~GJ$R6E2ePdڱdR); 2-B[$ЮK׬ʒHe ͐u[ ,nlM@V[X`HG-0ú;;y{=BV>t AVS[&ӜH1MaU2ks=݆ђ\P2>'Q@p9,4nL4+ǔ\(HB"*"và J >*U{X3`j7n a}`X"x.l/(N! VڻyvEߪ]mÿc&ts[TQC٩=GɁM5L8;KvL&g:G>{PfN dZ !f<{ ~=_kuh,;"R<4z?l?hݠq.^:^&`9y7 P r[F ;NoUmZHP0;O<:mu::R#܄P;OKK~7GoG3R.rg-ķ}g/mՁ$"G$ (q |:?e@ Qc)Qb"%nhV7R6-h fibqft:k>who&'JpأYDWQFpТBPhBA4Cw_w99jF88Yot%mJc4x$| L@㽋Q"=, msjPQ{;Sioɻɨq8޲]89+ r#xRPwKJIݧLf|3 s6~_75~D`c6GJ|!mD`] M҈6}h/iZU4;a#n.n>BsE߂M "єP7ʣB3hUm zeoP SażÈ8usyb+-ZqX.ΗmYFV+/g̯zC>!U_9}-i obÛ 3m3 ]aK'*Rem%ln_sѝ{֮[xd/Oڠꋗ7o_@ћ, {`Y.Nl j#L BlVFA -G3Q+U/GkKήLn{mN}L'盧$1ʞ}='D+#v)C 5>Xqû8ūѱ1"K<"b(ptPIOAJLIf1 cmVwQE%$/eW*(-!^2&a"cs5aXIl  H(PHоF$śCׯ oEwlp9zKwbQ*SI/T8Ql//Y-IlH&rA`+d%Hx+EY6jOY$Dʎf2JsA%iU%O[ UU.l;A|VY;EPQz+9#+ca@ $,JS-6HiHS0Als}}7D<#Hm@ Ҭnq_G{c}oS̏u/WۙQGk|cr=xd4gÑ|P2w?R<ϫEc]VMۿ_{7mrʑ䍿s鬗qqPxlj-5fnw(Z'epHdQ5JMvA{MqZ9?d 8VYBs)!s9AAkB 9BD>)c"TlIwk-C<3sÃs 0e:63 p = 'dXHp 5aAH20ƳՂBjYv'eۺiX DIڠ{S%ѩRt5jJ8]='z,ܹ1S}5d^*85"Vה}{_6 1p=*%>%7ıCa8c9JO]JX#M<#X-$ugX.:Ŋ7]ڈ1Ǧ 6@a3VĬ`@!pxg HY 5u 4Et<JwǮpWV1mmmkMrHyTvO . 2;Y31{cAң#}u^nI. Nyeװ'rw rg wAFp|bnBnnFSix]((@ڲC<`ZJB2Fg0W*Y!7[N =>ۘFAK=6B w&sƖƓ q$vZ._mK<џ,Fd6}S3o:"-(8vjSUU2 <ƞ:T T ZP %Sq2X,#!F(ʽQ e1ҭzqYfZ% IZS L Y`.{F>HI|ejV A\Fn8T%S oO¢LL!La٬RJU*Uj6U:M T(cT}b۶0/%Qu%l-RmYD9eIRщnxMܸO60`X%/Cb4b`@Qe&aF{;ò Xe1?ye\JMZ^bZigm.[ 8啪^,V7KjY ^nVG yUbu{DK]Xa/IE"SC}!~L@ZW`|4\H֬8¬4xg*Fr',Ը8ⵞFŀ95K3=}ل.ɞRt=xO|Y'-϶sC2JcG[}ϹmbD`_=r`Є/Qng5ΆDЏp12:"9#3@aZ-VxHL(>^nVn7dl6w! / D`NU0 oo-$ouX 1q Z姟n~0 @Xpe$bgc1ac||Б?0rէ}~ Vck#m*M,Kv^weڼ sttս~_ =HAԙX> V:3E 6a+5a[lFH9x@;Oj_4flsj:%5u2E}Iok׳?etA@m*d^ؚ&| d>ڶGq`:_(1LpSp:7'9P/&Z։9Y#Ͽ ː%49:͓mRM<{QYІ<>>}l837cK +[b.19!CaM-sͭ6,L.W~$A|ӍJ9欃yάt^ֿdvɮ5KO%aNMF Fp{1h~Yu 1{Ѵ$ CmCmMHY֬]+`Y8x>T0Z/8;G1'V?,~a{p` ?5>. [ o;+2dMaV۩q L$t\>Ni ap3c7kL2WCO`[K:4b [3 Q0rO e^mhC_[>5֠ق,,Mʛ%+ݪ*f2m`Ur"ITr\iJ\tǶ̄Exo8B!<8TI0K,b N 0t1:BW)K6E%IyZҴ:ѓfpvĹ{tЬKVݦ˻WƨwyD^p<ڜ:^j 2E^?wu'mٮv"oYv=-ᖹe(Vq2&9 |=ްT1OEkQ씚wн`@vt(XdžrL *i0cB0hPJɢ%:J{U $LfihQ6 70hBQ4Z(M\CCqoSA j)DPF AXՐSKJ$Xe&F’>oz/^,MZG8MmScՈjڒ`bO l"TӉ)x rĎm(-剱&%,%ڤktzcŷ#@ )&d1 77BйM3.3"HYDg漇g)hgF:z?LJ#g՚sım" }[HʀVoϘ=pfm}vz<:GӯJ @r3OVDd%Yc^P )ɩM 8XZ ָC{:H+C݂Rkee@`CaѤ}ɉ|66A}x$'%%Q5kIJǟʕRUbK*Z-\+::[~) kaY(RI>̘R_hI.1A:9Hi JO +F)mF06C"1,_ D( [/R.f&޻'@|U?"6۴q$+a5Ԧ w[e 蒨K%I0#AUzt EQҎ*ݮYx,TeLQTAUP1sꌺ.jh^k*R8U.(HJȺY5[TQB񩨠,SAhC|j wXH8Y[WUX. ^Xc?J1 +3ʂ+ʪR8FV:nW!աl,ԹT)&t4/^ }:OƐc hI|XI?%)L{ԡ|~ɂ[ý<ܼQ;>s( 㩤u~uvp^ BM.0X OgV&ȚHʹΞN4;؉@'O`L2Rޢéq'S>I4TTT!9B`RZDk{+.K}#t^ -~}X+|xbt}c0'VcAOy /|tj拰U_H7QU[g_1] ;nuP2S tÂrۤKKrCM ,ElZ3#b҃8VGq;5@BS&è%cKf$4qZϋo73d43>Z}|z)r֩hZ-S++G DD˪臲3r)S5&\!#h*EiZˮFi0 8480Ym}F:/'1JuH%&ga=m/c= Nכ|Iu$]!0fzķƢp[Z"ZÕBj=TV1-757?/޶;c?׿c(](wޅ5xgO-)D$HY%8U$5ҧ A(SWq#R Wj$gDHt2UD{crAj'6ʷC|={OWD<hهVJ e$XƏHD;'񘦙aOՆ2E8vo{ c&hʑd0; f,A:|£ CQ"_U3byMth:M]ʀ7ɐ7S4#sƪ 76m x'Hui pH/o.BzŨ]Lg47p)%`q#tse=Ǽ B Lvtƕ Vn5jEM0ŷ;NzKCYx̄*T9LCǽ`׫[J\CJ JR!0C]lubFo|[ТtA;iӂPuY. [>*"碭|_˞˹wmVÕ!8DbRSi郕Cba_:d\ $B:ISLp&tT?;g+R#G'/ׯ0r`PN*hPNWAqc&OTESWtt`t B>a=A 5sMULF7K)d2y&s4pMJ `0nLMэ6~:5/[SH8Zn1w3 Qr&.bGօcA.CTB9-aTjEQ^k7o_kwkU=YAYKeMc>˦W+)ɛ^a ]+x!az) `rfYfqdZVS#J il-W>?j{c%=KIܐC-"\QpH*:d-yUxr.&̉NӄQKѱe3Й%t u}it}WD9hcdAfXd}N"1U!*I$s*=->r{tmGN{R_$Ms/[rU[1^3oqk[*kJꝻ~F )p~ygӷ9'2azR)XְBP ˸@aWX+HLDD OGa \">dkV.!گ}>%؆d/}ǕN:Isqܛ`R =q sѵxI8y zE+%:$QB̤??"΄~o5ǚ:EE;c0FÙLt&1f#Xx,%ِ$'.:4]-3@ ċN!@<&U֑yVkW3tx6"P"/*.Ŀ>q<^4XoZq CՉN'Elp>a) .bV qWr+W!\ [.^nj\s}u*}eܸ]]W7H\bg=UUpz],g!]&%W$R!'*B'&(\;O >Vʾe3jED;E4 OrvL@Y9/Y;S]&aSb)!|Lٮ6:|?Ǿlϱ#wYKb+]a-Vh!PКH4QTah6MmK'@hU@ &T&{QNw>>{C񂩦> E& CžHFu563bIGuARfp5BKWا&y$A%@;i٥8Ϭݝ$Ga -@!xRN$&?Nz0O -fۧA+(>/!1+sqS^̄K6nq goŋ}hv{4Oo\ܛKSt=Y7~֛2Q0jk>FYR;'6 @(~޽Sf*To*'&"[&z? :wօ;޲r_!A>ȻC }sM)qEQK%M֔Z--'cϙ_(g~Eɼ*ofa.ܲtE~KYͮ ݔqϕ"ȷ,xS~U-WkWQj#4Ծ0ĶאG֊*,F"`pH@t &gX7oe~*T)jm^MqG4ֵf$00q㐨yi0<,l%`K5@u(/2q!ێi 7gR:t]D)rGIgC]*R'0 jV,5BJ]n+z_&zU6i "64}=n?1?ßQrŤw=[hmH^ ْ`8=W\\tNgx*}@=hÿ]C2>5ܸ25k}/ěc'!5Wnzn< bT{ƕ``>@QzFЙK2USE_h̚7xMg.C  qNkoenl9̗ teǏv-1m6í pPܣNg!lgYaVMf~J/ 9iUWcՂP U2NZϱGF&[-P~e yA7$.DT;ov-hn'm3Ձth4\F`?hZnB-MG3TX-J %Tm7e'מqX鲋SiGSzV^be~%.mnI̿ٯ(+|̬wf3ݝ}x]]^{ P !RW(QJF"M[n@@ӤR9DBU*Q⤨E븎T;{ν3seѬ,hJڙCEn U]9/m z"LӚ3{Z' EP%: I[%I3SG4 ;>-Bls0d4E( &Ewj,iDRwkEVn͏5ҭexOzh1G:;~- |N=0hȈ_~1Wz<;ܖ&NvȋճdMvk_lh(5{O_~SM˵w?w+LofQ(oFMѹ{WlU 2S-1Fjc1 bॉPTe jPӓɄzCW/.uFuj8ݖ=G㾣Ácɧ-O煟Ϩ֏+"j2#R>.u|vHث |%8 DHB% 6тR}4Zf_2+ab+A])Dx ޚ$M\IZZυYڇzt~dzv&?'l_O ;;.A()^8Nl[k%l;3]yת$$|d^\t]{*-ի+ /Kac]4O})X{b2hHˇƙ5l[^ܽnrNor9n3+Į;8&ܨJzAZLȈC p-5Ӕ-Wmwg+\ٳoO"[(Ek KnIvaL5)ys0"|6[&[ݍ}-h꽁n s/"5h?3ӣ~=(3M b'MRDOEz$ !0zlƂJJ/";?x.sŧ6;k=:nZVV#If!ې<]rd1Ht P}.xw:VV[gEH狐qvXphn*?@M)p Z@4P@-k h| ߑD e\Ÿ]Wq]`#0 %>c`O`o#;O8xr)3}m?˸пQFeQFeQFeQFe`-.`F ka9CX6%t= j蒺X>&RL{ֹ4tʮU׬Y?~l֦7oa ąؽ*/( 耥 ANsp&Ta@5tb>}D!/>yi%Vػagi,J:W+ lIg@%ђΡ~W@ךU}Çn8ooچBB?B p~6o .x bmuLq mtLh!`#bC'<ay ;'eaA_/J|n>돂S9y/>#w"V#w;N endstream endobj 640 0 obj << /Filter /FlateDecode /Length 32450 /Length1 52944 >> stream HV{TW3yPqn3J]$Xy%+C`l^L@j%q>UPZ[\]Kŷhխm֮]9b۽O]{w2 ~ګHrXrVqL:b##={ o$*w :Wh)-48JىE3j&'"$𚅧0 Êvm k@b$>ϬLGhFZ)mkD|sY=-Oy{k+ӄmG2k 'htY+yH&bn .+cB̝cZ̄>k (9xޞo߇Wt:3ER#jj'OnH2rʞ/O 3r) zG16AHC1.#r^0GAV+ŘiB\ PD3BEj LP w9LR%( D@Zk>rv2`KM#0eNw)+_t~g-G5TGO.r#XNW/GƼtyGo^֝O'.Pq>lнcϖ/>xغ9 ykN>z-k/-K '#4 '^Ň6L )=|AjJ`슠%a?\j[<59^5+4„* i5U}8s586GK⼨u3))-fZp\ ~^W#k-0dԗEk|0g11N#)|U*#+i+E9mbi3EvNQDmDi R&FFDIC\.O|>{μ^qP x$X1ۭY3Lo8bR@x1Ms<dG0WB"(ɇn wc8]}tǦ 'TE^1m՝פ-6P':ZwqPؙ/5 g;3毿UIp:孍2J:ƕT9m;NK"s[_h8.O䆎9:!!Ll u! Ѷ-9&xF1쒏6k?q^QUS/`Ǖz;﯈6S9ҷ;߹.UQ=oePWvsͅ?t D*H! ArVޡ<0 &Yqvtl zB1cz?P^H>?OgM y7-C~{9xռGY53%yT9,'6t7,-0/E`NXz _@g9d"{)Go9󺺐6}nI y|cc-԰zb(-9p,fR*ay)3GpvQDy\4Nd&fϫuAȢ~L O+Xje"ZS0gj=1T2"H356,2XLN2K;ʚjhjNu&fFR&2==qrqn,NMt I%NќV[F3gӛ>R`:`ߓmɶT+^9J ک;ܰɟ=#l*?VSJ#I{OH{Αer0BU|pp//#Xָtl=>U-J;wNhW#G2[zNUZ >8X^Utťf]V }18jl<㸉qˤ3菄 T -XV?83􎽱Ǖ^e uƩlnz(la~)kQLkr?SvybNi}^)#dkMcjVM~IP&!)GÁl |r |[q<2|ZuNgfdY2gM xXۭx+ey]\zUQJIEg;?yt}@?_,~XreEƅ+-'ed)PSہwCE6~Nuc ]1u8KѬ7MZ;ƺ?5NP۹{Uݔ~U<񡐑idΰeLj~<)gjM3g|t#͖ UlZ`9r|_KpJ:})%^6X:<#+OfdN΋Ϡ0eX RjknX[2i'_mQSz]Àc]uhE ncm7e{W]3wwߐK?۽rCN6Q~ )#?jIQ}lNWGmyaå󗕔qZx{K KTgYѰfQ}Iv,k޸pkLx%af$8^[iQֿ_lDO>aCH=+P,5Wźnؕw󮯭ZGcnJk9^oc/5`Ayzuv5aId5DROcS*, {9:Ѷt Njds\Ji0 $9fؖ/$Zec^l$zHt&iHc !'W㧁!@ 1πYa=܅  )0D2 )y4 do~Dɔ;G)oA$9wS?\gt {LJu$e Mz ΗKE'0~MJJC.3:4j&4!80>$v"%l#0`je[YI.J/t=3tj#Ad( D1D)͓AO胴:GC, T!o5kemHL$ Ql%wIUt=2l,i%T&*N:8Ӝۋ|W'7B!(2-@uɕΥTb"<ۅ-bX Bh-3 wFQgvc;ć%GƓb#STMfUKr%Rv =W`LL3f=w ֝ bl4;ž-p=ݘ֔TT!$qxD<+^:Hzp%bd8_Kc bƫ6ϼݳac !gcsNNT3αQiBmZBPH[WI$Z6n~BJZ\PUS"Ul7{ͼ73ofޛytn-x7~wM/I~Y>Ͽ |.ڗ.X#Š0Ňxo+JXYT+af҇|SBStvusq3e}wQgje F( wq~UYH+TF$4|+MO=NqL K(b%FU<'tߦqQHۡqzP+2IdTC5\ ]Gy]HS8,kz! 8WP~í<ƍbU)A:N*üʀp[E>5-4~)~27Ei8Ds61>g9;w+HUD]!x}eq٠R38@;& 3QbA56JO舯*A.8i jOiu S#xޥ!XCN9 &GiqY*Pum缛NEi&(vbMvqM ʴ1 !tR m"`ekZ'&ZeڨRiPUc^|I{=={q2)^+߯mC?ur J/*Ac*Evg6ηeSz wz R@+V"Oj.у;S33|wnbFiqDԿ?kEG:A /} Xtmig==0#мQY_?|l_r77q5nf&v˰VϿ;1&5nM p+G{Ke +zk,tԙnOm ^P1 .U@c.j^ xuk?C߯Ī+[ѕQg"$RrLx#b RhSYŻUk*Q=VeQ|()$6c-bWQ*-u)|J)$@֋uQN,+{QoFNfB}|gJ \dՂ‹'<à A:Zppwtʅ\ =0=.LLnU@HE?ex ~a2 iGV,jHCZOkD!m4ͅ-f8 fr'[<4 ZHAv\JVL rL>Q0i@R\WY *pw ÁtyJSv)@ ^T(ӋԖ@SZ )m 7Y=!>`h+R\}rp*e[DQ\KL :[7hz^ĭWf&q9Z܆E01P)*l +3( 1{A}c^QPf#w9ԚTuWU2"ZēAyydy _+>>=?Y/WKa=֟zyXOp1~ݩw[J^+zSfsN(^xENx;xv~dܖH-ax>Y۞kM .KYR4)mSm7NOwf雦d7YLsyy9l6S̹̚|rӲHKQh4ڱ##*G;:9Mh ͂X=QGh4AjN${lR'z$?%*h'Jvio߽g8߇g;q>''yn(IBx3D7TԖu  *miZ7uHQ*JBdQC`UU6ijF%Qagwi{4 J΂zuЉc謠 ]KHja@'eG`$ Ac ܱ抵fAE"W sa. qQȰ~X򂍳?2fx^=D,:7;!d&RC)Nizq~,Wn\dJoTV$e KRt"va<8owuhNs0ǴDz*;Mar#x5 ox7 ||1fFI,dFL҂O27gH#RhBSia^ =0 @`J TEuCrZZ}&^n|@2pZ'*-p$z4x,PEbtod}C_@a#CU )!BfyceAU YT~_ H΀lsn:rXGz:F=DJc ~7q֞Pˑ˺m' G4=-SzrvL'мۛȻcx[6[%F%]g׭2( 8 ߎK&tމ:U=+ [C8 RZIbI Ω\k{4:k  ~}=+wA+ʁV-!΁JB.ѧE((ym hdbqj zd,{|۶Ȑqϝ;X́v 8%zM=?u[ .#-uK[ |&Mc{WoE\ XxNFMRzn$DvmjC>%A_PɄ'|t&"$hs-;qn.=Ѩ#.tO}>Wuw0s"s]Q]A*wt@LѼ0֋ uKfWC4kge8l4mi;F)ݿ^RѲv-*lEJWˣnQm5pNtgYAհTBl WrѵyP|R(6'+sjoy=p*nS0.J^fWZ?Uᛥ;S(X< lö"r"H)f0Kk1n`LMeI=.RB1$~lm2``-Sr Cxm+˪:K}8Ӱ_R YB! Wހ\w^Mq\!MvFq^cwfϹvf{^{h(B`J"@qIK@IT* *i&j!Mbc{ Ej(m(DЄ.M0*KXo߿1Ҿg4YM[c:q2ҙ:.LӷXZcx(rL^p81He)|ӽdPrXP##Sz_uI׎1:)Ԍ#[ǤuRLFA3Jq~$Mw$*Tdq V;X m͂$xG6,eKGvu*&$sK0Α~@yUub88=RՔ\caP4(e2Ba~:@.>0~*r=Cm@ A #wv!Gi'HG^:znwvt@[tD9)\+i" b dH:Q=g4b#[Ī.*D"QLӅw;K$R>AtS[U6« 7IrxO^!ԪOR'ޏNX%E,r ('<h| 06yWr`Qj;JQkɞx,8cg& %iX{,Ju\^~淗Lsg -NwbJĹOF#֊zxؾ^?oZLxQ~~`OmvO(=&4tb*e.<= xUЧDQ3~t4FXk$h6B˦+apK%9R:G[cYFv8gv1 )%W' .y{lL]_>vvrְ%cḱ&ؒشy02Vwq6Vp zQ JT.xs: 77Q0ERtY\ C 9}y|TC9NMy7q]{wJZiZɲޒ,l BIJ[&% 8NGNd'&;u3jq &mJ:iPL&00q6 {ZigWgJsUA=AF(ÈvVQS2o~\ҵ&c;̼!ˤwME."/4Y-VIT ~|@s\$\B2aLi8 XctX`u%GxM8Z= |*:R` "]esvn8NL/Ws6d*ų+ *Wt~}ӟ|kƃݭA^J͎¡n}|N8N&R)M9N1ZL=i1`6eN".5)ٺS&ruuBA:~d7.6Ecѽ?E`g{vҞ gpDj^2Zlpu^[-Xwbk7xG5h']*H- ~["[Q&9"809^DI eqƛYՄx\Y;eJCƟ.%&nPtЬJe<>i`%C%0F}"0 KMk(㮙 j-m 1nȵ>0 ]`t&v9sNs&YG7p`*T Smm/^z% sƸuwQwu\ f.\شpOmԹ:>cQel]P|ΧٻxX R%A-I}0%$JbsbWrAXd,$J" }W$'MQ5)bG2ff 0ڸ¤YfNYβR5s8˻ܗJ^T{Z7W.;"qbiq6A``FbѠ3Lʎ+ lqH` A)&=] $aqX?Ů}򄙇jcѻB6=6o=ojkO_xt%rsQmW_}bʚujd^]ߜXj㚫?vً}>E /^"Fz ,Xc1Uw98YёjtG=nϭЋkq` *]Úxvv^hLvK()|?vk&lDzf>e,_PS%a a2@ Am-7KƩz0Мe8g&lOTw Jv6C fM0d2#l&1Dv>&Fb Cf|&f$R2p? Hy@^)iG!x!e5c.= JEf8doߠMAELoN{!_!VaXLsz{K°-kh0x)-$ZRʚo,ܘҠIwLѓ Ȱ_&넘z(/rΖT Zp'GO*B,PYRURbea8t,` _ L,сqT^6WF/-~1VZ 2 ~TTj)" oόd}j4&*@2 NMvZԧVlV z͢GhFF7&Mb]rxMTJ)Y$vɫHbCu_3>{|27qZq;<$T V* ޸- ,-=u{,y@!^3rm;AxYʛ[{t]]w,}ߎ[v#yGCe(ډS[>6;Վ6+kfMxmdeTӱ1aZ q^-lj~1ɩ3֔VeOģz!^M "UGl-B^b lF*l7cQ[YJfCqi.5s \ ƫ46뎿`/<3{̞s1ޝ]wgl ;MᲡME2nPBTI(qQAPK@%5i|PIP *jVI$${k4y]7 42A3˼\a17;);yL~DKz&O'+*[#A21,f4kf x,|m끵/in{ O-0HO{b׏%<5պS T?,*`bB炮޵ݠ ƃN\"%FXl[Lj`>b%bECvr+Q* BZ}oaudd(łp*}nY6 Ph#V/>Xl7%2I`^H7JಃɅu:ՔrSV,N)#Y>ߋq)JHD)y yfHDX@+\Ə UKJhִ ^S?p>g2ylS߶Iwt|~Š_<};1FdT?e0܉%\c9KUjp>+#A",޴<*sLdm1 8,Ĵ_L{G? k 2ijQ2;PˎBHk 5-U*\nn5\G1J/cc_n9g@塠AϗcF0ܼE-aY^X3sQ;#Q>ϺԐJrJ]&IٓN)=eA,`nح绻 yNs94  a{Rіx"YDӬao~JV'H>ڴL9r:|؉;a8*0&0׆g[k*W+OsS'ƹH,dJBwUɈBUz_*+*n6dv*N))k42^ث{{2&p)dEiuʚ5.\(J|̧FL(\?SGW~]4xxỐfe]ABhY%t 6?`XLHL;"|Tx߇/T88)5𥀍>|6a)I'Mkd5YY7ޔMڗIi*RpLʣ WS7s ؅3W\@>ϜhkޖE( Z[ TcU~1F`clN|r<:PXÂy ne!7VV y9Й@p!A{p!ANPftXZ@u 6AZjٖ45+6!8Z.-kiD}1WOFH Zz{j߈=6mLN.+()([+״;oD8+/Q_],sXIīpXQUQ Uu]E.[-:?W l;v|swĎ> jXt@hDjEˆ[ySl FDUOI(&E &"ⴞ KIpO&PZJK$"$&x+y* fJ2[p,I%JA&QM$4M&'Z[\ @fM#'IS,9WܐdžY) ˒gbj:+LτA3tf:30urg,B88 @3PB.;<#~rH_J2=#!/4Rm*+eU=48 OKyn 򸗈a>c2 @7Ʈ-ikkHq٨EfJxG:Hxͼ9wO9C6K0o;M zqr6& >\;7}㓲~tfጚӷzE. F6X#-R#l}}FlX6hsµq%eX(Nn0V!JeI PNMPò iT0TZHK^b۠Dp#z?!5z&ZĐIfEr9s$G98 ۍVaQ0kWeD県4ކۘHcƇ/Xo>*A <R9lrI &3FSP׾u_ !>{q8NcOOُݟ xXS+i[v.׼׺~M?~a~}r lMNY;y&ŦynA=΄ٰ;߅,tfFQnԵ}?(Я9^gv/s;]o *wms!]\[XX|#|ޑᲮ>GҶZZCTvlhQGK#6 ZS}+f3l!9/OK9:B xl"ax+8`ƃcð tCد`sG-\r9XZh(h ~L=p_^Tět>[ֶ7rڋ;t#x䭈OsnŃ?^?1@=1yx\~x.kmGzO+-b4UM:5gzKK3t,Ck+bCUه;?=|<=}=3==؟Mȿ$Y :DNFt4kfWHkВowZz^}Fے m/c;2+ڇڅ+tJޛvt*a*H0 bcQZK)ܘS-iQPQ8D(m&#Qs"܅~ 33sX:1pж2i iP F}%P"=ؿ9&3${mZIzy-[aCYCm)djT&(;ILH#i:!@dpʤq m LI2agRu<:B~weЩ{ǽwwZս &I"B!M 2ɩ\`MЃ&=(AykhVQHi4+gfP\L'ilq3 {+r5-bє-;9%^pgn;ݢY)JšAv61 QTp@%RGRļTGj;Xڍ糯Oi..Τڴڳ?~}?A\¡N1KnD kI*7F(>I@$xO&8OPu`#*S:!~?=B]%DebVnXw;L3OY";NfbEoPI?* &j{U݇5{U8o%YAt8HAIVC2 wmz>Kl߻j=T(^#_TW;6ڟmٕ]V((+#>?יΧ7;]baŃVLR֡s5G6r#ӟx%Pc՜08挫zQnKrwM:@ 2Uzy_cuZPm窍֍BlKl0?F^:4JѯNLP4 1IH.SC} P([dCz8EAՔa|OJJ-"믶~%C93Oc-߷>Zׇ--~^ɷr9_Ok.R7|,`i[{Kl6J| ٬?4Nƞev! ?.f# 9[n0`$X֥G@zoq;~@rjb< H,k&zt=B ]{NMCxYZf_IV ]= ^$S~ma^hovv_]]`*ņ|vߋ6["TR-$+xC4աUW@)qWIapT0+&z:DC53XLۅбPbT'KєwU;^la+#f=3#"??yVPK_qqIzybꭲ%Vz K7/뽍x"0XL ʓ@=*eRGO1;ܐn$*!M3ZŲie9^B(NuLާ]%t=PB &H2, ekcJ%FA,>(iIQdI J"Rae)F8QD!d=vZ v{%P9 uIej1*E<ȴciJGjH]Y=^= ,(W})X6ܙO-+C}&f Ռo&g_6_}*r'Q_F;l 5v)7c>,@lJI/aA,`^Φ옉`>V*8H 3V__Pv''}F` DU5s8'v.=a[|F? a[v"6˱S!j$`*F"'"kdO4*(e0NFcy9\b{ c*v%%pJ(^Y mdx sԐ($s$ciJ"ELcDOXG U)h^-5zK;F)=o&#وge#[ddCȺj`tt,z)Z=7A~M0Ⴗ 7. XAoaCςbt߁(ڂ ^ q:kE:hZjjC+Ǒć1 )zQf'TbjdN xIS4'`Ub/R n $(̞tC%@;QaYx+^;#{g$Q O~#ӗ[|'0}7o=sɶ=D*ߞ?Lh􂛿b͛!GX h^)]d;dkr{O.oZc_/Oi/uϹׯ>%v|8Mn4馪B;Saж=J?i]Gh+MD!`^cI:-"RجJGŰ\?{;{3Jo"y138gƳg> &GX YAFHW2V2(!%UE>5/"tIU$ǑX>? g|ut#1<,<Z c nt.R+07ը/MPa[~Es<yo~4b$Wx*һJbFJ *}8UR 58FH^WWW(&Zdor["J&SL"M07[`0e%3| RZUC5YR>~jQH=h< &#%Fz5V"U 43cCv0 p*6WS43{`Kq/s;ͰDCd%( n@'c:/kd4Eoq(7T=Tz@\@.A@f4z6X|yMFoרkpt#t7&Y~5Bs2K _2DS8` FtFb;,<?b+y|p/9* ᛊBV6_c3fn$4 4 ,;y)fc-"l:n[ZaB.a¥ Ҿe!pX$5AR7Xx1+y1v@A4\@$}a[ iISS'p˥W +&4]i*M#0öФ!Q|^ZʥFpix$W|*5Ĭ%Fie&|f %~Sz%P~x|}Ocͽx6X|+`z~}{D>:n9~CxM^J"} nOH:hȱEHB zgw)k6;\L[WO+H9;eƷmlf\ N^ B ഢ+jerF8qFmlglWl47yI­*C!>oI z>(83^e7P'<=*:Rn(.leaD!) B:m@5W5DMUswh]se~PvH097};'6?g@@<{k}uKW#pP"iSEd>I"M!;ٰʱy<0*LX:`$& p] lr2>1:^^Lw'LG dd PG^ 0o`vNKk"{[;sˎIu෴c6GBK֜=ǮkfHmun mn:|:28|8oh9GEpS}\CLYuNbJ.j!Ro^ڱ)_+};%>x;Lct_ :g}c''Ů-a/2o6Hc$?_e|_| pwON:IwНt'ɖlZP!%$6HҔGR dM -y ijJI@dhK1)a25LkILlcG^?w3_󬓟yo09W(%_~Jc{RE;9&>h+>VL.1 _X:y ޟ`Q\|:|twT=֠]- CEl *C\kT[nca cfM`Ӏ 5}=oW-PC}ah.#s_]uPNa/lG}y!ÓŞ8s4$+C,^I_ Đ+VMd0:odA 3!`2&IB'Пí pgW$vԡXiq} aM󎙠av1bF;f)Ī($s`D4߸ݓ'ʈɇ}e߾O{n߻~?7`w߻^++9z+lHoZ}* ̘5@ WP-`AGdFh3(X,':'\IA^" ?SnvKy阤?#]nJKzScUE]UDA~#7Tq*1]A`tG:c!3(9ŖƋ$j'} ̌#fLB+K?)BdTWf2:tm/676|,<~׮u®]}D+1M@<s' (=݋{.^D^x yaB-|.Wy?,zO7w=D8a㫦s~ o} L#0>VxD"RIBT9ZƱZ[L:kzML {P:3K)"Uzpqc/QƐ?}?[3"ѷ*@-fH0ro -<⚸5ںr$P (֡NX*-ĶmܣBuG<*G^Daa[OQ=,0O$r{,l79q0Gov#*U7?'gH eH,(hi@KTL#|4 fc6 F ?]: kvc*WYc--#|:vؗ/ ,KIM+h6 "n21ݴ6*ՂFUI@]WiMJ6yRMZ{w$V;Q T1)K/bE']㕚aw;[b=Vܪx~d--@'>? \f9A 5 o XC?(` P7PV`j5 5XV&7;pG6!gU57\]Uq3-o(˔i_X,rF&KMaex}04er-ғi:XQu eH-*S t ҫEC&QˣUh+h &"a-.ӖKI ˔" !*C\_u"!aY ifB=O2g>]ٍb/Rrek[?eCl bko*/*[;۷HQ{vte]UsC]+둎u&b q[qGn\Q :%83azݤ^a] |fBXCQ^nUR֬j-q夤y#2bc0UR2)D-å⦬K8Ï_9 s>;Ȑ6)t(@RxI5g6 ?Z]n1:qkp.G%r6.7^w.֙Ϲ^}=7=5t73togԻ﫹.1Sﮎ>]f`&1 ;lhї%U=U4SԀfP7m.jACo  x'Udy{M=rCoAWһgQzflne5 Ԕ2@M!pqOZIpo~ER2Ą nF6djYNW)e-ݸl]/+=WE>LT˿z$8F2D}[.ipʱon>Rۖȃ>r)twN>yj>z! ]T cpd˓0hk.jߡg|"J/]CZѹ }ӹٿv~93գ+V*2R E%Dvŗ (g.(w"m{ ]G4 #a5_{K]+pFK|I=u:JOgiqc8N-d~.ğ?36JXz`ow,oX޵~?jcv`alڴ]Xmִ}_্ ,ɧKM")zPW T7֢j jcmv$[[f7NҾj\=_ߏlO楽lCdIJ mQutu4G -ї`"۸b֔@,"Aə5@E,+ Xi}PveJ$d/IxR2d*.$$&`&8 Ll m{Ol)w|saS:#)B-1Y J'NBS47=!&`!rWB7*f[p[Dan+ VMfS(G&BSc$\V\XOV7D_5l3v~c_ziٯ&3g?>b3 `'΍=Z>le4b2FBV(lTNڠB ML6uFhIVUc!X5mW!ֵKKhiNE{?Η}{xJ7={|s̰'FOƨ0.ꏷJ$ݷiYX̖ _ڲ`>0ET2<=ϝ~Ǎq#OEG~9OKvV^?`A 6QAV %?mBՐr;J*&,4 ndQ\Y@ =t1$Tcf0uAw$aH2ŅB`T8T/PQKf"\tv~wg½}Pwkug)f{NCóooj]LvO'}܂Lͳ j̡ጘSOdRTofaO37^&/  ֙ҙZ4 8bx"RMj`^j^LARJ5IzIc;j 6'ےY;f[v6%vK]*l.+()ֆ*(ZM†u=#X E>ap|jyPh8-ش\8MKf˜z31 P^Pxj*B'c0F;iǴMBB뎆(H^Q4:ui$ڟ(s5"^:O]A9Bj q0 U\)pLpa Uβ(^ny^LRԛ'к)&~ڧU(E :κV]7"w(u>IBڢFBhS[F+6:vX(YtJӶDPU<ޘeltڐ\pTPx)CL8>9NhRXޣYS/| wdTn"OL$'f6IoRHGsc[œܺ1I/ 8#TCDjr8:FE^VFC\W4BAyJɏ)%qД,IdNBGhɤ mFF0m8dɓj*,#oA,{,C Bxkċrpj_^Y*,DX0# G0!1 H4 qɆQEIXMXqr(2":B#0qU 1uEBW3n8Ь8Jѧ3_ +N::<'f:qgdDrG閞_ɜIoaʓAQ{)AP#[s>}g=o2r;}!郞 ^́sMyg}zpD8Tҩpez& E}oXސ󐨧x1?_3DA{͉H:[,N~(N%joZ#9e#7!1|ۉtҼ+O.6-qOOZa%= AG⢠4/M?8' 2uͻ~!=.z`*zBFZ*F~ӮiR_:.!+0XU|}}}Oͭ~-o;@Buc r;ded5A('OL<;U[&Cҍ͙k'9-ߋ 8 = e%Q# /4h8ֈ4@Am>ESA < 0n&\?w/@ ;}oޅ@g38Ͼ еz` ~RyMߵe=.7~$x`@$F'7pC(ERv`;paGn7ݻ\t\{:'ط:ꨣ:ꨣ:ꨣ:ꨣ7襀 `f``cgdWPd`PQUSa70426153wptbpqusac  ϐd5 ;ZaTbP 'q % U 5 u U`P`pdz !U!PyZ1A0T5AH2B}$ 6qN= /YP6}:9@9(3/< 7xAW``18Y@2hu*@`_ /( "B%(XʋX% \KLʊŪ$*š - endstream endobj 641 0 obj << /Filter /FlateDecode /Length 20761 /Length1 36080 >> stream H\U Pν >AT .!6&" (^$6V#T2幣4^QӉIcN?sB`4Ru \deXY3 Uw?1oWr^Wf^8uWi.{g ܜ3;V^9BFǀ9oW0;R:+ƛ)eHUV$[Peˌe>>ܔ0X5Qc232OtUhz" Q) 7Ox"8N%狷R CGxxR0s'(@Z>.䎞PoI@ūBkbk/"6b$3MjZ}e<⬓!2z%P;<\FpĔz@CIOF6OR9U̕k‰Xe؏Gf<Ó*}9z^kFqxa62O.*Z;120.u\ZR?DKd̗bPv'<' S+uHUWtKAun\7~gִ=[nVɺaUUDk `)!>f,w>?hjJڈSI4)i2KdrG @tP= 5FNg%ܘcv{ͧkn[hu'mD^0{.Ar6ަLLb2㛈2!| >_T!`*9*FYӪ%љZ¤c,3*:sVu[U54ſ7?o1Iꖔ/ "J!fHOzxv>n!.1*ֈmaj7+t@[U{, SR$qU"q b7{+-;XyL|n@/UZj٘\Uˣ(#"ug xv>DmjG[K~j!Ia=d!NK:IF++o'1zsd(+Y\kUSsevqJDHWڜi;= fk7w_ d1b?'@/MUa$J3tVrb%iߐsx*A2Gp>~3o3Dvs%Ёyz. x_-Ϯ%O7a-}e^ =*;d#Rmg\eh_&҄a Q5/{?y^4d5a^|c!J_>{ۭk1vء}TȈ6֭ZhެiXh4 jР=?4D{Iod׈t&'w;3 KI:2tQsi^j)A)q:gNGOx9᭮׍8',JM[pN_yC;%5PO ~tx:ݵxu'3ۛ:<Uu[͘xlb1aaRm2v@4Ii&EEMӆg'JLEHIGe&M5I JU; ccZs9w9%aSv&UffH Ԣ[lぁ7D۩wmJ[ ajswޛuųVba gc DZy [! &L ITmkX03*}3ct 88gNͩ -1=h܁{h:H`xKIx L᝚ؚέTd%H!@Gtl-# 0č03 Wzo|z6[>#n2ORTiY\qGqK$H~Z @ |mW,BACjGi%jRdQ(n ;Mlq, L~ӓ͘^”f֤Yohljۆq,e[hLvK+ RnI Nky;Rh@KIO rҐ14M"4_9?=a5_nhi5)l@Qj6dn\J&~/Cl*Vtq "6.oWoKlPh*>؅QDh唖{'0}PBGXU!$:ᧄ|ccMB\젟Ϋ{T h$S̲fCMQ**@.C_A`)P`%EDksmd#GH}j b –>AE7%j7턽ż&Α 9 Ȇ>ϐQgJ  )'h= WAZ)ЮF;جe8{71~6i%lӱo" ^!WcĹ7:j$`ٿtOr [m`Aԡ,J@8sIWI Y\3NDlt@˹LSZ[H{BLF RG8_+V݂{̅Nj}XSil |y;N> |81@3sK|؟cw%m7k}U 7ḘXaQJ̽4$9B9=6 Wc`<š5g~07C͝,Hp,f~8L oTœob8-xNzw&}gd>2LBS!sH&pdO~#,[e.$)"%gR\=߿ETt*gn#; gpFzj{>vE2OLOA<_\s59PN;]N4d[mCY8A(S.iȽ S`[P:C)Mڏ.*ڟzבJ^ ׇ\ƣqKB:|Dl. |F^{Öo&d,h`M/ ( s"Om~y;/oɥQpwsHsej~?=3.eMy@~#a;}ZkZbʭ^C~+USUeA:z2:n;q]DmJQQ?coag;o8e6)zMdMU!=n]WnJy2H)jAc+Hֱ6ZŹKޝv>{4zT*c.#7R6EĠ8܇hZ.`9'/ǃc4.\/lX{{63yT~9E uծuu3 _&RJ~Zn=mWD&r8:FM{mw˴m%c%r>"F- ^M }>: ^VWK`>ޅ ]$b[LAmiL_\׏{;4&ʶ%|ʯP?B |M+* *S3mEKe/AkT^ OG3O0a̽(HeGW_y_>9|tDNxȑ쫃I}9y')'u<SjYrQ>A瀳;L'$ܓ>pƯi@# lT,Nr %Yێ-dtq}z!Mǟe귑k[PF6v=[ 1oBUHO;s'H"IDw FZn}YZ(8twSt*CӴa"ghsO WW(2Q# ?^Ǻ{ }o>lj<%Igl7NS频7-|>O|z1(Grg8n5BdKU1y<7 + 6|&׀@G>pTG JMm@6gj:+1 H oN}#^EV]П@']ߥ~F:$0u7ˉAc'> p Imܮ'ÿ%jܘ6[_`7$@ bE<|ᾟ?@)gZ<'D(lJS% {4|Idjwm[ysu^ N"|LgY@(ia_4A?s\?H}(`'DI$[󘹘 Qj5L?!QzZN {y>>J z; QJ0dNTBG(Z]NQQveecCFLa({AG*C龛CJV{ &%^=5]Vn`vBq68vYM4ER4Rg9Ғ3ڕf@N.h^;,7#p$%YvTl0AvX%㨽FWJ(3%r @@HJS.jǃDP맧7ZU~__;מk{ٯ}/Chlt >OO{էi_iM>hjH+7hFA;ʰ3ۅp.EF_Z(1PT%*E|s1/=@4 b,"3" <aH,P#u(Q|W^"u ݢ56|FX4A*oD: -d|˒Ab]Wxt%& _{9K$V_W}L[=acl6a  ` Bب3 i4΀B>(JRBE۲n>O&RbH2m4HݴIR1uH|gVR)]wsΏ;pMŸHHZo 5.~ 8u=ϜWDv}O87űHݝ;oq5q<~Kw=;Mc&RѐgP|}ZǣBr"{0C^D|sGlUrw+4('wԀlsYK+koRH4nWNaV~ʝ:=\72qy>#oj0WPPZkVISa;hXNV c s$`RN@s,'CVF#*'  `!) —fڗ5= bGI5# T L}x1fۍ;u)$UF@]w3UjNkݙhˉ[f#[WXcGC]P+ԅ=92cM,.N$nn$-% %3iz4,vԌCn;a+2ILU 㽑驕sy٬%z[ǐ&z[!",1iya+9g4{3Qx)YKL5 Wuuj9?Ӏ9ew. N-wЛۻ@ٱFOIޅ G^O/ O,kBGʟsȣD"gzAi(zEOL?6O*~C.Y6pxkZ"1FՔ`\Q$j$\$:ehNza=`PErn~MQG8||a>.,,}Uzbm$, s&_U| ̣li8Jqs֠ʂ1PlTJg;c_]|e/ 9 ۏL1.o/^IGj}Ovrec}ß 1^E=ۣz\`ʭѴ.Ť3-YnC~wi LyW <9<a6wtRɾNu6qq;g|}|s&81$m$hA∆[  Jԍ+ ae-ӆba iv$gѭNP&Dn'ni&,Xrw`(b6xkAڱd] ں(ߜ};y 2/x#t0}!DaiRg*]rjje+&]߳KDj5[hp`z)!q[/7$nAK蕑ON]N/hjS+C{۾ xd|} _jprog,fo8B7qFG8.4ԴsY!Λzťm O|;@Q@k*,VV>D#s];#f0/{k~#`V4u 9s_?d>R"7[qo"W^Ϧ\}C ߸*3ߠ'?͝KM^|d3tn:qy894͏[^NoS awj1v1z/l2#f2h׌ b,7]ό_7d  &|y@YͼeN0Eڙ 3Đ!%G,`z(RP2K[ҤtAK7{)I_" D$JDgåE4 Rl^`-2 ,d[&oGe}w>l_;ŜqވI%CѲ8`צBt[NmPPp?R&1jcJ-i~l|J<3ڃ|Euwť)X-YKn8Y7G&s`E |o0epXV>+X*V~<_2Ta/"R[g\1iXh:-l+)`#_qeoq4b4u3 bT%;%`L@,I `KK jFC:^.a VI w QWǐ F ɔjkMVyNo~. 't_ݣӜCBnת-}]h ;>]NZAnr>Qinh?ܛze%~u7,/,P+Kt{X| JœGJHlqqSA7R6 ޵B2uyXgux r,Ȳ:;^gpd*]>YY>bKXD-+qTG9x6h)*P8(f) pɈ$b)>N&S h,jRWcáEyL$޳1\5YYi:!NHG (-G7Áǡeo \7阎QV !]mkZz7jOu8|<.~dt"޵? w"'34OlS,=_D F> ZEqmq:.Ly{{+5Z|N€σp { pD=>>?N|FEM68 QCKs0._/Hp0Qs(^iV* L3 $OjGsp5mep~/ e\w@oM F!wt:c0~޹ݿww $lj٘qMa]矾sG[:V R ~a YVد߷h~or L`3?% sq'% N"Ura,6n_40ZpKO t 9z_:e(BPӡ USgT\ #^tSʪ ,k??(!q݂a H,<9{R\Iw9%p!<Ë䊦@ʩA:f*9p&c1x}\˵η\8biĠ[ӭ6VtjyTԳAj{?-yiɴ?Wܸ+wvL͵$^R ׼y<{St'zfz~9o kNxş}٤x ḋE@^LyKޝ>/%Y_n7۾['|p^z|&b;&9Ӗ%?д b!,%sď hJz(s`uz _A{'CCQ]y,Ɗ1S,"`mgD]ɬft ۩ =c 0'#5 5Klt\M8 E z\!p>xEY u GiOa[c}]jgO*.Z nTb ^(K H$F$K b _aLBb !ِ* P䒇| 8}lUuQtzG%T -i tc'eOw2 s FL pB޲2r9-TJ &˼dfcXfԸ2 DԬ/S^$Jy<"q2Bݗce3XFK{^@cMظ"đ@7*@ރ]|[>}=DD)|7b;9 ~޵+a~}D[ԓ_j.agufne& Ib+pC 6gEzX }IA*ΓdWdlʴ,ۖiLJޟeňN**c( lѣ'SZ.l@_ϺyBt׋6I ]mՈ S*՗lr(VFA?YY :s8q*n%Zc۶0/%R/Kdɲ$^aMműjQvyޒl[5M4ۂI_AQ ,6C1ċ+.+0 ƀmi; 0o`C[;Jy1B:CJK,bDv:c`Gyt~9O̔Voz'#,˵\YvJ5t[mZ}9V*7 G8I,a*۽pf 8N=m FxCy\4(i[ 5,ݞ?D# ׶ Gǩc_s,lyO͕ƶMSCBӯ|I'C#.F2ɛ {^V\2Ƿ<[Ko\'/-J;H76 *&8ιj~?s7l2n 6M%bDӸJ7c u =|(ʼ],(" FOʴ2+΢RUfa(brr ^܇ F>׆Vʘmuݯ)C3i_mfmoF9&aY,; עy ̀&=t_? IO/i^N 7=E"IM{,V̈́3"R] &8Ki~*D+qgp&6YIdBQ`7#H"J"<ډäDAL]wo %$=La-ɯ$X ]"y=bJr2 =}L @tnw=詅y+(IH#i)I|#4 M -f2˙3+~M[T CeUa$Pkk]h"}ොͮ\\p)8fcw]9,4BpZ9vzq5oW+3 ɞdj%=Lm wocC߾եAuHyBh2EH8D"Ƣ%-(L'NQrwB%u I<}hև8DeGQʳ" 2߲`ZANJA']PBCpO_qInMHUn)U ҞP9f"׵A0Z ] u;4T6>f ]wi!ՅJeS9:]܄XI!o=ĄE\}Tw!D$^vǠdh}sرjY TZFaf |6'I/gjL<&5@mkK5GrQm/TZr-=Ϊ`Qi* =īgЗ@?kb< b// ]I_:Eq@AXJWy߲e@]gUr~1MVn,Fpd8ҤpNթ۹喣5 89CLYp)y̔Lc1S)eJ Xi~6Dp^~޽_HID+3l~zݿkӏHY}ixx_is}%p0B}NJ?D0) y'7h1,`FQϴ\08lc딺-{I_IBwurgtREU$EgEn}] [c{ڬs/́Y^vwƄBCxr2YVBR<'i299hW"M&RQ)Q)5ƲV bFh!͵y9We5ff"3|;=EtN Nfɦ-4&Tf~(^ۑ73"Lc֕oFݗ^C?ѝ6cKO'O*'S3%qk)o 컳B %3:v}7};&8?yhlA?2v;].?9Bk>rZC]0c" *t¬'x% / Yն|;w^myŻ uL)i :HVl>O(DE PQ"JiUqQ5uYͻ Φe/MJ>O4D1{Le%*|Jɱk^in7mf u$1i/ihFC&hXfNGX&IPɁsϵXMfLC:Ht4\@zrd`3D1\}`Ba'ߝe ZBV "d.C~g}|bK>|IHBt|wꀰ{\?^:X_d_Y"Jewq:))REb=N8%]fUTVd˱ ,]>&a1b_ǎ^( EeyۻҢz#E o{ݶٴ-!5Dxe*_ um[Ú%}ڽҙB*@ a<rb+4aI^o\??X,ûtO`m=k'krӝ`DSD$?Ro)\$ςut^"()|))(馋pu^ !\łu'k՝.솝I'pӝZ17yPsYV)e K< 3.ĝG,ϵsxu֎բ:۬6K`rsi*RvBSi߶C7fl0v<yoʆx2^hO?<ե`LOok%%4_:XIJ<8=#"8v*)""#];ble(2RF#Qe{Ch˽Ϳ%#3S٢o W?*>>nkk\^tK >I( _P?18ku,>syO p*#M3GNvoAr S#BF>S6Qnu0)(GA|`!/C?2nİ2(]؟f8\񀁢N'V,bg"?/ht_m[8 ߎ2}7z}5ߘ Y(q瞆~kh6ںz0XKLiN,\S J$sBQݩYs'eo[e%^rA4 ",ě7RVoKn%^Wv?#eewEO$֫h2%bQg<&mqLnԜ.LjU&o糗7Q6B퟾zί{bV#^ endstream endobj 642 0 obj << /Filter /FlateDecode /Length 17179 /Length1 26628 >> stream HV Tgr\&`RR9B\rIBLX0!$2UT Z'G=q=V>w=R*lU@u}oۙ1 ,T,:э87e(#OI%D<ޢwQҬnEr3\-= ^0Up *#*D-y2o m*ۿxxS̄^ iBtE[bseDЪXv$7"q3zA]lA+)4uDYuDR + UⲲ<|+T I T1a!y |3TXb  Z,8TRZd͇J^d0 ((,b@;4=*T}(*ycF×|ƌƢ$h ]9DDJ~&PŘ38UŽYY NmLQg'wF^OI"Cvvug5g 9smiNpV6~+U-RLo}%ts & +%Bb=W~{Z㲳5rz'l y"8gscŽ{OpBT9;{qgBi8-Za_sNgV*~Q P%U{yڔڋ͞LyZDO)b뮝۰mmI΍Gzy>qm0Kw[]'r2T{E=SY\H0^^wk{4]m-Y)av3_)hKe]ot-T'n:B1)|sJSUAsh]]u:ɣ]v\XpVVK}ONJ>3F}ġw#V\㸔:,)E]-:ٍHBz o~ZԖ&9\6b2LRCuΎ=ֆfELT_3I"dł&* U0Pg6FNB$`$$i2"2*&*&s0AHbq2$XOX&HEKeJznC]) b]TU]ђX$SB*̬%I `Io'HaZk6i)aE>BslDy҄7IKQQU⁹ ) ϳnq]?i]kTg>WZdmg뭚zm@Zؼ˂Uӎ~hIޞy-[6~ugYLN#VYMS ve6£o'e}ƥ?9nwa6B̏Ff0aBf1*6Rᱹ9/hS;G4W4R W`5&q;e2Z '鮱܎[jyDDj$$)IOKydn: E e`%ӮS@D-AI0$iCiMfL#yq4jyAzf q"ǽGyH9HF-"1҈B+E&XRcFa"yJ)ҳMFWA(5aAf2'2yJHMfeIU &)T"MI/TEa1NWBx9VaF2zU()2JTe)d2;q\ ڄg)|FEud[^?VA * n@@AB 4J ."\@QQqEQѸOFJ]"̯9S;two*x){ˣ|t4,V&C;`LTj/UFF ..xhfJxAP)Yz{,&,]^FX<Kh)b S+1|:&:J%>/W(xeTx)H ,JMQ#xT!BP2d\=ٴi^|z.K05^Ή5sXϹxR[ؾ@}#7ҭy$ˆ[6dqg|9%<`}`fD~q-U'C g cQ{e5[orgea3;ҔЧ `㍰7S}bN;U u$hwOn7+ n0{mq/JוRݮ^po{Ƣr;[kUvgnn~(^kuCԁ/.B1hˡGsq^Nf{y,I(\)%Ok܉K#Yǧųvc\B0 `.(䟐BGbЫMRFA(o ݡN(u[A0ƇBín V7? h`էA%I(p@& X8H#(* T 7{/D`'Q{f(0a74w`Uze^(1gSvrDK!&Bֱ9nat8= >f<$bC ,5 E‘X/P#7+pCx ` Ndq&A$DX$;!59ERGI4lh=m)dnެ T,8$8~64 6\MG\p уPGԸqDą1b/3ބA=4 w E.ă)c%d:I&0#vr\!׌sF)^Ћ!ԃ AOp {}ɸ2Ȅ3L19S9>El{me;BP3s\oao.e}ymsg"ntxxJlh;s`Mjgp.v$g9CCh0gx֛+-ʁ ̍t2čZ0ad%fhA~AZaN56n%KK) G6b9:4pL`D)dHnBg~Æ: qtѤƿ)}4C;5C5I>=EL]j:y + ւ4,D@", q 4*ic3CҙN~̔N3tI"aIf:ʨi0AG;&zw2H;r|=-f԰I}ԵUߏFhفz1#d5=uf]2^"hV3, ( 5 yradևFMP{ 2K7;,27Xy91rc6R/u9fgG%kYomee#g;"ւA;"Ɏ7룘PCķ^^ּ-=f`Em.d\2C;dX ġ0aѶdaS}BFbG[h{{)ƠxHyٰwIyY%'w5;&595X("o X1-)/*A0Kx0z4Wl^=*"V9f nVi)ǀeGfkX͠Z#X]|Gԁodu%):0ĝ1zoQY5?ϻЁ5Xo2H1ʼnȪUD_WӀ$K$L!KDO(4bqjZ^ !=uHf4HּlnFlDwsR:Ѳ)tj?]ԤJtSW=vS ƿ;8m<QS PUA ],{qLQv۾MQ^@QWAzHS }*QPikc zNTi6eQ1]`OPBiq|X i 7!z o hcS \~|?7d)xr![~hSԀ}aU_M7:D˱=EFbvo >;>lӿlogsl Үc:G x]pݣ7C1i1W#g\id·8&%3֭ks@= |,Eqm`VGLZ7 a,8F\w^yS؄_:sM&sE߉~Z ,_1k=j.f% o2ֲ` 3_ʐ0! <𒖦|^YOAl;1qM;T\%?X9qv8q$8p&<菳_2lߐrZc9c?I6WFڷfpx9+vF"sloG$`r]ܜ+gOdr^̗3ۨUo d"cwtu$:.Xo[;H8Ĺu+Mm8\M{=vCq}=RL?t.sse}Ǽ325W*j>R_Nkxw"Po]zܯ vZՏa1>SP=!s2sP#}L>E+uԱ U7QGȿ{~8Uh Kx&e?>Yg6*1w6s?F \1_v}i-T >rWG^/y}ž,Wn݌׺JC=|+ʑ}\3r|/!\Kxؽc3iw>iɵge>y"N96pb{Q"."G\Eu oIyC߈\~w+J_ýuzh_V`oF 8(=jI++!/ }ʌd_(f"Cyv37D`8,@)m8߆7oU vNG ߰F`'У]K/\?&3w>NyI8N/!>|A gRBPb,tmjESye˶H[AfҊh B4IU֪5|ο<~7yffA4φfa_:$4f4t8Ky$.Q5"G!cp>!⥯7ʅy*˟syf ??U4g13sp5dvHkC8 1MmQsiC`o޿N߁ FPb|Tbݑ!hh֘uf[ֹ j E~!bRԿVW?QzhED9ꌠI Mca * ŠDF:ܳxd#tH QhB% 9*dQHN!B*i3_s.7SN^2aA> +ݯRh@!BN8L ib%/>CU{sc!ƢɭⳈV,c2(I$G)^"$䶓ܷIaj-a,r5FVjYU*b,mNt>셦};k%ĝ`TrsH,"dAӝX +m.˦kkePёʜ;Z*z8.\"]"&`KnSN6\3Ch(*Cmý.(jݦ;N (-OypK MΉ+q/j]:2ٴrN4^W\f0[`0 J&CDb >%>Cge<?2b1(kkj-rK }羐/VA'p'Sui4"U :Ӕf+RMxoV 7? {=k4$4 `GK(XmMh'ևB# 8ŇZݴ U8]+ڰ(H$T};?e_$ :6*߃wH*"6mf ʲMkC>a8w+pj3Q\H%EGˋŨFu#nK8c`]j5Z5ДfCVY`F'3oѫxPkv*S&#o{ުzB^:;3*2N&?#lH,&D9|)l/\꬗~lb,ă? I8 :Xz3}~SښRRP W8)Rug#h6Q3!M=AFKh(fSY`/-ǖKʥN2Ձqd309>*5-0 .ɘ6lޒ.G8di4Cf7TţjkpixOHC0_as^ \WcN1b(wbRA}8FAzHb*A^UBWw5n)m=_w% j*Rm4qhh$`#j =lB|4:e|(,v]!Fm)a9]vp:~DiNG3ZR!fάZN-Z0V Uf^Pe_˩hXb"Jft 8CǾL\Ui3 `#ChXG[Gע8ku~A0\_ѣz7K]ttz0혪Ηk{nukۡzfͮ6߰ݴwlEߺ=(Dxt+V5WEowv]u\\O\Ʌ]Ɩ]nKEzx'?S~GQ[pVW0e Ka*<.io{/KRh6) tymz/-]!IA[Qmv WܐG#7l3/m a~_ xZFC|rG/(18!$K4 N,m~jLK3?bIFeޚѣϏl41&Y(HڈR@Y(4L P>lY[yy^U&QzғzmL/t&U%htOs@VפhB;p}ˎ pf=J-׃o ýs6wߞy_/Qj_!}$4PA 0AYpmS[$)O{CvŽX#2ifüĜdf - 1!f! 곢2$+ܯG?S2RA;XiiK!WZtE[}0 t.:5^\S u/qLխ۶ 95-O)yaG&^CTw7܁uG'vp2ѓ9~i^f^p BB£40'1we1:Xl%h8bVJ9Q9hd6-T^[p yprc΄'nir-}Ul'8/}dEHMO[ccv6l Js R4 p#voȜxhO?ه҆ O}jKXֈ}&F:J uu38Y"L@He^302 3wK hdhWi#I6$6t` 0 p;3.BDK&d3$;prBc|EQky(>+`sGt~ P,rfȯuŪPD{(-~ JKvhkoTIO*14;xUKFjL& {W $jjyӇf_R2,T'dy~hfpIZiEX\1`H$^:UųQ*jպmomہ&7J,ZNu#(rml6NaϮhQ?Wg8 Vǘ@P(" =nR>\=&Q/C";0<+ EOԴ2V]m-!?$/73مCeVHܤvMPZLIkUDڥ 5;؝p .>Amb7B¬Z ڢ!U 1ެi%,QԠ.3D3gH>%JwpEmܐ\1tAD{6ƶcb{3o67Of~*n=6H* x$F7Qkx ?hGmg ێaZuUuSꡊ sA0io{zE"!Ukd}yp y5 fQS_׺fWtti̒Dg^.@&Kr.NTx!EI|kL*ls#YI$_ m?2qɱ] ċ,"Y,oˍ?t>yAkOEbX ^c`Hʊ-s;'=וInsg-9~wnliUؖV"!˗.T2HhaL2y* Q cuG3lw\4m_"144팦:6MK+?| Yuڎ4IJHM6ҏO/ٔ+ׅlxǴq{߻>|g}666@lc) 4͗ 4Ġ$MQi.٦.ZW-mj+u*#mJtEZiJ=٤sœ}|}=GGLCBfF/֣zT? d=$(FtOH'm"2D%1:O2y.%:DE YRpZZ\Πl1lkԴZ6Ѭ Ζ\c.?0(܆\`$a!sŨɐ++2c8%Nvڹ9é}l돋Nb *#sZv$cA0/N;_@,;Oc}ËY&(_}`sf*S.bx[L='v4]mB$BD=.fd&\UA;d4!_ڪi¦l#U`v$!ne,ai}gC̘LXQY 5 )OYؓ 6ծۼyݺݨU)9EH#UV{a s#SzOXoiZ YQIWn̯dQ 8 EowXfZ]F8;>r"3 <^S7tߝ9ȁk%[yx$bAht\ǙT3A؀dD!TXVke̼""Y]b++k2Yz<429?ۋ^:}C>:o'L>77g g(l?tz Băыa#$_/w0 BR7 c}EV+@ r4F L4n4>Z9DG1$(MqUc8ȑDL"ժL&XO]'kXhC*ox*s 5Db_d+@ciC@Г`m^ظE6Q٘.6tfM4YƬƛ DRƷ[B&Ɇb@=5{ 7D\rBŀ"?ޮ}OUiA+7|G׎"5U&3u@]84V#4ĝ=K3:q`{+}]''~qays^GW~7Ggg.CI<Ŵ{=&ػ׻m@Bɋ.OoO? @Xg%l M Is=wy$ذuFteFN ]}"ćeFm2*ʓyyV-Lx T% R0K0j2]sBFaCviQ\ O~w#X,? */eqWH~, O~/ weI09 %t Uuݧ=ۇc #|&q>0$&f6uhJH&DKfYQݔTզ,S[Q'&(Ji,2I-dk7)x8|<ƹDObtj/H}L$ݶqIį۝Ҙ#gabs=D1VÚyBFB!ګڤFA-Ж6 GJcTYe̻Df287LjvޞLǮ <9_D,;dcܽ5=jq-~ %$F() ،LdL %/.'+\'LYi&c@]֕pV p = -'#C)J6E80ҽ ~`űmG6wڵڬGI{_SD?+{.vN'm#Ql]; :ѿMEBtτG'Vu=SefzO`F~eh*A|8IdrGN&3ğ ûE-n^^,td:%G&x QYwsv٣8BMX]ɤwk g&{9%bre(| Z`Idmd=f67#jQ 6u4 -4b]QMҸKPv42Hұ"5ܐ[h BƇt& /φ}>MPDZQQDӻagM&?I+IK@NRlfr&eF'c[[KE[yBe9axZˡQp0[sWT olo^O+[yy-#)36SIc~klm֜e2[,T)b榩T~\LTS@"'lpo#0ԺU9E{(jAhiF iuTc@Q0J/fC IoԞ'ZUd(񢃖ɔlus_1|1hL=>!s&8eb<_[؇0qWY21GPA5 (Kɩ&cx,:{h&]wB)X(u_-6 Y H AŽ7XhЉ,X׃k?zwjk恝QHTA,XPFS`F'/!dVsj 5]]p.ŨN>zp<5ךG;R-o܄sDi0*DTN$驙J"iaa~ހ P@'9gpApeΊ0RҌ02pq;-,[^fݝ.e.V -CGY.le)t*u[*FDB A4!`D 1`LL g3yzsdofe!KnȮN?Œ4MVKd& \'"'9MSO[=o;ѭVn}-mĶ4x(/VPViꧬVɞc،H_1VV5YaToMYO5SR^I:ɚT]ZQWnt1*zfk&8̈́*1V4]/jig,ӓZ:._᣽Y dd2-2#:xI DSBϲ%>~1q9Qy2v笞mH$% .gܢKdoN[T1Vj4%A1:CHluu&X.1+*Re ˖LrݠMa&ZԜ!Dk#)5C$~Q/R.=O/RRZr-C@n(,?6h)o8"e4`bR+ԦQMP&Ǿ_M5>o@#M/r5`)oyRcW,Un02U1ۘ-@Z$Ax+[9R^XAi6W!8IkR7?Zdޫ8ɉN5.FJYì(._Nѱ1 ˈT(Ǘ9ϩu{xzooԣe`Jw~xO_Q)(~nF2肔hl!G+88!=p} P.|p" iQo!@i=>)La S0{XH!C9Q~dM&K;:RK,O[ 2́'W4 06(lJ|6Aabb⧻[i5 %},(''Pp+fdspi)gq,Jt{s09eO!ЁFt![`-:x[Wy n_oBǥܴjSq*M*:>j۩Wn&\3 endstream endobj 1 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 621 0 R /TT1 607 0 R /TT2 623 0 R /TT3 626 0 R /T1_0 46 0 R /C2_0 47 0 R /TT4 48 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 2 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 1 >> endobj 2 0 obj << /Filter /FlateDecode /Length 3 0 R >> stream HWkonA.l^`0LfZl][m02U$$'^dSeKs=;y>F>|zvuOFbIFfW?\5٣.tSe)_zi5Zd-e<˔0*z"\03If7ޗîuEMT>ߑr3<*zAU/9ABƅ>zYlr+Ք\bMH O,ݒTNUV1fSZi0O9BIV#Q>:5[MA+;QSj{{ Za+2&bOijQg5kq.BOǞ5f@ m s5  1PSFW#d/ZC3cQFzP7 "`4]ݪGM SsxU 9{5iJR鍮tjӛ5j a7I2 S \nnT EZ/kA_sI{͸qH t/ |Uw*Ї y4ib]Gu?bPx` 9X=Uj2җ ȓBhJ1ًˬXg=D{:S'%p8Yդv| 2nUy'/Z53ꠔ:: ̊/NߎK GP"0@E Xcg?ҧ nC ѭ PD Ѡ }G,XKo7cGew{8b27c@m n KPcQ> oUC=T:vrKgӬ޺ClK8_ CE$%9qQ瑃wփQ]^,4! l #qwA| @#~H@$cg!x2?\8mWMZZMnY]WA"4?F0]&!,yK,7d$TUULO-;s 7쬹zM-39ā#Cpv>PPzxMJŭT !sT-yFbߙǣN^C-fHpߗU.z2I-Ii!z)I|På$OR8e '-YrV6ˎml~U7) ה8.hҤ9Ir%GA}LQ ~MVxep ;=T)kU5HD)Rac'Ga/j'AT 22Rk+ Uu$ia(IQ:I ެ;IECY ӱ{S3_:۽uq%[n -ٯodBgptd¶xSLsG@Hqy]cw!&<N)h)U rnMڰ]b(7Maں !VII&Ô:p=KBW5.c7P9!~ΏCm҂dTk>%g;f#鍞3L%-U)Rl;<{#I@5լA}PLy>.nb8~J Ո>`$ endstream endobj 3 0 obj 2488 endobj 4 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 626 0 R /T1_0 46 0 R /TT1 621 0 R /TT2 607 0 R /C2_0 49 0 R /TT3 623 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 2 >> endobj 5 0 obj << /Filter /FlateDecode /Length 6 0 R >> stream HW[o~7A^dC^W;q8@- -hjI,)3S$;yE]vfo߿F>WF3 䌓]]A4NYY,: 6;Q&< cKyԶl{ׂ= ʃL~ңh&x3oLBaB@j}O.8̠(3hցNQiKR3^('Ady+R$S8 YY$$JjK6F@3ؼFa]e %iF4:&ϯ1fSn@m4յ*ঌdĿ%藫tݽ58v׬* fDi{DZGi@5wtGwg5}\TLϊ gHT:m;L_mR/oe;O9rzR֐rlb3dQ$DΣ"\-\_P5j9-*8jidJ XL]&l#C-e¡5'?SF&|])^ylQ$4^䤹J]ZK,ok&l}K%ʜ :LK4`rY)MV5IF8D7d 8X();w5eS^xf1շe{nx2wO`Tᗠ !s+&!vL69|.~jR:G%ph_'M͞D8Dv"D+Z]]x>}R:(-"uğ;GC70lnjkuU(*yZ/fPz *P}̄r\h`F~pu֐,8 PS.G%qJ)(7l% !ڬG-Tf+Vk4TbMPJCW'b# H,H\k?2mKD$W+XX C\^Tk]^vүW;Tj nb  4.Uk̬Vh ~\@x2 HPK j "mݥGyT'9;{֪MeoW$Cgz + rQ7s~#n8XqՇm\,AL!p<:FA8a^K* v <<6wx$`=ttRDmZ1]_3U2⸄" SΕ/YVm 6Yq p+]P8I"(4m#v$S{VI&%p/zr"e.8JS͞1^'ll ˡ$ɜ]Ut KI'Q˞[7J'lYlׅ۸UIVj poy_?Ew Hή/ODnk]a}72 ǟ;#add&L9>w"SMk<hP(w]a-óKe^#"딚ɒ ] ƪhkedE)"A%qFhD˔lMDr '>oZYA~+q<ȗ4~Zl3ÛN endstream endobj 6 0 obj 2410 endobj 7 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 621 0 R /TT1 626 0 R /T1_0 46 0 R /TT2 607 0 R /TT3 623 0 R /C2_0 49 0 R /TT4 628 0 R /C2_1 47 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 8 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 3 >> endobj 8 0 obj << /Filter /FlateDecode /Length 9 0 R >> stream HWko8_|ۘ)R `& .0ăمY06h+K=g~^>-v(RKE^s]^rrG׷.pbW2~YJyVfm96Ӹz+ fg3wi^!Ի.6@=ϧ?w(V@8| :95@[9%8_ۚ^uCф`q S ܬsY(P}=)\Ҝ)܍ߓc2jBkHl52G<̑y8INzuf2@|XrE ^C^,n~Zjˋf f602#}ls^u M?M1s]Mw=Ϟ iVByƯIlv{NfBDgIJ8P~TպGZ FӭO}$)H&pn5Kч-j ^h~[v#y Æ8/4]hn{m;2dSg|T>xPj/-+Ԗ-UNMGt{-}[uG۶ 0kRFMyԏ}f1 NgѾ7ClnR7NqFp;\/BnEÖ3$>ͦU:;gwZA77Hh!mbcU(kVKwF[w~Mރ\6GWpZaQͭ0b/IP}q>;18"Q4ɵ.wzlx;6^N\v4k?I}X\Uz0rZ3uV uYGuY/u "1azD7/L:/"K|z6s&#s xlMODHYQ 1Z9t0قœ˺-ppC3%:F %-jC0bORJ rpek%vY>,A~">ǁ*Qj?L3gNIr̨39q N&56ݡh CHq(E%B40t~hMC&)^@[|mGkdYg)XXJ)PSP^Ϳs3Jcל̑kvUٍpzgJlWs`s\ 2Wy9)$SWGR-w(J <[T@n p;ٸ˫ĥk +fv#kyt endstream endobj 9 0 obj 2507 endobj 10 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 626 0 R /TT1 621 0 R /TT2 607 0 R /C2_0 49 0 R /TT3 623 0 R /C2_1 47 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 11 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 4 >> endobj 11 0 obj << /Filter /FlateDecode /Length 12 0 R >> stream HWnF}ؾTaQ{H^-.5YФʋ,A3Kж 3g'_n>#\]]o>QFHgF2!SQ%yy<ʪHbR$O}9^L>XMfԦۘ0cqQ\xX32]=x0-Oā.֌d\M=+X+ b ;@4X;tc\92;b{4:sYgtiܟRٮӨdo^L&[o3Wv(5#RϹ: 4ހ06rX'mRG9: O Pga8po[?7՟Cq^d3jТ5E ٬֬-A,AU!sVkԅh]xaS5FRIZ`Ȭ_յlm"R=}/*/pGоFqЅ9  ь< [ VTZ/( :w` Bê5VErxwc=8hjݖZ_{ Zo6\Ea13-Ry-GC_ArTFh-ܠ/OήaɑI]?~ʋ.,Wdl`4cY :˾,(뱔EmP"Hzuёaމ$MYM]<%g/r~)S@&Zp㳊oQ̕ec+Y{&g ꢳ˲RmZ7L3W#708<v}(N)Q[Yl{H&^/DZ˲iu8P-2B*%$#H+u=I':Q endstream endobj 12 0 obj 1916 endobj 13 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS3 604 0 R /CS4 605 0 R /CS5 51 0 R >> /ExtGState << /GS2 636 0 R /GS3 638 0 R >> /Font << /TT5 621 0 R /TT6 623 0 R /TT7 607 0 R /TT8 50 0 R /TT9 626 0 R >> /XObject << /Im1 16 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 14 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 5 >> endobj 14 0 obj << /Filter /FlateDecode /Length 15 0 R >> stream HW]6}6#RDE$M4H6ZgHHόPHٙ`_{~t?nu{IaGLQ)O])[>黦jQۮ,HWn?97_6&!lXN6(cl F#E)<~XUUPFbd [6!(tkNYE=QНUo6]9QkyJk/kb!ޑNCWFz֕pAe^d-D.K4bDt$nÓTPFG=#"?Ց3>zOsxDKicbR5=QƕOJ8%.BISDӌs }uv(\JF4⁷hj_,߬Bۙu8Ih2)tԾ‚e%J>op*{ efݪb|Kg#3W>,xs몬5MWIRP$>ɩ-N$ţOQ7SX *&$yߓ7nƆfX:XV6EWn7 Clx6em $OV=Pl81M0s1*JgI4ErKP<9%XJaKCTK2j 7'a,WW"p9c! E(TUmJy|ys*Uu4dX~~?dPVK8}pyɉ߻+(vhβ x h}[PږUiK7a5CilY(c籼R%iܫs'd:"fVE8 ˓ O %r@L՘RКj횧r7o"r.5"]vw2t1*sW yt=%$d3 G3λ*_ jJ m >&|.`ɹH~Q.p1.b_W5=h{MmU][F<9/z'~lp}%̧eL^0BKMi0-s!Y0SqR1TͮfO cT)=mƪ-ΪikZG 9;;;08vqlZ"vJWϟ7]]Qgg(-S&lZhx=vzzϯ ,5Oo8(n@(})9G̗77^CSa&1,x:E).r>|OQcT`:17ˆ{c9vCגK'##=2YgY!`܋ _\|qB- ы\f)#5Y ZpN3WٕGBC7m͌b2?4=A b哪^UKpڌa}}'ț.Ղ#] Ka8r8x*K/A9d:>-;G#1}Ngs v1iv%M<|JO; @K p/2M%O2C`O3!Ņ2nܖrܕ]΅p3-4l3', 5؟M#-`,7c?=Tݐٱe @@TuΞ)r;ҁy2EȖ}K.>0FW/Ƹ?b&R;G]܀.4H5i3ZU 0P= endstream endobj 15 0 obj 2021 endobj 16 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 379 /BitsPerComponent 8 /ColorSpace 51 0 R /Length 1848 /Filter /FlateDecode >> stream H׋ EaV٤lA@3Ք4 DDDDDDDDDDDDDDDDDDD1Fg6 dnݫ2#lr?g>d6/Os&O$H @"Dֻk: @"D$H @"DdVHdHY'UŬ !kAa.~G]yTk>]O@}3`Gj-P>}%H3P T%(@n(@NHdƒjJ _BT٤>:JrO?Аܧ7K7_:QO]u"h-žug@k@-P{;x QW@|R$ (@*D:jC y|R$H P&T U'@|R$(`R >$(@*DeH Q@y}R[3H>Zq>j/@Z/MBSa+= hpsadڕmy9hjr(dЅ lFk=X[§53'OU_䤐+SЯǙgI+UqP@' ~} )4_q*r*:x<(s;g>b>}h_<[:wYޏnSlf0*E}-sC@{=@ww 3m {_(tj(=Peع:kr#>O:Ǩ=ҍ@': {-4]\=>pO@ۀHȬեkf|RdHuȓsC GV~@ŷ-k @)#& _ ]oj +Ŷ|nAk @@HD@"DʌZ@E?}RYk9rn2V>A3hPPhדPX sv ?M wK <`BVnC r@c'}(E4~G2V}.iwݬ@k P>WNȵ$O a@ Т~=]J,?= @!3 @k tjE@֭<@>X 9Glu{$2X ;榇Ϛ9$~$t~V>qNOvJ4읦=^Chؿ[խR-ԾY𢡊;{!Yn~} +ۿO%d>IG Խ'1Ћuh'Pg)H Qo | 3H @"D^ |$Hm @">SGM |'#!|fB4g>(AYkYӍtt=NW1^MBKwB-_V qdiA&mZQgyzټ>ߙE@"D@Yi_ m״/$tX7}}2G3TÕ@{s: | @8TY2,s_L- C?"3Ή`8kS) A@خ @A@&)Ng= /w| 3}Qp endstream endobj 17 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 621 0 R /TT1 48 0 R /TT2 626 0 R /TT3 607 0 R /TT4 623 0 R /TT5 628 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 18 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 6 >> endobj 18 0 obj << /Filter /FlateDecode /Length 19 0 R >> stream HW[SF~Lr}& CMkH$C=g/K$\|gիGF^>|s4?`$:+dQ9/V5U*쿃7p<d<eRFb4"7J?$yѨjQ a- kdC ya8xq<xS<aܝ 9ХGnGܫ뼸!HԗueEj*fׁat#(qʓPҨlVߖ&Wbj UlЎ̽{ O%s[" y'yW}<Suj vΠڶXfBQ͛kߔD>wx=T|Q_5 *,FlI&ΪZrY`Ⱥ~:<]ԤŅm0A[2kQV"S~;x6<'m[,1K2uU}QVK3%ZU[nDj.iYJhQUz$4a).  }br8p'H?9]\!%Lx¬Qd7cAԩAT@z07u eg -}h{b[kuYulGEv8ȕo\@q4\RiGtu`I},o"3zIH}uLhlޛ^`JQ/uk?/IZxoFg`-_dLq~xV482SU#a,275SՃ0S ѐ㣐ͲR̀nVf UUF@:cbdm #RrU.iUGdKč6Vbǚ1b9#/ u z dqjcn6]4֢TN(w0A # zBUAmVuOپ]&AU(1K`,J)>#PIE< [Jt'Ps򑩅V^ԍJVA]yeuh,7("(p!5h*?W= b͢g%@g@ߛJʝːħaҪ21AFVn'qmq?5hViev<6#hCvCGE k5w9VRˉtNe:3mM~NT=Bb0am?R찃M^#߆曺Pkn7<`f0 K"uq H3! s]nEYC٨#+;6{ Wc\G/t|99?~Cf,avW2h2Ol~-&  f~MsY;?8 E ~~Oqcf`YJ.̲T{ki6N Gj];cr@s>ƍtV?]KSe"ɊW;N,cnS_ ZΠӲu|B29ArKLԭYNO9| g%Ef|:i3>V1u-7##̄ПbS9hXXY>W`ѳ endstream endobj 19 0 obj 1768 endobj 20 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS3 53 0 R /CS4 604 0 R /CS5 605 0 R >> /XObject << /Im1 23 0 R >> /ExtGState << /GS2 636 0 R /GS3 638 0 R >> /Font << /TT5 621 0 R /TT6 48 0 R /TT7 623 0 R /TT8 607 0 R /TT9 626 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 21 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 7 >> endobj 21 0 obj << /Filter /FlateDecode /Length 22 0 R >> stream HWr}ߪ<  *VI"n b\@` `y @iws˪,*s}Nj˷bJ(LB(8d^߫w/V矏^JN8cm^+)x0uY7Ž"gM:Jvf:lB8ܮ:P~ v@8~.mr!bGvrrH1l5=pZ2rjk|Qpjҙe>[vcXQ]̖u5*Mo3M;j eHmgbx6ODCVuE(eH4RSڃO0H=|Ǻ] MbcѱǢ,#rų*ԬJGo]Q]V-FipJ5}Bwd"xIS׋auhYUw u73B< otYխ-:uxZ jt((q{sه8ޜ(/:A̹c/fP & v rjSx6Qh\jk1ygeXcf[F<)mbDoUc5H$IՊG0QW8pFyV@X ɠ PYOU!["ED`0(9h::^_( ):3tARAN ! Ƿ6Gߌ=؈N UӔ4W^,r"Dwz̨X`''Z92m@<:;2iSd(3͆DQOtd ;62֚{|>ez&ı}ξv9=2Az )JZT+K!QQ Xn#ibbjɤMF܎w[_W8~xԇ@I4XMG&DΔϠifЊ[  ~_2Bg )v4˪DeIp`8Ȳκh0xQO!yzqx$.|"Hh?D M w,; |Z:\Gxӵ'?jQů d7O߾@DL gϗ?38vgZЂ W6O_>]CĊ }"~'SJ(H^P^]//7XnXζS`Y endstream endobj 22 0 obj 2179 endobj 23 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 381 /BitsPerComponent 8 /ColorSpace 53 0 R /Length 1749 /Filter /FlateDecode >> stream H׉v EQ!ϵDܳVj]TB!B!B!B!B=(4oVwhU@iNuTJ6ԏ ~K@7ڷ|hW.s5@D"D "@D"@D"D "@D}ͦ>ih PLs!Fp @D"D "(it!D "@D"D "(it!U^j}zs?Y(>рr>z#Dڟ̷]M8M2߄ k<6 Ut3._UtTP|2`t*$PC@-}"5 'Pcp@}5 'O( aO' O 6 @|>1}BqDb =w v@>|4&$|< @2>~|Ixq $H%G Q@>}IxUiu>f+ O@*>t|)HPEC@9 ixR󉐮} e;@'u k^ҘȎnT2X3s#!d@sЋK]DRM ;>6 cȔA MIc*0U5ҝ?i = [ii~@ J6gϢa'o6:?Lb'Ǘ<мg 뗲;kF! @ë 1dGȸ:u} ݛQ Gȃ |kGsG(9QMG*tb@^}r#Gȵo! S7{)A]o ˅B|8B0b1|]p-0 ɇgHcMa,3(Okp> (OK> b (O+> 3i̷ӦP fz63Cɇca(Osh>A_ t>>]=B@!ԪV'hu@m/ANMu@w@=[ 4 ៧f3b|J)ϧ C"}J)>P>z ԭM~}us g!o ۇ܇݇އ5|3\s ;|N>೔~Ϫu{ 6OgU;kZ3&S^td+;8iY_YZi >1\?sQu8|Qw"Q!-Eh/jvKcڋK{X:&kT5 &l (-9>~ 4=m.!F5XcI5{ozrPf@㸿1 ʦDP6t9 TOY6bPux} ʦlcY!B!B!BH? r endstream endobj 24 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS3 604 0 R /CS4 605 0 R /CS5 55 0 R >> /ExtGState << /GS2 636 0 R /GS3 638 0 R >> /Font << /TT4 626 0 R /TT5 621 0 R /TT6 607 0 R /TT7 628 0 R >> /XObject << /Im1 27 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 25 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 8 >> endobj 25 0 obj << /Filter /FlateDecode /Length 26 0 R >> stream HWr6}L}ƕN[VQ*1=eʤKҎ]D@dI8=g<޾=O/FxPRBUx:{NŪ(.݂jtÐævtLqS#VGxÿGp4vAMPv*ߧ!z9__WGyvYG|>T`I>^ C1yd{x>ŎGF-w&BUzPݡL8>%:72hUTo(*eqiy2]L=Pt)why2ԡ @r3a%4/^\*^p}N U gKʗ=ŏɗ /]d}?  CA '6QtvyiNU1yh ;bUi|N@ Ĉ J遠b^rڮsXT;P  u|vwc DAmj&5ԇ.yY~nTI$8 }kE.0p2cU(FΜ2MiWEI?e-yz^qoyg8RYpyy \+  ^n jс:YRA LB͠ϧ$E抠rjlmGL)r kjO` v} g D$LMetew-H:tkʤYnRߗi0թf؃KAOqWqĺtt6A6Fhxsqh Ycė 6FjE6iG sѣMF06Xǧ DI#Պ},26^kIvஙhBsK]Y8K{yeZ=5V閕@.-oqtZ םrܥ):'&VDz0*jG."It7@S #c[@ʹ~*t['59mz1mxp :uEZg>ȺOa|a6##_eThZ}k^K2%uHǙ:9*1ÃA 溜p뫽Ztx YTuO(`r S`d-b.5!Ʊ6Vc #tB8 V퍅m "3 endstream endobj 26 0 obj 1526 endobj 27 0 obj << /Type /XObject /Subtype /Image /Width 476 /Height 188 /BitsPerComponent 8 /ColorSpace 55 0 R /Length 2036 /Filter /FlateDecode >> stream H v#! :a7fTn, qqqqqqq&%qtr͚͢e+ڒv K\3|-f,nύX-R]k5cגkƒ'cא%_KK=*f8'hƒ/o%}V,ZrXevUգ2|"¯Ɛt ׌)uǷᚱ˟aǒo~Zo; rãݻWw|; DP-mz8ek,\>_uh=[ Ac[m҆q|<6mU?l˸)h[)<,ƪ*\_M:#6PG웂lctMvp}|1x@~S[[nE| ߒK۔!-oCKݹLqTz dXq=ᅳhOf-S 4,] n[YycLmx;(\hC/x:=N*zW}'tm{~$+/'Պ Zr Zg)-۶lT:/Ja'&) p_FVD>mFU+*Yp.cƩ`يvu]㹻]bzո͏,|o…}Dezw2lݾ8.[oc@Z[jDtݾ&z%HbLl}rHoo"w4*|}/z{9Tlg|Uie[6n&}\sDϗ WzU>B+c1hʗRpVWnPklU7OZֲ/4UO2W/rNn&h=MF4t14]\8зb 7Vا.ۯYG.:c%a_|zID;6[ЇwZN`RaR6]#w]sƺu,|⛷w0t:~\\;N9mq|(ª7f-Q:` 3}.5=/w<}*p,Ґgf:8޸:S1{Ð>{}#y@mO=D}@˸rU tP,G\@/7*5sp,s]y.@ ! *뢥s}_JH]PgW .|A#3He:G _ȸ\ +̐1,#ŗGTfX0(/v=J?ϝ`my=`,Li1;+CE<̓%"|ǐoM\3|3v-| .X䚱;e"\d,ΨZ\_·g[|f;u э%_KK\3|}INzCX?9>#uƒuv*\%X䚱k5cwܭ7~~u m&k틹1ͰRKl4ڶC o36Ǖ|;̮M3gT2߹qlȒo~zlOΙ1ݸ_uqqqqqqO B endstream endobj 28 0 obj << /Type /Page /Parent 597 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /C2_0 47 0 R /TT0 621 0 R /TT1 607 0 R /TT2 48 0 R /TT3 626 0 R /TT4 616 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 29 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 9 >> endobj 29 0 obj << /Filter /FlateDecode /Length 30 0 R >> stream HWn:}70X9mEFf8!Jq3_?{Vn&ڗ>N޽;x?=)x%ίņWI\*eFJ9;_X%|#,g  2#GK4";K|Ηi;BXf/eQ+Rl+Y%Y{|MAdN:_"s8rֱ$hOGK#w!vǟDpwZA80U]b5ABB]?Q ïZĹY$o6x7b7<th-ޝj2 GbA u\]Ň=p%Cib'D|7Lߍs*狀9b4q9u odcFK_AX3.D uyvE.H.J.|d+~[y&~B>oa܀-K:ڍ#T%5 sOrR7=:y(q_ CGȲzKWqd׬\few_ h ;')ŶJ,QBըDQ 9z7 Iy ?'Rj$¶.q !ֈ!5hHҸዲ6 yI5bjhfuiUj˕ ˢ^?fBb$R5@L}|ı"{m*ht'qS[}d{]$>XFGEVA8*&v,`$M&{deX|$1vS-!eb[8צo&'}Q /8$rȌl@^16vns:a_oFU{>}<Ԅ`&cG nBj xBAzb_omaUY&3zұۤbndusX&2?en`AXg_T 7 h@543. 51a1jbkvKu '7t sp;_U+%6Ѕx>31$rM ZxԏͥxӇgStA]LEzű(^1Ac7~-\ӑ=,j(ľu~s䗨8Bz,]ƛKY)%.xQB6yARdb'8Nf&~,/1xy᭔79*VQc ʱ^ @} ʼn0.9MW-.t;:I5s+6#eC“Z%5S4nPնֻ~4ai9a rPO]H*O#JU v*R4 ҵ|J7k,[G={E) EɄvnmL˂A?8Y[t ||Ozt +ךAS=*~y$Ï3-.ǣ;nBM"7}kZ;&Wp16X٪5ͺVogEn JfR,֧='G.iccmuFZ0q{Q8ja?Vo Й2ݭ̷b]oO3GSf ݠiEM H9NV`4Ӥ}x=c .?j:UtXA,x R8{Э&h"Kݐb[ [@ F{ThRq3Uލau(Cd#j(0xhF/aUP@f ͊PD9}FnDquF{ǝ9?P̵%q b7#l7$afƽBAyh8uO{)uSjش1> /ExtGState << /GS2 636 0 R /GS3 638 0 R >> /Font << /TT5 626 0 R /TT6 621 0 R /TT7 607 0 R /TT8 623 0 R /TT9 48 0 R /C2_2 57 0 R /C2_3 49 0 R >> /XObject << /Im2 34 0 R /Im3 35 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> /Contents 32 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 10 >> endobj 32 0 obj << /Filter /FlateDecode /Length 33 0 R >> stream HWmSF q:\;vTɑe{ld SC&Y=s+t|wx2h{(Biܣ(DkYhN(Iali;$<4L)b'#>=n<"C(G ^_@,Ux @+_aon)(tyahS>ήݠ1.Ѝɿiww;PLcp|MSTt@6hCnǫ9deC9ŞԵiZ Gk5nZ)}k.o3ZUC}a^8$i2[M ݧb8]vD7JzuA\p";Hmw5zҒjw0 #U dr:}_QN$wՄV5[jRrk232̞"Jg9JDjGal`a6yk1;r&G*`E>@s4}NݠcTb (1$<kpU=α#%P!>L~⅖i*$h*\\ce~P{Y&"ZH .a-Οy  Ĥ>p*UIdIN(zFa<Ns;G1_`/.A?H%zn0m:HC"dVȷax&[qD.N@ΪѺn q> ?G(Ȑ WP%hS ZuRVpv;G64O fF 1UJ6^i,Icf dsv*[rb/eA|o,nބy͠Zxcf H xpv-j=Iy $ߣ"2׻0gK@y@g,A\E,"+U~aJ!s8y ~l$rɞ[úuͶۥ[7} u|y Meds2 z΀,^dybrAwf m ٬qaŕGԙ/Wf 'ۨU[Q{WG%h[9Вonrxe{dE^]h=>0 [j>'w󝶕ͬ7e%0+an:~_py0J Ϗ_v> stream H{Wg&I7:4mo4eɑ67 @[6\ rp/_͜rǒ9^=ޕ<ٌΫ _{#G2sS3녣|=ˉ$ģowp#OUO>t0G:Ě%DNLI=z;Ob=}SJYzjiJ5҈`nĪg>}bb,~'<'gIjݚjQ{g^Ӷ@\0 (#ե &jc) @Fk/Lվ)hl1֧UH \>%.@!0/L`hQMY#)N}EѩܚxjX*O,VC2&\jIY;aLtskCCCCxP<Ѵ}0/yB(sKTե!jJВWa:eyO/F[K\$>.]_NܸTn}±MUT0ϯtSq`s!E[S.r>qZtChxFiZWTk;_4n_A _z욳y};^x,ݹ~3җ׿S1yEGW"V {|x8ƥ$ǹ5uW tʒq庍,~uIX$ե=cwQ8qZPҸ?N5b":XS÷XWCb yXxGR6LqxέYyyy9Y0/y"J#)c}iڷPHơ7g.j-;҉?[2R&T4w$eô\cs4`Sfw0/<<<<(]1/մ}Wjz4GٰyVUHw~JhX!tEa 9!N_k_ݎ9~q}?,x&qo;a˃o6vjM [(y1jpX9z;w SCkx8x{Ooશlj D8j[k'Ck`U F!t`mB=N T4/[J1,`9<[8?ZI|<^S?)fZjO;)Ynш҈Hލwtn5'^8fQb,~ɴ S^U15UWD*L;Py)%twZ LUK늹&6%5ejA>xbҺ݄])_ZRaVlX1-Sέ<<<y"Ѵ}kh՞8֒B;ab+VZRflVAMcuIE\anpEi+q&tpٗZzXN\'LŻOZ-UzOw gw+T7tN DFaLm >X;hh˃5{YO%ݰY a𿁇]`j>WQ+לP5 ~rꢿqnv~C0^p{bW!!!<]Npw 0m4WV;hdWHJI9 o{NL)Nьsk< "fPxxxǠX]ҝz2Gs|KtuI*<̀۱E O+?C,p/oVZۜenwyi6R?[jmgi0'\13z> 9Q΃%ƐOx4m:+ݼ2r07@Ҵ=>" {=cwz1MO)݉ƽ#OAy*c+v{fAúq W{CYQXEjO>@+ݱ6`EPI;4 ϊ0b)Fq5=Hp^Rn >.:|f%!vM-*7lr'^Odp3xEc' \fZ ] zZ{x9,2 Er&>۬8Y=+뤼uIr bI_N8' %AvKip,&>NpC|yI]\tyS;`}RG̓7è'񤎒ԗprsY\746ǝ r\kUO.TμxEwfͺnN?sis} ǵY6\O.;+|Z7}_x22L~%(\^l=} WM'xŔ[ v+{0YUk7BF]bUm? |Y':Ug D7tVuĎ<| LJU;@o0 VNw4i{^wT! (9rUXV㞖̇.E4puνz0?0iFE!HuZp\)H ?eKkV8a9V6 G`13VU &^AUx93{?*á4nA5)n88l5Sv^I3쟴 έ8[vqLnuqU0UiC\q9Hᔗͼt9ɋ*ͼx3@=BUf^ߠLNƩAʥggU T$0wTϣrMN%{_ڙx^^;31=j35Ko{#&ʓMsM^ _kW4r`dXf)x  TFcc<խCa)ڠ?A[#%D,ʃѴ*Z_eb"TEZê X$aF*rMB3ݙ2윸'Sn?;3S'L`5b ̇\B0ףٺWx H H H H H /oI endstream endobj 35 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 457 /BitsPerComponent 8 /ColorSpace 59 0 R /Length 48035 /Filter /FlateDecode >> stream HWv8 Er,9=tgʽ$]a c H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$L"TKLZ}N`xvBiR}t4Љ?|Y& y ^^7^U_a.U/4;U(zfߞyU*ܫp1(LXpQ]{:2/z[U 7U%WbC7WWo_,-Pʢǟ/<]: xEg|o .@}"vPC*ʊ)Nj CZ?ҹa\ЩNdWbr$ /a]~נ`å{V0]xLfRý @kPX!3rr#OӾ#~\)-Z56#yhC[ټ gio|1x|1QJp7/0Щ}Ƈu+%r񂘘&!A'"gww:?ssnS^¢Z+z!rjN IRrN탔 QDK`7]< FoV-&,Ea$.5B>z{g(u, iw%Jg ? ';'cDfѠZ{F/ыY{Yh},벜:aF 9_|NA:hV Ú𣅼c[p|F1g}o;N^=KΣx@ԯ|Sk'y:aTѢLn#dO:*iI+zndX{p1.b`+%!Λh2g[q{}>jM72[ǵh6 6mUOeQ#`03kn,΀cQҢ !(,Wm?e5}3=jPGzfuJ¹sۯQRͦc_aI784B[ ~_+ 6z+NoQ:623ϯ}ISO];w)iVT{}Z>GT Z;wғ\~!әHaƘWP$7#Q3 H^ 7$ċg~ w/y*l{G{)ꩆKZʝ\ol6KKƼvؗ}h{]wy| _`E cL`۶(#SGIMy6W*M\\U’4]gp0p`]Wr/[F|̶9;K ~9BGqћEW.??d~¼<$_ʏy}3|{Gcj4A0O@g'} Tˈzk+8@x22ij<=O.g4hR^: b2%F3yH5wcyδ,œ@|򥎔IU4aǼo +n;8}^D rZD7HB]J̊xY_}\Q){=9IfX4z蕎˰gC_>DCI:w iYZl{кF-EiעT|CϐoW2a9;FT(eAJUHC4犥'΢Yq|rQ@mm9έ<k$-齔a{!:hA-ױW~8Ct{wr?m0OLgbQocӻw>ĨMP#ZErh=™ x{%AINz<\@=2 ȫƇ!y#F(d=&v[?{CLxBbmj_fܸ{[+Hg(Ҁ5 ->)!ZXdPdNsJ2jog++:;/OY@=)bL Km5RTJlH 1I.WW\dCr9cW$}گpIGeɝ-'9 `W"x )85 j]4 u+v|pu]>_p|sqqCFXdWp˃ L,)\~f_={1vm NC"̪쏣mJs 3V33||92ŇxI8H=y_ƒj(Mh4{>XZM2-01miDTP#?rչoű 5X-{ZK!g9HJbP`b2e OUwx7?҉CrΥFL?LJ+Xs׼r81ݮ-Dl]>C=e!EF,;;8~-7YQ#3%z%~%1n9'3%tADO@Tw`Ѹ)=򱇕G6l䦅T]\i(xݝ@i 9^oAb紲/6s*r%>߇|~9wC\=I}@Wy*^>0|NU9B-k~2k3dH[5e^Լv+"KhTIe/LM$OݭBu-g1$^D{ 6jeWB `D) 5~=t.uI(2&$|l.̨В_lٲro֜2Yn.(` \w5x7WـJs׌U[=d\.޶t~?:%`#=q»<>8?QVpC91b͂t2tW?nݐdi³Q#[X)*x: `+5k@L_[s>}K$h~Yh "N⺁ &`gLF_VloZrquk yOUq˨lRG [t_[ۯE%cKTooV[u1ڲH4ǹ|P(i44[r,e-m$/G5czKf|ly NA['m+XsQ2둬Uho2bto^qG{9ѽżZlmO/$^*Js!߳ΠF˽ª {~Ϭ]vZˆf*,bY_խ2/2&*~P1 GH(O #jHTmZPr,挚|̘ۘ,8iفqLQSWhh.L~}iwV(ԧ7F(WAߝ?χ6܍iGyAK(SӇqb>wku>[4Kfu03,|SeFTmi[hO@4H:ƙ:[?I۫E»9T\w-ro?&V6M&ֶP?(.2~7Fĺ+&|k]5'2<!Ď/@I^?fMvLbU{Yeu&ٟGڲ_]XjW͆ 4mPm< >;ml|m`%igre$s&/|liEXT%Dae#ʺ‡z#>o 3\%1HsȴT$ZҮdk睼S.Dm!# BMB*mȸc6ȍ?}#A]^(XPfX~$D2H.^zR;]QÁɹfjM(dSȁjL'ޗKѯ4܎ؤdmkvD3۶Hۢ^̨rȒ8`Փvfh4HZϵ-"Zd'a6=2DZFtɹ##V'5-5|ⴤ672 e{Tu =B'X}/6N@#<2qΡ7ۏ21vZ{}N{y"-fe!ƽJ u~͔8zyS<,vs $͑V/b3J L됙@$5ߋrX,"_o.N`O_]Kv۱*66P=%S۵=0c[ 0r\\sI-iB}8{ o4 0 ÑM{r٘uB n Q(P^l7c:DalTQ:SY _ӊt(&[9WXmp_?| I4D)Ȥ'ap:.bCzcG[;s~&ݞBYv/ƹ`3?nq qI)!U;]y#7E m~־g\Jl_0kE\@s,\~$ТPH@LB.+ߣj'_p[(ya^=hu(T5+<) #L%:p*T&Hgh] 'z'.;vi-g]+d*L*Fگ% Ugm}&dtԡzڲ􋊛Bk. RW._`6pG<<7WȒ&_xmJԾ߉?y/h5(8< rL}6{$HF:1!$_ķ.߈BtՇjI?}_͛`ÿ~Խ՟}zg,1z ,8r }[~jLNXFυεr>7ז4nϣ>a;YyڹDco$2R*ͩOAbOtDlɈȞTnZ0I+*cC*Co}6J9. B҉c|̭.XȻ/a[(-R6gc WF!QR{"ͯn8F*r UMlss2uz̸mJ\: ,,= vzVOZfn#rm5PӌnGzJ:Rr Kܯ]v+Y)1h!H`b 3YZg\3^biFRh6Yzo-L`VGw+R]Cdžy)l>!hO<53fm|ɵ!(_؜,;1"~oQ?/'0ʌ6yXб=3Ș``Su3Eߩg^܍䌬z5zY&5#ZݣqŋM3/e{vu!*rXǯR;tV;,  ~t]2d;9XT~0~&>n|2cp#.Q"L8s}bNURЄ}>y&[ laDxq Hȼ[q3b^l9>A«[6&aaOTj _q e1H(%d?/.,gEC-FK"9סFkv|1$IZ{зzɐta,RH%-ruƵ 8Dz.8VBk[o4 &z}e,dHuZZemSLzi e"Up>Qɒڠa/ZޓWFzwo)8:;)Rd-}n'+و(ύj&WΙS_CyeNbBn$|<$fv`ʃ=o%.o{yCr\Kݝ1=^*er<,Q3^8>| ޠC9wLQ,/?C2)Ug!ty9l#Ih4Gg{Av hwvawA#L 2M쥺'Scelkt/KC LS"|\qFatٮxj#5.efX>d*?KlVo6M2\ISLN]9kHP,X @XH5!UŃWzR 3~`Ydy4m5*a?k?#]Xi%J*iAXbڌtTQ\!VX p%w\-MN5D+/B$&ޗ[oW+LgTcՑm(rHq_&'Zױ^Wc; Tmonw9@$@]0Qb˒,Γo+ZvP(ᒝ,F,9eLbflX% Z* FzW_i(:uZث=UŜھ*Lt Wu1]KH'L8َNjoOLpr o\S(hB嘻ڬw!_ ;7.zpt5NDD}NjP'n+]yqLx #H#o2YĤ͉2f˴CGYHw3?AcbОf#"fn)\j5i#/Hj{^imu%97k5SnJja|/Ȅ{k#kBpDq_Zs faŽ*9sroV,=ab_֠[ Bt V GijD4vIxg镧ȡVRI+q.uԩ)OF2We,\7Ɋ`CPw;ir^ռydk Q&_mqa{e&?q? `Kᡝ2,AD>ݦ3.NB*Cc1ǧkCVsKVܵ$Ur8+台6@ 0]r]|ܔV}xP^\KN݇SX#[`euTL^d\a_+95jjA٫vBxu z담ޟ;6u"/#)g6StA3Hhgg5I\2"l{5hS7õ MOq#tpaA;w36矍|#`%\+i~Vy|Wȑhr'R $J#@Xӱu%NJC;,!̣Bp1EÌ#ua*znKj Ou2&] ƞ&V73QT{ur[7i ` iڔaƁC3.R['"ӴOH e/׾Ӽ@!lk,⇓}ۥ9A-)ώG2Mʊi[ơDǟ^F}3A.հXq}a)a } 2GrB{]#ecJ1OMڽ?U{ TDv!B6Qן}ȕ+8>ϸC"'MБ#[#+*G׎W ҫZ ա)XqZu}ZJˋA7wDjGpo ֲ-6aC%l{ _ld{҉dA) B:Wsqg*M-lA*T B?d͓"/1ŲX&2IPB'Lt:c:K`ODž&W|tY^%HڍogsSYgn< ahfP"vb/H jA.V;Yf_7!nY$lJ]'IyVM Mc^pT#9|Q.֋M]-2-"^8M&˼]Ţy7/.QP[v2+"d'sCDU1 o{Z{ =Qv%9}p9P _[ rP;>h(9yVULubtoַ@U3:5n.]$yuݢnj ojjgW8=Y(OM_MByv48քnVZvOJhȘ]#TPr)Ȏ13_RC9f\ُV1`PxUPœQX]->;]T YST--9ٝ(veguKGHgjiܳg1\vL0]!T#` "l)|6*2̵6?>%T*@wuFt^u |YN0}?N3zS~/deq, Wj w͸l=2et4YٽW]ѱڣҜ$4bo:i=e)Bw}5Bnomُ[?բ8Ÿ۳8v6v=W{i&ݿip0 :֡۫^]~-Qv9wB3COj_SWuY`พ]`R/07x'Mf'!̋\Yv_躮IAg$6 T]^{Ա\,`xyc}Q2:t9BgS6e0rtr̰sbo;Gvd:ˀnFҩ^N. GސJb4Z_՗X{6\y\> ߐ"&5tm)afIƉ`wF(4veg ϒלG3LqWwb^Ydi2=R;ʸoWFǥup=k|׷6 uΖQ! 7 (,&aM6& !_{ 1 曇nvdvXdq6h?Ze0eF|\k?a$)cb,cņmT:v۟`eDY_PdH5U '2nvXNtXgaHTa\Έ )k/,)%;<E[_PF۶%9G$ٰ9o1B}]d4Hy%|ؒǞ(ɳ=Y nriO1gpre*y\Mڡcqq&h䴋^ϖ͸tU??)\3k!1\;>Ѐtr9fZl>O[z(:ȘGuš|U3K|ogD2›ݷ 49\g~ޒ(qN[>P>j'T .0b,Ws aґ#FIr] #\2L@m;%&[,C,p׶?$t/WwLMZ9GKuą\u{ڷZM_F7C Q?t#E :ټ:U5Bp%iNB͟nlV9l18Y@])NQYCm(sSI^VfgMiT-]'d __arOg n8 c_܇LPHZW,uܬ~x= ѰQDFDY4.F ™0}wand~m7bsXgDks-IJ]2Vho頋_V|Y0mn'uyP'ZPP'f+qOn<NivK5o513?IetE\O:}_O㖓Wq5SrzOtΝpH' &Rw6K wKx΁ &:Ѱw*"z{P":eG>YmLjypA}[8V}RrkY~_ہfj=懟)@Xsܵv!-?{OwY-6 w3qM~]&Laޜ7$h/k5ߞ-QK̖(6 [?ڽ{`WgUz,} Zh/Jŋɿ\鯔s5e?EDGB'* 67@ݪtIqvFg1Z4orw?SZkn'+ [DP/C3B4)cO C$6s㡲[Вeşm'&Ѐ4hx~Hb"˺I4({[H$q$ "u2sJd|8: 8PG@fNo`x*b:$I=hDGҳj ҦpʎqXnMfSaŹ]Š<א/(t{⧥0&$|c=JӟsOq۶"BΐIJ蚣㺡r!,UJ1Ut[isIїb>ga,ZkhHz-eƯKD [ͳT_0"uw;kg *\<ڊmUVV105ٳ~"1X.FOS_72'1e,n3@tA)M&ecWyZFү2}Vr_m@Yro,y[j^sk}qp WA{ phO~Eq(ܝgZ"yaRE&(;ΡMDRn Cys$?nO{;<׳G3`Y! 4投Ⱥ*,2ZynfսO /+ܶ߉+?K$8_0_"wx=뗘RoyS./QT,>nW%) }io؃i8s&x6uŊ13s3jA@ۨSb5BΉq6/ 3+i ..br9Ѿӡ~KV> ёαj^ ̯HgSy*.e9-w\~VLu eQZ0-~(:okNxe_BૅlhWܼ(?UDE* w?,>sYDzƛ;o^w==_Վ]e}qRB(P&ܺ~(Gz3[KNMOi S%ct?6|wX]PtX>8ce^CO|X+s:gqz5tOEroۼ|_1`9k4rm:v8^3EcܢXb /=3t=@^oV3N_ 3 GjZWLghNJ(s  DD!%>ނO,S$wqMqOJG90A '':U-ٕ!.z_b\b݁(0^6?_HNt<ѷaO:]:Zk aܟNjB[[z<_Ј.y-.=[,p\^+k~|E9;Pr?·$Z~mWIIU"F;2?;Ĥ:r5>?P_Terw@-?綹z~䴢ˢ:Pi,1YZwq nyʃ:]A/ WsT힔ȕ:BϤPDŽ0o}tց?sTnDyl<9Fd`p~mtiD|¦ zۃ·:sslأAvGjjƳ73qm`oUHEN39%E4}6 ē(;"ڞɞNG'z(] >f(OfI`'{={ui0Ba+LP<E9ZA@r4ոk4VH`5uPǮ %W~]J)#5H`O%Q։ $2!a2'?~yoWkО1?N,+ÀEL8CW O.Y`*(NA%а^{B][s΄x/{^WfCR=$*] \aL\mdz~Ib?>n[;НXjpTD;:"׶}ɞ:ފfh"׉A F/\0q>O abV*W|W^{r9|Å[\3${p"3LɟަgԓXwOpo4nL~o`-%Psl̯PHEZ NHЪ\Bi"ũ{*5BY{˰[{pF 6iBZ艁e5̓l +Dmr'Ҽ* ":lLI?y' - fmmn9Jx_}~EѱLqU{He&-kz(v\H{h šW!(@鎽c,w'~qi_ꮽhYH˜IrD6~f-0PVE.lD^Y]ƉE?9bo;*?JLNb\5ֽXAщRVw]hϟȃak[EMXaեb"gR4E+]%0IcK8NviV*+2|-^,}'n_bK)R$ϦB Zt+ޞ< _HZ hǻRv%[ WѴdh1.uߤBcOצKڌ8yq%GYasU-`ÜDGG[v!cyݍ3o,j zfmm}6,2d\jo6dU¸,;%Ab-xznOa/5'*fN;N1P߱4ƨw{\Ϩx'ʨY:NR㸡ƬEb/3E˅u7/nqpϵ/nfT6\ {Ϯ: Wf~BW%ЬnED@ELÀGlᄻ]]+!kNB=+`3gV^4SB u.84QI7abւ$ѻ~*tyѳnGT,$&ߏG!feznSuT&ߺdخېl:hxQ6nv< \/lg`g~VpV"U]^lv2[nj;U«[9f*48Iqt p~q|d@%_fJenü8˪j$cqe^a`0~WT$[_.mhL \:e4Ʌ絙諩jܫ!N~M-iF3C]M#ЕӦ C:jrI͕ 622DZs`] Q"/|y?tN1p7euf?-̨塓>?o2j-B9Z$φK#C5W +o[2A^Ք <(*&uVk4"kRmlj_jTاsRqUvUQkw ILlfǘ!ןRDa^cs-C8?Bo6_{mBhEqH1<r(n<(KcRn+5,Q#gF9L,y#=KdKl9I3s6n2d]{SW_lA9Hg,NQ(\4Ot-PCтUY>.'8ՙD JGֿG.JR]뾾ej<.cR83A1g($#bnJiCMq5+ۺ׍u4p~jǙ Z У.ՏlHK"9\%Fq-幎(O~R:?(kg2u ]*TCEi>l<Җ II=Ot$ ^zŘo(dF y VL7Yf:Du=/: 6v`NJf[FHzrǮѵ;d^uhwn '?1/QQ_m`D|;'Yb%z a 1"!s#X7;]ѥpҙB_ݙ:תat-_=69'YW =C=Hl1Jkzv\t/%#ip5C9]i);jxwlX? <y+Qw#0WfLddk'ދ 8:0|]SQ]Bb_<3=QE~qĊd\B|N2(&vQe=NXȟC(cc岆M#,zIqoѫC_>Y)0zVN/Nq6ϭCЁ[Pq >X#eʺοaZoLTnS2Zk}UӉ|IdYZyKE))"DtcBrwm:_ίk ǩ<P[vvrq n[>\/dZ6 ٗNK#ͤ{GZce\dcJxg#pȇVɃI# $Dey5ّ&bc3IH/Pİ& j̩RM3&K[Y?}gOVb*p.f rN+ܛH{[\v*}y1EqNTn]Z|C/CWm<jWtZi O@wxXK[e 8#MFeKpW7Iw.tS UPl3aK5_U^tmNy8ߣ2h$ ^)OxYGn8 F@؊T]Ƃgsh1~6E6 vU_rtu6!p׸oht'oγuhȨ+`Ď0\ yu f.AqR}V|: ^F49hwZZX JfPO$ޏ_6`p=Ӵ%B W H ku2Etu޸v𮭵v)~_>x:gC}qG*{JPȨMW(D1hUĔf-2,@Z?kH I-|mup|.EQ4 oze'FXXQ6/v{V.V܂4gxm^Zŵ'7P~bEtQQ6ԥ^/ƹF@TTOpC9YD-TWV@,\K]vofN~wj˒>jOO,F q|9_hf#MGg0̤G?濴 ݔ*yp&.ǂ? wu_p_ +O:4kt8OITza~N'ڶƑ DP3g_rA9#Ĝ, nt[v:̬j wS)/GU k^;T8}*< a.6 MmBEm?Kپ='-KG]KXxn~[EaEZL<}\u1:z}]83NOq:I-tyLoyI5«w^հO!i7W]b_[ݔ_Il$2x#T%ҡ}7Ȕf}0Q2ؖ&`$2?3=dOK]ǵM^-Ǒ${P\d(Etz(RGBVw_Vtd r[4Aέrc:%#7׉]B!L L_ M bF(9]^yXG3)G! ʋri]\ueFj3("O86pez/'v@} B8*W:fY U<#؂VϜ[A)l:~(yB~]Sn_X%{4֓xy6R"#i?( k*$/GYJȭx&w+Gņks^Ҭ<y\|#>ā{חI ,x5]f;m\IU1m<ٺJnڿFw!d(ĻOÜ *%"m=SzPSIǙijg)RǕʼ +fp >ћr?sJ'yд=GW_'xo j) 7uf۲@ @?廑QKg`4VA`MLMу_k]X >\ sM AG6! QqInG}-6+yr닖#M  `o-2"jU%ʁXc!=ɀ=w&7d;5»㒿RWc9}^o~Q5Vp?"a]gh3QYHYj ۯ#N)sL^Bt?8Lϊa΢FlO.qZpoT8A`b5YSqBX,ZCVϓH aѫq&S6$5NSC& "\Z+Xvz~{HwF=^ɟk!F{I,oL3N&07 ^+JtCڡ;㪒cRqd. ,Ə<lxz4/ sg/Zv2!Qq(GUHz(Wwe*=|W3?k;/Vʥֆlz1wfb_i?ݕ(w2O) `?N@+NʂsodGAݟG)Q+7:h7Cxo1j$3_WfZC3BW s6$Er,)/if.(Ŋfb/MS4ʅM @cP< l5D?VW=#dzWUbR%ؔd~OQX,FV$MXF$_=.Lno ~ l?@$o{5o!b4*5GJҎ,"R@yw~_ mPXtLmm}d7dcCAe>,5ID2zXq򈛾oi+x-׃Y%BUNĖg8s,OM0fҫʢB*գ$~fϫua+OKt?$U/45|+(h>``#zM)sA&`t$8U ޳ G<; GeHr+jT {ҽ+R,CQs5V_24M0 Ɛ`}J&7Y!P]MI~k>*]h PLDrNw.~jCp 0}yHjNFYCɓ)Q4K/ 0`Nb_o <`nJ9yhA&3 zx0k ى*y8g!rd9tjΒuLM+Ez1ǏY e1:W2D@m:%ޒ#.*QgVR 7|A4bV0# kZK/ a9^fG?8295 =?Ԥi-iÑ̺?^K5iyO!S2V6u<%r7Ah9)(\p!j"}*֚e-&d{EX8U0wn;o?kzDU<a|[#]*vvΨZHWsE=).E mB*!E=^2Jk3W . #I'5K!zU if',i5 ``@n[Y}G+K2J("\n4*QcW‹\-meV#ʃl%.ˆ9\ #nIq_hܡEq*pM"z{ߨ60Sjg t\oWv3. o#{2 xxRV+{a}& hT ѼUeh ', I+;/K,R @F,XMUK[., (գ>i!Ff;r/kdI^UFR`e[.f)<7v>8O?gxSڽT`VGxLҿE#p#Tf vC~^Jj/sT_{],`a+=-6+ l¼ml2g˄Qq>rvnW:,(BL/kdnAP)"ہSt1%Ƈ a :jyL-D.,f^a=UEqW7;hl&oծg"o],Y{'SqG4wwyQp1ܸvaSNF8e]#)>\.:ZH<yPX졧~Ж&4]-p+NݴwdS>e?a<#䉕qݏIDC\b#$gw( zSV2vܑ)ֵξ7'M;x*L~~Τ-?4 ݥۤStGO t+|R]q]n6]:9W֣`kTP[Ciɼ?YJ< {]x)SQ-{[4sIX]UJL [eh=ۯG?UyY``9/:_fj3iUy'4Y/ ȻSѺmNWQ JN `x:[d<lW?RpRJB{yERK*O7_2LҢ rr?~ `2PW{ڭ1^S[.M#u_7@B: ~:}_5LHTԒ)9ꮶ}ﵔ0 n[%(:U56ҴyFʽ>.7&~LMHfj/jt~g':BӤV`*a&._,ZpuVe04Q5"WT߷aHQ!|Z9=&u"yZ莞o ʺ$iu?5lL5940lgGKPtVŒf 3(HS]4z܉!٤mGOnԶ0~rk',Yy|"o+H"teÅK(y@{  h-^0|\V<`:J_V;nBR^/ma#Wn\Z-#$NVՐ(*5a|qVb'܎"p2p)k|c;6W^:RSX<)+Y1Ka+"ڏWtUr5ژ4 8:ݍ1twױ8tOj'WyW} GRB""B彷Q++BAMި JE\K sؿB]tEy+['24(n@yUlūqL3,h *7<]7bdgs! 2ybMф$7G61K$cZ-^c80{ 4A u:mf@JM]P̥/r[I."' HT6.',=rӭr7@AԴ^Vz7>P•8N6V(`Rz#|bSavbzI$խJqTe;^H eGN^FJyx3H\uat[^w%~cin`<ڳp/jwGY+]+@)ly3Pj/|@",XH)E$\/69%C0FmVD{=_6i lBg2lRزQ5?H;wljY׷%Z'xk/N'hYE=E,Y(+F̪\T1y&myqVKiq㻝Wy5u6,mKV<@I$0qa|GYmY෮ܣS&S,d83KVv=udf?e1f 'ਹ%W5__+CYt"c bj艄#D"o;eqZ.n\qM9PWwK$vOK̷jώpRf~ާSYɩ>|g÷< =[t;*#is-|+ JfXȹWB%-6(S`ĉKD_;a9/%괙 >|.h{W__ݜzM4{#O͔ă:YBثe1r_ߡ>C3ɸ|qWOrHlH67S?(t Q]M܀vs_+efA"mw/dn`, ?^k6(4whDK٭%ĐrShPԏ[~>Sm(esC}}{ >6YNh,Hł=kD̓S`O sz-6[pMNf,q=Gxk:q D#[z;=V`yӣ"6ECykk|v 7>|ɋ)Z#jEmZ-x4IZW'I4|w'uKթ ,Hh/VW~_# ̌8GuIK#/Snf":)$Vwm+%6DaseGt\KyH4NSY͎rǵ_yfYz 2]}lrϨ:p_3)P7#5k؃5Q~{-}:?9uhI:"Lh}_^:lH] =ru!&ދS茇,A|=sRv* 17\'Yq?hQX^EdUJC]84UM(ir8$.09 ܍~ۈszcMQ>s~BIKvֻrZ`C ~5F{&dU}FF% O`mwqO7sKL.ng!~ϐWcu@;Uv& {EF(vՕ{$N!E4фRAztJq拚6~s0CŘlřj:T{T:qz9*GH$}ݎm.\]].`G>R'ŽҼwT\=WКRΝ=}'м}ٖڍOU]ީ,b\t8GqH ,lYr2sW?Xc6DI$@ ꅽG z,0v:*-w=9j m((Yd@^>U9%p۵Z1B5{:rCY@x׌ZÅ˃L&1* j$9s5n%&)BGZKђ~/x'Qs:YU FipڎiQ8'E=Rfcч!1%_ ½.tٰJwH3Oӧ,+ϗ;n˿=PI(̺] COPyb];-C-~c=⵭OXV&gAw lLfc5 __5X*X@C=e]%6Uz^5ơ>9 YiYp?8 "e:eJ^*(Z,/B9֏ GiEtUZ.GT<%u0&թSR8mUF`ж'.k&=}g/GxDֱzAgu7ĘFej" 106jM/ 3|J78WBC gb>V*0QdTX8IM ޟ3U{: i _Yum\ۣQ3mZ =t6/-lDNL:I0(N^1޳W+9ڰc9e1qv;4D =i?'zg/Gk{x3?+$yp_5$/%$ X֘5e7ouuJaKm*$DX1W0mF, k j\wGR䚛D 9dJ⤶o*_еًIԶr)^w\i7>!+ӗE_++pO-5 Typfsg 4CM3DӈPPNMznu-'6h}٪.\tvF>m̍[6}wwXЯ]uuLqM9'PWNqd(zvEp!~Ȉɯ?z1Au(YNN+I@QBSŮTq6lV‡X=GJ2o;&<# PVR ٝ,|Z5[W*+cu,.W(Cn)Q%z}?V2*]/)66LBvMk]yp"'IxU[':+G[tp[g*o+ڶ#bnqriiVz2_W}u{ ~ _4 thY![=?&Kk@!~[WuWcxEd0?hRJբ2J & g/gniɟ9XOJlK̉\6Mƫ9Aʠ.cuǴ=O:Hjͺ&J| iaxG;޺ eB'?ʓ%B nR5Ui/_R+@Wc gԃ1JWd?x{8QMRt&ƞk**qRrS3s]sqq$hܡjgq|e*!'~i@CF[CSR=#0 |a9ՍblGvv\l%b+ A-H5'Hg6˫u[U =I/q$'UpqY Y Y8' CU[WO Hьt{ĐEj+?1fh &.I -*\6/G^C-HJt}UK/J>h9*P)i,ĘQLS cq^}p8kB;A]y[|X4GfIJy)j\ᕢx#8[!{xkXNhz C>a 4llHB[r~n39y9{?ungM? ;ăM@,yAK{S 6 4 5 Q\3ZY($(VESԙEKLFՖ#ۖY +$f떜1Y2sYH$`0,a1tф0\p$L\e]iE#~Tq*+SuzWxv=j87hwK0lB~z4C.,3uzk 'U֛,݇ӏ`5Brl`fX;8ǖ䜥̎'pFLm/woǨ#Tj.LDd!?jjơ-98 I|7W̃`sN,KQ+$X9;. KX濸\t4/Ÿ㿉d!?ix&{WRX5U`Qph#>s^ o]Lh_߬DfT΋{+dſd $EvķPaHd5YL얮ciCpnKδ9!K#N |ǖ rԉU^P{\BrKa娞+|@ ECXh,|4orv7:T[g_m vroәӢ#g1+Eh9% u(|-i0$Wc]*b]w;G0[xAZ]d[>F@{/ߧ1RPwWyB, *(B__GnY :GQ\T,\d]Շh4vbNho)汀!@5~lPpG/ 9)9)>:xyuq1drZl3!t2cro9d8vj{.e>PHx)-ѡ6LYz]$ٯi}GPnsd2Lse[a:(<_x?sIدR7u$O."J?Er(A3:~drU@1shNߵ)D/tUcftOiv)Wp.q+,(M%ӫP}]ݥo3SN B/ ~$[:PY*K/wߌy~^RR}Bq 2tgMDP@waG&#ɪJ0cωjR;Wa0g ̓kpGc|@vk{MG̚wakL(SϬ{}c_z]w>ܻ*ـǎI5J^]ȐdxAXWM˵Ax@sFOڱ:;kѶ&Zi%cz }#&+M*5 i4o) >5s{lNճx.>O[8ߵ.FDPaLg-?jWC!XFbV9- =@N.i"ڇ$έ] S9f`sGCL7㙜j׷|y:&m[ۚ շ9Е(sIG~?ywN*ڢ,ᜢKט8/qtσAp#?_FBL)팡$V3VqqƺK_&33&գF]zEXе]Z;qXpu,R{x|p]Bo0 F7ƥ˨ɝ) Jj Ih6@3mcuj ycKHxlIW\oTȀ"#.]u7[]3%&_{ߍ=394 lJ >Ҵ֎i8[cjL]t\ moɝKSay{Hn%p<(j0ĭDc:H !۷m$kwx<{aH5*Dɍ )k,<.N)(2j*/1tZ ٭;hS)rb߄@XXQI%61͜ԫɭc nXf i?= ǝc7,Pqf4|xփwz:EDt~y s|Z8G-)+ҺU=Ѣ`IEmX1d~{[W]*oDZC;Lb1 o&Otr?uN0Ro8Yy{FH:ShV)Q0{RSHWr8$HYr6Uw=$Nd{qDTkPw,$jĕ//`HF:|Yw ըn71 Yav=Y"Ȃ}se0X)4%*oE3'.[+"QIݣMx(A-h-vԲ2''WfgNӛc{quZ.|V B7_hj(γ{L3!G2Ĩ?L#@(y p j6o AhS O핰> nS>܀mꪅP7~I8d8^w9M|Ӈ7ق]31(&ȸz7MJyZ Dy^fY$#nog슭K)2ϮT23-xwwuc(5Ha˜A f6c(= h_؂/.F{…ViZ 2 OZ<ʳ~̡Zbt[Яٵv~P9m '{69_Yx*}>qPWgI,}{%oοڵ/Me{~fW./f9ًʅ\]ٽa<P18o]忧m)N9 U:9TPxOˁ8 EtݹQJVQ W8‰pHvmމcjp&%}>q@Z9v;zmCHUF['yUs$_\q@PڵՕ g ZPv#OWi2zxSCQDRr0 \pU|q?kf3?%dKxzJ3XkHGCјjܒeL>#x !&m<ӯ@]Ϯ5#ۊ|$жٍQ6S Z uDtairK3<5KPW3 <ܹMȭ[Az}^u"C\0Wq K!҆:DQY% 2Pr3T)u:`& * &w푅0sLb`m36z!XSOHppbN?Q$O *sZJ"S%i|.8f[rԕ".ߣ֏P F~]_^ߢ2ёrpPR6@|6pf u!C ꚢ!Ub%{|~!f6S/_ xH-N];'ƓrZg@ W|3&BS|Qz%R`yUJ<uTnG9zֶn VB =z|5F~;{^zNZ^RʁBU'u"E)[+0jHH57P܉?mVx-:Lq-2:* [1qJl}ow͢ :!b襙fuGq~Үŵd埭'4̛nJ}⠾-x$ԩׇOkqܢ}iiGrXuӷ@!jf!ԯ|T8&jL%S1Μe}7 ~߰SpOW+^9'lL*jYw46o/Bכ i Boqt8ࣄ1po³^@ixA#WЦʶw:J{[dMˢ &0!MCk_@θ1jԕt%NmiX|z5[O3H^y?o%BeNi0u\WysWkYKX\T{:"-T7~T%y&R%昰 w\K|?&Ʃ{ߗ>dcx8:~m 1=/*G,M?YT,r熽^ep70ԜV"Ƙ8~A>d`pTV qTYSxou=+(8m֓&ޛ#4@۲{$[][ x;,sn@e/nm ,$#c&=~.4G*G,Uq:m7j+Ji*fqR-<؈ʏht*4?΁,;on{)uw \*[=iYjd><ȧ;R1w _f9^ߍ ϟNi{[ݗ;ol<v9Mm_홦ˠd ! k h“p7ZYqd3]\\4nKaeEh?۲aM@ъaDx>  8{Ie,b(g4G뺤u^%Y<>YeцqlUBAYnڊE_fyJoXB8bSG~cgUZ,ofI+ ^( oaun!ta5CުnK,BNQ!֛}}ۼz%WXX К{IJ?<OmWU[TT:EYEptIa/^X} hP"ˢPQ^ :q9.Ց ' I^b+,W9*ľWݣ"#S;)M$&o|8ڭZ]cR~NQeQ鲵qȄ ^X (sz*W{P1{j1=õ)p&[cZBee$9:wtT?$iliՒN6.DuD< = /YʔW^E\e!YPOcadk˧)pE:InH40=ʢ$/cONW|}gQѧrq96& I70ot )_2Wh|'WJB)3ܪ e0YFKm ĥԭPki@ 6tR*[Kw7grV߶+?V2fX$;{FWK^^54VF#iedKnnܭ*'!1hƉ8hQx\+:!U3nS|\:_a1>#3G^8`UbDCgBu;qeqf@ȯ mWpsz?:,ڠe4YdP\2HYbmTRUBqt?3*HA->q9>NO~< G`ʟIG MHdzsWpzS55/+Orɔ>TkR> W0C-h{ZA(hrT&,Ae:EFͨZ4?[cG$u(B[$D {Ew0ѕJ2KfaPÌzw[]۟p8Su l'rSeF9jq+9|{z&x,kj3다%|\qQ pjiEtVXf&K$ek.UB-wt3Nu}_R1r,Y=u) ^v=a6UЁ}n>}t?,CV]8C(mӘyP+AV 5GUy2ƭ{V:p%-ƩOP2X3cZu mYJ?.h'|JΤf3 QCJ8H ;)\=u6c! Rh%Y4%.quJr%dZr(Ǘ}yS߈K7ꐗ۫viCOjCeZ;.H3,'th\;~ғb*)DM0k& A9\`NpadpRJ:HJX}yRxٌ~ËRZh&0o׍xSgtPKfI |Ib`}y.՗bY?`{l,@޴; yTqY -KD dur<|) I%'SzԔBFe ;mM}?|lGgaljW;m0tD^z& :+;(fiڠJW/T\Zn٨e|T!V"_GUiW J!ǥ-xA9GР(fߡߪxq p3" 3(M׋tF=F똇=hI.cІ7+jڞ>]XT@E(}Ͻw5p_sR$u_- V!WߞNLeA[(Ce \Ҥy=8R^ 5``xULNki.Cld|J)m(4 /Frb,BcChoW,uC+:DzO8Z oLHp;?׋K63wmdU6*@g I<2no@J Du QZIPF;h Q3SGkV.gF'Sd+wx&wu9)[E>d79cy`pn95GȜ_qMrs+&q+au()p)'6 ӈl/7[˒$3K5E'hI P{^ >}] No.qq?d^f!nӜ*)o_-RP:R7-uv*2;}tK%- &jmT-Kxaˈd|Ġd]FJm'53!(oZW~Z&Ak †E=⟏TJ]-y6HɈKc&+T{\ɇNzҺ<\1IEI`nWtٯ8X 8wu::܏0 =Z8f>n2D Emh+K+MoyѶek i:fRԪ2䌩rLҸʋq]f sEttZUSDd޵"<3]_= eO%WS$"qTC*?՜_g,9a\ ׻ԬoScТ%ZQlcqIT8nw!z ^lF^?qU[v.58|985N#O"nZ-+r][ A耼ԇVgǯi f+qs57Zq1M^ߏcw4,0\?B2ô踊'rqiLE:q%(/IX3~rxx&yIM'[A**EgЗI(~:/C_URį.q%:_Pb֧οǨQU`6eJI.K⿄PE]T%q*n#v+_:qT~y ".T嬙5pPvyx0XW7|||-W P~pύwrηaTⱴ岾RjmYXb^Lp pWۃl(GS*/+jr?yK RGф%"2RJ㮹u'L.!(Qay^Y2rϢ?Gð >\lGB5HZpƯzAi `'8_Iënc~p8p8p8p8p8p8p8ck endstream endobj 36 0 obj << /Type /Page /Parent 599 0 R /Resources << /ColorSpace << /CS2 604 0 R /CS3 605 0 R >> /XObject << /Im1 39 0 R >> /ExtGState << /GS2 636 0 R /GS3 638 0 R >> /Font << /TT6 621 0 R /TT7 607 0 R /TT8 626 0 R /C2_1 47 0 R /TT9 48 0 R /TT10 623 0 R /TT11 628 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> /Contents 37 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 11 >> endobj 37 0 obj << /Filter /FlateDecode /Length 38 0 R >> stream HW]o6}గdpi~Hu$,mx}Y[,~dB5>Η hћh2K4Q1Bb) :3!.$ 8M3D9.OIB)łݺ̚*oQQ"[_T$%hT;pTZcW8MwBbɡ>󋏗z,b hE-9:ooUwHm9r<"cn_xmv{rp(^A.Sge,\4A֪Et0DSLyfPUUl,) !yum(\"pVy8X/-$N8G4ZҬ;SF#e Sl1I_/V(4|̅ZdV:UZ!ot d @\'I}F8mE8[(?0qvӇ,ymMuhJ lVybf@+rϟK8Ld'G%K<,l\F8eP7aCofDJC@WD1se^չn6vTlg:($r4q:}IH!:ʫ묩jU6*/mL5 u$ `>xsszz eqjGxgj9R|O1}᧪%\r^1,_ù Ԉru%ˎe;:|mS U)f&*4%о,GOgR`ttB (<4d yF"Ǘn֋7hpOyQnw[:(1"|c7'VvFhcbd'6Hݟm>G+U7KOj۬\y$QLU1&K@&HOe5ަQ$w,#9lx7"BP*dBP#Io.o,<#mԪZ5hKbs@k&EMq~RCm4naDp&l BCM imNJ~iD_~cF!fuf3ho/'\D,W>;u`3v r !|NYfWOLp ^ ̆z8(Ȉ2՗A.n-eTpC. eb,FKpKR)AY@f{vOEj endstream endobj 38 0 obj 1636 endobj 39 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 457 /BitsPerComponent 8 /ColorSpace 604 0 R /Length 22494 /Filter /DCTDecode >> stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;X"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI/d^7}֟Oԃۻf!L~mF1^CslժhuNgg$e%szf݁V&6={,cU(və#WJ}3+Ǿ̩֐kֺ֏wJvTp.u+cߋUm'^&U䔤I%)$IJI$R$؍ncrlAppd74)(vI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R;\ZZEo{KG$pދ:O2dnzXZ}6ZI%97tΪ2݉EYwQV>YVD:7&W xWO]\:^Uqmvt4o,vON]9wa8ag8@nV54$S]LcucC]c8l "JRI$I$$I)}>2-sikW3_UfSnۻmLtLQNuEQncP"lwI%NN}Z$C}]`D oTMk*mF^C3w_ȃb$ CGJvLS dd$%q&ym CCպ]=C}mߣݺ6PZ F,}QX8eF2юX]$EjI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJX=[:6ۛs,E6:M'Vc1 yd⫧ *mm2懵t#s"$"$JRI$I$$I)+^-].+>u՛VimmKY#?'5)f6^feUz.6Cخ sc5s5cLW?s͞f75΀LrˈTtzzN+1a;\"RV^n;M8MxEָ}X_# LIpӺx3 ^d>p~Q׋mZX=6C?/}8yaⴹ`ac.vjz8}kIޜ(6`eu{{ "t~_fN.VexVogLˮT;_Y 2=O{/W*d8u^)D8DFU W}^w5Sv>_D,kKteA&؞|8\oU;b iM K?NCJyܖL rNH[uPiu+/)=ϱ#kF,];.Ϫ ۘ}NlK6g><,ޒ[/{(ήTѻw!) nGLve嬫>2c2˽cZc|8 L#CsrTŎ$qfd?ӫ{t*>faSPF>:3zf.] 2)e 4e`oՋ*ckdV_]p0kç]^;[ xH+ATjL`qK,G_]5O-??wKp4}Yސ4:nwZȼםHi"WtD7k?5ctzO9̮\׈{\򀄸̸;x&NgXaas<@N!=[t卛}8[ӫz-,N_d-+c{.͂Xf smuetb8mkmO*atը]nZF0;Kie{'gv'jE֏F\YCy8"#?L$cs:"wPy_C*c\miuN3:VwN}ݖl\smfcEt^.c"$Yca֟_yK߲בfD!~c##&np iFdqٵղylǥ0;P\֒'P}7xWT,ƾ::fGΜ-rcYmc|y2#3 h_[\ ]չgfK~RTu! 5]P1O(fp 2ٲN֏Ztnֺ^Y{s)kH7l^U֟Zޑr1 &^% e*D^O` D2ǽ:ӏlgYWP[c;-T|+sǐ&}64@aU<I3l_w>Uh"VIo&@ٹe/e}m!󮿀#obycNY2aZ~vI%;%_+7 ̻84.Xo^5a-{j-p=0Pԏp9 ' tY3侳Hvs^>jf7oKecWu< qyyq)Ig~?Et XT`+{\v&Tw8fnHnHRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)Kc]N]NY6*. [6U|'o,NNm͹vsr&1cӘTWSkX Flk['䈇MZ$nc\DDI%)$IJI$SϲNĻs,kw}-i2ұ)韲qײQĹ.t̸ʵŖ\Yc##@ (witޓU.F{Η@l˻q8I4)dRԙ$I$PI%!5_hHl[.lCLrQRI%Z1{e&pLq1QSKDI]$IJI$RI$ zk}}B Z6LiB5_hIl۳$l A'RIV_kGNtfIχRD#o#hHWUKklIL I$jJdu=rӝ+EH$usF7=jί[u 9 % ;kcYq%QvNNmnXߣ`n$k?5 UUmV4@h"%]]+Һ~%)6\ּJ%$I$U3*˥ w}UJ`zŮO;mQٞ, ~~7m N)6imo$Ю~K~qwQcdѕKnDZTcsL U,\K>ɘ-cZdknk8p?RbL} Y\\ߤxDڃ:oHRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JR-X=}NkZA,qk^ǁ-y]o+f{`Iq%Xns9$I:RSպWMhчϧYVo1!R}_KmVcs\[ZL;gWoZwOvf1mY{i.Zl}]>ةޡoctr}Xֹ/Z41%C IƾF5:Fp6I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$ILgVn65"767yk@h:@y9yظ m2={^He[@Aݰ%&&>&0n76XDyӠ Yk"qԵT[t#y_I$PI;I$I%)$IJI$RI$Aǧ&Ssw1"H F% (t:w?7?trNM-n2 Z`Qu+dto@N$ 2{G5 \}-Ӳ8Y\\ߤxD-H4~I$I%)$IJI$RI$I%)$IJI$RI$I%)$IJCeUV5s@ kv $.(bf=v[[` !4 ?u ݟN%Ncln 跖NO* )ҦگRU湮5AwDI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%,cTYvi pM= Omu V܌.pQt{t]魵TXƈ @7\*: _F8Rin6`I$dLI2IԔ`$oSRJ$JRI$I$$I)I$JRI$I$$I)N=Y4D 2p"AR0m鴆Ӗ֝tnP][:A!-8NݿNBew.s駗|\9IWihRTZA.HI$JRI$I$$I)I$JRI$I$$I)I$JRI$z:t]N= 8۷k.ƻKy`nt۳iĩYm\m;Ay`SHTsC@icK{n?D:mu/mZak-s\$GtDI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$.ڵgM|ZAW?}=$7_H꩔ڪhelcDѠSI$V.I$$I)I$JRI$I$$I)I$JRI$I$$I)-MNj v}~ l4<$&27pXUmwVjp}v=APAZ1>ϐ[.}LϷvݺ%I!I$JRI$I$$I)I$JRI$I$$I)I$JRWOk,Π5Sp.u:pt˩31JwCZ*`}X4{Z\="JRI$I$$I)I$JRI$I$$I)I$JRI$I$FE8Ժ띵0I$$L5%%zpo6T?SُU>mİ}?K@f/ںI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JR[̌{1%↋}{M46Y]]4VwLžޭm̬[Aw0bӻI}n$}K}?Ցm}Ƚ46Z=:/.3KLFWP]Rڲ^Upmt: IRΦΝLj5?YK~E vM /ھtFoغNEnmTz}E7&SդݍX3sZZb:Z4tĻҳ(eԿȴ"Lzv3_INK'=rٿk'k=>@3.0Jj]KmV>CK\ %$I$RI$I%)$IJI$RI$I%)$ILRWP-1~s񃠑0v0F!&IA&^]xeU3W熴I@$%"ۛ.d02\h;KXr2.99Dm֝K+c~gIIֱjؘ;57Usk[}Ww M؎g{u}'US[~PIdvs=;0 70'>NUq)> hhEkVNX<+n[c\\I<ky n6V,_EmF$}Ox~GU&b0d_mvL63htWp}F;[sZxa{g$I$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$,Ϭ5ӑqmpun31ߚY9?C;?`$Ji浖c qkI>$u2t]rqP^Nϱ΍n<-DS_#k&< CپCs7s Y%/+{5XnEcAVl6鵭 d<Fn5SLz0c7Hv¸I$$I)I$JRI$I$"U3 kE R"COW&fw=+=o]a9iY<#̻v6,cIm[]8h"[ִ~k+Pk c# *koi *Ǵ^[Ԭn۳ @vAP#|sqT-( tfKybcrs=>}̪u9¡t׏\즖1wk@ItZI%)$IJTszN>U*;=Ilc>״}n$;;*م]YHƾMW v@/w]E+$Iis\45pu?*oM~}8!v{á{BJtRI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$պ~PiƧ.g=[lhpnu[?3'Mv4\p}}\w2i撝jM,mUT` kZ kZ dD:MZZ cG5ŭ$h"$$I)I$Jit\폱2hԹ.pBN~f%iWQ1eoYeO'&Z ZwUU>jV54 )"K'93a3_vX?3g!no iX=O;{+v̚ dts˩Ymw-x"`RS5UEL6heuh"JRI$I$$I)JwJU[}Wu{uE3tCH$`697'c9C2'_k Xu2߁wDBgW:K^b8hEkKOh%+Lbe(rYM=W ˭peu"9q:I'W^u-d :E8QGKvgnKGpOshkLpnFMd캪+c#i ޘ^_nXr)=_0bVXSth$Uun'ث: WU j-uNl XID._d2,q f('[@{f EuI$)$IJI$RI$I%)$IJI$RI$WRt`a`Ѵe;g@܃ ~ X52qqnn|U̒71c$):K;;9ߙfǼm/c735IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$}aʿ u,gzyؗKensL8`>8܇cbds2/&_Eal b{Ż%kuW2HǍ{*}$є32s/en [X1})HRz} Q@79[67i:v&NeY/%RYVt?&bgǕNTG/"im1R4 ADUT}dtU];5ֵ)2m5rp[{d uWI%)$IJI$RJE#"j]uĘ$LI&] >Φ,u=6mdo ̱CZHt*Թ/?Gii͚GjWꪺkmU421@5> 1ޤ{^Vdk2{Tq,s UWMmV4@h%Al)ntFI$(RI$I$$I)I$JRI$I$$I)I$JRI$I$;b_OQn9kY zXE>n6Xe\mbecә5_ncpH=M䮥3Q[['&vc9ƤY$IJI$RI$Tz1n뮧r mrZwwWF Jo$Zl9}ū'f#rMVhmi8>@]GjIJI$RI$I%)$IJIs[:iNk8xYU{*M qѯ"\֏/cHI$$I)I$JRI$I$$I)I$JRI$I$,NwNUιnsq"[׉zMY:m]ㅜU 'w|SMMT9 n{˜LD:*c[sߴsdy<RI$?d|Z]~EFvI$5J3z_uhii͚GjHw,/c֋i,\;Y.pnn 2~'i ,$iԏI[魵Xƈ DB΅G HRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JR0h`ۊ[m6ƵN $}7;ح2Y 'sbtwl8{H*&uA䗶[vsjtk$.{}t/^6_TctwnZ767nD+(}hu~{zך.cu=Jv0tނ~3)7SMv4I$ wH2K=#fb[OQnUyڞ$;oHXIn~8=vwhet쟪fk6Q&Ǫ^laFn#p)NXӺ_R*l+nz艹ݮnln'Uo,}6ۺgP]Skrensd>7gB}7YUϬ aV8h9vx~?Xv5f^c8{\ú NDje}\}OE2XN;OpIԎ/^[-u0mhsx{D{BY?aū#c_ͻUtշqv5kb!m2 #3b,^fNv_QHHnsC+IFUL<̬o]e~0Av{mѡs?2}`f&;쵎Eu pnJE/ XwGj?nԔk'C};Ofߜ+]S 7Xsv?11pCϿfO>~꒟K\ΛԯxY^=):]=ۿFoo9 fU=-߬eչۜ_| YfXO}^mEua"`CR\]#;f6qwT"Y9 {DQNNGPu-n&=bo7Vo]v %runmhӏq]Esn驞{UGֻncz{apk4;XA%3f/o;6ڰ觩]]ɢfYc`%svKAp0޳}d9fsYMd6,V4:0^\wiک}]INwSuKȳ`ͻKˋۺ\ݠ'%SհfoKmֳʎʙkv;.cU2Ga1E,j}b.tK upY$Z}\cWeYuXok<l9q'DՎGPnMί:=cH[+Nw.%)$IJI$RI$I%)$IJI$RI$3X=[יִ6sZ,EE#W㾷 )IMLŵ5s@9̙()l԰ߘ,Hβ-O0vtC/#.c[nw9M62IijYs9q\ O!jZ1mnfi2-hq5U#lV0HF'INAtI$)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R \|[[&Us$x- rnߝa| {-թh Y=Cl;;m_Ss1%:}Qܛiic,}nL..uku5Ռޙ 믵չ-1.%o$I$,Z9Ke9{A1beJrDx8-kqz]aT[V\ deXx8}FeOvnqe~KD4\I%4^6~_Q}C]w-_ =YXzm=#[gKI_{Ʊ{W@IMtnίgZ *;u8 k68sgd*-}3;7Uɬ}uz3v5k[ JptnMls:]C+F?hͼ\I%)$IJI$RI$I%)$IJI$RI$3X=[쟬6rpqQqlk>i)I:\Ɔq7;cZ>@$DI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$SQʿJc1dkD2Peqr,ewQ&04k.t46gCL>%Zʣ2c}o0ZAi湮s\sH):I$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRdۜag0 )!m:8 9['']?gSkn86Ƈ4=c4!$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJY-%u"ӧNVFS6zb4 2&IuYV«?KK[@{5epk8)*=+6ܪ$5xw;%7sC^ǶKYSfn*JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$oX7fd#Ǯ=L{s\۵l1[$pR`lk~t˻ 9E pF*}a987ezӋ~hmTN!kL6'Yi;232vY =~%/hͻ\Ä:$1:1C@ֶOQ֚%kw~.N;`>EUxWRI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$Syb׳=nkcRqs/伣_%a{YEk~@?F$Y$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$SSf7߿#ϴ_OGs:-y"t8r+O6ԱnmX#n$e6P,IJV=fc͑>NoO·o-vK%z8Y ԰v5ՙqYξ^ݾYu&f5INHtEL94 Ɩ4qkK@'DIJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJThkXG"~5;,ȝZvKs"UĒSO}K!xu7`LN͇i\Y}Fq2?k1ٶshh.6c;}>A/$Bj]KmV>CK\ %$I$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$պOnɧag1_ckiq t['']?gSmW˩{mևcs\ k ;$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$k$g xX9WXې/ƷYꪾsmVC%$Iem;&] Zq&\YC5RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$ՙqYξ^ݾYu&f5[u ݟN%Ncln 蒝E cK\ q!mW˩{mևcs\ k ;$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JAFef$ӹkC:U\\k&\Ѹւ\ L\MyFnh{p`IIY>WG*ߴt2&fEsZhpSmW˩{mևcs\ k ;$JRI$I$$I)I$JRI$I$$I)I$JRI$I$!j6XֽȠ}#eGsQG7ϖ;э-oö\=g:IG@h<ޡgՉS^ :,UY:]ԽoN}v05uk#O* 3tޡskʫ|C:>F @%=JK'Z`n_dƻ.u,"ۅ`ªᱜ4PJwX=Gd=>ڲ鲋 0m -& o_c7zJuX9='&Mؗ?aa\o7.5[O}j{SgIRoӃn]sG$+f8wHͷ;˭ k@ 6ێé:OpzOL]M=K u^Km'vEx8ha$OL[MK m pmv=`8]X$$~,p?U~?>԰Z)4`۴R4>i)IdWX ޫteΥ]p`8UV<63j9INKC'԰V]6Qaf 4ųDV>,p?IMqm5事Kэ-ky`7b\q`n<:sm?8V>,p?INK'#3K վ{N CiuiLs}WX ޒdIɃKa9v ȵg 1wIɝKia5n ǵ  䒝OپOGӞzE6ƌv^^%;ʎm9}JCp[EEiȗjuiBo_c7z~c]s:vmCmUXm|%;,~u wRmYtE6qX7֯%:,&K԰7lLJNqm پ)I`df}azUihm.#nt}j{S|pqk98#nFMX: ySORs]uגIݑk4Xc,:wRk[u7Aݏk25:V'%;,}j{wϧ<,/Vm6-Խ2 -JwY?f8w'&5w3af/;U ڇRS=''Pu,&՗MXYhpm,ql0U}j{S?Y2nĹK; }A6qxt6~p}WX ޒ՛k^ Q{]u,p:E-,p?INKd԰]uwdZ3K;dΥ԰Mwc̆ sՉINK'Z`n]'#=K բhcF Knu/q?LKc撝wNǵ&սpnl;湱e/ṲKnq%GZ`n_dƻ.u,"ۅ`ªᱜ4PJaվyf?>-~;2=Z8d0XKm NzONXM.(X"`_GWQZF]Tf+zԃYkJJz3_@8f[liSf> 2jnݶ34Zf8wY%ΓgMT=ݡ紏צIV>,p?INKd԰]uwdZ3K;dΥ԰Mwc̆ sՉINnmX4~6Mqpu6c1k:t@7֯,^jUze]]x9γ&@i$I)I$JRI$I$$I)I$JRk hkd Ŭ.-iw$4<"I)Wt\FN=mlsevRM#sSw<&jYZ[n`\nz'P~/ReWۏMKKouZhnfdD<Jx###&bvIm~m}viRSzU#3$N=u=Qcۘ:ݭa$ӃЮ{~KzFH={Ƿ u,m[n>ۯ#IJI$RI$~ho='?gzhv/GǶ9t+vG>~m_Wt~jJmbtZ>?YenK[Χ-tU[7aAz&ex}Z ]G2N(Ȳwk FySvM-mKlTQ;wHb/7 ۙKl5T9cfFJtRI$I%)׺V\Ɨ6mqv{>d4DSгyeud7#&\d[@h`Og.ioW47ϭeO}xf;e͹sm&ht<}@WnC32*iqkvEmsg.noW;Oeezae-kj&I;t= I$I$$I)G3Ji̹]k"ʘ5@'lRL7T kmne^7{tp O? ܜueY.ddct:|K5E'WS>ﶗ[5nqy9ɮײ*wחk! kk,f_QLEtX(>ʪ%ˬlmIIJI$RI$.źjӑ]nu4n ݣw$buZ:];FOqȪz_Fϳ9m߻w5tҸ*y}Ǹ{C=jmэo˦-s쭕?N;kws++m:1͏NEdRkk}ѭKa1vU~&'TT绩bэuXQETCk5cclIҰvWxcwƳv11ĤI$I$,ۖeF.;+kёS=G9ewY醃&wn6XoeUc_vMKtj~kJKW\[g s*8C>XCzcI ;*WQ̷z7nMa0Hrى^ޣv)Wm!o!{,kI&]UuQ:Tcc׍sY}QO?zgHJuI$I%)$IO=zxyvY+Ppׇ_`׻`qp rzn܊ouCex;idW_R4t k:̇ke;btO ٸUٸK,ǯ'sa){l[Ep6Y=%6:>m^C\ks]<׻lʼ|+ppM]~E7Y57pany%)$IJI$Ss31Z~6(k3F!ղz@6^M }r]칭7}J]wNֵZK6mt΂aҰq+ⷾ܌qm%?II#ݧINW@Ù//\cYK[K[u ;ln]2f`~4:UcnmS15̶9s`3I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$J endstream endobj 40 0 obj << /Type /Page /Parent 599 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 621 0 R /TT1 626 0 R /TT2 623 0 R /TT3 628 0 R /TT4 48 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 41 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 12 >> endobj 41 0 obj << /Filter /FlateDecode /Length 42 0 R >> stream HWko6_~Yؘ!%$tfN Lf 4]02mH$b|/IQmɏH=˟wA޽ap AQ*t@Q"e">dIϢx`^ ޏ1AgpyZ#j;_HO24~Xw3T.gMyQ\]^"S(VE*G/"*Mop@]봱nm] +Ӂ%-'I͘|ܚ /OhЂnNū(PWm<GŶ*T/hS"?}ֱGYQNL;aae oEPv3?ZyXq*c_/hQWUv$֋o]J@ʖAKqJmD~!*5QCkJ#YFSJ D\uEbY;M;3>pU%*O^YűvT7sTf"p2 p`UonK<8c@ܪA gY"xڂF"UBsQ,27<*ep TN傗hCu2sN]M򕸜@@?h"wUtB]榢r&- IY]S9: Q9UTGUh\rkmlڧP<܀O7a aY -h_~Z| 6W-8XK p*K#:ʵ:LOtφ X@pHLG:Zyk(M[j'I{`A*Ɂ$6kY=ƻ @)B2! l8L`Cn$ UTݣ8qb,7L^^!|~<^ݞ oho:Bl)d@͗㝚doM*W_x"DY=!tڡ5'DЩB=7W&> z,PIp[evb,|w 03v=f%qVg~wpߞS뒃ŭzx }vⱱº%v8rz.]ecSxȄšFZjhg%.Z8*alL<oƠ/&˧/y!pq+!{3!0lʹGKjGQkw PI-Ֆ-qycgXQ })GHT 9GV褗0v.hzP{]AѫP>Y`q`' ^EU:݌?paOTI .b5g1%>&E9AA%PWgCĶc7tkme%{ĭI@qاp25EWhMtox;vuk!U]!0\`s=]j&3 nebyܭLjUi%dAkP,E/, X~lUU$b1BC}C_q}M(![d3k5zJ@oo"/@t +-E{0I| iOl,N`%u͕_C:z1 d3p`& tQg*7"^=o=_Q5^/nw endstream endobj 42 0 obj 2202 endobj 43 0 obj << /Type /Page /Parent 599 0 R /Resources << /ColorSpace << /CS0 604 0 R /CS1 605 0 R >> /ExtGState << /GS0 636 0 R /GS1 638 0 R >> /Font << /TT0 626 0 R /TT1 628 0 R /TT2 621 0 R /TT3 62 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 44 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 13 >> endobj 44 0 obj << /Filter /FlateDecode /Length 45 0 R >> stream HTko0_q~Xc睊Vj)kFUVrĔgp}94N}./oZ!3EFVdS*k&$3&RAʵ<0δP:4#lb ȳ!iz]׻n_ZBՑ,6HIl 乪}z^{]@q9ׂ@>CMdvV%X/0N|b cS 6!(XS2sG!A$rC \nO'8 /l2L IrR˒D`)$ ٜ3TPoJ\-5_0NC˼xo#}?bdF6GZҡ 01eAaшIy E \\ʜ2iJ(JoyBOy!s2[vs2z{ [. *S+M$x7:Y[K6{uh*X멐#T!q$Ē&@aޏ}d #sӒ}f+&#<պc_SwAG8E-iliE< YU^L^|o3+[Ȗ endstream endobj 45 0 obj 772 endobj 46 0 obj << /Type /Font /Subtype /Type1 /Encoding /WinAnsiEncoding /BaseFont /Courier >> endobj 47 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PEINPA+Wingdings-Regular /Encoding /Identity-H /DescendantFonts [ 77 0 R ] /ToUnicode 78 0 R >> endobj 48 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 333 333 0 0 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 500 444 278 500 0 278 0 0 278 722 500 500 500 0 0 389 278 500 0 0 444 444 ] /Encoding /WinAnsiEncoding /BaseFont /PEIOCO+TimesNewRoman,Italic /FontDescriptor 67 0 R >> endobj 49 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PEIOKH+SymbolMT /Encoding /Identity-H /DescendantFonts [ 79 0 R ] /ToUnicode 80 0 R >> endobj 50 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 120 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 677 0 708 0 0 0 0 0 0 0 0 0 0 0 0 698 0 0 0 0 0 0 0 0 0 0 0 0 0 0 479 0 469 552 469 302 0 0 0 0 0 0 844 552 521 0 0 344 0 313 0 0 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /PEIPLI+Garamond-Bold /FontDescriptor 71 0 R >> endobj 51 0 obj [ /Indexed 604 0 R 3 52 0 R ] endobj 52 0 obj << /Length 13 >> stream endstream endobj 53 0 obj [ /Indexed 604 0 R 3 54 0 R ] endobj 54 0 obj << /Length 13 >> stream endstream endobj 55 0 obj [ /Indexed 604 0 R 2 56 0 R ] endobj 56 0 obj << /Length 10 >> stream endstream endobj 57 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PEIMOE+TimesNewRoman /Encoding /Identity-H /DescendantFonts [ 75 0 R ] /ToUnicode 76 0 R >> endobj 58 0 obj [ /Indexed 604 0 R 216 60 0 R ] endobj 59 0 obj [ /Indexed 604 0 R 31 61 0 R ] endobj 60 0 obj << /Length 666 /Filter /FlateDecode >> stream Ht%%%&&&霜]]]^^^扉CCCvvvAAAxxxEEELLL򌌌𲲲lll222PPPHHHfffRRRMMMOOO444JJJDDDKKKNNN+++kkkΥZZZ̸BBB666'''uuu555QQQjjj獍hhh㡡333SSSwwwFFFttt888\\\שּׁccc!!!VVVXXXqqqzzzrrrpppbbbYYYꤤmmmgggeeeooo[[[|||sssTTT{{{aaaGGGWWW@@@```;;;???III:::<<<999>>>777)))͋___iiiddd}}}###UUU 0h endstream endobj 61 0 obj << /Length 87 /Filter /FlateDecode >> stream H 0ܡ.{{1Ɯ{Yk[k9gc Z1!J)> endobj 63 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 6 /FontBBox [ -568 -307 2028 1007 ] /FontName /PEIMOE+TimesNewRoman /ItalicAngle 0 /StemV 94 /XHeight 0 /FontFile2 64 0 R >> endobj 64 0 obj << /Filter /FlateDecode /Length 7856 /Length1 18720 >> stream H\U TTG~7;b5ٔFFM#H#%ƨcpIr!1 gNt-N"zqqq5fK}^}^h8c<+z$S0?~y%daw'vt睜,o~"W&Ξ`vYb3]̙ᆟylO@ti@{}!X OYO?|#cb}M" )Ѐxa*11c!؉ @ld`3.cJq \μ t@}3Jc/8 &"tN7h}B_Vܠp]tG'Da Bg~R!䢆m"*IY=8OlBR=(Y;F Qa&:V1h}xc毿e 0Gy`c s5. ?RT8CK-/cV^ >>Ja6 ֡ӔA@e }SkF3|9Cg ޵4F0FxF&c Me) Kh)Ne[sh/S8O=ݡXH%@)b@axD;T#>(#dt˹r%sJ(SdU)uF]ReU!KwK%RldrjZ[Y_՟8=/r^2E+)+fd\+64 "9Ki⑜C&CdT+ I6ES1G:%qV25[\DxaY&lTQQ%TD TyIQ$*(`,zY V-_V++So#h [g1l2}Us0Mv`&+\ŗ 'W>T:+]5ģ(佛tz 0QdwVbXc|*Xq(q 1>C9T -ڄٸuK x7F4u!V=KӨEʰI)C<;xPMz&1!>O#wȈp{Xݻ=l%sڷkj1˞cz#s*Ҟ2g/r&Jiu3ž/ϔzRGs0:LH4u|kR٦n=~nvh(O0]rL7m~a+' wڝ3c`3-#j5͕\'׎IyS]ާ- 2Js= 0oV8[x-N5YԒ *:GC͉igsOJwvKN17k[!/ٙO֫6Ͽwa>C|_Gy)p`uLIxQ0Jx6MDA)mmHk2J+Jʠ<ڦM BP 79ЪݙٙwfK}2Tj<\ϖ7Œ5؞v,}ݭF\7.IK` S&5l tFz0O5Ńs/Xk$,5,?Xέ_5(`WaI<=ճ)j6/Aly5I{Y4Bޠ?upO>YBޛMLAr]TFea{ p=߮HTWD쨏}?uSv5Ż&j ]!k,䎟;oȊnQ}%CWhxѪaOۼ5MPT|KmhVP3 kE– io@cT cߠzȚӟ?~#>& bShJ ,1s8{UZa%LbGToڵzx*CRx=k]f9q@CA| 1QNZ ;h .]Ry[\f8C(n6G/x,XY*/j>TKoSyΞ~ eöOmvDVꬶzPuk$E4m4=+l\d{ yװρ*=`8xЁ1` x1~xcccC?I,cΙ'h0GɎ40V #̹sslq8;kO,4**9h)>SQ{(}4cC QG :p~4}PzB-1ޥG\A,k+'*p w%9zM~Qki]1:s6v6ͅg˘2e-`th,^^wm w(@P){ڵ2"nnO|FhGQ*B/Uz;́ėڋrque?k <]ܘ3u.s ϡ*U^? [60U} u7w5S9qs͍,:i9y \kx~lV9Ⱥ4z1}u'@8o{V3V\lb?vnLM Ѵ]VRq2u4DKY~5ܮ#T 5ms $XzJH$GԳL(GܹibC~,0|46u0?m41zJ-"q?0gNLߦu^Cskw+*c;iYno2ЯD?SXc*~l>b$~n?\'͂xx^`1{ޡ3h倲T]KI[ FUyr'i-##UuϹǾ176!P $ɍ! f4|x| AMu2QP`T뒅jc.`@a%ilS,7@`#V*ȤI ~vcȞslЁJݟz}={߳uŘҟ?-䳗I t4;;koL;u.bgw7cQ; u{n!8z,\|M["_ Lކ} lۧ-r@ےmoIq!} {'Ç]8y9P6~nPߐk[ׁUN~~GqL~OsF0q4]go>KC:Θ8w)c&K"yeȟExGŹQsS%"wu%rfUΣhy0zleh =(F\8 v] K 9?[zeeCkY*+%[}&" }(%"_6K=ػ&dMmN^'ȫϱ)xƜP2 Ɓ BZOI' H(j~̳]b,d3{ $mgGz"aφC]S}v{SɅ (9orah+X3O#@/K߁u \dr֎vĴ#R`=b݀`X=Xwa7 {XYb;L&_.aT|aNk%6"4#."-qlam/I*dfu@!Ys@9`afA1?#$;NiZJi% xsɖ  y,HKmvx%ame1ΊYհ&FMڕungp:ǜVCUquBz5֪j_V{UGmSmNvz%ΰi69ķ ڀn5aO1܍ jn` q5\s+ O-O@$Ef`mT!jL `P 0iki_I?!cҾhL\:ZHB[H i8̘|>KmYjoCސ/g)֋ž> ׹xzRjK͢|гERWdN=5.B@+`Q\uAR+Z |#}$]~ 0׮TzҐqiIJ;0k_ 1 +l+g0ڀ!ʶ*(Vd|$Ls[=!|B!!JfJەRqTr^DV$h<ɪ`ɏIyDxv5%KS0=&R򒰓korm+JiI\قg\.@? 艚BP:e#fp< OO(,"U9>uŭ .u?(Av኷]Wzob,V _ 1/ÈKt9/WVjokkmm-yl9Ŷ,{mϰ϶ϲbWĞ@IZ[d٭B c.R6Q#Tm.3JǍEUuÔ~5C9ds6062!x![hi1LoȠɾ 00%Ⱦ \5لdgDvX {{EpRvtWrJc|TbGLgk)4{ۚ-zQ}_^`ox'-ilj7Vslo7-BrÜriNMr↚1n C-70VQ-ik:XC,(!:`$2>}9wOJ܍6˕}.&Trg͊3.r.^vKKZ6_bek&^}yᮋXy+/b՝z/V ɿPl SN p=LJ7-1 ۥƁx"\t"-\:k̓.ley(%w<*}e7{*.X!xso\ÙvKD EX W}ukâYf[ 5K,l"UL9G(V}O$gv]'<đHQK!w?A)$,,9+"l,4v,T ub_ut_tDxh(=ok( ?""#*KT~֖`WJ='B[`܋it8դ:T/e!]d>' h:)08<ɻqr8yc Xl(6tne7:Unb{sgJy^#[~\*QBA@Xo#!&җL6~eUS NA)X^a cXf~FCA=#T F\Q&41^_h¦{wZ/3L[PNPhP715}^gd胩9]Na8$#nwlmDvxꪲ)ar ءrod+oכvܺ}y}~ қYH$D"H$D"H3@} pmwvva@yO^"铻|!t;3,h0 endstream endobj 65 0 obj << /Type /FontDescriptor /Ascent 898 /CapHeight 0 /Descent -210 /Flags 4 /FontBBox [ 0 -211 1359 899 ] /FontName /PEINPA+Wingdings-Regular /ItalicAngle 0 /StemV 0 /FontFile2 66 0 R >> endobj 66 0 obj << /Filter /FlateDecode /Length 6023 /Length1 10228 >> stream HW TW< ѵK0p,$VM„Ef(-VK['UQc{Z{DP|Udn>ߠ{9gΜ{f'AR'o@I= (YL]|A8fg훮2>Z޷:ܐsdY [`AW-6j6΋Uau 4D!aFB.ܩj !lvFM? @z/--,X~ϛu AQ/q=V 6=`ת,T4H!4{#B"Ċ8F~[[nEWxTpD0 ]WҦ5K*G4ktO2ؐRǒ+\V6']ȵ+ Ya>&DF-h6h(Isw&J2 CG)U ` YZE4E$ NJ%h^S4A'uu} %̲2ܴe7{Oдw}כ~R륶qZ~[qaչz?ro=w#U{eB1plkC+7BV ^k-obfæS^'0Y0K ]θWJ9UU_^Z5{h!KwLjQqhçN9W4kGf~tU']\<۹6raחy4)˗Į \0;m#)D_!(M9*F$a}9_xbx?K/x<1;8&(,Szz%UUggy%*IieWNrl0{&j?ߎ!~[[mޓgpVm(߶d'{K:JB?뉕;K*٢t:޶kBqT$ *gi=.7Et^3t.KơcHS\b@n5$ 0$0Cg9pAAz\3[#Sb -(]CIHKXr5ۿ:t0x o=ni:ږ_|b#S8"ZlpWi6NsӶwDc{fjXϝolTsj"ilt&H  &c9r&X>=熗TҘؐ$}&і#T]dsKXwk|xsb̙@k/Fa^ڐU֛y['?qw}k5!4mWbk#F79Wl&|՗f19hY=cJy~svLcY˘|zf*Di&l {_~_vCYLRFBxl. s'nv VuCxDmDidbL̿(n27Ak!H`]a&L DoɆtոp3&\ @P$'!$"LGg& P,8pStd &n5Q S`$d4I pa54g DދDVD۠ph9YŃ~1XiB vHY|;et^(! Qql E."BMR9dV+P'9b W2Lɛ"SeJ-ЀTL#ϐaT SX&۰G2=h'*@FTi0LpѪ16 NkVEt 58)1der-&W@=h SBF lDr`Yد,Bqg澖F/l@TXPvW <4貼 HJ "*jXJZQѪU@|_;s̙sΜ3s  Q"ud`t_[8G 5@ЀH><&2|qC\$684[-ZtRZ8,Jz%Vv1Xɫ,TG)(Z*) BӁzl2}XLȅc!%g aeN< jH i/w~b>7= [R$= %BsĤs +Ŝ曯H4PH?Ykz>MHHUN.DY,f-As0p:Q$n((FJ(VIg3n3H)<ȅ7K$~NqDiuPm Ss5*׶}?ZL] k[WA Fݰݬ5W7}jY|^V뮸o_J^8t_A+Vbv aXҤ;% kBC1Գq('MdmT|ˢjǕح2QVlbQFi(VGhrF}!1'`d9Cbd|˪xMb!_{"[8~^Zv鍙K|2;y̾-9ַQ_{C}o'հI^ʘV]y)uPM; lzc)5x3 6o47J8d(wn륳|Xچ4\|Bfn]y>8)ط %ۭn]9;3κTMwh3ݥ"Tt*ş`%-?}>j`sM\ن/5]#4^8 DkS_*l+gGvuܺ|dP;.xf1u n7үoVwӖ}~oÃ{(k׾Z?tZ}nSrfgE.o_zU{%G=OgsiڑX6SҺ=Rf ~$8RBBH$óա:b22h:2U yH:n%2FsTi#m"pALL'yЧ&0vu @r:; pba} uQa?\OW+v@(E"؀7;"> UO*H#16*c:Ye(P`eZ5(Ռv:^#Il}d:# "'#W Va9֊(|,E FQ3jE55twl]x6 ?& d"XmFXor'G9r|K!( jruu:)k&Uɕq[Rvy]!p$T*]kE``%fc@<^x%k- އQp_÷q~2uоpEbI&Nv D$WMy 6ZR2ʞ@) ZFQ6 fEϧ:l`' C13d3EL "eD\v=%g9p.EqY\>wݕȰ0H=DcݧI; 9k (#V\E1 qQv,лt,FGYrPΥKAJ\>>Ii^j/5SNMQ[tN*D@Fpzr:TIakȵv2W1{ҍ)“a1ԇ#+\ d=crc\ߑ8'=~X1velm޲ZH8EjFݴFM)@HFy i1Z8SGp99-?rJηqЮVyc^$i7c ggUkyQ^֪@^4P"@RKhZB˨4cDL2Ujc\%`\Չ8jsmiˆE˵a۔H*K}pj" /B0!kŬI>@AVf)`h(Ca[ۊ/&Ϝs̜ic-hEA;nQhv7zLTը5Rw,Xkv g)(VIn㫮JQߘfL<oj2eo%=vL~ﴚ}Z]^ Ȼih6uꨝe Rd*>YZbto4M1,,Km:B#謹Y:F@fWT)Y ɞꪔXtjzQP8mbogpY¨sS䈌vlI:y#aL,y^C6qdKW'Ye|+`P̝+wֈꪭ"ll")HKj0偀\tQUQUשB5AS8b3='=g|C2+ǿEVwӬ\yV$Ze +c֠iOѲZ ŊY]Lн -ͱ\J_͍ *3NT%iVV;!*$|eluExr.耧RVI/Ry.ӔP2(zE0HI~K{G!c]5pަ~mr@mdv; WBƻ/9k*84lB耻%1_,;j,!qkh@2xЗT|7_@Þ ua$0S228&'Uv?S9831yk(=m=Ŷc{ 8skǍVknv/ȒN[qoB%rJ7YF=zC҂JyMO;96vZJN*RrBQ%GRҮMI%!%J)Yĭĥĩ~no 8>g@C8w zz3餒SJ+9=%4)Yd:%<%% A_+s >0omm~i~iDm k#Zbا%6k-ѧ%iZQI>q>>^Ky 鼐{8n=*f8Î=k4Z+&JlpOiI1n> endobj 68 0 obj << /Filter /FlateDecode /Length 13179 /Length1 23000 >> stream H\V PWPĠp(x" Q ň,I30Xv:9]3(_ZY_d_X\vC\'pΘ@AƷ@B:J@]H{4Q-41+ɟh0-@`(gcgj xHC$wHA5]TrS*h ] D` ^0! 0 #WF\4B3_|ryu#-$c ]JJ>*uޘ%PxD4J ^}\vG=q+˰Aێ%&ԕRh=0EO?B: P.yGqߢ tUmmke- @h`'F=?%6<_*A;1]Xa jdmn>F-C,, Zzx7_4zު%F8&92%S_̯:z ZE멒_x)R}AFQ`V7,WkN|›hapqp-_6*Vӻtgq"UUZnUy9߬puoS0Lpr| C5>l6?Aƒg/jOJ"$i4Oe>UUz>܁j^WT[^uA mz"If[e>L[G[=lk>|W6]պ]JUe Eo$<:f 'W` .>>ƝWEndۧ'h: _h eQ.|,P t/Y>qxgsk| %̷إH&U*)U6u@S]Tj@nClؤKa Sz8=V{+/A^@0nHCǂ4_r5, .CqA9j.2qp F?%i y`Urb=-o=bDjΧStV}⛔%h':nNK[p<j? I8`}uQ"^kx5(љ+0sOkU%\uJ9V:9yF?r'{ Hky״Jn1RcFF>lQ׷O^a={ٻuҹS~>֧wV^xX-oisd:{bbD26YG-mfeXeo1$p mγqvA&qt[Ovkzke-C~Ixy+3/X{lgD8j->s``zDbYNG;r }봺 *l5u+VAhਪ+|޻F kB%!M,?I$qF "AҊЂi,h;v6 @h( (s-VL3{9s?5S^Z "G*BU UD*wpt_50ɹ@.^˛/xrXy$4cIR]B^r܁|')8.ST:i@m/ Xv%mXGx7ku ] s"6UR͹7#{ݳBgNfg4 3pedA8vOc5ƑA\drD]e^8' U}DڰgCeBGЭ(;{ħ&2TU}ẛțZli- Re["w/W@`\J俻OϜyA1 fz9y1=+bJ}"QJzPV0$Ҙ+bry** ÿE]SH^^JfN?Sq/> ఑]bl;@ǝJCvyx s5ܵEX<-liBG[=֫Ywe:WkDaջJG\ss40NSz|NU)>;:fΥtKS|%ucqf{GM|K9Mhmt(R BG5mt2+lkjdv9t~9h./n`?>D%(K蛜%Tj;f!fySq֣[(fΈ2S) yEp`X:GwByp;` LC1nGaX~ؚE&3MdZ+n^&ا;qylo4m߾g!2v2iAh y^mr(^:cP׌N^R/f'D]7 FŅro: }ui'sHu~CVlb0:܏sߧv`o`]MЍGAqD[󜊒{Ѱj񢬦&&|I#t.6}&|QZ m>~T/8^SQ9~Zc13qD;ɼ{hkgnE$s_ɋ,,*MHgHڋN2G_ed!܁!G\C :=|=6JD8ik{'lcFgB!}Ff5Ѧ55r.);n˒mf )jV)Vڌ6p: mBr7ׁJK٦kqFo/p_<Z5j]E⨡ws 0£0ײmy,i<1-C\/MhF/7#|t<"(y%[0,̿ cW1c$9eva-Tlk'=daګa%=("1Vh22O[ +u*>ٹTV!Gkx&xsPTyܭ4Q+71Wx1]..CE^\be;Mb3ΉIJVhRzO@Sm ͭ$?T9Bxg﬐:gCrj2z/XKڃlR}4 g(nj?G{r3)0>+80ѳ02"L IVrs0r[IoלeH9wZ2!e{U܃HH uaj T7:wL9<#"w2t&87= XCtR%(Oo?hU/Vn)CZ`#ʟb$ 8rlx$"SU\7UQw$dlIcN;(;%v;:ɖtڱmڐBCtTq4 t1qϧ8>4 30 LjBHS14x2 ÝvVw<33d ! )sY5Db-_6Ro .,a 署MBhvaT$ $^!d[0Qd A L !0b:A/ g||z2v!U\aVScUkxSx Ẅ[M0-feN;;@/;5zꖕ"oZyVެߒ/d]^VMlohok|rX/ɶYaHv"MK(< %EQ9KQ ~qL$1 |3$~[/8Oj0Ɔ14A6)h5Vg6R2>ra?KlG3lnW,Rƫ(y|E7DDr|z -jP ^@rR]_TXȰ)0&J͎C8Kr c`{ X BL, jrn? 7@ :h3hXJ1c)EjŨ`\ '-qBrPIVt**J騴=*}**JQ)&QIi|rzU@z? ]H_ H/^ې:nzxb亂F$ 0划rSRJ igh82 b[BQk(v! G/J#O0bR!ch@_'; .mƀ$@I1&0?iFq>9YӒDƖB 5OX]T /&[EFMbalM:^H߉[WE%K&[6 NF8ƒC#Do(gkõ"L^J_! Ahi'jwۼ جM \JG=(\B{h;K9⹚Bܽ4Fi]d>:D< ֛ČeqOL&WAF,szngYt:N^feVU9 6m&LbG N/~F"ބNYbnN-;1~5Sϣƽސ 06)ڞ /[mpy6]}pfaj'i왘/]y%~p~V_OV r+)c}o`W9J')C&vӝ `Q2h3'O 4 i0,3qJ9vrΨ`#s6ܶy NJQƃ@ rP|4o>_z`sy90OcHMԖq'Jvq:<Ǫr706 B 0@/ͻEDF_[{zچ`%Ӫ83rfbh.Y2_[IFLnh@XM.$ƽ4%wo 84.pPzSF}㊒4*vICe(e4S9bi` |bǯC6NE၏1;1Lmֿaͧ)j7GGep7"]$x!Zd^yy*HK#Wv! خfa*rIщqP[8uY.{'1E,̹oÂXTV/pR^F_ħ}S_^~8m>t[ #f᝵fq<פ {\Oȯtةث{oa?ѺbY[$nM(n >5n->λa?\z MIC7\a7P^Ɗq{!d#h]aejm;}>'α}~ر;ȓW ("Y.!echlZ@jc-M'njIӲ N*E붘~2ɿ|k,^*W 0:5Jz.&2APhhi7',M_KB3O߿E ɠA綉LʲZ3Fu|MbBNԓF,7x^ks/K&aPr"Q4>(@m  jM,\h6!l<:'Kb6DWpws9HAB6BUu(ܜ-gs83̧Uiȕ"]?A "8`O*}wOWjw$Vb;ml3G/ޞ-”uRI<7g<[Fxq, ) 7j4lΩ40^US=ݤtܤ˜ Gc)an5 Hٱi{g/`@efۈ0hꅯ}cPz o5a~? h&^'z8ڑ]L",v.GaχSr ӬTzm yĕ/yI>U$ ΋U:Mg0qrҐ;6rGe*֩PՏE 6x*{RVJ05 / 1u,Q28b6HRrT`<=p& +%LbWt"مH%B5C0rc' mROl.yv~A3jv sRwҽH-3yMg}cm)0D6Z6Zp:C͗oaMXi;DŽ7Db"ĝ m^V,(9y1R(Zyԟl"V!0Ɇ)rt]wc[O<39oW{tֹ`*?}tG/̀6eGwĚ^P[E܀Z/]bΐS &]X!f0٧Gcj=oj /}P}6/l6N__f&qndJ<~Ld3fzve+,̣O[PruD|^%2Ë^".fѬh6hǥ3 ^: N\ס`/ tϋ[Z.TZ 7dgFܜmnLQ XIx^p#8O I\Ϲ @ւ]t>8f@*H!ϓ".>UY: GR{&&rTH nG^veӃOtȾHm,$O{kCo-(K~֏{_i&F.nQtT+g@jܨ"8փ ZϜ)^tտrFzwH;qg~1dr+;d gN+Dj :;MmT;~%\ndX$HQ '=0l$zW@~jVՈf{I{;yMY72Yє4UMJfmuĶ ])Y 2BX=XčZ)NўufU:>}z21NPŤA e^qn~W4> Ppz@aRdDCKCMJޒ)Byf%-(1ȫ>K{,hҍWS$vݷliJ.2m..,}Y[N)0p\F^tZ=jQ\E&Ҏm}M Crfd11!k)}RIP%jL`vh@-|c| /$gB a,y{ PF%#zRKL,y 8 )d6-OJN9DKNY6FƒɽG [`CD«X ܳX6#_,}DJK謁Fq#m2#\ GIT57RVkYt!?0MH͒XQv^uIWTA-ëSB/-JjQY n.-k:v77P{ZNǥ ܡ'ub`jxKuVs/$wlDihs}DSo6ʭ:*#yKD>k)$ÇΗX xV~>@k9eӨsZiQ QޢIR'(3 LM x6~f<t\f189G#KKcB;8 5nNkFX#rC4 -=HFF @OJ`p.] ZHDΦ[.>13'h υ'1d37R, c8( AorDMޮE'E`k˷{5VYFs.+F}f{5YY"%Jk-GvnC)q Nf t+C8w_%:XZCm*,5V;]85s&޾ ) kR*3Ic@,62-w|g *i,M#QiqboP7?iFm1 hn] Q43jzWYJHV"KIpg4qNJ M k@LvHq )GOB=b7 H=YDZsT8D& dݼ9WWlzIzG89 A*Qf 7Dp3𖘴X}VP>}Rx.kΥrM3ܼM&d&NNl핦Y_C*"r1¢䧲 ʹ,3,4jyX塛 dsJV>ΞB}ӑMG[([5 ӲVjeK%$-aӑbqyI8qGC2C#)4Ӓ LSZJ!edЁ`M0n`BɔRۜR^C!|{_+su[4v8>$_;4R_>F}mZGcʛۆh szvc ?=qϨῩFƬ&4a}AskA6;KEeS#:, `"b"%;`bFph](0i vZ X^Q(v\1 ŷa洰yǩsuEl mO}c:3!Er$?,MG_xUQSN;nyPvϹkL{p3YPt(T_6SHW/%v}^0:3DB;/[ JJ08qfN L"J%8z \{;9ԯjmk&dcS*k]۵.֫b8IKtFb$, _Zsg԰K{<_UɧVDz+zg!$I=MU}jj!@.j~qգaNX/~0ߏ1b$-L6+!-#*Gzuԓwij/ubWl+l MWBzsy DnnբBXL-61v-X>IpԀmM&#]X MU=]?mg]AE}<6IV}LQU_[֧:wE=I.(&g!E4YYIRhYrlo96Xńa^\cT!ZM*59Σ0t*"шl/`㋷ܘH=ku\$r/> y`V˥^zggdv4I"6eN̿=·W%TZ||c(ȇe١1l ɔio3^IEB_lbt{%~it*^ХSOcu)$ FRktm)QkԜP-ΌpЎXA/0A!kPjϗ~r}-9&7ɄUmLWJƦq|MfGe:(eUfIbM6>=!jl35.Y(VYj\֊qjF7EvH˩RfsL\{ e_nl1:Dqtߝ|&H-&Τ7P2o/vgkʼkũOYƵZJjߕᅩ=)gk>RC#j;n*C#a2m؞pLppL4^/Sp%әq% +clʘW*cd)YoI_|pמF ޛ(ݵ޶=[>X fqV ·a/p4wl4A þ{|7sP0RhqRs46uwL:N|VۻuD^)xcoŮ\7&g>=eaJă endstream endobj 69 0 obj << /Type /FontDescriptor /Ascent 1005 /CapHeight 0 /Descent -219 /Flags 4 /FontBBox [ 0 -220 1113 1005 ] /FontName /PEIOKH+SymbolMT /ItalicAngle 0 /StemV 0 /FontFile2 70 0 R >> endobj 70 0 obj << /Filter /FlateDecode /Length 6763 /Length1 10440 >> stream HW Tg@R&Kr$q e !@0 &a \dB"hO*b+*c.>]*ʺzT[* A[wv߾yߛG )EXHR)Z&CN ZߛαZÐ5kCG#0 ]O%$ڈ6BD3~hffc!AfA ],;ũv(> ؉ ,aP>#l|O 7fKp .3 }޷pt:eLFfAڀR$V"zDl! }/^>ipl+)T4\tң떔7kVg}z>`CHOa[\V&'E8LjSh$ 昉 Eh_@pAMjJg@M8 Ll6 FIG+A*.KSqd EbF}C=cFR,k $c(g c , Ӊ{"鿋su{~gz;ǛO=^koۇ廪ܚ!g*ϯaXvZG:V Ҏ<{BșŊminލ ڞfnzsYӄU37GnYd~$XWnvP^5"ʇh!)k;uZ3]8Ri 'C.\(Ӑoܖ1k򤫚+6\aׇ-=xv}bA*=v'~[f!_ ؕ_ќ\^rW8hHW߂/znwJ+A_btI4n_RRyw"D_ZZ|]q ~mP(b+m#='NH%e>Qb;miuT5>ӫw26Z!dv |J]=LW 2k>?]l$;R#ޜP'ux{n,]ylG /-kf]~ig''% 8qHdk]%zɻ=nnXߓc;v̔ٓŢc3\5,&)ʩٶ񺵺 Z+QuP/+BnX3-*97H# \[cQX4>/IHc.{qX2ԧPXX()$TlpHesgi6]E@EHDt]KR5It-Gcc>;$S$ 7HD1H36B3uff4.MґFz͊^}pS5 @iK7`^1f؇/w@;` o-C,2%- H@R2| @&Axn @&V B$a<0 LfL#yq4j@9=D^>ARl|1")i )+ #͖otU(Q(^ZES$9df3P$!"L&%@Pidx:oLkp$jy OS$YzҠ9p Kxt: 4 Sd{ɸ\QH5*\I ԙr (i^B?Nqe:P\z@"]a.p:Lx bTiϘ B=4ySKe8 ӞK4.JHNWхN52Il.nT$M%eeZBk[9N.vٿﯷz=]߫B<}ro||[CIFw;oB>gEυb{yIO|j> U<\yg'8ͷs+$ \ũ=/k8qv܏BEŰp`ITt6BCo.3#0H= V(1c%!h|ܳR%QżȞǿ9npFW;+~ԩM ?$nAi4U?` RNt .V :?$IϤR_>P 1n\lxIH"•VX̅.ҙpRV;h;}ZcnwL8$=kO iZfrM暪Cg$j%,+N #y w' ԎcrΎ?("u>(ir͞Y7M,1䯿Ҹ1XG"ti7R(FYd,Oe}^EN6N5i~eͅ燣z}0}^:waD@@(ؒc6"55=:7}Z.Fƕ3N|[).2}Pb7)4!܆is^skƯ0{W[y'r{u ݞ+?>ŻY[W}9x:? 5J<=(!r3Ekk1B %vu髤ČL)?\_cKZsfqz]7L)p.>/tƳJgkc{ĄmXq\iq.Yy7a׀$Ue̚6$Ij ֖ >#sfh.L7D4r^_diWj Z~8=N ~i:^I[C*6e Ӯ܁Wm^sTSI"#'xnC}JU3N|~tC/ݓvMO}M0)ߑg?nۍϤCK֍LIB5{tlPaM㗁wQx` ~{ U`Y)oo.%` 8&8B0P0& ` frB5}]=caB!m n 8C&87İ wP Wt [p$87y{~3@r{Ċ.H%J6(y5cc!IpL D]gqDB|I-cWBP< @z;Dpgk%J'4H/ h"烕idVDQpO r<i*t O!"TBT#MUP }.A*t2&-$D x*>A ?"Wt%_ %}l4QDH0(|| ?^t Xt\#@AJiFL KZLG-iR:"6çRvT.Pv̟ۘ[޴ kBiD(I[RчrޏSZJXPLh;Z_mG0|CnU#'s`mދ$c9/v>H!`2fS SʨX+ 3%2j4MՄNui!m4-[UT'$=_sIpex?sx`Ows֎Vϫ5756xjKqTaU[*+,͛JMY ]7IQ Q^HQUP%wS6 aC_ZZIJ>UqDUdH5%ߣGPpCڦ# %)%JONg3ԁ) 9 YrZ=#սDghw v55j@yw4=IGшJ L~YӻT(3l:pAy30J'I\øZCs $έ:L6019F.&8rTfCU*;LPrC*l&lV+RL:_I3κBأJf,hCM#[r;{&l9sJas6ҲԚM],a;qGPeBL*Ω5S]nx% zI\Z2ʘS۬*/w􏍚tQ#_c>Ykh_婦fE\S̱W'\X=nV``kNv.[ @ό$VdkIʥeqR YT7glNwSb{lTO(LXi޵f+rb ;"9x݊Zg&$Jƿoɼ$5DJ4\Ssb[(l7W1ag26`EMz'-z_>S]_!C H naFkC 6tm C%w(P ‹E(qD_".o3_ J>Cj]x ΃; Gm8 R-) ݢsx <BYb;eh~ {V_ A_0Y Q)h߅ >g04*Dȳ;O">qо\R?{3%?H | \-َQQ$HDr qx46ߒVq!tׅDmAGQ%  ۂ@[+橣b:|GDk 8"suG+]Z,/N-F!sIR|X"O LuN pHIWQ5O2Zb뷁d[I[e_;$'y|ObQfumiVK/FZm3P$7C{@JN!Ri=3( '5>1hzT"4F\ ̧9Frp*:ȝ MEápTMG ' ~n'lf1>sgX913$6ПG9*p%lo:n @>ť^W`&_f&0̴M7{\âɌr׮L3Y(,rg-v-A1.ZO%Q@A(&xH˦=Oq Z]r76/> x,]¿^uj%44^iHExE z M|&Sc4ުg+ybUgLrpkъ;*j㬷|-_ӸS/-/=44/a>Cy -K`$`C[+RŪJkGQT<۶V8Ng:_Z'\v-T<{L˦mZYֆX0G< ~ ZoGWV?u2Fѐ- m/Vp닉AAz350oC,c5s8spܰ endstream endobj 71 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 623 /Descent -263 /Flags 262178 /FontBBox [ -124 -250 1247 845 ] /FontName /PEIPLI+Garamond-Bold /ItalicAngle 0 /StemV 133 /XHeight 457 /StemH 36 /FontFile2 72 0 R >> endobj 72 0 obj << /Filter /FlateDecode /Length 13770 /Length1 22832 >> stream HV TgrBk\IA0$ZKEf DUjO*b+ZDݺ@xUtmuej=J };7???rʔqIGk`:RZғ:!5ZPO6XD²=H 39ϑo$Mo)SoK $p}W!1&sJȋݨC X%W̛Ⱦ CފDed# d 9Е'zx1 @CO WMAs7=uNI^H8䕆v v:]1ݠrVwNagyݡi߸-Zm=F/kYsX>S˼. . =V |zdݜ"n`9'''">>%p+m$$VY0*--[֦Ԟkj>-7Բ%G;W|ZI[K&_kTdٰc8lÊ(dt&v:C|n0#679 7kr%a|F9%r`bh. cc߮{l-ep :ĿQ\8iKt򕮺^kez!uɵ#o VJu3Z7M_v֥n _۱s٧d̴{|O!;aeY'/=0\a6PЫԺcu hNS[1^a҇Y qcdOqmΜͲzǜ$dX ?ҚGz1 :(U]Vc> b[_!@!ah0F e*6R21p)S3G6UHAEFXbt1Z4&34癍z 'qyq!r$`!HNrB4HB. AxLHR&6"$a\$b mR7[ yoz2S"+r A q$?gwrs*(F="16RPixƎFEq2(uM$5$%1/Pf@Af2+rJ#Sse*,]TaR-O)IPNU)s)tezJLP,f$Wߝ2Y)ijJ)פ Yr dP&\B;ԕs*B"&EDCQD" J}P+"*j RŊR\]պ[_jy~{&79w̜̜9xR|HD.ʐ˔ᨶ~ Z Ubڧ^Y&S J""@/ekz¤Ag*+8!Q!a!*ŰI\pSI ARe\pA<\>O**KԮZ&3۩?/2dHPi' ,, D>-=MVI)Duo"H13.2+4˵|" AZz6P'RA&$$,̥1]{ F^yMSӓ]SDUJ³Dy~jkr,㸠Mm>ճqR3 mJ^Ҿ[ٙ˵gh ip q~ 1m+s7hV;qsYXMOH՗1K^>9\WO&Ke䕐{oXV+Q}{.[ ]u燷b_uMsEnt`OjjjVMIGݺSBE_% X(z:q/Rl1jݕ8:!elʎ%Y=Lg=&\V'xuצ}nyLTkoZѦS]וMENvQ* ;Mn^y{ %3qiD1}Rkh(mvL|vù?v|h?$lEGY_ nb7t7+_kj{rР[wZIDim"*~WKp^YyEvuɷZ~<|odCRib&Qe֦:A-M/wZz$Up)-xjcu^:k^ k|t1 1Wʹc;KZ Z⍏ cDZFJ¬_P2CpC\կrp3Gf:8\{{s=n9;y !c][(\=m)87xH3 ۀ bq=C1 WJ2|a$@! )uQw?_r(QQ2hȭC!qJ䩆~ GԚqav w^ [six P 6Ja؃ '5̆5q??" Z.@et9\(uP[3RԿ C Apc!<.K+ȉ!hb yOH''MhIgS_Gi6͡ni-qNG aKƖgf*,FaroV+`l[^`[nnɹ`Nm6q_r a[``](#G#wc!ZZ1\f?$vV ~"&1.hm,>F8jhL#gf ,dfC3'JlPo1mjcm02o o/Ow7hTO\1b`2R a1.&Q/J >`[ ERQ_a.Qe#Q"WRdjT &IGUwl {9wD"aƪZLWJ17~|ȉ[p^vAy| \FR|$r<5+SBhY-1ja\&7vv%c-ՑHΕ~n(*P՛݀<93[wΏ?zҗ;E]V7ƥ_$`D= j2LKKo[ܜ<3wyĪu3{+9w6¿kNF;oIaAIc3 b<>jAk5M#XOFr L'iEVeyQrO^iOeË >*6*m.͉X-hZbVP5Lh\73Јe#_ o@h5at`}x#}&t)Q~ۍFZfJfEc}q n;\FIlJm]G"s6fI9ES晼?S?Sڞ@Qh*ݲե%L.#}bfVj>\s>đ̸vƽLe-'ҾIsn| $B!_ڻ$͘SbIsR-ZIV5~-`vwIOWDtJ&WKPBS>FM0m:/O T)3`Ayv[(m\<< 4Oq`?_pw|(  Sf{aj6h:C۴)zN!w+&y=O/55FK経7W*-}zZq{^C@%>l9L kg^2R ^d@pw-ƟPԮ{ 3E5}yu>/Ԅg#.~mmbY QJǰ Z]B4=3[V'O1{?1[ \|dNgge6:EQZߣ?Ld1F_I>qqXeDo0G}_78~>Z9 )iuFg^o(b; ;Ӎl=г$91X1Ry` \ms.syd0?8'l`3ϊ~v"W!>ia޲//q&9o/NeQs˗yl{Xw.j6_s{x/ISHL}\o*U迥,ŔbMrvYgTҊW)}H)ߥjujt-VPZ:T,Tz<;5[\F͈{;l結<&ꬋLfpZm*w {l7m'R63^WSWя%_qg_:ƾ{PEKd{%*[Yh ^iFm}A2$p~EnmO x{ʊ},Q?qyiM1'C@.ǐ|eO{|{bCu.QwuB7sz9z=s\.*PD˂Yp-X8oFl8Ojyʃދ홒WS}>Sr>|a%c:@ ˀӗjnoIba1ͦf40`<῝3oԷn`b e#h ///7C ,7rT) ėbnEEHQ.,ʠqcވ|tIw~-HxDkY.1x8nKR}F1`UC/xR BgJc{MZ/0Jk+0Nm圼#ב;SN?[k4lLH4CMOKw2 zi`d% /f a@ii4iJ*npt  $p!lsLhA?౫\FSBMPKU2cJ$pCVsz)Ca])]2`.`@@(xT!@ITͦE?.&+;Nxb6#v'vb'؆d8\ <č;MAvCزEM:ZJJv Zv%*/|hK'jՙ9ܹ3{<J7{#+``Fn~0>oqMɔ /rKKK͈i ,zW ïJH$DosO {@н!;:tc̤~ umo4L( OM禉OpeMv-x yXHԙ&We/2aU<}%dTIK$G$$&I ï -3ρepSƁ1 S)oH2#II&$J2&1IJ2,IZ$$ZIxI4(-` Kπ?@&+s(9Qۙy&714`rl5嬎XX[*XKj^Kƈ؁H,sUVb߷-| FAw c>}1><1>0)Ϸ]tIWϞǑ[7G8=+;>˜f0sr|-[^D}Y'$]! 踱WϱR>g"R[$_ 6ˎRAzU>b/n8hO8;Nt [t?_E6Ȃ&$ʊ?;|ZAiٗe ΣJ W: [7m'''&/ 2£A&!~(ŵ h!jESeX( HUR7!C%k!:n7(d:)OrղzY.Ҙ[kkeSBZK~nV9f % ap@ ذosa5XzI>ׄjMrkҞ!MzLb^y4^t~߶ 8N!OG)qsR5}_3PLIAjy7?ӊpU Gg~]AK<.nz|ыkw "=sxOXy:8w-dO>6(%1Uru Qwې=cs_M8վUT[Y_=aڠT6Ej?FQT ({[h{UgٱƧVj5V{ סw#~VX{s'&V㕹('F؈-1Wz\5>=/p^@foi(0KLUF*@t k 6s(I'e%Zˌg2˙YZ$ $d}/ѕ(&q4; s*ŷqd8"H5*;jKlYM]/["BKK>TDw]n׍D7\uu{x+F"eرH۫]-%rdh, %/U+HV >)yV5&JKw),-X޷ܰPf^ a+'w%/R 1NkIbehz^ Tq/" R I>I)HKg~Oqr$(B H (S/-bP1:1Ki+?asB2b?qؠXXƎF,njg2A;WʚNMKrsr6 Jag IR'Hiiן6 |^yvc0>;TjHLnI^BJr n<+WYu͢e˲|`6eb,l1$ vL NvNiRڴ!͔d =x. 0ô+A/#))egWn̎;z^j@ Ev<1Nߟg9KS"e5]1X5+ç@GwMmPÄH <e칖U %%Š:_ak'NI):C]G'RS%$k? T%ؤ$r'=pJr\0C#Jx TaIi'(ׂT&x7Ho72C邍A2ظ0Us+?' P_MLƜ[ XV%-%weK#.df|{VDֶl]8;SgT)1jU!̫!/'9L-qokRuwS:^iruY:WZSGk~p+B5`l>_}B}xrP|K>bՐ%`zmyFMkg7̈0/['f@?%5MzcdԉBFψ"}W7EJ4cAIumM;޾ɩ ;55>>|٨"%`< #9u\';Pv:xNqO [[@-Ε UjxPS=%KՐ0»Dk}F!Ĉ.UY>Ks9bcmcQWr\t'ʇ*&OVcYP+"IT8^C_kuZD,ݧ{/Y&@lea~7W(E"m>P5+ ~1iV g_N #fv6ZhT # Tӳw yh㪏ᇠcj&?qZ˾{Oݐy/\zPqْoO@K0EgN$ljĬm[&O<ƵIz;jI7p{6ÃO0!e eX][F.ҍJY 7&V"9)~?7?Ho0s92oZFqv(]4VQ`4]`Z|JeÓ:ڛ) ,1IkTܼ|ptkáĹ9DQ#ASE6}…7 G,F':if$a.t\a2&HuhrQCm/N*Ƈ3B e+5J=g8lKhIaҰgM gbif>8wKI޿xI:# vFs(¶l۰mכ6&3$m܏ۥp|E>E),m-ؠKPya8Bb^\$XD ied`{] @(Vn\߁a@hٺF%R $RBՉJ5ҺF^U?p򹜦 YQl%oT*S)PP&^K) DQ,y5Uj؟l#՜CϜLtCmMk*WN;A j^)%<0:UHi04 H}i:yW4v*Cb6/ Yx;m Ư#o[zn٦ZUżN꥔ɏQܼ{s&(:.Gzit,ϝ|O}QN&C6u^H?ٲ8dNdмQO<㠺PjWNZ{$]2$;yMeMۻo~~'+D<(\#^7j6W&={>ƆD*GYZYs*OYV5k^j  #|=* TD ~X잴J؁`.AZnO`K((⤩.pɉJ ]Ǩ\Ljn]3Gr(`,z8NLX?Bi UїǶCG"?'-W{Doi`ecFMwFx$ "hsd3k|kAxAŦ,TܟUiQRͭFEkZ@:̀Z$vS f CxNrbI jZ ptכ] .RŸ́,Is39;@ng=Ϗ=NNdC4sx0\;??pRÁlZ=} S:HՕt_{S:P4IJM93,߃ 6 dDf&?"r )pY 7HIm?:ci|oRt(޻68O>`wlcqC&?ypu|w?Z]M6mFd0Y:kwnLMl#8r^AiȎrzcM*dBGBl^Gd<Z^y)ƱP m_v)™p0eN%¹Hr0}M7ßi^ g5 ?.,o0)onvVe~k玊ն9%0pOSh%\lQoIF C6tSGBR[ "D hhmu%@`:}$EBU?b0ӟu:oìH~[O-녱f]\b~%uU ڼͿy<s&0q:=!Oo,q-_MJÍ-TUSM*MJ]#Rޯ25KQQ5P/I301S2ૻxn-o$@o{;hѵRqQ}Ō힩cGTvnBom! ,F΋'yd\e'hI2[BJ`̐OR3jIk:xMWBLr&7뺔]\Z~xA;4N7f7?k|Dg2'_Tr͐+;g ݎBDXHsS, $s|ʑ#J8[r;%jQ(G~4|<˫򜁶o~5&Ȳ`-ƓP@RE@ <`232eprI:p1Mg `g| I&əJ:Ѿ6_9Ao_G8#P [ endstream endobj 73 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 98 /FontBBox [ -217 -315 1129 993 ] /FontName /PEJEEO+Garamond-Italic /ItalicAngle -15 /StemV 0 /FontFile2 74 0 R >> endobj 74 0 obj << /Filter /FlateDecode /Length 9303 /Length1 17296 >> stream HV TSgB5Ag** B8@0 Zux F@TVť8.ezZg\Phu`u9g̙{{o ',UEbHs6" \ 7414F3i ndz+8-]Y`)͟$ : /ci;:E8u~kOxouи?^קIS ٬X 7+Z N#Nqf|^9c[[rLXnjhRݼͱ˘,Tԯ Y>3ĵe7v5vs&m vC!QD<ѸV]vY2ݠܿsrNpvgTހ"2vۢ—-jYyX: UA  ɉ #y>G~; YzNq3q~fMkjum-Q_7Ib}9g;vg`^M讲QFPXe/Jz.l77̫M=3|_nJ=8*) [VOwaQ#a?λ}f1Mn-N3鮊@Um5IVuoЯ;H\p_MK6>g'>^N9 A)p oo*ۋ;]N(^öss~ʺ ~6cSOȹpt;m.))kZlWE[yGƇ Can~Zܑ.xb2LzیmoZ3QArP&KxPحVi4S%YE4N*%9`(Y,vbLb)}N%%%bH"Gn@N)4Bװ;h("_"ZKk9F:K#K1)**,8I(3FDysN6X)`<ڟ+dfkḂ܅8iBGmRo̳(4Dn˓c~%@ްWHt1;冀L?I~]so՛1e!Ƒ϶bK#Swm\R+?v"?$t\z`f(!CNg*ˢ8OAfa8? Ρ5 M g2[l؛c.kAKk1-3-gkH.}b46=a_ӭl#ynbǼӮ.vRn j(/cj֙$4Nʜo6ͽ CA]$ 'a3b"a`$$)HYJdaa eCDCx,'n聈FEX !&!|DR )`hA!ҭsv%ϟ|`^[G[-NpQعd{!oE}[>+7;  8x1>>pЎ·|@]']x7G|렂c&֨_-w`af3}ۥM?ϗU u,].-d01tEVQ ##c/>߯WU]w>⹢oeV%V^۰kW>;B/MaWPE졺z}J._N;N1r,1-$ý>1 pϬ4'ڰy*PvK򛻗6ښE AsC/6$v=s=:a1.|eWt#GIxAm5>__^t>_}dSFgߎ|m;VzݵSE +jpJz{[}1: SpjB{D~w=;̉XwV$/p_]`g/BY=W&ݳ[ښ%o`I/FЂ0Sp(SΘ@ d\ATr2x` !0` p/,ot߃pD(%K,n=ͅy|XI~cpj2 @꣚yO@.&9[zҒs1)xb=\L#BY% F.pFG<&4-E)) D>'̞Ų6 p*{U|/~!7&Thn #v51$<")vr|L>(2]KIx`a'%p9W[Aº1GևЏ0}ƲpcQ,e\5 !"FAN 3DQhhhT^Nε@˨-x +/S| )4{=(\((>!BH#Bc'hЎIJeA6KZg >#ͨ$l%6?pB#܇4Mhm({ ό1!U0 LY8q.ba<^%]6`#6Sfɺ7s&0W6:&jm:=$BpmR1aP:f; aer@2ҊA[Q3T: c(кB7 i)+*юU Z=`k@erc/Imv~{DqCt^V>(NcY ˤOΐ3l_2myV+/O-DnTӻdTr5+3`>h>ohyռ)Ly~Wg=g)M]SdKԝm^#&UT^4} mbk+Y#Wr`nVض!Z#h\Wo^:|aK;BŬS#p^ߘZ PI}cSgoi!} !`NbYn[,oCe>_4Phk55N_-Z1kbcm`uL%v{iM?vш#ۢcYb%O4PٯZqk5Zyx_}<2Ȯd"\n"r~>h*WD|XJ $06ZN]cw$6 Vl| !l%VFl2;7+>hՏ Tye,wWPclF{nNrnAꬩ5ȮG8Z DlG/Xj/V#rm%n~mHЈYEpɅmwfHµl TnqM^ihyU0^txs$ӷhM1 VL*;S3Ln{F8GI'*q*rEމՎ6Lg>aO7#mXbwC*&uU%ډĦp,R{̩`T5Y&(h5~nlnXDlqC# TO:"ʝ+DՃ%yxxF<cZ4Z谌S)_ ;%nLv;r?Ŀ!gNL9ӁJL~@8Rbi6ݣiAr#]"#I/~^^׫tttXd_ W$`I7=%tp>YOS6y\t@ur?Im RO~F[{-F'^M]p/@?;Ž$x1)D̿x/(#= * =l {"wR{W$iYPȥ M, 'l_쬃IUg;#')te9688T8r,^MGD>?2* 'i4RY?Ӑ1{S'c=hj/"r|p~Q-.KQ{L%p=P|)-9gccrmsiHV Ǥȏ4iN/rz|wu`HQu<F:bknڍj62Kq՛)ztFۅȣ9<.\V3_91Pzig15Nuu&_3 ڦV>Kʙdߢ={ilp%/S9Gkȧwv]nijk!t7p?Wܧ,^Af3Ԟ؎l9'ịl+s& c0oQ>M/c1P~i|R,AK O37W~'; PUuC0c!-YUyU<] ~W]K(^ԽwϣGȠN*OlL7QQ?E69^\QLIZ%d_6Ͼ;cllw窾 3qWa9(IM$%&GQPj%{"$"(D2UUզ&R=[A UH{y;vwvR"Ƙo@Zgl 07 2c!N㇀ks oe4 X3NXcl'ܗ݀wA!~̶$b39Le&ٴ6+Zn3pL&~Z(#CP#j{pDݤ(;6 1i!'n_r`+.6z4H[d+m _Xgԋq:({d ̯qjpj3M֖z!]B i4D iO#Xe‡A#0z+K`I$<?84|M Pk Az#( Q`tu g V%XN}(wToÿbH 'p10ɓitzsHaL |KrT6X+cO%?9LS# T#jd-R5J¤"܇aӜG(Q$PuwLjn5~>"٥Jkd89WP'Ea<B}I`t vuxb5_ԂJ$F3F<>WnS\q!nO#KńJ(@LЧk;,:-h~'8wR?vk/xd>]:TI.>:ٕ=.~$t9W:RlЈ8;萶L֌ EʂNJ=8*G4n/튳*nw71aeDOXFT"AVHtFZFwHvJ.PPUqSe@"dW+s ؀NJ>I=~IUFRXQ(*UI'{U%h:Cz3ܰ!ZN>SR=ENh'b*(eF@Htݙ8B9vǧSd zhnJ; <$PO'Ddg T5QS> (mEJ!*D.D B9!#D7 эBqaX(:9b#f.61EfQy ^`]z8b 85l^K#'Kq~xb.?bK\i FMfsc qXve`O0\_>ف? HQ:$s@Q]edͱX31G9Nnqoc`1 ̏ [-w#SL>& t..}`˰1@]6Fl(<"TF*&'Hס^z:ce:X9z@BJiB"<O&“$}%F|Kaд/fWi.Y~6 [>nszÍF&+*{G= _]IO"w{O\< $Ifx~ùAdk_?̖/?$W0fvzbINr\:\[b<Sdu>-NԗԳX(PVWmA0>;/4Աz9m&䝝(Fb|$s8;:b<N{ m Z r /! g8d&|!/Fh= hNZc[}ΞZSZwa(/+؋ lDG݈VL $s>\R^YY~o(yE\YvBw19 }3ߐe`[]v nDd5/,8,b`jsve٩55E}t˞YYS^[9xQEՒ%ⅸxP୸9oQE *[\"DR\vh˅rSI=53즔LP4[VⰙ:2 ͘rrkδ mGSɵWςG6bk/I:V6N49ZzS)yѩE{6}MϷh1%Yb,f1_1WX85^À[?!kCT53d,6 yNǐe3UA,@,( >XYL(C+23h33$2q.C> TtR8~ %@~C&!sW 9 l1CJAL7iL3 m2HCQkV8荵?`'Tdl endstream endobj 75 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PEIMOE+TimesNewRoman /FontDescriptor 63 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 148 [ 548 ] ] >> endobj 76 0 obj << /Filter /FlateDecode /Length 228 >> stream HTn0 y ;I]vOC#$2/AuDzCu TZc5FR7쌅mTXU}e[EW@l|9m}F2MةGأ AYƖYOcyi\qR!I!Y5uk][K~>qHI3 X|^;` Gnf endstream endobj 77 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PEINPA+Wingdings-Regular /FontDescriptor 65 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 131 [ 457 ] ] >> endobj 78 0 obj << /Filter /FlateDecode /Length 216 >> stream HTP1n0 2Hv2^C۠v+)$@|j9ğr{j endstream endobj 79 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PEIOKH+SymbolMT /FontDescriptor 69 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 83 [ 548 ] ] >> endobj 80 0 obj << /Filter /FlateDecode /Length 217 >> stream HTPN0 91$Sե,8--п')"޳e>"7#8 GGP`{e32u84x*!p]O-1AgB%o"(k8ټpeʭ/vuoq k* :/>7i{3/_u1 s򸝾CV!~j endstream endobj 81 0 obj << /Count 21 /First 82 0 R /Last 83 0 R >> endobj 82 0 obj << /Title (Extrema Tutorial) /Dest [ 603 0 R /XYZ 0 720 null ] /Parent 81 0 R /Next 83 0 R >> endobj 83 0 obj << /Title (Data Analysis) /Dest [ 603 0 R /XYZ 0 646 null ] /Parent 81 0 R /Prev 82 0 R /First 84 0 R /Last 85 0 R /Count 19 >> endobj 84 0 obj << /Title (Introduction) /Dest [ 603 0 R /XYZ 0 265 null ] /Parent 83 0 R /Next 98 0 R >> endobj 85 0 obj << /Title (Data selection) /Dest [ 36 0 R /XYZ 0 213 null ] /Parent 83 0 R /Prev 86 0 R >> endobj 86 0 obj << /Title (Other functions) /Dest [ 36 0 R /XYZ 0 397 null ] /Parent 83 0 R /Prev 87 0 R /Next 85 0 R >> endobj 87 0 obj << /Title (Integration) /Dest [ 31 0 R /XYZ 0 441 null ] /Parent 83 0 R /Prev 88 0 R /Next 86 0 R >> endobj 88 0 obj << /Title (Interpolation) /Dest [ 28 0 R /XYZ 0 639 null ] /Parent 83 0 R /Prev 89 0 R /Next 87 0 R /First 90 0 R /Last 90 0 R /Count 1 >> endobj 89 0 obj << /Title (Binning) /Dest [ 24 0 R /XYZ 0 299 null ] /Parent 83 0 R /Prev 91 0 R /Next 88 0 R >> endobj 90 0 obj << /Title (2-D interpolation) /Dest [ 28 0 R /XYZ 0 212 null ] /Parent 88 0 R >> endobj 91 0 obj << /Title (Fitting) /Dest [ 13 0 R /XYZ 0 641 null ] /Parent 83 0 R /Prev 92 0 R /Next 89 0 R /First 93 0 R /Last 94 0 R /Count 3 >> endobj 92 0 obj << /Title (Functions) /Dest [ 10 0 R /XYZ 0 552 null ] /Parent 83 0 R /Prev 96 0 R /Next 91 0 R >> endobj 93 0 obj << /Title (Smoothing) /Dest [ 13 0 R /XYZ 0 553 null ] /Parent 91 0 R /Next 95 0 R >> endobj 94 0 obj << /Title (Fitting different data segments to different functions) /Dest [ 20 0 R /XYZ 0 233 null ] /Parent 91 0 R /Prev 95 0 R >> endobj 95 0 obj << /Title (Fitting to a function) /Dest [ 17 0 R /XYZ 0 679 null ] /Parent 91 0 R /Prev 93 0 R /Next 94 0 R >> endobj 96 0 obj << /Title (Operators) /Dest [ 7 0 R /XYZ 0 223 null ] /Parent 83 0 R /Prev 97 0 R /Next 92 0 R >> endobj 97 0 obj << /Title (Generating Data) /Dest [ 7 0 R /XYZ 0 500 null ] /Parent 83 0 R /Prev 98 0 R /Next 96 0 R /First 99 0 R /Last 99 0 R /Count 1 >> endobj 98 0 obj << /Title (Data Representation) /Dest [ 1 0 R /XYZ 0 680 null ] /Parent 83 0 R /Prev 84 0 R /Next 97 0 R /First 100 0 R /Last 101 0 R /Count 3 >> endobj 99 0 obj << /Title (Sequences) /Dest [ 7 0 R /XYZ 0 427 null ] /Parent 97 0 R >> endobj 100 0 obj << /Title (Addressing parts of arrays) /Dest [ 1 0 R /XYZ 0 232 null ] /Parent 98 0 R /Next 102 0 R >> endobj 101 0 obj << /Title (Expressions) /Dest [ 4 0 R /XYZ 0 116 null ] /Parent 98 0 R /Prev 102 0 R >> endobj 102 0 obj << /Title (Constants) /Dest [ 4 0 R /XYZ 0 348 null ] /Parent 98 0 R /Prev 100 0 R /Next 101 0 R >> endobj 103 0 obj << /TextBox /Div /Frame /Div /Footnote /Note /Endnote /Note /Shape /Figure /InlineShape /Figure /TOA /TOC /TOAI /TOCI /TOF /TOC /TOFI /TOCI /Superscript /Span /Subscript /Span /Strikeout /Span /Underline /Span /DropCap /Figure /Heading#202 /H2 /Heading#201 /H1 /Picture /P /Body#20Text /P /Macro#20Text /P /Normal /P /List#20Bullet#202 /P /Heading#203 /H3 /List#20Bullet /P >> endobj 104 0 obj << /S /Heading#202 /C /Heading#202 /Pg 603 0 R /K 0 /P 496 0 R >> endobj 105 0 obj << /S /Heading#201 /C /Heading#201 /Pg 603 0 R /K 1 /P 496 0 R >> endobj 106 0 obj << /Heading#202 107 0 R /Heading#201 109 0 R /Picture 111 0 R /Body#20Text 116 0 R /Macro#20Text 119 0 R /Normal 129 0 R /List#20Bullet#202 134 0 R /Heading#203 150 0 R /List#20Bullet 218 0 R >> endobj 107 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 108 0 obj << /S /Picture /A [ 110 0 R ] /C /Picture /Pg 603 0 R /K [ 112 0 R 4 ] /P 496 0 R >> endobj 109 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 12 /SpaceAfter 6 /TextIndent 0 >> endobj 110 0 obj << /O /Layout /TextAlign /Center >> endobj 111 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent 0 >> endobj 112 0 obj << /S /InlineShape /Pg 603 0 R /P 108 0 R /K [ 2 3 ] /Alt () /A [ 565 0 R ] >> endobj 113 0 obj << /S /Heading#202 /C /Heading#202 /Pg 603 0 R /K 5 /P 496 0 R >> endobj 114 0 obj << /S /Body#20Text /C /Body#20Text /Pg 603 0 R /K 6 /P 496 0 R >> endobj 115 0 obj << /S /Body#20Text /C /Body#20Text /Pg 603 0 R /K 7 /P 496 0 R >> endobj 116 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent 0 >> endobj 117 0 obj << /S /Macro#20Text /A [ 118 0 R ] /C /Macro#20Text /Pg 603 0 R /K 8 /P 496 0 R >> endobj 118 0 obj << /O /Layout /SpaceAfter 0 >> endobj 119 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 6 /TextIndent 0 >> endobj 120 0 obj << /S /Macro#20Text /A [ 121 0 R ] /C /Macro#20Text /Pg 603 0 R /K 9 /P 496 0 R >> endobj 121 0 obj << /O /Layout /SpaceAfter 12 >> endobj 122 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 0 /P 496 0 R >> endobj 123 0 obj << /S /Heading#202 /C /Heading#202 /Pg 1 0 R /K 1 /P 496 0 R >> endobj 124 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 2 /P 496 0 R >> endobj 125 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 3 /P 499 0 R >> endobj 126 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 4 /P 502 0 R >> endobj 127 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 5 /P 502 0 R >> endobj 128 0 obj << /S /Body#20Text /A [ 130 0 R ] /C /Body#20Text /Pg 1 0 R /K 6 /P 496 0 R >> endobj 129 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 130 0 obj << /O /Layout /SpaceBefore 12 >> endobj 131 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 7 /P 496 0 R >> endobj 132 0 obj << /S /LBody /A [ 133 0 R ] /C /List#20Bullet#202 /Pg 1 0 R /K 8 /P 522 0 R >> endobj 133 0 obj << /O /Layout /SpaceAfter 0 >> endobj 134 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 54 /EndIndent 18 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent -17.99998 >> endobj 135 0 obj << /S /LBody /A [ 136 0 R ] /C /List#20Bullet#202 /Pg 1 0 R /K 9 /P 523 0 R >> endobj 136 0 obj << /O /Layout /StartIndent 53.85001 /EndIndent 17.85001 /TextIndent -17.84999 >> endobj 137 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 10 /P 496 0 R >> endobj 138 0 obj << /S /LBody /A [ 139 0 R ] /C /List#20Bullet#202 /Pg 1 0 R /K 11 /P 525 0 R >> endobj 139 0 obj << /O /Layout /SpaceAfter 0 >> endobj 140 0 obj << /S /LBody /A [ 141 0 R ] /C /List#20Bullet#202 /Pg 1 0 R /K 12 /P 526 0 R >> endobj 141 0 obj << /O /Layout /SpaceAfter 0 >> endobj 142 0 obj << /S /LBody /A [ 143 0 R ] /C /List#20Bullet#202 /Pg 1 0 R /K 13 /P 527 0 R >> endobj 143 0 obj << /O /Layout /SpaceAfter 0 >> endobj 144 0 obj << /S /LBody /A [ 145 0 R ] /C /List#20Bullet#202 /Pg 1 0 R /K 14 /P 528 0 R >> endobj 145 0 obj << /O /Layout /StartIndent 53.85001 /EndIndent 17.85001 /TextIndent -17.84999 >> endobj 146 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 15 /P 496 0 R >> endobj 147 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 16 /P 496 0 R >> endobj 148 0 obj << /S /Heading#203 /C /Heading#203 /Pg 1 0 R /K 17 /P 496 0 R >> endobj 149 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 18 /P 496 0 R >> endobj 150 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 151 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 19 /P 496 0 R >> endobj 152 0 obj << /S /Body#20Text /A [ 153 0 R ] /C /Body#20Text /Pg 1 0 R /K 20 /P 496 0 R >> endobj 153 0 obj << /O /Layout /SpaceAfter 0 >> endobj 154 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 21 /P 496 0 R >> endobj 155 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 22 /P 496 0 R >> endobj 156 0 obj << /S /Body#20Text /A [ 157 0 R ] /C /Body#20Text /Pg 4 0 R /K 0 /P 496 0 R >> endobj 157 0 obj << /O /Layout /SpaceAfter 0 >> endobj 158 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 1 /P 496 0 R >> endobj 159 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 2 /P 496 0 R >> endobj 160 0 obj << /S /Body#20Text /A [ 161 0 R ] /C /Body#20Text /Pg 4 0 R /K 3 /P 496 0 R >> endobj 161 0 obj << /O /Layout /SpaceAfter 0 >> endobj 162 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 4 /P 496 0 R >> endobj 163 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 5 /P 496 0 R >> endobj 164 0 obj << /S /Body#20Text /A [ 165 0 R ] /C /Body#20Text /Pg 4 0 R /K 6 /P 496 0 R >> endobj 165 0 obj << /O /Layout /SpaceAfter 0 >> endobj 166 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 7 /P 496 0 R >> endobj 167 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 8 /P 496 0 R >> endobj 168 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 9 /P 496 0 R >> endobj 169 0 obj << /S /Body#20Text /A [ 170 0 R ] /C /Body#20Text /Pg 4 0 R /K 10 /P 496 0 R >> endobj 170 0 obj << /O /Layout /SpaceAfter 0 >> endobj 171 0 obj << /S /Body#20Text /A [ 172 0 R ] /C /Body#20Text /Pg 4 0 R /K 11 /P 496 0 R >> endobj 172 0 obj << /O /Layout /SpaceAfter 0 >> endobj 173 0 obj << /S /Body#20Text /A [ 174 0 R ] /C /Body#20Text /Pg 4 0 R /K 12 /P 496 0 R >> endobj 174 0 obj << /O /Layout /SpaceAfter 0 >> endobj 175 0 obj << /S /Body#20Text /A [ 176 0 R ] /C /Body#20Text /Pg 4 0 R /K 13 /P 496 0 R >> endobj 176 0 obj << /O /Layout /SpaceAfter 0 >> endobj 177 0 obj << /S /Body#20Text /A [ 178 0 R ] /C /Body#20Text /Pg 4 0 R /K 14 /P 496 0 R >> endobj 178 0 obj << /O /Layout /SpaceAfter 0 >> endobj 179 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 15 /P 496 0 R >> endobj 180 0 obj << /S /Heading#203 /C /Heading#203 /Pg 4 0 R /K 16 /P 496 0 R >> endobj 181 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 17 /P 496 0 R >> endobj 182 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 18 /P 496 0 R >> endobj 183 0 obj << /S /Body#20Text /A [ 184 0 R ] /C /Body#20Text /Pg 4 0 R /K 19 /P 496 0 R >> endobj 184 0 obj << /O /Layout /SpaceAfter 0 >> endobj 185 0 obj << /S /Body#20Text /A [ 186 0 R ] /C /Body#20Text /Pg 4 0 R /K 20 /P 496 0 R >> endobj 186 0 obj << /O /Layout /SpaceAfter 0 >> endobj 187 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 21 /P 496 0 R >> endobj 188 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 22 /P 496 0 R >> endobj 189 0 obj << /S /Body#20Text /A [ 190 0 R ] /C /Body#20Text /Pg 4 0 R /K 23 /P 496 0 R >> endobj 190 0 obj << /O /Layout /SpaceAfter 0 >> endobj 191 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /K 24 /P 496 0 R >> endobj 192 0 obj << /S /Heading#203 /C /Heading#203 /Pg 4 0 R /K 25 /P 496 0 R >> endobj 193 0 obj << /S /Body#20Text /C /Body#20Text /Pg 4 0 R /P 496 0 R /K [ 26 << /Type /MCR /Pg 7 0 R /MCID 0 >> ] >> endobj 194 0 obj << /S /Body#20Text /A [ 195 0 R ] /C /Body#20Text /Pg 7 0 R /K 1 /P 496 0 R >> endobj 195 0 obj << /O /Layout /SpaceAfter 0 >> endobj 196 0 obj << /S /Body#20Text /A [ 197 0 R ] /C /Body#20Text /Pg 7 0 R /K 2 /P 496 0 R >> endobj 197 0 obj << /O /Layout /SpaceAfter 0 >> endobj 198 0 obj << /S /Body#20Text /A [ 199 0 R ] /C /Body#20Text /Pg 7 0 R /K 3 /P 496 0 R >> endobj 199 0 obj << /O /Layout /SpaceAfter 0 >> endobj 200 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 4 /P 496 0 R >> endobj 201 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 5 /P 507 0 R >> endobj 202 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 6 /P 510 0 R >> endobj 203 0 obj << /S /Body#20Text /A [ 204 0 R ] /C /Body#20Text /Pg 7 0 R /K 7 /P 496 0 R >> endobj 204 0 obj << /O /Layout /SpaceBefore 12 >> endobj 205 0 obj << /S /Body#20Text /A [ 206 0 R ] /C /Body#20Text /Pg 7 0 R /K 8 /P 496 0 R >> endobj 206 0 obj << /O /Layout /TextAlign /Start >> endobj 207 0 obj << /S /Heading#202 /C /Heading#202 /Pg 7 0 R /K 9 /P 496 0 R >> endobj 208 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 10 /P 496 0 R >> endobj 209 0 obj << /S /Heading#203 /C /Heading#203 /Pg 7 0 R /K 11 /P 496 0 R >> endobj 210 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 12 /P 496 0 R >> endobj 211 0 obj << /S /Macro#20Text /A [ 212 0 R ] /C /Macro#20Text /Pg 7 0 R /K 13 /P 496 0 R >> endobj 212 0 obj << /O /Layout /SpaceAfter 0 >> endobj 213 0 obj << /S /Macro#20Text /A [ 214 0 R ] /C /Macro#20Text /Pg 7 0 R /K 14 /P 496 0 R >> endobj 214 0 obj << /O /Layout /SpaceAfter 12 >> endobj 215 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 15 /P 496 0 R >> endobj 216 0 obj << /S /LBody /A [ 217 0 R ] /C /List#20Bullet /Pg 7 0 R /K 16 /P 530 0 R >> endobj 217 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 218 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 18 /EndIndent 18 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 12 /TextIndent -17.99998 >> endobj 219 0 obj << /S /LBody /A [ 220 0 R ] /C /List#20Bullet /Pg 7 0 R /K 17 /P 531 0 R >> endobj 220 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 221 0 obj << /S /LBody /C /List#20Bullet /Pg 7 0 R /K 18 /P 532 0 R >> endobj 222 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 19 /P 496 0 R >> endobj 223 0 obj << /S /Heading#202 /C /Heading#202 /Pg 7 0 R /K 20 /P 496 0 R >> endobj 224 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 21 /P 496 0 R >> endobj 225 0 obj << /S /Body#20Text /A [ 226 0 R ] /C /Body#20Text /Pg 7 0 R /K 22 /P 496 0 R >> endobj 226 0 obj << /O /Layout /SpaceAfter 0 >> endobj 227 0 obj << /S /Body#20Text /A [ 228 0 R ] /C /Body#20Text /Pg 7 0 R /K 23 /P 496 0 R >> endobj 228 0 obj << /O /Layout /SpaceAfter 0 >> endobj 229 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 24 /P 496 0 R >> endobj 230 0 obj << /S /Body#20Text /C /Body#20Text /Pg 7 0 R /K 25 /P 496 0 R >> endobj 231 0 obj << /S /Body#20Text /A [ 232 0 R ] /C /Body#20Text /Pg 7 0 R /K 26 /P 496 0 R >> endobj 232 0 obj << /O /Layout /SpaceAfter 0 >> endobj 233 0 obj << /S /Body#20Text /A [ 234 0 R ] /C /Body#20Text /Pg 10 0 R /K 0 /P 496 0 R >> endobj 234 0 obj << /O /Layout /SpaceAfter 0 >> endobj 235 0 obj << /S /Body#20Text /A [ 236 0 R ] /C /Body#20Text /Pg 10 0 R /K 1 /P 496 0 R >> endobj 236 0 obj << /O /Layout /SpaceAfter 0 >> endobj 237 0 obj << /S /Body#20Text /C /Body#20Text /Pg 10 0 R /K 2 /P 496 0 R >> endobj 238 0 obj << /S /Body#20Text /C /Body#20Text /Pg 10 0 R /K 3 /P 496 0 R >> endobj 239 0 obj << /S /Body#20Text /A [ 240 0 R ] /C /Body#20Text /Pg 10 0 R /K 4 /P 496 0 R >> endobj 240 0 obj << /O /Layout /SpaceAfter 0 >> endobj 241 0 obj << /S /Body#20Text /A [ 242 0 R ] /C /Body#20Text /Pg 10 0 R /K 5 /P 496 0 R >> endobj 242 0 obj << /O /Layout /SpaceAfter 0 >> endobj 243 0 obj << /S /Body#20Text /A [ 244 0 R ] /C /Body#20Text /Pg 10 0 R /K 6 /P 496 0 R >> endobj 244 0 obj << /O /Layout /SpaceAfter 0 >> endobj 245 0 obj << /S /Body#20Text /A [ 246 0 R ] /C /Body#20Text /Pg 10 0 R /K 7 /P 496 0 R >> endobj 246 0 obj << /O /Layout /SpaceAfter 0 >> endobj 247 0 obj << /S /Body#20Text /C /Body#20Text /Pg 10 0 R /K 8 /P 496 0 R >> endobj 248 0 obj << /S /Heading#202 /C /Heading#202 /Pg 10 0 R /K 9 /P 496 0 R >> endobj 249 0 obj << /S /Body#20Text /C /Body#20Text /Pg 10 0 R /K 10 /P 496 0 R >> endobj 250 0 obj << /S /Macro#20Text /A [ 251 0 R ] /C /Macro#20Text /Pg 10 0 R /K 11 /P 496 0 R >> endobj 251 0 obj << /O /Layout /SpaceAfter 12 >> endobj 252 0 obj << /S /Body#20Text /C /Body#20Text /Pg 10 0 R /K 12 /P 496 0 R >> endobj 253 0 obj << /S /Macro#20Text /A [ 254 0 R ] /C /Macro#20Text /Pg 10 0 R /K 13 /P 496 0 R >> endobj 254 0 obj << /O /Layout /SpaceAfter 0 >> endobj 255 0 obj << /S /Macro#20Text /A [ 256 0 R ] /C /Macro#20Text /Pg 10 0 R /K 14 /P 496 0 R >> endobj 256 0 obj << /O /Layout /SpaceAfter 0 >> endobj 257 0 obj << /S /Macro#20Text /A [ 258 0 R ] /C /Macro#20Text /Pg 10 0 R /K 15 /P 496 0 R >> endobj 258 0 obj << /O /Layout /SpaceAfter 12 >> endobj 259 0 obj << /S /Body#20Text /C /Body#20Text /Pg 10 0 R /K 16 /P 496 0 R >> endobj 260 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 17 /P 534 0 R >> endobj 261 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 18 /P 535 0 R >> endobj 262 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 19 /P 536 0 R >> endobj 263 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 20 /P 537 0 R >> endobj 264 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 21 /P 538 0 R >> endobj 265 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 22 /P 539 0 R >> endobj 266 0 obj << /S /LBody /C /List#20Bullet /Pg 10 0 R /K 23 /P 540 0 R >> endobj 267 0 obj << /S /Body#20Text /C /Body#20Text /Pg 13 0 R /K 0 /P 496 0 R >> endobj 268 0 obj << /S /Body#20Text /A [ 269 0 R ] /C /Body#20Text /Pg 13 0 R /K [ 1 270 0 R 3 271 0 R 5 ] /P 496 0 R >> endobj 269 0 obj << /O /Layout /TextAlign /Start >> endobj 270 0 obj << /S /Underline /P 268 0 R /A 571 0 R /Pg 13 0 R /K 2 >> endobj 271 0 obj << /S /Underline /P 268 0 R /A 572 0 R /Pg 13 0 R /K 4 >> endobj 272 0 obj << /S /Heading#202 /C /Heading#202 /Pg 13 0 R /K 6 /P 496 0 R >> endobj 273 0 obj << /S /Body#20Text /C /Body#20Text /Pg 13 0 R /K [ 7 274 0 R 9 ] /P 496 0 R >> endobj 274 0 obj << /S /Underline /P 273 0 R /A 573 0 R /Pg 13 0 R /K 8 >> endobj 275 0 obj << /S /Heading#203 /C /Heading#203 /Pg 13 0 R /K 10 /P 496 0 R >> endobj 276 0 obj << /S /Body#20Text /C /Body#20Text /Pg 13 0 R /K 11 /P 496 0 R >> endobj 277 0 obj << /S /Picture /A [ 278 0 R ] /C /Picture /Pg 13 0 R /K [ 279 0 R 13 ] /P 496 0 R >> endobj 278 0 obj << /O /Layout /TextAlign /Center >> endobj 279 0 obj << /S /InlineShape /Pg 13 0 R /K 12 /P 277 0 R /Alt () /A [ 574 0 R ] >> endobj 280 0 obj << /S /Body#20Text /C /Body#20Text /Pg 13 0 R /K 14 /P 496 0 R >> endobj 281 0 obj << /S /Body#20Text /C /Body#20Text /Pg 17 0 R /K 0 /P 496 0 R >> endobj 282 0 obj << /S /Heading#203 /C /Heading#203 /Pg 17 0 R /K 1 /P 496 0 R >> endobj 283 0 obj << /S /Body#20Text /C /Body#20Text /Pg 17 0 R /K 2 /P 496 0 R >> endobj 284 0 obj << /S /Body#20Text /C /Body#20Text /Pg 17 0 R /K 3 /P 515 0 R >> endobj 285 0 obj << /S /Body#20Text /C /Body#20Text /Pg 17 0 R /K 4 /P 518 0 R >> endobj 286 0 obj << /S /Body#20Text /A [ 287 0 R ] /C /Body#20Text /Pg 17 0 R /K 5 /P 496 0 R >> endobj 287 0 obj << /O /Layout /SpaceBefore 12 >> endobj 288 0 obj << /S /Macro#20Text /A [ 289 0 R ] /C /Macro#20Text /Pg 17 0 R /K 6 /P 496 0 R >> endobj 289 0 obj << /O /Layout /SpaceAfter 0 >> endobj 290 0 obj << /S /Macro#20Text /A [ 291 0 R ] /C /Macro#20Text /Pg 17 0 R /K 7 /P 496 0 R >> endobj 291 0 obj << /O /Layout /SpaceAfter 0 >> endobj 292 0 obj << /S /Macro#20Text /A [ 293 0 R ] /C /Macro#20Text /Pg 17 0 R /K 8 /P 496 0 R >> endobj 293 0 obj << /O /Layout /SpaceAfter 0 >> endobj 294 0 obj << /S /Macro#20Text /A [ 295 0 R ] /C /Macro#20Text /Pg 17 0 R /K 9 /P 496 0 R >> endobj 295 0 obj << /O /Layout /SpaceAfter 0 >> endobj 296 0 obj << /S /Macro#20Text /A [ 297 0 R ] /C /Macro#20Text /Pg 17 0 R /K 10 /P 496 0 R >> endobj 297 0 obj << /O /Layout /SpaceAfter 0 >> endobj 298 0 obj << /S /Macro#20Text /A [ 299 0 R ] /C /Macro#20Text /Pg 17 0 R /K 11 /P 496 0 R >> endobj 299 0 obj << /O /Layout /SpaceAfter 0 >> endobj 300 0 obj << /S /Macro#20Text /A [ 301 0 R ] /C /Macro#20Text /Pg 17 0 R /K 12 /P 496 0 R >> endobj 301 0 obj << /O /Layout /SpaceAfter 12 >> endobj 302 0 obj << /S /Picture /A [ 303 0 R ] /C /Picture /Pg 20 0 R /K [ 304 0 R 1 ] /P 496 0 R >> endobj 303 0 obj << /O /Layout /TextAlign /Center >> endobj 304 0 obj << /S /InlineShape /Pg 20 0 R /K 0 /P 302 0 R /Alt () /A [ 577 0 R ] >> endobj 305 0 obj << /S /Body#20Text /C /Body#20Text /Pg 20 0 R /K 2 /P 496 0 R >> endobj 306 0 obj << /S /Body#20Text /C /Body#20Text /Pg 20 0 R /K 3 /P 496 0 R >> endobj 307 0 obj << /S /Heading#203 /C /Heading#203 /Pg 20 0 R /K 4 /P 496 0 R >> endobj 308 0 obj << /S /Body#20Text /C /Body#20Text /Pg 20 0 R /K 5 /P 496 0 R >> endobj 309 0 obj << /S /Macro#20Text /A [ 310 0 R ] /C /Macro#20Text /Pg 20 0 R /K 6 /P 496 0 R >> endobj 310 0 obj << /O /Layout /SpaceAfter 0 >> endobj 311 0 obj << /S /Macro#20Text /A [ 312 0 R ] /C /Macro#20Text /Pg 20 0 R /K 7 /P 496 0 R >> endobj 312 0 obj << /O /Layout /SpaceAfter 0 >> endobj 313 0 obj << /S /Macro#20Text /A [ 314 0 R ] /C /Macro#20Text /Pg 20 0 R /K 8 /P 496 0 R >> endobj 314 0 obj << /O /Layout /SpaceAfter 0 >> endobj 315 0 obj << /S /Macro#20Text /A [ 316 0 R ] /C /Macro#20Text /Pg 20 0 R /K 9 /P 496 0 R >> endobj 316 0 obj << /O /Layout /SpaceAfter 0 >> endobj 317 0 obj << /S /Macro#20Text /A [ 318 0 R ] /C /Macro#20Text /Pg 20 0 R /K 10 /P 496 0 R >> endobj 318 0 obj << /O /Layout /SpaceAfter 0 >> endobj 319 0 obj << /S /Macro#20Text /A [ 320 0 R ] /C /Macro#20Text /Pg 20 0 R /K 11 /P 496 0 R >> endobj 320 0 obj << /O /Layout /SpaceAfter 0 >> endobj 321 0 obj << /S /Macro#20Text /A [ 322 0 R ] /C /Macro#20Text /Pg 24 0 R /K 0 /P 496 0 R >> endobj 322 0 obj << /O /Layout /SpaceAfter 0 >> endobj 323 0 obj << /S /Macro#20Text /A [ 324 0 R ] /C /Macro#20Text /Pg 24 0 R /K 1 /P 496 0 R >> endobj 324 0 obj << /O /Layout /SpaceAfter 0 >> endobj 325 0 obj << /S /Macro#20Text /A [ 326 0 R ] /C /Macro#20Text /Pg 24 0 R /K 2 /P 496 0 R >> endobj 326 0 obj << /O /Layout /SpaceAfter 0 >> endobj 327 0 obj << /S /Macro#20Text /A [ 328 0 R ] /C /Macro#20Text /Pg 24 0 R /K 3 /P 496 0 R >> endobj 328 0 obj << /O /Layout /SpaceAfter 0 >> endobj 329 0 obj << /S /Macro#20Text /A [ 330 0 R ] /C /Macro#20Text /Pg 24 0 R /K 4 /P 496 0 R >> endobj 330 0 obj << /O /Layout /SpaceAfter 0 >> endobj 331 0 obj << /S /Macro#20Text /A [ 332 0 R ] /C /Macro#20Text /Pg 24 0 R /K 5 /P 496 0 R >> endobj 332 0 obj << /O /Layout /SpaceAfter 0 >> endobj 333 0 obj << /S /Macro#20Text /A [ 334 0 R ] /C /Macro#20Text /Pg 24 0 R /K 6 /P 496 0 R >> endobj 334 0 obj << /O /Layout /SpaceAfter 0 >> endobj 335 0 obj << /S /Macro#20Text /A [ 336 0 R ] /C /Macro#20Text /Pg 24 0 R /K 7 /P 496 0 R >> endobj 336 0 obj << /O /Layout /SpaceAfter 0 >> endobj 337 0 obj << /S /Macro#20Text /A [ 338 0 R ] /C /Macro#20Text /Pg 24 0 R /K 8 /P 496 0 R >> endobj 338 0 obj << /O /Layout /SpaceAfter 0 >> endobj 339 0 obj << /S /Macro#20Text /A [ 340 0 R ] /C /Macro#20Text /Pg 24 0 R /K 9 /P 496 0 R >> endobj 340 0 obj << /O /Layout /SpaceAfter 0 >> endobj 341 0 obj << /S /Macro#20Text /A [ 342 0 R ] /C /Macro#20Text /Pg 24 0 R /K 10 /P 496 0 R >> endobj 342 0 obj << /O /Layout /SpaceAfter 0 >> endobj 343 0 obj << /S /Macro#20Text /A [ 344 0 R ] /C /Macro#20Text /Pg 24 0 R /K 11 /P 496 0 R >> endobj 344 0 obj << /O /Layout /SpaceAfter 0 >> endobj 345 0 obj << /S /Macro#20Text /A [ 346 0 R ] /C /Macro#20Text /Pg 24 0 R /K 12 /P 496 0 R >> endobj 346 0 obj << /O /Layout /SpaceAfter 0 >> endobj 347 0 obj << /S /Macro#20Text /A [ 348 0 R ] /C /Macro#20Text /Pg 24 0 R /K 13 /P 496 0 R >> endobj 348 0 obj << /O /Layout /SpaceAfter 0 >> endobj 349 0 obj << /S /Macro#20Text /A [ 350 0 R ] /C /Macro#20Text /Pg 24 0 R /K 14 /P 496 0 R >> endobj 350 0 obj << /O /Layout /SpaceAfter 0 >> endobj 351 0 obj << /S /Macro#20Text /A [ 352 0 R ] /C /Macro#20Text /Pg 24 0 R /K 15 /P 496 0 R >> endobj 352 0 obj << /O /Layout /SpaceAfter 0 >> endobj 353 0 obj << /S /Macro#20Text /A [ 354 0 R ] /C /Macro#20Text /Pg 24 0 R /K 16 /P 496 0 R >> endobj 354 0 obj << /O /Layout /SpaceAfter 0 >> endobj 355 0 obj << /S /Macro#20Text /A [ 356 0 R ] /C /Macro#20Text /Pg 24 0 R /K 17 /P 496 0 R >> endobj 356 0 obj << /O /Layout /SpaceAfter 0 >> endobj 357 0 obj << /S /Macro#20Text /A [ 358 0 R ] /C /Macro#20Text /Pg 24 0 R /K 18 /P 496 0 R >> endobj 358 0 obj << /O /Layout /SpaceAfter 0 >> endobj 359 0 obj << /S /Macro#20Text /A [ 360 0 R ] /C /Macro#20Text /Pg 24 0 R /K 19 /P 496 0 R >> endobj 360 0 obj << /O /Layout /SpaceAfter 0 >> endobj 361 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 24 0 R /K 20 /P 496 0 R >> endobj 362 0 obj << /S /Picture /A [ 363 0 R ] /C /Picture /Pg 24 0 R /K [ 364 0 R 22 ] /P 496 0 R >> endobj 363 0 obj << /O /Layout /TextAlign /Center >> endobj 364 0 obj << /S /InlineShape /Pg 24 0 R /K 21 /P 362 0 R /Alt () /A [ 579 0 R ] >> endobj 365 0 obj << /S /Heading#202 /C /Heading#202 /Pg 24 0 R /K 23 /P 496 0 R >> endobj 366 0 obj << /S /Body#20Text /C /Body#20Text /Pg 24 0 R /K 24 /P 496 0 R >> endobj 367 0 obj << /S /Body#20Text /C /Body#20Text /Pg 24 0 R /K 25 /P 496 0 R >> endobj 368 0 obj << /S /Body#20Text /C /Body#20Text /Pg 24 0 R /K 26 /P 496 0 R >> endobj 369 0 obj << /S /Macro#20Text /A [ 370 0 R ] /C /Macro#20Text /Pg 24 0 R /K 27 /P 496 0 R >> endobj 370 0 obj << /O /Layout /SpaceAfter 0 >> endobj 371 0 obj << /S /Macro#20Text /A [ 372 0 R ] /C /Macro#20Text /Pg 24 0 R /K 28 /P 496 0 R >> endobj 372 0 obj << /O /Layout /SpaceAfter 12 >> endobj 373 0 obj << /S /Body#20Text /C /Body#20Text /Pg 24 0 R /K 29 /P 496 0 R >> endobj 374 0 obj << /S /LBody /A [ 375 0 R ] /C /List#20Bullet /Pg 28 0 R /K 0 /P 542 0 R >> endobj 375 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 376 0 obj << /S /LBody /A [ 377 0 R ] /C /List#20Bullet /Pg 28 0 R /K 1 /P 543 0 R >> endobj 377 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 378 0 obj << /S /LBody /A [ 379 0 R ] /C /List#20Bullet /Pg 28 0 R /K 2 /P 544 0 R >> endobj 379 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 380 0 obj << /S /LBody /A [ 381 0 R ] /C /List#20Bullet /Pg 28 0 R /K 3 /P 545 0 R >> endobj 381 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 382 0 obj << /S /LBody /C /List#20Bullet /Pg 28 0 R /K 4 /P 546 0 R >> endobj 383 0 obj << /S /Heading#202 /C /Heading#202 /Pg 28 0 R /K 5 /P 496 0 R >> endobj 384 0 obj << /S /Body#20Text /C /Body#20Text /Pg 28 0 R /K 6 /P 496 0 R >> endobj 385 0 obj << /S /LBody /A [ 386 0 R ] /C /List#20Bullet /Pg 28 0 R /K 7 /P 548 0 R >> endobj 386 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 387 0 obj << /S /LBody /A [ 388 0 R ] /C /List#20Bullet /Pg 28 0 R /K 8 /P 549 0 R >> endobj 388 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 389 0 obj << /S /LBody /C /List#20Bullet /Pg 28 0 R /K 9 /P 550 0 R >> endobj 390 0 obj << /S /Body#20Text /C /Body#20Text /Pg 28 0 R /K 10 /P 496 0 R >> endobj 391 0 obj << /S /LBody /A [ 392 0 R ] /C /List#20Bullet /Pg 28 0 R /K 11 /P 552 0 R >> endobj 392 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 393 0 obj << /S /LBody /A [ 394 0 R ] /C /List#20Bullet /Pg 28 0 R /K 12 /P 553 0 R >> endobj 394 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 395 0 obj << /S /LBody /C /List#20Bullet /Pg 28 0 R /K 13 /P 554 0 R >> endobj 396 0 obj << /S /Body#20Text /C /Body#20Text /Pg 28 0 R /K 14 /P 496 0 R >> endobj 397 0 obj << /S /LBody /A [ 398 0 R ] /C /List#20Bullet /Pg 28 0 R /K 15 /P 556 0 R >> endobj 398 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 399 0 obj << /S /LBody /A [ 400 0 R ] /C /List#20Bullet /Pg 28 0 R /K 16 /P 557 0 R >> endobj 400 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 401 0 obj << /S /LBody /C /List#20Bullet /Pg 28 0 R /K 17 /P 558 0 R >> endobj 402 0 obj << /S /Body#20Text /C /Body#20Text /Pg 28 0 R /K 18 /P 496 0 R >> endobj 403 0 obj << /S /Heading#203 /C /Heading#203 /Pg 28 0 R /K 19 /P 496 0 R >> endobj 404 0 obj << /S /Body#20Text /C /Body#20Text /Pg 28 0 R /K 20 /P 496 0 R >> endobj 405 0 obj << /S /Body#20Text /C /Body#20Text /Pg 28 0 R /K 21 /P 496 0 R >> endobj 406 0 obj << /S /Macro#20Text /A [ 407 0 R ] /C /Macro#20Text /Pg 28 0 R /K 22 /P 496 0 R >> endobj 407 0 obj << /O /Layout /SpaceAfter 0 >> endobj 408 0 obj << /S /Macro#20Text /A [ 409 0 R ] /C /Macro#20Text /Pg 31 0 R /K 0 /P 496 0 R >> endobj 409 0 obj << /O /Layout /SpaceAfter 0 >> endobj 410 0 obj << /S /Macro#20Text /A [ 411 0 R ] /C /Macro#20Text /Pg 31 0 R /K 1 /P 496 0 R >> endobj 411 0 obj << /O /Layout /SpaceAfter 0 >> endobj 412 0 obj << /S /Macro#20Text /A [ 413 0 R ] /C /Macro#20Text /Pg 31 0 R /K 2 /P 496 0 R >> endobj 413 0 obj << /O /Layout /SpaceAfter 0 >> endobj 414 0 obj << /S /Macro#20Text /A [ 415 0 R ] /C /Macro#20Text /Pg 31 0 R /K 3 /P 496 0 R >> endobj 415 0 obj << /O /Layout /SpaceAfter 0 >> endobj 416 0 obj << /S /Macro#20Text /A [ 417 0 R ] /C /Macro#20Text /Pg 31 0 R /K 4 /P 496 0 R >> endobj 417 0 obj << /O /Layout /SpaceAfter 0 >> endobj 418 0 obj << /S /Macro#20Text /A [ 419 0 R ] /C /Macro#20Text /Pg 31 0 R /K 5 /P 496 0 R >> endobj 419 0 obj << /O /Layout /SpaceAfter 0 >> endobj 420 0 obj << /S /Macro#20Text /C /Macro#20Text /Pg 31 0 R /K 6 /P 496 0 R >> endobj 421 0 obj << /S /Body#20Text /C /Body#20Text /K [ 422 0 R 423 0 R 9 ] /Pg 31 0 R /P 496 0 R >> endobj 422 0 obj << /S /InlineShape /Pg 31 0 R /K 7 /P 421 0 R /Alt () /A [ 584 0 R ] >> endobj 423 0 obj << /S /InlineShape /Pg 31 0 R /K 8 /P 421 0 R /Alt () /A [ 585 0 R ] >> endobj 424 0 obj << /S /Heading#202 /C /Heading#202 /Pg 31 0 R /K 10 /P 496 0 R >> endobj 425 0 obj << /S /Body#20Text /C /Body#20Text /Pg 31 0 R /K 11 /P 496 0 R >> endobj 426 0 obj << /S /Body#20Text /C /Body#20Text /Pg 31 0 R /K 12 /P 496 0 R >> endobj 427 0 obj << /S /Body#20Text /C /Body#20Text /Pg 31 0 R /K [ 13 428 0 R 15 429 0 R 17 ] /P 496 0 R >> endobj 428 0 obj << /S /Superscript /P 427 0 R /A 582 0 R /Pg 31 0 R /K 14 >> endobj 429 0 obj << /S /Superscript /P 427 0 R /A 583 0 R /Pg 31 0 R /K 16 >> endobj 430 0 obj << /S /Macro#20Text /A [ 431 0 R ] /C /Macro#20Text /Pg 31 0 R /K 18 /P 496 0 R >> endobj 431 0 obj << /O /Layout /SpaceAfter 0 >> endobj 432 0 obj << /S /Macro#20Text /A [ 433 0 R ] /C /Macro#20Text /Pg 31 0 R /K 19 /P 496 0 R >> endobj 433 0 obj << /O /Layout /SpaceAfter 0 >> endobj 434 0 obj << /S /Macro#20Text /A [ 435 0 R ] /C /Macro#20Text /Pg 31 0 R /K 20 /P 496 0 R >> endobj 435 0 obj << /O /Layout /SpaceAfter 0 >> endobj 436 0 obj << /S /Macro#20Text /A [ 437 0 R ] /C /Macro#20Text /Pg 31 0 R /K 21 /P 496 0 R >> endobj 437 0 obj << /O /Layout /SpaceAfter 12 >> endobj 438 0 obj << /S /Picture /A [ 439 0 R ] /C /Picture /Pg 36 0 R /K [ 440 0 R 1 ] /P 496 0 R >> endobj 439 0 obj << /O /Layout /TextAlign /Center >> endobj 440 0 obj << /S /InlineShape /Pg 36 0 R /K 0 /P 438 0 R /Alt () /A [ 587 0 R ] >> endobj 441 0 obj << /S /Heading#202 /C /Heading#202 /Pg 36 0 R /K 2 /P 496 0 R >> endobj 442 0 obj << /S /Body#20Text /C /Body#20Text /Pg 36 0 R /K 3 /P 496 0 R >> endobj 443 0 obj << /S /Body#20Text /C /Body#20Text /Pg 36 0 R /K 4 /P 496 0 R >> endobj 444 0 obj << /S /LBody /A [ 445 0 R ] /C /List#20Bullet /Pg 36 0 R /K 5 /P 560 0 R >> endobj 445 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 446 0 obj << /S /LBody /A [ 447 0 R ] /C /List#20Bullet /Pg 36 0 R /K 6 /P 561 0 R >> endobj 447 0 obj << /O /Layout /StartIndent 17.85001 /EndIndent 17.85001 /SpaceAfter 0 /TextIndent -17.84999 >> endobj 448 0 obj << /S /LBody /A [ 449 0 R ] /C /List#20Bullet /Pg 36 0 R /K 7 /P 562 0 R >> endobj 449 0 obj << /O /Layout /TextAlign /Start >> endobj 450 0 obj << /S /Heading#202 /C /Heading#202 /Pg 36 0 R /K 8 /P 496 0 R >> endobj 451 0 obj << /S /Body#20Text /C /Body#20Text /Pg 36 0 R /K 9 /P 496 0 R >> endobj 452 0 obj << /S /Body#20Text /C /Body#20Text /Pg 36 0 R /K 10 /P 496 0 R >> endobj 453 0 obj << /S /Macro#20Text /A [ 454 0 R ] /C /Macro#20Text /Pg 36 0 R /K 11 /P 496 0 R >> endobj 454 0 obj << /O /Layout /SpaceAfter 12 >> endobj 455 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 0 /P 496 0 R >> endobj 456 0 obj << /S /Macro#20Text /A [ 457 0 R ] /C /Macro#20Text /Pg 40 0 R /K 1 /P 496 0 R >> endobj 457 0 obj << /O /Layout /SpaceAfter 12 >> endobj 458 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 2 /P 496 0 R >> endobj 459 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 3 /P 496 0 R >> endobj 460 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 4 /P 496 0 R >> endobj 461 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 5 /P 496 0 R >> endobj 462 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 6 /P 496 0 R >> endobj 463 0 obj << /S /Macro#20Text /A [ 464 0 R ] /C /Macro#20Text /Pg 40 0 R /K 7 /P 496 0 R >> endobj 464 0 obj << /O /Layout /SpaceAfter 0 >> endobj 465 0 obj << /S /Body#20Text /A [ 466 0 R ] /C /Body#20Text /Pg 40 0 R /K 8 /P 496 0 R >> endobj 466 0 obj << /O /Layout /StartIndent 180 /SpaceAfter 0 /TextIndent 36 >> endobj 467 0 obj << /S /Macro#20Text /A [ 468 0 R ] /C /Macro#20Text /Pg 40 0 R /K 9 /P 496 0 R >> endobj 468 0 obj << /O /Layout /SpaceAfter 12 >> endobj 469 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 10 /P 496 0 R >> endobj 470 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 11 /P 496 0 R >> endobj 471 0 obj << /S /Macro#20Text /A [ 472 0 R ] /C /Macro#20Text /Pg 40 0 R /K 12 /P 496 0 R >> endobj 472 0 obj << /O /Layout /SpaceAfter 0 >> endobj 473 0 obj << /S /Macro#20Text /A [ 474 0 R ] /C /Macro#20Text /Pg 40 0 R /K 13 /P 496 0 R >> endobj 474 0 obj << /O /Layout /SpaceAfter 12 >> endobj 475 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 14 /P 496 0 R >> endobj 476 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 15 /P 496 0 R >> endobj 477 0 obj << /S /Macro#20Text /A [ 478 0 R ] /C /Macro#20Text /Pg 40 0 R /K 16 /P 496 0 R >> endobj 478 0 obj << /O /Layout /SpaceAfter 0 >> endobj 479 0 obj << /S /Macro#20Text /A [ 480 0 R ] /C /Macro#20Text /Pg 40 0 R /K 17 /P 496 0 R >> endobj 480 0 obj << /O /Layout /SpaceAfter 12 >> endobj 481 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 18 /P 496 0 R >> endobj 482 0 obj << /S /Body#20Text /C /Body#20Text /Pg 40 0 R /K 19 /P 496 0 R >> endobj 483 0 obj << /S /Macro#20Text /A [ 484 0 R ] /C /Macro#20Text /Pg 43 0 R /K 0 /P 496 0 R >> endobj 484 0 obj << /O /Layout /SpaceAfter 0 >> endobj 485 0 obj << /S /Macro#20Text /A [ 486 0 R ] /C /Macro#20Text /Pg 43 0 R /K 1 /P 496 0 R >> endobj 486 0 obj << /O /Layout /SpaceAfter 12 >> endobj 487 0 obj << /S /Body#20Text /C /Body#20Text /Pg 43 0 R /K 2 /P 496 0 R >> endobj 488 0 obj << /S /Macro#20Text /A [ 489 0 R ] /C /Macro#20Text /Pg 43 0 R /K 3 /P 496 0 R >> endobj 489 0 obj << /O /Layout /SpaceAfter 0 >> endobj 490 0 obj << /S /Macro#20Text /A [ 491 0 R ] /C /Macro#20Text /Pg 43 0 R /K 4 /P 496 0 R >> endobj 491 0 obj << /O /Layout /SpaceAfter 0 >> endobj 492 0 obj << /S /Macro#20Text /A [ 493 0 R ] /C /Macro#20Text /Pg 43 0 R /K 5 /P 496 0 R >> endobj 493 0 obj << /O /Layout /SpaceAfter 0 >> endobj 494 0 obj << /S /Macro#20Text /A [ 495 0 R ] /C /Macro#20Text /Pg 43 0 R /K 6 /P 496 0 R >> endobj 495 0 obj << /O /Layout /TextAlign /Start /SpaceAfter 12 >> endobj 496 0 obj << /S /Sect /P 602 0 R /K [ 104 0 R 105 0 R 108 0 R 113 0 R 114 0 R 115 0 R 117 0 R 120 0 R 122 0 R 123 0 R 124 0 R 497 0 R 128 0 R 131 0 R 521 0 R 137 0 R 524 0 R 146 0 R 147 0 R 148 0 R 149 0 R 151 0 R 152 0 R 154 0 R 155 0 R 156 0 R 158 0 R 159 0 R 160 0 R 162 0 R 163 0 R 164 0 R 166 0 R 167 0 R 168 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 185 0 R 187 0 R 188 0 R 189 0 R 191 0 R 192 0 R 193 0 R 194 0 R 196 0 R 198 0 R 200 0 R 505 0 R 203 0 R 205 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 213 0 R 215 0 R 529 0 R 222 0 R 223 0 R 224 0 R 225 0 R 227 0 R 229 0 R 230 0 R 231 0 R 233 0 R 235 0 R 237 0 R 238 0 R 239 0 R 241 0 R 243 0 R 245 0 R 247 0 R 248 0 R 249 0 R 250 0 R 252 0 R 253 0 R 255 0 R 257 0 R 259 0 R 533 0 R 267 0 R 268 0 R 272 0 R 273 0 R 275 0 R 276 0 R 277 0 R 280 0 R 281 0 R 282 0 R 283 0 R 513 0 R 286 0 R 288 0 R 290 0 R 292 0 R 294 0 R 296 0 R 298 0 R 300 0 R 302 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 323 0 R 325 0 R 327 0 R 329 0 R 331 0 R 333 0 R 335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 362 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 371 0 R 373 0 R 541 0 R 383 0 R 384 0 R 547 0 R 390 0 R 551 0 R 396 0 R 555 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 408 0 R 410 0 R 412 0 R 414 0 R 416 0 R 418 0 R 420 0 R 421 0 R 424 0 R 425 0 R 426 0 R 427 0 R 430 0 R 432 0 R 434 0 R 436 0 R 438 0 R 441 0 R 442 0 R 443 0 R 559 0 R 450 0 R 451 0 R 452 0 R 453 0 R 455 0 R 456 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 465 0 R 467 0 R 469 0 R 470 0 R 471 0 R 473 0 R 475 0 R 476 0 R 477 0 R 479 0 R 481 0 R 482 0 R 483 0 R 485 0 R 487 0 R 488 0 R 490 0 R 492 0 R 494 0 R ] >> endobj 497 0 obj << /S /Table /K 498 0 R /P 496 0 R /A [ 590 0 R ] >> endobj 498 0 obj << /S /TR /P 497 0 R /K [ 499 0 R 502 0 R ] >> endobj 499 0 obj << /S /TD /A [ 500 0 R 501 0 R ] /P 498 0 R /K 125 0 R >> endobj 500 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 501 0 obj << /O /Layout /BlockAlign /Before >> endobj 502 0 obj << /S /TD /A [ 503 0 R 504 0 R ] /P 498 0 R /K [ 126 0 R 127 0 R ] >> endobj 503 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 504 0 obj << /O /Layout /BlockAlign /Before >> endobj 505 0 obj << /S /Table /K 506 0 R /P 496 0 R /A [ 591 0 R ] >> endobj 506 0 obj << /S /TR /P 505 0 R /K [ 507 0 R 510 0 R ] >> endobj 507 0 obj << /S /TD /A [ 508 0 R 509 0 R ] /P 506 0 R /K 201 0 R >> endobj 508 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 509 0 obj << /O /Layout /BlockAlign /Before >> endobj 510 0 obj << /S /TD /A [ 511 0 R 512 0 R ] /P 506 0 R /K 202 0 R >> endobj 511 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 512 0 obj << /O /Layout /BlockAlign /Before >> endobj 513 0 obj << /S /Table /K 514 0 R /P 496 0 R /A [ 592 0 R ] >> endobj 514 0 obj << /S /TR /P 513 0 R /K [ 515 0 R 518 0 R ] >> endobj 515 0 obj << /S /TD /A [ 516 0 R 517 0 R ] /P 514 0 R /K 284 0 R >> endobj 516 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 517 0 obj << /O /Layout /BlockAlign /Before >> endobj 518 0 obj << /S /TD /A [ 519 0 R 520 0 R ] /P 514 0 R /K 285 0 R >> endobj 519 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 520 0 obj << /O /Layout /BlockAlign /Before >> endobj 521 0 obj << /S /L /P 496 0 R /K [ 522 0 R 523 0 R ] >> endobj 522 0 obj << /S /LI /P 521 0 R /K 132 0 R >> endobj 523 0 obj << /S /LI /P 521 0 R /K 135 0 R >> endobj 524 0 obj << /S /L /P 496 0 R /K [ 525 0 R 526 0 R 527 0 R 528 0 R ] >> endobj 525 0 obj << /S /LI /P 524 0 R /K 138 0 R >> endobj 526 0 obj << /S /LI /P 524 0 R /K 140 0 R >> endobj 527 0 obj << /S /LI /P 524 0 R /K 142 0 R >> endobj 528 0 obj << /S /LI /P 524 0 R /K 144 0 R >> endobj 529 0 obj << /S /L /P 496 0 R /K [ 530 0 R 531 0 R 532 0 R ] >> endobj 530 0 obj << /S /LI /P 529 0 R /K 216 0 R >> endobj 531 0 obj << /S /LI /P 529 0 R /K 219 0 R >> endobj 532 0 obj << /S /LI /P 529 0 R /K 221 0 R >> endobj 533 0 obj << /S /L /P 496 0 R /K [ 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R ] >> endobj 534 0 obj << /S /LI /P 533 0 R /K 260 0 R >> endobj 535 0 obj << /S /LI /P 533 0 R /K 261 0 R >> endobj 536 0 obj << /S /LI /P 533 0 R /K 262 0 R >> endobj 537 0 obj << /S /LI /P 533 0 R /K 263 0 R >> endobj 538 0 obj << /S /LI /P 533 0 R /K 264 0 R >> endobj 539 0 obj << /S /LI /P 533 0 R /K 265 0 R >> endobj 540 0 obj << /S /LI /P 533 0 R /K 266 0 R >> endobj 541 0 obj << /S /L /P 496 0 R /K [ 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R ] >> endobj 542 0 obj << /S /LI /P 541 0 R /K 374 0 R >> endobj 543 0 obj << /S /LI /P 541 0 R /K 376 0 R >> endobj 544 0 obj << /S /LI /P 541 0 R /K 378 0 R >> endobj 545 0 obj << /S /LI /P 541 0 R /K 380 0 R >> endobj 546 0 obj << /S /LI /P 541 0 R /K 382 0 R >> endobj 547 0 obj << /S /L /P 496 0 R /K [ 548 0 R 549 0 R 550 0 R ] >> endobj 548 0 obj << /S /LI /P 547 0 R /K 385 0 R >> endobj 549 0 obj << /S /LI /P 547 0 R /K 387 0 R >> endobj 550 0 obj << /S /LI /P 547 0 R /K 389 0 R >> endobj 551 0 obj << /S /L /P 496 0 R /K [ 552 0 R 553 0 R 554 0 R ] >> endobj 552 0 obj << /S /LI /P 551 0 R /K 391 0 R >> endobj 553 0 obj << /S /LI /P 551 0 R /K 393 0 R >> endobj 554 0 obj << /S /LI /P 551 0 R /K 395 0 R >> endobj 555 0 obj << /S /L /P 496 0 R /K [ 556 0 R 557 0 R 558 0 R ] >> endobj 556 0 obj << /S /LI /P 555 0 R /K 397 0 R >> endobj 557 0 obj << /S /LI /P 555 0 R /K 399 0 R >> endobj 558 0 obj << /S /LI /P 555 0 R /K 401 0 R >> endobj 559 0 obj << /S /L /P 496 0 R /K [ 560 0 R 561 0 R 562 0 R ] >> endobj 560 0 obj << /S /LI /P 559 0 R /K 444 0 R >> endobj 561 0 obj << /S /LI /P 559 0 R /K 446 0 R >> endobj 562 0 obj << /S /LI /P 559 0 R /K 448 0 R >> endobj 563 0 obj << /Nums [ 0 564 0 R 1 566 0 R 2 567 0 R 3 568 0 R 4 569 0 R 5 570 0 R 6 575 0 R 7 576 0 R 8 578 0 R 9 580 0 R 10 581 0 R 11 586 0 R 12 588 0 R 13 589 0 R ] >> endobj 564 0 obj [ 104 0 R 105 0 R 112 0 R 112 0 R 108 0 R 113 0 R 114 0 R 115 0 R 117 0 R 120 0 R ] endobj 565 0 obj << /O /Layout /BBox [ 121 291 487 579 ] /Placement /Inline >> endobj 566 0 obj [ 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 131 0 R 132 0 R 135 0 R 137 0 R 138 0 R 140 0 R 142 0 R 144 0 R 146 0 R 147 0 R 148 0 R 149 0 R 151 0 R 152 0 R 154 0 R 155 0 R ] endobj 567 0 obj [ 156 0 R 158 0 R 159 0 R 160 0 R 162 0 R 163 0 R 164 0 R 166 0 R 167 0 R 168 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 185 0 R 187 0 R 188 0 R 189 0 R 191 0 R 192 0 R 193 0 R ] endobj 568 0 obj [ 193 0 R 194 0 R 196 0 R 198 0 R 200 0 R 201 0 R 202 0 R 203 0 R 205 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 213 0 R 215 0 R 216 0 R 219 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 227 0 R 229 0 R 230 0 R 231 0 R ] endobj 569 0 obj [ 233 0 R 235 0 R 237 0 R 238 0 R 239 0 R 241 0 R 243 0 R 245 0 R 247 0 R 248 0 R 249 0 R 250 0 R 252 0 R 253 0 R 255 0 R 257 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R ] endobj 570 0 obj [ 267 0 R 268 0 R 270 0 R 268 0 R 271 0 R 268 0 R 272 0 R 273 0 R 274 0 R 273 0 R 275 0 R 276 0 R 279 0 R 277 0 R 280 0 R ] endobj 571 0 obj << /O /Layout /TextDecorationType /Underline >> endobj 572 0 obj << /O /Layout /TextDecorationType /Underline >> endobj 573 0 obj << /O /Layout /TextDecorationType /Underline >> endobj 574 0 obj << /O /Layout /BBox [ 197 199 414 483 ] /Placement /Inline >> endobj 575 0 obj [ 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 288 0 R 290 0 R 292 0 R 294 0 R 296 0 R 298 0 R 300 0 R ] endobj 576 0 obj [ 304 0 R 302 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R ] endobj 577 0 obj << /O /Layout /BBox [ 197 434 414 720 ] /Placement /Inline >> endobj 578 0 obj [ 321 0 R 323 0 R 325 0 R 327 0 R 329 0 R 331 0 R 333 0 R 335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 364 0 R 362 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 371 0 R 373 0 R ] endobj 579 0 obj << /O /Layout /BBox [ 127 311 484 452 ] /Placement /Inline >> endobj 580 0 obj [ 374 0 R 376 0 R 378 0 R 380 0 R 382 0 R 383 0 R 384 0 R 385 0 R 387 0 R 389 0 R 390 0 R 391 0 R 393 0 R 395 0 R 396 0 R 397 0 R 399 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R ] endobj 581 0 obj [ 408 0 R 410 0 R 412 0 R 414 0 R 416 0 R 418 0 R 420 0 R 422 0 R 423 0 R 421 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 427 0 R 429 0 R 427 0 R 430 0 R 432 0 R 434 0 R 436 0 R ] endobj 582 0 obj << /O /Layout /BaselineShift 6 >> endobj 583 0 obj << /O /Layout /BaselineShift 6 >> endobj 584 0 obj << /O /Layout /BBox [ 90 453 278 595 ] /Placement /Inline >> endobj 585 0 obj << /O /Layout /BBox [ 277 453 493 616 ] /Placement /Inline >> endobj 586 0 obj [ 440 0 R 438 0 R 441 0 R 442 0 R 443 0 R 444 0 R 446 0 R 448 0 R 450 0 R 451 0 R 452 0 R 453 0 R ] endobj 587 0 obj << /O /Layout /BBox [ 101 409 510 720 ] /Placement /Inline >> endobj 588 0 obj [ 455 0 R 456 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 465 0 R 467 0 R 469 0 R 470 0 R 471 0 R 473 0 R 475 0 R 476 0 R 477 0 R 479 0 R 481 0 R 482 0 R ] endobj 589 0 obj [ 483 0 R 485 0 R 487 0 R 488 0 R 490 0 R 492 0 R 494 0 R ] endobj 590 0 obj << /O /Layout /BBox [ 90 519.81621 483.53758 561.38387 ] /Placement /Block /StartIndent 0 /EndIndent 38.46242 >> endobj 591 0 obj << /O /Layout /BBox [ 90 577.11618 527.1687 606.68387 ] /Placement /Block /StartIndent 0 /EndIndent -5.1687 >> endobj 592 0 obj << /O /Layout /BBox [ 90 553.29613 526.27151 596.60387 ] /Placement /Block /StartIndent 0 /EndIndent -4.27151 >> endobj 593 0 obj << /S /D >> endobj 594 0 obj << /Nums [ 0 593 0 R ] >> endobj 595 0 obj << /Producer (Acrobat Distiller 5.0.5 \(Windows\)) /Author (Joe Chuma) /Creator (Acrobat PDFMaker 5.0 for Word) /ModDate (D:20030505124753-06'00') /Title (Using Colormaps and Gradients) /CreationDate (D:20030505124745-07'00') >> endobj 596 0 obj << /Type /Metadata /Subtype /XML /Length 1084 >> stream Using Colormaps and Gradients endstream endobj 597 0 obj << /Type /Pages /Kids [ 603 0 R 1 0 R 4 0 R 7 0 R 10 0 R 13 0 R 17 0 R 20 0 R 24 0 R 28 0 R ] /Count 10 /Parent 598 0 R >> endobj 598 0 obj << /Type /Pages /Kids [ 597 0 R 599 0 R ] /Count 14 >> endobj 599 0 obj << /Type /Pages /Kids [ 31 0 R 36 0 R 40 0 R 43 0 R ] /Count 4 /Parent 598 0 R >> endobj xref 0 600 0000000000 65535 f 0000150455 00000 n 0000150841 00000 n 0000153405 00000 n 0000153426 00000 n 0000153800 00000 n 0000156286 00000 n 0000156307 00000 n 0000156707 00000 n 0000159290 00000 n 0000159311 00000 n 0000159687 00000 n 0000161681 00000 n 0000161703 00000 n 0000162119 00000 n 0000164218 00000 n 0000164240 00000 n 0000166257 00000 n 0000166631 00000 n 0000168477 00000 n 0000168499 00000 n 0000168915 00000 n 0000171172 00000 n 0000171194 00000 n 0000173112 00000 n 0000173516 00000 n 0000175120 00000 n 0000175142 00000 n 0000177347 00000 n 0000177721 00000 n 0000180211 00000 n 0000180233 00000 n 0000180701 00000 n 0000182457 00000 n 0000182479 00000 n 0000186999 00000 n 0000235204 00000 n 0000235630 00000 n 0000237344 00000 n 0000237366 00000 n 0000260029 00000 n 0000260391 00000 n 0000262671 00000 n 0000262693 00000 n 0000263041 00000 n 0000263891 00000 n 0000263912 00000 n 0000264014 00000 n 0000264176 00000 n 0000264591 00000 n 0000264744 00000 n 0000265140 00000 n 0000265188 00000 n 0000265253 00000 n 0000265301 00000 n 0000265366 00000 n 0000265414 00000 n 0000265476 00000 n 0000265634 00000 n 0000265684 00000 n 0000265733 00000 n 0000266473 00000 n 0000266633 00000 n 0000266825 00000 n 0000267052 00000 n 0000274998 00000 n 0000275210 00000 n 0000281323 00000 n 0000281557 00000 n 0000294827 00000 n 0000295032 00000 n 0000301885 00000 n 0000302130 00000 n 0000315991 00000 n 0000316207 00000 n 0000325600 00000 n 0000325821 00000 n 0000326123 00000 n 0000326348 00000 n 0000326638 00000 n 0000326853 00000 n 0000327144 00000 n 0000327208 00000 n 0000327323 00000 n 0000327475 00000 n 0000327586 00000 n 0000327698 00000 n 0000327825 00000 n 0000327948 00000 n 0000328112 00000 n 0000328231 00000 n 0000328332 00000 n 0000328490 00000 n 0000328611 00000 n 0000328718 00000 n 0000328870 00000 n 0000329003 00000 n 0000329123 00000 n 0000329288 00000 n 0000329459 00000 n 0000329551 00000 n 0000329676 00000 n 0000329786 00000 n 0000329909 00000 n 0000330329 00000 n 0000330419 00000 n 0000330509 00000 n 0000330732 00000 n 0000330884 00000 n 0000330994 00000 n 0000331147 00000 n 0000331204 00000 n 0000331359 00000 n 0000331462 00000 n 0000331552 00000 n 0000331642 00000 n 0000331732 00000 n 0000331887 00000 n 0000331995 00000 n 0000332047 00000 n 0000332201 00000 n 0000332309 00000 n 0000332362 00000 n 0000332450 00000 n 0000332538 00000 n 0000332626 00000 n 0000332714 00000 n 0000332802 00000 n 0000332890 00000 n 0000332994 00000 n 0000333146 00000 n 0000333200 00000 n 0000333288 00000 n 0000333392 00000 n 0000333444 00000 n 0000333609 00000 n 0000333713 00000 n 0000333817 00000 n 0000333906 00000 n 0000334011 00000 n 0000334063 00000 n 0000334168 00000 n 0000334220 00000 n 0000334325 00000 n 0000334377 00000 n 0000334482 00000 n 0000334586 00000 n 0000334675 00000 n 0000334764 00000 n 0000334853 00000 n 0000334942 00000 n 0000335094 00000 n 0000335183 00000 n 0000335288 00000 n 0000335340 00000 n 0000335429 00000 n 0000335518 00000 n 0000335622 00000 n 0000335674 00000 n 0000335762 00000 n 0000335850 00000 n 0000335954 00000 n 0000336006 00000 n 0000336094 00000 n 0000336182 00000 n 0000336286 00000 n 0000336338 00000 n 0000336426 00000 n 0000336514 00000 n 0000336602 00000 n 0000336707 00000 n 0000336759 00000 n 0000336864 00000 n 0000336916 00000 n 0000337021 00000 n 0000337073 00000 n 0000337178 00000 n 0000337230 00000 n 0000337335 00000 n 0000337387 00000 n 0000337476 00000 n 0000337565 00000 n 0000337654 00000 n 0000337743 00000 n 0000337848 00000 n 0000337900 00000 n 0000338005 00000 n 0000338057 00000 n 0000338146 00000 n 0000338235 00000 n 0000338340 00000 n 0000338392 00000 n 0000338481 00000 n 0000338570 00000 n 0000338698 00000 n 0000338802 00000 n 0000338854 00000 n 0000338958 00000 n 0000339010 00000 n 0000339114 00000 n 0000339166 00000 n 0000339254 00000 n 0000339342 00000 n 0000339430 00000 n 0000339534 00000 n 0000339588 00000 n 0000339692 00000 n 0000339748 00000 n 0000339836 00000 n 0000339925 00000 n 0000340014 00000 n 0000340103 00000 n 0000340210 00000 n 0000340262 00000 n 0000340369 00000 n 0000340422 00000 n 0000340511 00000 n 0000340612 00000 n 0000340731 00000 n 0000340896 00000 n 0000340997 00000 n 0000341116 00000 n 0000341201 00000 n 0000341290 00000 n 0000341379 00000 n 0000341468 00000 n 0000341573 00000 n 0000341625 00000 n 0000341730 00000 n 0000341782 00000 n 0000341871 00000 n 0000341960 00000 n 0000342065 00000 n 0000342117 00000 n 0000342222 00000 n 0000342274 00000 n 0000342379 00000 n 0000342431 00000 n 0000342520 00000 n 0000342609 00000 n 0000342714 00000 n 0000342766 00000 n 0000342871 00000 n 0000342923 00000 n 0000343028 00000 n 0000343080 00000 n 0000343185 00000 n 0000343237 00000 n 0000343326 00000 n 0000343415 00000 n 0000343505 00000 n 0000343613 00000 n 0000343666 00000 n 0000343756 00000 n 0000343864 00000 n 0000343916 00000 n 0000344024 00000 n 0000344076 00000 n 0000344184 00000 n 0000344237 00000 n 0000344327 00000 n 0000344413 00000 n 0000344499 00000 n 0000344585 00000 n 0000344671 00000 n 0000344757 00000 n 0000344843 00000 n 0000344929 00000 n 0000345018 00000 n 0000345147 00000 n 0000345203 00000 n 0000345285 00000 n 0000345367 00000 n 0000345456 00000 n 0000345559 00000 n 0000345641 00000 n 0000345731 00000 n 0000345821 00000 n 0000345931 00000 n 0000345988 00000 n 0000346085 00000 n 0000346175 00000 n 0000346264 00000 n 0000346353 00000 n 0000346442 00000 n 0000346531 00000 n 0000346620 00000 n 0000346725 00000 n 0000346779 00000 n 0000346886 00000 n 0000346938 00000 n 0000347045 00000 n 0000347097 00000 n 0000347204 00000 n 0000347256 00000 n 0000347363 00000 n 0000347415 00000 n 0000347523 00000 n 0000347575 00000 n 0000347683 00000 n 0000347735 00000 n 0000347843 00000 n 0000347896 00000 n 0000348005 00000 n 0000348062 00000 n 0000348158 00000 n 0000348247 00000 n 0000348336 00000 n 0000348425 00000 n 0000348514 00000 n 0000348621 00000 n 0000348673 00000 n 0000348780 00000 n 0000348832 00000 n 0000348939 00000 n 0000348991 00000 n 0000349098 00000 n 0000349150 00000 n 0000349258 00000 n 0000349310 00000 n 0000349418 00000 n 0000349470 00000 n 0000349577 00000 n 0000349629 00000 n 0000349736 00000 n 0000349788 00000 n 0000349895 00000 n 0000349947 00000 n 0000350054 00000 n 0000350106 00000 n 0000350213 00000 n 0000350265 00000 n 0000350372 00000 n 0000350424 00000 n 0000350531 00000 n 0000350583 00000 n 0000350690 00000 n 0000350742 00000 n 0000350849 00000 n 0000350901 00000 n 0000351008 00000 n 0000351060 00000 n 0000351168 00000 n 0000351220 00000 n 0000351328 00000 n 0000351380 00000 n 0000351488 00000 n 0000351540 00000 n 0000351648 00000 n 0000351700 00000 n 0000351808 00000 n 0000351860 00000 n 0000351968 00000 n 0000352020 00000 n 0000352128 00000 n 0000352180 00000 n 0000352288 00000 n 0000352340 00000 n 0000352448 00000 n 0000352500 00000 n 0000352608 00000 n 0000352660 00000 n 0000352752 00000 n 0000352862 00000 n 0000352919 00000 n 0000353016 00000 n 0000353106 00000 n 0000353196 00000 n 0000353286 00000 n 0000353376 00000 n 0000353484 00000 n 0000353536 00000 n 0000353644 00000 n 0000353697 00000 n 0000353787 00000 n 0000353888 00000 n 0000354007 00000 n 0000354108 00000 n 0000354227 00000 n 0000354328 00000 n 0000354447 00000 n 0000354548 00000 n 0000354667 00000 n 0000354752 00000 n 0000354841 00000 n 0000354930 00000 n 0000355031 00000 n 0000355150 00000 n 0000355251 00000 n 0000355370 00000 n 0000355455 00000 n 0000355545 00000 n 0000355647 00000 n 0000355766 00000 n 0000355868 00000 n 0000355987 00000 n 0000356073 00000 n 0000356163 00000 n 0000356265 00000 n 0000356384 00000 n 0000356486 00000 n 0000356605 00000 n 0000356691 00000 n 0000356781 00000 n 0000356871 00000 n 0000356961 00000 n 0000357051 00000 n 0000357159 00000 n 0000357211 00000 n 0000357318 00000 n 0000357370 00000 n 0000357477 00000 n 0000357529 00000 n 0000357636 00000 n 0000357688 00000 n 0000357795 00000 n 0000357847 00000 n 0000357954 00000 n 0000358006 00000 n 0000358113 00000 n 0000358165 00000 n 0000358256 00000 n 0000358365 00000 n 0000358461 00000 n 0000358557 00000 n 0000358647 00000 n 0000358737 00000 n 0000358827 00000 n 0000358943 00000 n 0000359028 00000 n 0000359113 00000 n 0000359221 00000 n 0000359273 00000 n 0000359381 00000 n 0000359433 00000 n 0000359541 00000 n 0000359593 00000 n 0000359701 00000 n 0000359754 00000 n 0000359863 00000 n 0000359920 00000 n 0000360016 00000 n 0000360105 00000 n 0000360194 00000 n 0000360283 00000 n 0000360384 00000 n 0000360503 00000 n 0000360604 00000 n 0000360723 00000 n 0000360824 00000 n 0000360880 00000 n 0000360969 00000 n 0000361058 00000 n 0000361148 00000 n 0000361256 00000 n 0000361309 00000 n 0000361398 00000 n 0000361505 00000 n 0000361558 00000 n 0000361647 00000 n 0000361736 00000 n 0000361825 00000 n 0000361914 00000 n 0000362003 00000 n 0000362110 00000 n 0000362162 00000 n 0000362267 00000 n 0000362353 00000 n 0000362460 00000 n 0000362513 00000 n 0000362603 00000 n 0000362693 00000 n 0000362801 00000 n 0000362853 00000 n 0000362961 00000 n 0000363014 00000 n 0000363104 00000 n 0000363194 00000 n 0000363302 00000 n 0000363354 00000 n 0000363462 00000 n 0000363515 00000 n 0000363605 00000 n 0000363695 00000 n 0000363802 00000 n 0000363854 00000 n 0000363961 00000 n 0000364014 00000 n 0000364103 00000 n 0000364210 00000 n 0000364262 00000 n 0000364369 00000 n 0000364421 00000 n 0000364528 00000 n 0000364580 00000 n 0000364687 00000 n 0000364759 00000 n 0000366585 00000 n 0000366661 00000 n 0000366730 00000 n 0000366811 00000 n 0000366871 00000 n 0000366929 00000 n 0000367022 00000 n 0000367082 00000 n 0000367140 00000 n 0000367216 00000 n 0000367285 00000 n 0000367366 00000 n 0000367426 00000 n 0000367484 00000 n 0000367565 00000 n 0000367625 00000 n 0000367683 00000 n 0000367759 00000 n 0000367828 00000 n 0000367909 00000 n 0000367969 00000 n 0000368027 00000 n 0000368108 00000 n 0000368168 00000 n 0000368226 00000 n 0000368294 00000 n 0000368351 00000 n 0000368408 00000 n 0000368492 00000 n 0000368549 00000 n 0000368606 00000 n 0000368663 00000 n 0000368720 00000 n 0000368796 00000 n 0000368853 00000 n 0000368910 00000 n 0000368967 00000 n 0000369075 00000 n 0000369132 00000 n 0000369189 00000 n 0000369246 00000 n 0000369303 00000 n 0000369360 00000 n 0000369417 00000 n 0000369474 00000 n 0000369566 00000 n 0000369623 00000 n 0000369680 00000 n 0000369737 00000 n 0000369794 00000 n 0000369851 00000 n 0000369927 00000 n 0000369984 00000 n 0000370041 00000 n 0000370098 00000 n 0000370174 00000 n 0000370231 00000 n 0000370288 00000 n 0000370345 00000 n 0000370421 00000 n 0000370478 00000 n 0000370535 00000 n 0000370592 00000 n 0000370668 00000 n 0000370725 00000 n 0000370782 00000 n 0000370839 00000 n 0000371021 00000 n 0000371125 00000 n 0000371209 00000 n 0000371418 00000 n 0000371660 00000 n 0000371902 00000 n 0000372119 00000 n 0000372263 00000 n 0000372332 00000 n 0000372401 00000 n 0000372470 00000 n 0000372554 00000 n 0000372682 00000 n 0000372802 00000 n 0000372886 00000 n 0000373152 00000 n 0000373236 00000 n 0000373445 00000 n 0000373646 00000 n 0000373701 00000 n 0000373756 00000 n 0000373839 00000 n 0000373923 00000 n 0000374043 00000 n 0000374127 00000 n 0000374312 00000 n 0000374391 00000 n 0000374528 00000 n 0000374663 00000 n 0000374800 00000 n 0000374832 00000 n 0000374878 00000 n 0000375126 00000 n 0000376295 00000 n 0000376442 00000 n 0000376519 00000 n trailer << /Size 600 /ID[<97615b64a5d0081dee0ca3f53150f27f>] >> startxref 173 %%EOF extrema-4.4.5/doc/Getting_Started.pdf0000644012702201742730000133606711274636625016572 0ustar spangspang%PDF-1.4 % 806 0 obj<> endobj xref 806 31 0000000016 00000 n 0000001825 00000 n 0000000935 00000 n 0000002096 00000 n 0000002139 00000 n 0000002486 00000 n 0000002915 00000 n 0000003461 00000 n 0000003720 00000 n 0000003985 00000 n 0000004087 00000 n 0000004613 00000 n 0000005016 00000 n 0000005287 00000 n 0000005748 00000 n 0000006169 00000 n 0000006705 00000 n 0000007104 00000 n 0000007359 00000 n 0000007822 00000 n 0000008200 00000 n 0000008730 00000 n 0000009264 00000 n 0000009789 00000 n 0000022995 00000 n 0000065518 00000 n 0000089025 00000 n 0000108299 00000 n 0000124451 00000 n 0000124720 00000 n 0000001629 00000 n trailer <<28991b16bbfba94b9deb0907b4782859>]>> startxref 0 %%EOF 808 0 obj<>stream xb```b``b`e``[ ĀB@16@"!& )|*(`!)@ V1pԹ >SDB[fOn0&T8΅}K*CT[8O,+{hJOƌε]4„ȧ ^H?ʧµJy}U͚,Щ!ʓ+<$Ip,V)g&id<Ě4%I#ULĐIJPC40cGkP$&W[ywLLahU>G@Cb#DqyI,dRRMp8:@`\Vٸ*Tq-F!1p K)A%2!ef Y@r[l@ZMq 4ހ; { ֌30.bb|˘pq ?s׌~^-oQf7nZ\92r=$/94p) v>g`ate`)Dg`0tkSpd Vn HI QA gda`pp@M( endstream endobj 836 0 obj<>/W[1 1 1]/Type/XRef/Index[138 668]>>stream xbb``b``Ń3 ţ1x4>Fc8a endstream endobj 807 0 obj<>>>/LastModified(D:20060308151209)/MarkInfo<>>> endobj 809 0 obj<> endobj 810 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/StructParents 0>> endobj 811 0 obj<> endobj 812 0 obj<> endobj 813 0 obj<> endobj 814 0 obj<> endobj 815 0 obj<> endobj 816 0 obj<>stream Htn0 z dR,Em"-0R/؛Ş~8Ҟ(ɏ? -AHB h@kAEQĈ@( 3E!0ſ|=-#?We^|[KB^Pez_A,Ak-9ob)ϫ]T;H)( 8C34:h#CdN4rRf! C <д[XՈ,UI2,c_.]w=;W'I?RKE!0?T6{.GXt%iӨ$5P`w,7{ 0S+ڪ%I_eJ_RU;\Hd%e^گ,KKa xWp98%ks8tYG$,̌+a3Y> endobj 818 0 obj<> endobj 819 0 obj<>stream H;@ 9BzK؀<6e{R0 I,@e%kP#lfk?Nv|$ Ų4G%,&+܎`.O$Ԗw, 9:ouѝ|6߽J9bTTiS]+Ա?~iӞu I+! y:oBWǪˣ4'Bw[t{0 cʑġ=1hȐY'ǥqdJb-#y$v͗0ڜ߹uN`I@.d3cŬ ucKb1%L Y^ڞM2&_R]UȨҏcMڱN\[7 endstream endobj 820 0 obj<>stream HdN@ ;O#HeǞ lݥ josXAo5Vݟ;-$ˢrNւ4ڝ `Z;T`+]Je0Ey<B+=ў2Rr>stream Htn@E|E-)驮~K~,fa) ~C C#} ĦM:uMhIV.P>x|1O˯~SRE ƺ$YeB> endobj 823 0 obj<> endobj 824 0 obj<>stream HlMn09, 9$E =c1[6$9{RR/Hߛ?||ؼKRzɳ$6Q4xw>GafK5P_Wc88phs=wNCrB yʔ/|jXs؍J>ksθjXDܷэ|;4}UuC֤婉K5E42nô/=zY[a5]T.z9M{]e :e4ɟ8)X=/^֦TQ7Y._콑[]F[I`$ywEl@l~K!E;` A;ѶG,Ch#X:d8VhM M#9YaK;~ endstream endobj 825 0 obj<> endobj 826 0 obj<>stream H|SMO0W$G%!@{@CI6KR bq73o\o?p{zz*VU@@-~q%/3K<|!/AZ\BW>B8:CEi^irc9n vChw)vزTL%l6uun2{w_Dm_#̐c+䏴ˉ3:r5.yg{kmߡb22g 3c}JtBJ.S SkA`{ -`4+m°fl%+44g+Y>;S❥c8 !MЅ:7>p`ꩋ}I Gyϕ`uYl')Bjn<F3!vdܻ̽ԋ 9 Y.'f endstream endobj 827 0 obj<>stream HSn0sICjpCXIkHC F7ow85Z ^Pi;E:7?'@%RID$țr p"wx R2zsbD[@,S Z|kj6(kq0vm]o-3;[rdiA[_<~A#sWFysNproE,64Vmh_WU_rQ bRe ߎ endstream endobj 828 0 obj<>stream Htn0<pD/bS8M POxzI2yCW_qeNׂϐԮǭe;g29-9ezJa: kXFInC mOyW#/H.ud-BUcRc]H\=wᴫ]8*w)/ҧLnlcn© "ez22ZڪcNY3u-ut*]Hڗ g Cl!_0uʉB893Yaڊ_'aN5JDd$m]`o endstream endobj 829 0 obj<>stream HV TSWY!l&LE@Q^l-!& HikIƒD؊ DqE,#Z\3uPcu;FQ[gΙsfΜygPX '^JT,I[4=e"x=HC+[{"oF1S=uZS=޽v1; HXvd{_ct:C)WQ\)2|G&n3Lb6]:s,zT N4qfђոȨa:AP0,d T8UJ+42^ #F8EdlNߢν/k2>^p[[q{n#K;>9#+|k bWqy|,Rܺ|arWS#lqGͪsl늀څ_^,[?O'dOͼ9a4™ eg׽{t$T%&Xoа?䤂ߢ?_ s'* ,8U6*(̥Szzgܦu\&RE]9}asSIvσ>2ul ;#1v,SڵS-Zk]}TqcKZ{].~%+t:1fL7ڜӻ5OYu^p_꧱@xoo<.&Z?Q/CʚOLI8>!=cB:_slnsbѥv٥;jVE@D׿i!&gav^ .,&t-ͫnniho eD #l|}|>b"EaԢ)/‘"(PZ*ӈQaDPZj3(IJ#"_0d4D"dNQ$FBD%P+ajzU̩T F ֤7:#nR_/֨LH /  R$`= K@j*7j-+vԣG=׮nzJ5ݛv;3coor"bڠ1ސE r 7Z#L9E5]i@ Hi<@]ehM,B6RE,/2 t/w_70"@(71?9^zM%U#\&!(Jĺ6@"A Iґe2,|\>TcO8lM~Tt<1![e{slnkޟ+z=ſ^ӫ:v%%%6p)@\uk]3[[]׺ kwنnptW|Um$zpkAo\ʇ5WyuS̽P븐(#Fd#jRɪ `$u 'MT;s^}l~O҉WYVʱ|g[*6.mT{?ÑaNo H!ڮIPn,~{"Ř]>f[cAGn 1K)+ȡQaG7!B7D!ٵ{܍*"D,~BИW_21,ᣘ?+XE %+C(sLLƢTn-Ok\_eVn.߹_{OpFE"Kn0zlru}>h%j%OCM ݈wp/Fj[-lBq%Z}3,/`Af܀oBԎvPkpXw 8SBC`O z 2S̙R&%&+f͌MNӞ%19<,4$8H:ib`DBY I9N+BX"nSyjb#r$Ԥ`5x[<1ERvqBvzw= jkN)AEh.e~c>8y;; C8O-PmSbVDu9RC Z-YùJdc?KKLTe1[J%%yy>].HQjD?nCŖ~xǁM`ݿw6QСj;Z$p< kv0/^e Ay@K{:Fm%2G<9.E!ØW=P zz{5Йm sCԇD Wރu(BY as.|]H?7߶eL1Er}$?ikI %fxqpMAǹ_k ͇Ykhz k,P n{&kaQF!<-QcB'[t{oQՊBpG8F|mX燵| |[{f4 [9(g q\W+SAϨEk}^)Xs2wlծ/ì%cccĚX>8έXKMv^{mۊ1sJrXECОvMP͔8liD .}` %e5 rs N2v䴽+;Г)Lʴ׉{^x >t~ڥ r#=2C3-O -t1(_<}z>JԹ|Ĺ#>>1 Rl,?n+s| e3=M=K9Q6gi \qtƵH/H~3PHע;7ep [娕O [:9d_aYڠVLM][_E[ҟ vzJ;۪w2pnl/ Y{ގY9ߎ(I`X 4|u ۊc}V^r:5ژ]  N{{7}1d0:@`[CU:БGϬ 'XQ~pįo'>~ aʛ|n]tA )S1qނ=r zέMXo )BM|CRb\y%3m>TGiX!e~OE KI#X(.mm}Qh)P~X/Uj ) Qbz˿}=|s}7NuJ|Uvt9@gG_љݾh}mۛi jm{w ]몹[35wd,8I0p > ʾ~|s|-f/3ǀ+.~p<_fqLs\lqmn "Ef[.e#m7jr`aV5LZaQ]Úx$T/ [DŽxy Z҉qʉq ³"6CBܲ%-\8Btw k||BImJR;l_+&ٓg˰Ǥ˜غi yP ᷊L:Q;]WAnLJaqTRМjMs:Ҁә6ǘ-l2Dn'ZZ2'ߝ *DyWqpqnrۛ.o+]éeV9iLH%9CBba\6@[c=WJjuq)j&|ѩ$~M4UqHZoZIwlc˖-[wJ p@JC$6i4hd40 MI-%`\ΐtJ'3dӆO1_`I"鬴#{s=KKDt٨"h (l6ɔUg% `4eeTWzCpaC6{F)luT쌟d.h=͎VV)eũf6V5ZzMҗ[2լyE|vB^dh|Qo\-U3P̢;g7ATHO,U/W "R} w} o&[.>vl\i7ꇰtx:L.;~G_}ك3K) L#IdJW\m4?[02[_Nr}}ީORkȮCR;RGVß6xź12n#DD*&5eҥV)"*E,I.[mT$lvO- P(Ωj0O,w&14Za_Sb]B%Ň DySU*>Fc0=k}i>N]"/eu>|k"$ 0p Ȥl ]q%F rA>x8ԈAAGƖE':nũ $x /ߞe3bǎ9=|O7|7PƤmZkX?aǷ>6kk=nsrXnoSAUm"T؜V$]JE3r;`Jס52MzRi ȭSy#T[1@gtNB4MAQX΅,j;3lg(, 7 ͦaa`$R[ܚ& V7@55ޅ3-֟.` Moz6~-i܈v"K0DJM'v !Qd)G%ޱ }vg OäN~j:d ,E*U} JQ%r|Qe?\ r"X2٢ڝEQQqJZÞgs|@@l(-c` ?+"ρ2%铗/'V;ʶ` M ſ|sQZ bO.٘y!xoP9|/#^22 znE-(@(H E8)$iE[3V]e@ YhWfoe~m9."{ٱcoS'yLxA% eqb#"ĵ-gKl{-\:97Q^9"+OcUUarJN> H3t]]D:P.aES g,(aWϳl.-khmv`~wӓ#S[ >^"+F 6%BPP8UgsS*IX=q$:$=G|eD*PD%}Ա.bqbHTPDp8ʠOrB:^ (ƌI!cfk|ԌnxNet £髒&N"HY{XWRq8ؽC;p@y{kU{$tבŴX3ܑbn8 ѱuu/ɽHE i0dAt0AOh'!85ܺkDAYm5pQ#I#f=6c>7Tv9^HM0$`!hs"YFwFkmtmepvήmn+;7c9!9~7[惣+VlMGe58R/Z>hjf,|\זdxV9fPGE;e+/[6S\Rԫ$ IM:PYd&s&˙"P&5vu 6(lH14@)I(c{IPj7t@S ԍ{۽sJ9+.]Sf$I~(?cSoWlj}]J+LZ+zv|B#"QDxPl 4~C884M,navCx|S~zϾ xA||P_}`K.tavǏ߸qҮ)s-YzjR/Q=Oͤ&ӤI$Sb$KLXԨ4^2&|Q bKHc{q(Kc4Oi?<3 cʨ*Y: z~ޱz f;Њ 5Hݵثo a,YN=aG3VrDX2hdHGv+ i4J`nf "/ ƪ0=EarX T7`C9r-kp/ ȏO\uK,s\9ї0iUN=tGQ U'xA}Y@ =ª~ֳʀy 0aml)+pd^py<=]r*jFF`cw&,3?G2n(ЬEwyL'P4*tvb4JdCe<:]rB?KH4`2%CD$fEo08.պB9I*(?J0h/iŚ ;a:6&~Hi>~JMu7F_ctLd]OF\\&V"Wv_R3Ŕ_15[oye޽]mDp 3~(v>!Ĥj6nfÔ, k&'12qүtVn!/ǿ|vn;$tÐ1 <&zQ 4W䗣9.j5 2'+CF!BX3j̊%ZKtaNm sWQZ8j뱋v]V G o((Sҥ?b;zЁ;x:{[{0,3KAu]Q27?SJ=Op2gΎ_&CWY| p^ Ύ;Iwk-ka) xI)5QCH=B*s=*B(mSL+&: o_qgO鬪~qȟJ98G98G5*m+"cnr8$XZhSb SZ%Y!RVo)HH[I[CzNY#Đ͇2fɃ\sXgD3<7Vﳆ,uȓi9RY{%7(DQM;!,PLh^bȖYq貑iAe1"9͆EC˫3Yx޸{Μ%K~"t31}g ,9tA66C:` LJ)dDљhz4Oa0lc>ʐ޶cs@KSE< q⣌Yh@pӽ{ BnjP9*Q>Ĕ(e"g.n͓R`ԀE~ՀFqD7{s4l1JBDcQO0ݙxɥ{6mZ"E("EhT" E bm"XhQ"mi\fbӪ(X(}v}o޼G0~5WNYl,RWQq9PwTߪw_8|V_SJXw p{[w l*r|/In1HD^9r$!ԾoΧ o.^2z5ԡ2e@xtJyPC%xB< X  9BLZkC#>җz|2/)eYzAKe<}_CK}eZ6r'Їy^ig'x}F|W+G\\S,g1Z}B% qse FyzbvcK"~r=pRXn D8gb<<3'G] uL~NS Z͖xpm!"z'mz`>D}@r DwRT-=tblTno*)7ݳZZvRVoz~\`|33_*))xECD8Gæ}/I5qʾ (~bف9%P:P._~_%˛V|y5-k׭p?A yX#Ix4J a-X3D!X +Q;)]}m¾ߟH֠'׬M4h2joFPh[aJ!ӱChgb&6{1+3;C=(n%Y]f8j;!;V2b~rnCc6 TR>stream HV{lcf"}/Z"%R PJ&Օ:!]K=^Goq"$<!l>ԣIspndƋĨ/G`sLAIc{Ƕh|Z`%A,pl狱E>m@yy{1עK=h) ?W`t A ؇' );GȀ(ك]ܱBG6,$SJgՔ6/4?9hI¬!ߴӚyh5[ bV./=f{Z/ DA ҘEM5ӰF"tpYR⡲-crB){HXf<|ۏI\9fC)Ę"!TyM}8f7OLfL'BhhX,9X['$$XmEϳ X@!-&2cg8"*+Y;.'u-tX=gJ2i?~,3(n=q3R~wMu^9e渙v %/ vo dR1Jw],r^GY]QWX 5~4ʪ %Q%U%ڶz1B9)Si}˙U86꼺P"i6{uÎl-V1aܐJFeqWCX]a}i'5*oy"%M7{JG$ \B':, iˊׄ >,c-"EOoQ3Y),}>஡94}̡Y̋ iT|oBJ2 D$Pch?zVs!rY\ۜBvTFNpd9G-ʂi(^xIu`uZtc[Os/ ;p#/;No=vfP(nR|| _LOpd89Tkwg=\`l $!72J,C9e "~u V>N+k}( Yb.?3CwlKQ|!W4i0f1Bl/DWMZAxY8kZ\>-cTSKQͫK, ǴmLzQ=(UQs=&9ܨKϩG̿Voq@'mYg?98Vaj|k[oJ݁@Vt0'Q1yc⊁ٚadNWùw=jv; 1s}OL'ľ-  (;kWJ]ie:$kv0G@t"5od֮r:F4AcÙ&=%GT~$9%ma-}2:,O'j7԰g@9^غ0z![.; FGΔ,o ~Gǐ [&wʘRC=ǹXU]76isU AOS+5YؙX^Vm>IŠKk̿*Ν.7);82Vyŗ7(S/LGПN}h6kD>k˹_'n*mѮ;lw?Z~&Z7TRqRSq>T𳊥_ܹtlWwر/ hBFT+eieF4qΠcB2H)d\LHSQBft%KdiR"ZݛBZܖ>9s~ _`8aC7A(]hqPh ݾ3-gEF^w h(_Y[^X`J#_3ՖUmWcn=ӼַPLɫwᬼ '\k͜GQe)f4/w򮠽AfRT{{OnjzA2t(z4vȲ\\͸N\:JsD^MCҮBuge# Dum.ܮG Z¶u vFE_|kJG-̰brT_Т{~dl"A3Q7B!FVktNQ㕖FHao|z 3Q+mGM&F;nmi VOjխDfH'Kxp"[\\2y|3Ǭ*#Msr;0;pSS8ћ_ ]xGXö( [IV26nB~j}piNj$/ӣF=J#QNvPU]iZ|qϳ MSȡ6BŃCx2"?_($OL jB/ȹ|aʄ$ Pd'@\6p~_^TrLr6/v>g bzuC،=~p]#р8>33PR>mAYlӮi92xʪ'KRnT%dA|XAXkԓ)񇆓vGB̯tWq#t.򤛨Dm9f;g*}LNץT(h M$>.PWi j",={C]I,3L,)>d_+.k)\t< pz;?"vvN]`仝,=n'^pܫV |ov9:䡉UPW݀Ĉ/+:՜q@c\ ŐQCD/A!8 Z( , ~d1%H/ UenpA vpI0αZ0&0' 7P/,zaA=L:W###?;'*yڈaΉm}jXD7^;6-ĐTcyG)HKyҕ*6MVj(V5.rFN!L_4PNEOmVſ%=`y?5X~SLSLn&5YGsf5ZrtKũv0F&~9SJ77V; E Oe5՗՗+ uM;x?g6\ﺳc_wxa0 au+ 2IH aL=?'.p 0@@ L& R(Ǘ"Xo>@^LHm= T& Yh{q YP\,h 184(#@4$z/|ǶRZZWdG! ^kk躐>|&Ӌ \وwXtΔ} cݪ;yo@)K^ww^t{smXܫMoM7<:31dS#VbsdH*L/ȍ+,M[(FؗPZ eJ$Qˌu<Í2*j7%ҡh3}swιTwȹ)V6]@YG 8oĶ_u'#2շS\=lbMƆvU<ϛSߞD^o/,;=nGMa쮱Ora<@t{Y oa؏z#Ʃb+ж^m+wS&OA\晽З*휡? bj/!ܚhnr1M0uC: Jl@+<68JX8rHVI&1js t\h.X`+;O& NS1͙J#Ҝ4x)GoP(247ȴ?VJeE(Ql%XEf"`7K: ̴/؍IYT%d Elo6%iP$az5<[G*ZNF/"lb6.&^IqFؗ-R0̷p+m VV0Zc-A %]R;42A60 dy7XtKzn|.#83qyO$Vfjnk%0fWzTՠ)=~h3A=.*BqQ$}e%R*\V{ګO/myhy\rƻGpL$\bAuQ)fuJ][SS''0ۙ19 |MKGݺ~YYz^?Yec9s|}gLy8+1H@G8VD'a6Y/˱e <\H(9q߰bb| C5TK"RuPUJUYa Y{pᢟ#Qb⛈U.=!!0Nh% d#,XJd!>}yoWyVy6 滛Z Q[SJImRRF}.-p_"_G엫RTZ\--8CDV5G WA_=TCiJ|Y%ߟBEPV\|*iU_YhyLbb Fh-;vgO[*|+ &+]T֗ƾD'D-r缿F]i&0<>ǐgV!k7b2 ;B̷P;JOُ&4\I#v7{?f9 %34]&0oi|}UIPU`JM"L@ӦA C'uR.;u>_^j2W͛5}IpF ԯWNZ5k8 NvyóV;--؝9?;uT/}l뗞II?z&S깺klvyO]2|@&E),Kvmڡ4Mqy%-dv5cccPXfMZ`w~w= IԝNfa12=)BCbc{޺~$:N4hP*,ZXQkq֫6Ͼۻ? c9[3\b0 16u3pPF('GhKFP"܆IZJȨB(hZU%mJB[" ߼=-*y޼y3oL#{U`zs7>pu]ZLXg6772c Sd66lsӭ1",I \LQҤ[}EEC*-1#`.BJ.zbb?qכgwLnj0:'s GqU#c1Ó3?kQrĢxTb~R*XBf̠*G VɯWH*fbRy sM[u/Bu` Ɔk)qo:1]{枵.yHׂw%h.Py9>65K!_ 6_!k5y/@l0 D`wm0?>vB_^\XL@Z B?F3;gb٧( ? U.,Qgɻڞ:Aq6z!E 4i4=+|\zf$x̓SAa*W7T+f@1ۺ-I ="T {ȅ,;iv03s-ڜ[3{s*JAέ ZƹT 3A9kڡ҇#ׄC>e]T{w4=LA薺ޣǴR=o й!Y״b U.v_ˢ!e=D,KsCb6\=Wx3ΤPmSF/]=4s Y6D2;>(T(=]J{y77g0~i6H Z͇_j/+C_PpK>teݹ$\95 *dQd)7,ɷ9t^N%͌ӌ;ov^f1LS%ǩS،^c'AϦic/Yw9u "}skY uBZ'9*N -KgAQp.߶_Cj{nkd9ruƪ›6ߩQ)VaMp *vS#lHs@Y߂+]oSP꺊sɳ;rf宠|MPEjNP| 2x3b͵\leSz`ܫj=j=q]Qe 菀0ڼՒZd&hW5i^F]7γȫiY{CM}w[ؽCU\c7ۻDpנ ũ>^~;IɊm{*u-8%SVSp)Ao _c<C|m\-:K7 ;5@ oN%FISE]r}&G7/lS:[mw~uhYM^1KU9jTRT L' i/Є<LfπW<>v`Ӡ'tT`EgP_9L^gNF8Í:vh zoB*TK! ,;6M?.M1~3>(v?{P~OJ=9DcEV0f]ʎK 2P|2)Gm}qϞ_KV{6pVpv_E *d,!\C\~LTFa; U3t>f!'d?>4I1|žTCf6tx P6v?߇ K+R} <|PI1D>Ol3"6/X|ϛ`_3qaX R"u (wZ1P"u,DΜzy.ػ~HN> soˈM^ܩ7N &^ߎ\uBߴc}wǎ>m}1԰XdB@z,(Ƌݟ8? Fny7Q==z:=;"YH;wx[ws{xof1=PU}Q~E؞u ga;xA\nFO}W]gax9}ߊ\X3yb`)N;o-ޞEB;W^rqytCB'Ga# .zXYP>'fu%klj.[fY*$_NbW?]eװU`TgqSSI;# 1sm;"eL}J^'~YkyzS$!>~`TR~BP@N։yvZf?}5Fa2 ]vH)p$Bf̲ }:G`],֢nsEg (F )&!G: wd7jJ<4#܎%m7a嚰rMDѮӘ35N#4N#VxEruߍu8d/߂lڅƞ:bV6cmM# ȩ|8Wsssssss3יt]>Wkk\KqWfrd("8O ʲOB u)8;JZUjxiQU9⢪NS$%a Ӿuf nwpzZD6o.mg;xNGlJIvHx%ω &,SR0TB4JtڕM l+5#V !Hc*u iH*6ZQ@gҮ|ι9sﻷC=\iqM1,mܒܡxG"w|I2WG;$㹯u6'Αa2#H&d8]C6< 75H^_1$I~|8)!"`CTk[bXJ徿gˍ\ר•c޾A*{s׼Voԕ{{*:\JoԺQ@XAtڕf4W4ȴhwU0:E4NV>njtI36n06,4?Ѱ=XU4 xV| 1t֑}א5CcFU#Qa6÷U;+b,u= fe6q7IȀ ZNB?0n=tt !m?02Y?C5CX\VzJ΀s#ao1AF1jMAnsf æPpY5>?6^z6#O2퇅o~\xwb?ퟢ,dG$I/֞r|`X2^eBgLV#k[ZGuWHEOnn[2gjFFDzU"͋b0Tj|&KmS<20V83n.a-lS}< ͞Q|Z.RQRR:-E~OD?tX 4&awfR8o/Y[ LJ_yْ2g0>sD{REi/gBzq `E50dAYD/h!eV_n%D ӕ>sbጳ:PѸ)z*H_\8Y=Oo'; 0GFa"r)n'rdz]Č œ4 x;aKY0hZѤEc(Oez}TBa~.a]#]0{ vnhVwh5 sZiS+}~+#Kjk?t9:\xщo+9M+2ȉ6r\R!uwq;Tc4'Ɠٯ>>}ۻ;;"%;&"i(H2BhpRD%4Z[;p/:HP<ЉMGۦujhkl4C?줦}0]<'vFsL=Qtš84eae2 !NbV8Ve8u ˌC4seT!N4ĺUW2Ep@qyݭrq5Y<'=1(>LMKk ;H"WMrh ^E?tcշWTεqdӛ/ pU)`ZGX3r"-ʅnePu~fƎzpEE*F^--+{> [3 ~r?X ;}޺^*-cFt&g)TORƇ>++ǍkLU9Mkp"°Bv̝͝*OE q8<'Qq2=(4+9ыn8êqIϻ -T%j 2vrqB2\+$b߃=N0? 0ro%M*Y %3[~OLcBvTQ$ɠlp9WU}*ñ>oD3Mmœj 4Q(J`i#U]p~%=Aa˒>9RSCʉI>;˷,;Qr; <_*.kN_^ע=5Ok<<9pd{ͳo,s~߻3T-u6~fkit$vH--!Yi A3\l),2YDWeivސ@-A ?iQMd g` /hL`a~&t22i/+4"Vi<jHv O%=VK8aYiVnKyV+R{{m^ހ853SpCs}p5נ VS*dkN2`ޖp=̠ VmvfY'w7R^J6ppzlG.Q]Y4ttQ)$I-kXSK,2a(u A{A6z rB"1ThGb)83ɊM#z:IiO#t4)hN~CQ@A:_ <8=Oo[ݿ/+O;]Pp>.0QMRĸ?LhxP Aa%bL|L>OHBĒ (Qi2(hFӄEV[a7.𣉘 L"Q4fј La+Sʜ}L'q}OlB>t_KWx}c8&%\XGL_Uq|7|N82鐛!s=ф OKU(( uDMQsECg2N/./n2'pNOY0|Oo9CYE-* 5wυSah 큽݋!6G ^Pڐs{83a1}nfJyQ,ai)@]&y,αM+亀׿K,!%*Ei"^4z 085簓v*)g ,z<  E^ZPcs0tz1&Xl8sz/p6QŶG6zV6\}3_YJeN% U_;_^DZ6u’״Ȓ_l%b~Q=z`}sЯ;ںk ߟ$߳3ɳf҈BҮ %%JK5:H]P?*Kԁ Ul ֍LhЀ9g`fwm]swo%|jjٰlA LQ Mc8n P١K^R"{P;u;m>CP9$_u rtU51]ռag~IUO EE=?Eev%@ۗ'겤m2" *XH ƙȤI]R|A>W6Q3I](=6Tuyskz^ܻ~Netmyl9e7*u~{Bꄩ[!~~ GޠHAZ%f !iP#H` Nv<`[]oAcWo@E:MAx\ݓl' րQ` Hゲ0x29?~,tu$[C0A RlZ|rT *>ơ']iQ&*f/&SP lV(?f;>YeCHy1,HŰN1qg|)z~LJ-r~itH/=yi rCrm6{=ds4OIc(|J#_56or;|[E$Sܦ’9JD/}Vd^Gx!R(us: pI݉$B@p\/{}>f ݙG-VMv,fAw@`d/{j)=*4 9hQHQm 2ɯ', elHUuuPkR^Wggfڂ\%*A6)qt֜J WE٬7+PUU6Y粆kbnp wJ5-/y}Z|31_L<8DzMJJᔼ%&w]VJW|o୾aŶ2Px^M)+qEJPMHݦD<8L$aOȞ)=屡Q!!8lt"5D0#P}v1y]}KKU/]WnLSa\뤑ވW4YTܧElP4͆%~lƣgHfpnjCG^obF\qTY{v~jͣ3LnoK53o'̜wc>f$FzN>@//KÛȏi xN.Id,.OX/6K(a5"\J̯aG.⊸.erykaƬ\]7ot8n?%+ev4֋Rbۗe$-WB{)P;Ԅr;혮^\^b1+J1= HPgskf77WuJ?~Hug.;L6C? ]Mw9>;sv^gN./&!!hMVn R Ju?F;5C[ĖjlPm6{T$JT:I)uo͠*yV%w~r/<{ )P n}stwqyyÙlV+oO MTKH0UG$`yU_TT12!ڸcvK)*U4۰ԋhL w۷χ9]]Ͷ":$*h/s"C%2*"C%VC.60T c~)& j&m:?5:E*tt(V FYUN?)N< Zm!3B!-Z'p3E`QH"뵬`091“[=ɝ78KAS[mkM>Zg.RrcLzIHzfWK$'[j(QD5 BMLf޽= }um=Rf_(+xѲQA`,&#Ew+T^J4 'ݜ gƹIJJ$NvrkD\6=^͇}-h悌dA 2A>H#KOM<~=?<3;yz3 ' Qd1M3T#Agjk/-'7VWZJ27;-3;q2YiFz}]YUZ(aٲZmsҹukr6?nEyw0YJ"Ģ,*XϹ=BA.({ɇ ESjfW,ɲM6GV_Ag"{F(4>U0޹/<=F t3"-tQU\cBpE5qޏ?>t`"Yf)6RJBwɬnDJ&M [A:!Hq&D=*)n.ZdN\ YAPiĞd!'I-CkCCX[¥\{,~h=JX͓ϔv>zӯKUZ/<W8з7uxOuX Î+'Qbd55M^M]J bVkJLh)bkj1AA]U^T*Up]7n8F8j5& QĺMz뵌,Ύ-lAf)`f0ӹ8Ϝ,R6bmm'mcx8~f`͎3kge\9n̼1opG2g 3tKKwE PMpP -0 y.5L:_:*▓dtʳP8ѵkN6ΎbD TD*<+Ns;`^T`^d f4m iRaz%3y;EkRmM!Y W9霎\c ތw^"ʭ_ǰxbݣ5s8㹿FC"q L~Z] #1`NihShJGאY/vr mZ7m[ïmA}C}JܽWj5靠q*zǽX% 'HA2YXq|.ԕY+oG['2{ w?R,ssdIqe$6upJەvu Kޫ8g䧝#qw䳭פee:tñeGZiuqiG|H ViF$sl&3>9lϳ/qr X,5Qԩ$nZVJ1 XvA цe"JMI0i>I=9вI:>t )LTh8KLӟi+S񸕼'ynfEII&R޼ #'#F+܈Gkm=6;xNK/g?_ņ~8j$go '̎\3:n&ygS7^x쪇Tbnխ8UHp"q/3)n^%&6(UI<>0%6fM慿v$sH%n_3~q7pgH z Z_0!@!Ese]:]FG4*LkQ5d} ( Q DqB_l3`6}&hükfS]%K.v*2!ѷL"p+b`a)>C`1 u tխ7r;P}ZfBT SEkZaxox4Ѱd͞!.Q\S8zb8h7fZB?_YϏf "-ј%Ik=GDiĪ+/E0rmpaeya}n<,;TL&+`gV?>+zs_=w_C=\uvxê_S^~d~<})1!u,1q5iD~o|s!~I&^xYJ 5%)ԣy\n|ϟ&MH{~-LVFQH @%c}1 FWFjnvQ$S|oWY Vv LO3- $R@Bfէͪߴh=sm3QSɅV6~CIԷfݙt!ePSPl?v= )v' f 1,5o>ӏ&%2D.laH12Z062,6< '3/fݶ5K7P"3uW_ikۏ_@TwPƸwr+5 ?8γĵ;/vJɸWB?r'Ʈ渞rrˏ932t8CwFw%A9|4wN'.$/~f|Xex?Sns4 vST?oȘhDIB :Q+zPbmIQ N34LF 7F޸{xHDlWVmuT?-u{jU< o`,h "G[ $Wm Y舃bKEX1٤jͤSP:Qcy^UxR3e>D@жFbwBuEiOC+~OxaTw S;N'{h߁:`{|w:det^hh#Gl}GiXv,qagwoX_gLaq2fi F#AӳeKٺVN& `)X-@!(u9C8ӹJXI W *!%}Eqemqe11APQ{} -YƴQLÝ]i$GGS&3қ3w:?gZ&a*wSpLsx/Cb0x){93&ɚmX I`$-m%!9 1ۯu;g}/L{Koytfzs흉J\sd%;zG>}h?Lؿ١k۴4pՔʟ5$!rjFjyDXl|_=T٬)(KxĞy:%F8czߗyDp'$hb4c1\BK0zDmvDM(Ă ?Tv5 "474HB-!R \*v7({5,P2QZj( hC%mW#A֟x:Agx]Y "7o޵t(,VU`"9G:l %S.ͼi϶XYhynvD[Y*a(Qu5eZu4&"':K%^57jQe%~T2͇MxߪF7jɱ7/r2eʶ:`xN#NQR~;S C#H^8ySvUET8;M$8QL6_t[a'%I4nxY1({U}}aeNlw̐4oafq˂õ8@`)U3%0cE`svVh1 Xi\21)?ClPI+J@M/a_]ptuڞ1!U"H7 MǧQYb 0, $YB@EPo'Ǯ+ \w~?~2~#d+t|l1bG=u~N$gnOA E ml`GfD|0)y_h^Edge/hhXĻjqɓ,X,RlUeXhVS9E[bTYdL3;C1=Ϙ&?eSwnio W(@/5j,Ov (>?"yEexW8ezp!+6A0I +ߍ p0:=[;dvVy+G@P` W Ӄ@yHVz+l nvvmٯ;/q/f:{+A`!!w?!HSgN4uNSi-pVvѰ.ӝzmvz X ^O_h:tM],q4 fe5So&y]gh!XYU@ gIawG *6>x>K8@1UjK!K+WT鍧T!\dCSj:`#fDi渜\)+ O˲d6 %y?b_+={˯t/X\^Q^YވO&7\:1A=SY"MPR(:5ozTh?&ɛ8&%k oOxn,0>1w ?rm1Vz4d]II7PR#8 !e38WhZ4=߶L=-G~v; SJEJl鬴4I5+/@*goXuڝin.sP{6/]$SŎ]:7݄ͅ1# QhQ( *ikm"pA̢ N@8#z =ۣdS/tۈo)xGϜ+72KRBCrx]w A9狆A0ESJ5SC~5ٸp}P_/|82\#.~Wfp1b/LYtb ++R.*x󐩈*9z p_& iu b-qwLh<@X-LTќBj +E\b\S$ FPb:\NR DŢQ|:`1el'42oc^>Gm>B)ԯƫ3V$>NtNrHj[G!4YEgGv.K1i:$>ާ2ȡ}vBuKXF[[l [93Lڗ–ey1l!,p$6'Zh)hU!-DPRr+093  ${i4&m㇔իB,=3Gٽn5{Y[i-URg6b{ӯ=E2o/n[m 9kTM*#v~O} bB[ `hjl>H;1>77{;o Id,-Ce Rg/Nsܝb*ԛu7~T~TT:=6VF8s# Op\/T}oPU_G<z^sO;Q$i Gx_};H{CmH/HMج5 =Sh"pq.L~OaKK"bԔTϨ.[RM.Q#E!HSVhqe6Kf'&K ,Is##_ܜʝ]XBɝ))ae2,G׍;i9+Vdz͑P"t V<; ,:;HhOX 1VU<2Ąm Uw-A_2P<;EGtD|/HHpB5(!$#@dΊ'Av{gYy}} qpf@?7P$j+"H8K v-@dG}7[ްdoĶj\8{lPBE>T[?2Ӂ跾:;S-vJ=X襡 U^E{{{w|QE;I, $W sJd&B8I?R(oGA ݂!W\zŢ:p[8 }Yt= A4<#{ SLj{DK^*Dx>_&+w{ 9SR.&7*˹g#铮s<ot$RGx iMzSf̟0BRjBqO#&TWTOp@"V 8Ss+ΛʧF>*餌c>)?뎿wwwرϾq~َCq .)XФԍ U+BndL * t?424A#RCECdUd)XU ePm}߻|>_OD^LLr#& MBh * aH[TAV*n2&Gf4؟^ܖG6p_~;?[?%>԰V]`xP $Ո C1"2 I ֈY%g),qUc%w\(3]QFw4(N^uՓ.$;Md0<!9v:И5 ɼpxsp 2/ ~ D'w*~/KI"wpPz'X|1N|&սd@(Xc,2>k:fMY%kZ*Y{/ '1s h,m]yp砇dԂlT@#hMZ@NzC'wjd []1[D[t+:g"r~T*2X%rQ-u9\6c>.An6\S lJH {90l=p%0cJp VK_fylpߓb<+S>w.SE{?q%X}׽[*חU) T2 6)-(L~ W$ aFEj1Rⷝ27Tg2W0n(1pǸO_O0 nC##17[g `M3GB-NL3cdܒ9rd20,+fh|-ٜ-d^^q22 3ce&-96%_'dff۵ӦcR,&9Du|51u=olNI$%uwiFh$jt`[Hilb)Jxw -I 1 o703 Yn;;wU\h}~9)=*&kꒂTM@&nr1 %(E:WX!n}9v[}1]y}ˏ^IVa_kbc[~1(8ŋ׺Fr߾|Oo_S( eD7H: D2 2#LYk688F1 A AD!h~G{и>a͈:h@EU>g9̕c@G؉LD>ĮVIH1"Ci"4u΁@, MX-TMpIcѯJxrnxB>|fJn`>T@'#dFEr\=Y)F%" ֐ea1?W?RC0S8q5qgx{/xGSuoޯHAՍ;?$T}4ODȓ\7ʍra ׌t9[qy'\FwiSD$ Ԣkt~5kI&hZ78"PᚽA=~:!W%!}~P;[ kJ7%^l V"MI (5S\)[mmO摬Ȧ/X3q^ʝe%ƥ"-<2| (Tr xm(Ay@z@bpbwNs\q,"4w<ӹ*8$8 9R #N+prU*='ٲ3)\`T>44ZS`*Ut ^۷{jo:]y۟;rqiC m[ݿ[w}70?oOmwEJrrv'L6M;Ċ,bInc3[ *,H"''hKMD6zgp*J(Q.)RR E@ 4l (?I%"ib4n:3-} AO9[i:>r<.φ^~qD.kB Ҥ--TکSMI."Q <%3dQ.MTdF'JĥggB;}q7%gbW54bSyLeqJڕ,zNȘB|XK,ʡy^IA+XʶFA:@F;`&z]BK TeաR ViV+mu/޺ J@V2?>}ƀm 8pxd,TӄAJ6叅5&)2UiZVm4ENNKMR'd#ͦ uY4mS_zT.y=RKnJ_52y/d3r˸6d17&ljX {q:lc5w`u㤺 ,8־*# r}ma c5q@ x  HB4WIo 2 i0]];ݤ^rܷuf8 .3#։$}B'I6)&Hd/.Miܛ +B35>05D"$B1#d*R܉܏#M8T`ScJɒVZwn(T_9UjZ~} 8iKrfyN3&NΪ渚'$[duE0X|maUoi2pKK%߆UQU"- o-PcK]TP u | V]v>C [XBa0DX|I'A,"lB` qgG%C(ӕbT(N}71 "y9`b|U%2"ips B:%9_ ?8b@M`4-w~:EBbH`jPf.G{JY PJ!={ӛk6nr乎㍶)^IOgە~w2٩mhPyfs&d)]8ә(L]3^C_|d0t(tA A5-׵5!qS!EE^PQNH؄ CtT:'lr\5սV v9cJE'P v8pD3)^kZ3t Z;Fug'ւ( MZ لqdʎL31EqI[S,"u%R(f{L2u-ni v-dzuզ]71]@i{άK9țAkh)_ϲ*Gٹl]ZH boVÅ6> rMZ=N "3 %U6EŴ“bl[QTYKEF=FV;Z bMCHKCvfP1W'^Gvh<Iv\h?,Z&b7s良h݌$%&g:SS38 @zd -|idt" w,"e-;D Bc9(MXb7wohE܏`Rۣ}=A&U)y^26G3Yo\lYa@ bl r@g\2>^7kka5N7eIn3:p{O54v EP>j|?U j5&<,GTp(dN)++ʚ$4<)()fkm'w|J*eFwnw,QQ-~O*Q}xEsY6nKKNotJpJaī9HN]h`KU!.7MT|޴E]EuE}5bIeWYOC$, 7n;bn5UҤY1UqTɋZ.Vsi6\5)j(j@`E"VIkҶJ{H1O2~su rbIa#M<S>_un[xZ?e۶uq^t-LJ%RmKIiYZQYbxeGxCG $C0d.@>unv.FP{X0lŰ]$k1ReINRL/H?ӒA Ԡ](6H$tTJJ(KGGrX~4ka~.n&JņK_:S$G/gz/z~DSvmwd3>og(B+Ə Z`O1gw a>謋}$bp9=Npzࠒ`=\2SBd„B -̗!$_޾o]GԽ#렚uEMzC*eq0 3'"\|Aj8\NgYy~E쿙ߋ^]>?n+ J5^jyQʋS1nL lAMbe5&'K?ׯ_ 5UYO1(@tT5N[2HHTZ?-ue??f/s]_$rOwCttOIpkkgކDHҌxMYb284$'d:b:57=T c ذc"3Cb}9Q r<\mqH$O$Hoscn?sqs58'2+f>/8;7öGt6{W3?m 백./`N2E8rlԉo= w3|Y{+lpakk]X#l [P!ȰmbPPy &y*RI)KS2 k/d[ Cŝȹ@ 3<+ `u<`fͯ#/LLpmg1;FrxJa< Ct|4llxHeOo4ȋK#Ja , f=+ *,H3i#`1e=Z(`_8 C )Dl(3XH^`c _j %bk` (@\S*|G>|Kuqޡ92pn~Ycmhڎ r+<1Ƭt jCQK@X`. [s;-s7>l{rTC#NyMzq11ԮVdT''/"yW:LY$PLXEU-ߕЫUBO BǓleKQQ28jTq5 J_{[OqMmnztd׿"84 CK"FI5ZC10Fk5)\Ep!v@:;@e,4=oSgj`+ 2 ,GJs5/.)Gi`K5U!a m 2pRLs<:'[t7r[߮VQ!zwNySXp <ᅱ'BF7Zm=vZV:'޹:VE0XJ/S^VYE0G\n YW&CBp|iu _4G>piXkЧ6]C4I%˱ͅBmvKb }jcfzc!n7vАb1uq'>9;}B.BgvNǐMaJ%0BxBwT{L. g'LeQi,:> W 6&m1ia%ubKrr{:re.|t+nWgpHnz]-rğ>5~(Q<>\I$[礉sg>yyR;&geMsG'pBVz|E/5]j?1?b#{<PY@\RphHR( ^eS"I HB$vړ'0!UWMNB)Z"eq A42:"gq%fHYqfWe8S2gi$x ! ߧ2 6d^]&,MY_2C=C!R*K%BsBFȑ(z\X(&8²ܹ{Pڡ҃B2-"r)7/G6\]+l/R;G|>e' !c* Ҩ k~0ʠ@vhIi:u X[*&։1Ĕ٤=k;tj|W#I~ƍwv_q N.4&3=h6;ms6CْM۸{(uhۤʡoWƚ+],2)dY2kFZ+cR%W "x (~A z+B kunkУ ɤC&*7"PiFnVq 7Pg~U+l qt>b*NzavI]`V^D (OO"YhhgcdGzzם|'vut)J;:sV#g,;ΰs,~s; WWۤO'[Kϥ ޿O;}_963Owq 52yBL~IZ}OPl)lH & CՈTE<0Sx$؅u@V~m 7:;#A`4 AilayNÀh q\Juvtu7q\8$c&s2uȣsO=t뛘S>q֡u=3};[5*MUnj^A0JRc1g 5;&YSmǑG)v sET"*L!2\Ғ[+B;?/]am%֤"y b^L*x*k`u ȠQ^Կ1k\DBQū oG(#(&Պx.f1DžnLkQvIؓ9ԝ=x,w}8p8,k* w`nfҶ[=se%(+>`iZΦEBx%4U|.0- A/Ga tQq)>_#kQeh&E(aC6Z;:ّN>o:<]j.d(Yc9 V"$WE0uVԦ{׷t]eRBSL}w;CmI8?sm`A3M2{qXbжG.ib"Ԇ,VeYML#xsA8'Z H.LFί SaˋnpU{'Ve2X3UAr5L;?NifԶxOfuv@rT'>ٜ`|gfOvLګeJ6ʞP}RSٟF^SFbX_g?f/AmqV"5I60XucJh#h"SRRx0L&|%0pow(qvbrl g\Dǵ=1rڛd:XOT:;30 {f|$V@Z"{Sab)-|pucH\߉?{őԚΧў3?:н쑡|iJ"X\^Ba4$oC~ 8:M +WJgFrz}"Rt d_kV9RQ#0}::IB$1J$+NR8`YScyǀX-℻ KTZTsKgzHCkH3 *^gT # %h=}kNBG>l&-.:Wn]hI23 jh͔GŴId~`2ʹ' :+ ۦɓ\UʃO˄H($ ҭ vHv6iz \U 9$mI%eBւ#B{/{Hz$?h 7j-%35I5y\@G0@7.g~P<9[7&h^z*  1W $tZ[ERjPJ(+sfQ0V^BWEMRDP` ZuQnbB0O~] Նq2S nM HM=A"LW(܂YLs~‚~XC2^)?h*j w'i4%V>y hkYyVkV4dp2oТ1 U| 1ѡj!F`/:v;.X/F̷)ԋ6gB>?٧(UR/oj@=h5ӾEjv@Bպ+:ԦYE72OQ&TU@{;i@E?@V+@uH%ʖhX$R'm @KOWq Wn9$:^{8c{ѝhD窟ctvXrț͏MD[7(=ܷt'G,`Tv6}@+53YK9Q286ix‡ ѱ%i|VN4@@{gN0 =DR#JFuR*mǵq}q;xl~Egɝ7+9ıpZBOVi9 9L8R\Nc}l2 0kr*uo3s{nyO 5$8 Wk9G,"u4< с\5j iA& j^RJVt[l2̙̮bvY7{\;(\  4PmAJhJB-UR۴Q_!EmS0ɕx奨A胓6*V]D#b i]9;9}25rq/9ifpw#8B3(L;A^%Is9 kjڍvu1l[SMSք3c6i87-'ŎdP4 VCz ?%24*gSڔ>HkҤr)|J &`55G Kb=errB^ Y4 ya9F̄e6hF%Xw$U^KVT>YIȲbEEx0rl "a* |@dQ%D*ϣoRŢ<Ϫ.<PS]|:b%LeDAo*]] ;s hâ)#umaJW'tZt3*A,)@h\6i~8|!`ȌXhBY-?qMK^ZYgtM0 Y^L"H=MTkXoԩ@ Ā:'g2b|`6)!6a)Lf!vNd]鉐 aj$$d!dž8 ‰6A6F@#Q4ixuH ;r { E=_Vg}OmNv`xuK+@bM HHGnrE=sjYϘ_0k1r])8U8s܅\9JP溿 \o2Gش8OooKw;5Npt^ U{6N+-q@onopgx#nw~e62xqq<5.Hl-MEcH*x.NQQǭ[Q=@PQZ")EZV^"RД@E@4nԝ8d "N\.Gbx mf RW#)?+JLlMF1̿c-nw pcPƼ}[( 0S ӇJRjRy TipËŕIWzdˇTkxe, s4؟g}/zVJ~ҍrݛ"nQfʜ;|aw_kիBFغZE8Y{bGzujKt`;kA^}$:UlPg3 3#t29B='$+ D)X(+B#!:ٰE@/ p\>Z+ICܩp](m1ޜQ9zP2 cm ֭䔍2u9: 2j!L֬kGA#"1@ĘWb"?$caPB*1!=&FXP<<=y{ޞ[Q$ , E bγm+fȟ ɰ8 7iYEZQhhtu`@WJ=?io.PHBBDVMO>2xOs:1nIŜ/I奜/%*|I':At|TJW3? M7O%Rm J$8oR#9;oι~ 7ETdBDQĹ@QwЗO!U4/\-.ڏRp|KQ.Q@U2h+c3)'mccEPY9s.A zFϓ~t󼨞KVʇR{~9&T\QTxV]u EqQe,7tonpz']1`X@86q-C@HC@>A3"4`%=9iCIߝ(pZ)Ļ߀oYdEUԜy$kxDc Lg6|Ѿ t@Xi͵ 3dw[@LӸgiN{v/w%i:tСC:tСC:tСCtcșPAô( mE%2GUQOyu mj~-.-kڗ=cEUPWHwgZ.3O؃z$r&l3\XED a?+aIbQBɳ~Q3o982ֻy{L>&u QnѸD|Dywi< BnS,ԸqRE/ӸD|Ly8#\#fRy)$ YMa)y#y\`$IxvUo{M= ɐlչ׋kVKhD$Je?Lj*cQMI,Fs&YWHOq5=a:Yj|A*huC>N!!͚'}TmVARX0LeIĖңt,O%hbDzi1֝JqIHҸ&;f[HH|p(a%*+CK )"X2ޯ\00UcH,=Rtx&~O,tp,,d]K3%Q +iwnCZb*%C##<)wMks;azykcwVPԞWė8Œϟ [N*EC7PK?m|el Wo=r)t+FY^YGO}R{-{c Vj;K~ %= endstream endobj 831 0 obj<>stream HVyXSW/M>MQ .%Bbd%@*Ţ ,eDZDAbUEA"EL,~w~x3Vq,YTw@Zy/ae=Td2 (&t /sڛC@ Ĵ7miblՊ@}-:cT0nh805%Y1F\&@Fqyaek7VN8< b(8etlWVڧפj9>$zzT_ ]ك|Mo<VɖBXzsٖƖX,6MJ27Jg>?}@i1S4|G<3{3dB1 <ᔤ9̺=V8b 4Al +G3CZ04YBB4N( ,-SRR,a؂Xy IJ] %xUq,F';3L5ΪkW)plYQf,q!)ƻO;Flcc3G2|2??8|dߴF7o_7KZ\.O")P}e&S''jjw]ff7;K.nuquFWEq#bO}[]#YsC^ _;guhR$4)~c.W #uQ]zz}d\EgQSO/'yE:TRq]+UAB&:( iHՄ>,c)2(E[k%(J,x kh;!K(Wm*bH&xi(+a*x_L):3LOMrϚZcs.?wq*34=-I+2p$P[JKUXcr|ݰ'Eƛ\Bfmg˒i mDyodyr| 6T"88)8M3pxxܸ4>;6N(A9J:ҏs!,:g$.\%],´O bW H"&]eT~0u3|ZYәbߪs+Q_TGz\h|ճ\J~yvLՄh~mHXɕ6C>)mg&w&Kd%fuF>vVl9hg2O}RڼP*mV^7TcsZT8UmuD[;m!MƃO֤s]%2F mӲNE!t>Mu Yx(4l+KD)Odϝ_puRJ6r:՜AQAtf)EMGoW;oQ~?8^R1S5C (OmDܟi7j2ٙ koeoQg̞38wv?$f~OXċoSkvT@O3]314:PY:ngT`CMjVtf86Q~􅗁F(U&OX6ˬGȿZ OG`Wx#I^l(}6ep[|z5*VZV(Zµ(gɕݹM 9Py  ؿxRz;xX<gCvYX4αp탱eҦɈb4ܘEm^,D+#)rנnE5%ѽmy==緟~_`9c[@7AN$5x4FIAQCBQҟ;򠬨S\Q|M#3{_jCm}L i"#Mw*KGgpu&#Vf.Dk4/v c%*J w\.YHj$m1"9;_g')L|6>iXhm9M-)tG]{ţp(oD:ۻ2'45) n+˩bx&fñdzuJFmoqʖ8Sf'(5c6z[RpCe\1qeлW7E@"C[c FC#0ojȢUJ*ZF򶯉P/cT@ ^* pJPn.A fb .3瀧k]:UoU_ B rWt~/q/̱+1MÆ=j:WKؼYvFnSWF}㽝 ޣ=Нyt?ڏzne˽>r&HhʴҤf ֝ 7zumy6#@ncuB_ԟvMJ>F?= +n{Q%xIs<\P6)kg]铦Gtլc˴ccwBbXLu)SA 0+cgR" haaN  >0lVeV]RH|xkhI[^z+b8ნors˯ wV5$˳)CJJ+*)5b1&"sY l)x +C~F:=5HZ)]aYLUcUߨ)¬+Oduj%@HZ+ɱ)fqFxaδ8\уGq=t h)7P]\ҳD =F8JF[gb%xYغ-- K%qƨ>@xy֠6zV%̬s"LF*XH߫3Pnɐ\]- BLe$O楎K$s{m?ҫ {W`n̾q0 p01׊o53*}8 jxȓ~E(H#a w%ɂ Ga~ZO vY\$/! KC()`@ h5 popE1pdžW0z3K/t eӣ \&IŞpZ̀ktw|BD /c\[S]&Vh=>Pz5G7'>gTvby o,"{Bù֩`vMcwY4u94]ЧOr=䩼I7%ŧSIllְ#l,6#KJ_bݛedOop9uzGƾK󭝠#3>C/.YrAb_+ݽ s?vEz\K@\%e1'22a"iQٱ1Zx;Z*+Xc-`d ?dFbGDŽc̑2MgQ<<ݨZ$Xd0Y DbzU3'J/$bj[SCKӈ$'  "B*s8;R\b -!F2+'^֔n="i,s~0LZΐi:ު>A -߉zQ+s}U=:ԄIJȎܔAp/$3k=ZZN6s]%PQ^WoP5! (naDDs BAqA[WDQ+״ѤƺnFH֪UD4(y9Mҹ7}ww90'& (L!h쾫Kݓ5/+^W{֪'>94iÎFΉs+WK5횽La;&GzOsJ_oM<v\L%$Pڪ"kr&fs~Rh3d挙](@m uS{tR܈vW5_5=Jي |} 8t|+$&F L>"/H/pa;QSa;:3YF>b9*h /Ȇ.HD}Ñ@_lVF'~EV}-8kHf0GrJ=1-fIT*:c(hq\buCVP#A? 5l&VL3-hoDYXb>&b5vrXz"4Έu]= ђbOQĿΡ%9pI+̝e9O)m+glsM!4Xz4,ׇ bGdwx_,Kay1}&Dn..z%&F X8ȓdHő+:-bV/XIAJAP:j;#xg,:ZOE%da3 Y^Pg]Jz0%s]r7HR;ȖS[ʠI E{0]+X+6⯢L\d7iFq''H#O"bs`A*Wr[Z'Rh?͓.Kq<]pLƆ7:Ga:FL'5OCoFi6{ќh/ Ck [\vFb߯o1"-n]CZ;X:uо]6~}hղOsfMxyzMʐ&dZN#ؚ:oՍLo%VitY~icIi{i&X_xa8/٭J>1g{=Ľ.p: 7Xv2-g¼|Goo^MxلWN?6gG3vjw8X8ecg{1aNϲw:<ԭx1eJcy˼Mb6[(ly̸/PZR 4 Q"ió%Q)iҤQ  ITU;wU˟Ͻs{γUnOCGР3xho5ľU?c3+S9Q=c]8룩V?Űy=b]C)–:O8ߖ@5k;t3-2d&5ggYPvn4E~syN Rw ^g|MIɩ-IhܪkHFVb5 $JϖR2J1 ?1 vv32nYMW/ychyὠ$`wf0h1EܕSU_Z; ?!>ڀض ~?_с0cvG}Zs) 38[KFt9xL~ 'DY'?6z[)M- {]c9Wq;uMcz {if̩Q%G[r" `D_M}+F#/:76I'O1߽?RMGFDc~4C+r%;襳n2<`=K r,{i&QyEͰEX TklX{'F!#$ݴ:\(Y]G2j,1vawB[|v^B^ȄdBWgJJMf *hzЯ~-){ѮB;جa8{'0~֋:i9lSo ,.ѳ_S +΍1ܛFJ4G/\f} gVsدT) e$]_PC֗84ѿ?]/RS;$|Ԟ/Ƕ|TQ׌U@spdʆm.;70hdn ~s3M#uĹ*a68s0V<,LJy' Pppx l1X'X9{~ %3c-0HlL,~/Y^-#߂gW|)2uqvp+E3X*T$dc2)d|~Lo<~Ť;X$t*ĚkwAjZ6Sb"~Mu^OA HO|'C X橗iȀ:$Q$uuF>N! &l,V@:C[53DqVr$-tGBtEt! 7=}f[;5U\wj(ͩs% ԦDS[?BCRq-Ij mU.C݄^-FNfnܢ\r 1Z&jڢĩ*z?>qdm \;Ea߽G#G12r0eYD ji}r_jsN^hL,V9,0mbhr&ﵓi2E]kPOk%L^rP+#6V#{`/-*pu~WiCr =B( x&75'{YF^-x7vm 83 ^Irŷ_/WGSS[_&+nEC )A}9a&-ۨT6TM÷hJ_ְ:9 1Og:lb̯{/oS2~~0 (/PCru\?7d_L/;U~&}?^xL5LdKȑzNob K'ऍj!z:Y !0.ԥ1zE *0e -DTΧ]!Ɵ%kZ^@wAM7GOѽwNH E C["i5|Kr4FO"P{[r@x=0{SnOEfW1tQ1B;4)6w}GudM]hXI 1ˇbu!0ɏJ"iw3L:TZ%[e!Uq& R$bWsBTy}yǞsys;$$aELMM)K`I7FmTS<%۪j  ]#2;Ӽ?SN7H0˹o[-3s#3q-qVy753# ~>G\V2̲z>Ȍ_:]2_}w4bWL+Gܭl) P= >pFA'9(Iئq/L_=̑iٻ;Ƙڷ#?FL]9Ȗf['o3˧Skg|3她yLLݪwLKze%Y;7xL9,r[ӕ5;p{Y 2J#w:6k(%1`#NF9M>\Qwa.di{ne~C{{ J&oO oDw.??1Ʀcl7l14qkL,S,*Ge(g8 wTU"V(W+Xe E qFlZYˌ)EMe)fyfa4~rf/#F\&t$0H `p?$CVx8I$U HLvpvC"\V,\12"~7 /O𗈦qd1ʷ T(•紨 B~oW._'5򇄡{{3߱N9wg/,x˷ IrhF"RēI,9ROII2,LS==- %YHE+~ +~IhA"Ns<|0i[3,.jޅO!5AˇVRQߎ`(J.9Tm\FC/@b6>M>h͙k_IXs+d? G@mrzy?VbZ¤ͿOXEF  r65?4fýr wjy{Zj֊>5YP6/:&A]g3=|O۔YHUVanr\" \xIAkCaSZQ-ֿCZq 5m]@7`Fp79J|9r<#oC w`p8 <Z C!Hh@F|ǫ0NÐqlؐRԕp/^@Nbì111[,/w-\jJLJG#ahtp`ɉȯ%WoGDyImžg}"ZL>1Gy_t(:}gΌ}UCU#U܌Vʹ.ji6x6x΂;yi::Yvμn{o?k5[=aP~CiFVװ]#qȄ<&ٯ섲[ ەmB6*G_/ai4!cyp 0O`$@G?p6KEؠ f9f9jA co~o~RYY dLF!Rc_a{c3>`HMY`{ MiݱԈ'YXKӂ4SdVn4Gܬ]vNt"-hDuҷC|&MuCZJ9r`ȸ;ЃB J;|ܓv7YCvMkVmY'~lJNFʐ$1@dϋJJ)eka%>%PKJM_~H!PYۧ6/dWK46_JYyvͫūj/y&V;+wm~vf 7q0F%/z="4OD# *ѭRݭGM##љ.\$;PLSn$A?h"Z51I/UnE^tO&[&Y~NhGGBYOX inω &G`%@?K~AOeu7'_WolS8~I'N'# q"/5)IPLNmtڔ1ln]tdZe%jIF4D-[mZɟ5TӾy9$$W?c\$NRj8!E^$G%m$%]z2;-{-%(~n5q+k)iJZ !HZiaAZDɽa~D-f)) "0ǰYrkZ5PCMB7"侂 ^J a$*^ InJn!IR֨"N4/G,/,ЅdgG4e-w A鱥t:zf_ZBZ!A3KY cYX+F,i}kll9gm\*È90a~0 d2~2f ڗ>bB jeʠ7r)AenE 3SXDMI'd8d3kbWN|-'FY5יE'Blao;u,u^]鳧{ḻST`Kή}vO9zCc--q9B ebboH&n ;C3[fk+[[Ԝ5 ]zSĘP){P]e٪E (` ZB`wip ֲ -(-18uhRbt׊Ŝh, pR >z㘄V7ADaԢdd}=}xS KF9WMMĠ;pݹ'8\St._weރ^*v]n\~O/i+f_< SWjL>aX)1^| ύ7յր1p :B6xZ"2a8F9'bXnPn\}gF[\iL`*T@X\XQᱜ |ba>]XK曉9(ҜvNO}t<C+;2.lhB ԟS_>g|{y_Pkl?2Ō9쾡oVxyj*r|w|@]K}_o•/`5LR|ۉ]ְ6*R?Q-$p̣~:*ŏao;=C)|}dOnCg !y_*&C7敮cl1_MMU%ߩe_1(FUًWK1U.=;=ìBŪTG4^qwW'ݝ'Y$O%:l qfH$*484b£W4JȔ ShM n: ̄ @$tOv:itw{,:& hZ?`:htv]?0 HXHFehV<y|+w&0mI3&AѨ^MΪS2F܃f<'8f^; h*T&ِ +~\L"5"{BQCF.џ˷.N4 |~i"pFPNR+E)_AװbX<r>cz/nb1--rkn1)j<&<=ZzZ\q [.Ȇϝ_Q<(?fx1R_-"9"BV|NDp->0* Bi`(͖Z$7)FpV9,h4\h[ERDLXG^ dkݡP -"!d`"\Nb)`jniA@Iv6$\X7WD&9l]IϤQ_,MoGVlɖ-p |OnC?8ilŽKZ|Ӡ EQ/0!baM/P&˅~[X;D0'PwX*K Gj`‚ FmC rqe0u~l@)ͭ/p~ wmZ5D߯w:WWWD;5'Ӷ.z)OJ B%Ms0IEZ4 7k~ߎHMG]  9/۶uyI)RO?DDۡr+vq]dIڲIǖ]Q4Yۡ q6`: 6S: 10`Xqgc K2;;NV̰!+sw 0MWkMK&;mΛ$PyteKM7 ?j$!rsr\|,ք#ФG8KT2dyo\I&I DQ(1=6Y0M~{\::N˝\|_e?zOoXnnns A.R>FJiS^>[rWlO~}ɢ=tfx8nZPj׸}jMS?w j;Ȭ~ۯs7&7Uc ]O_;⭗?|7ٛ-ϭ{Z_¬;Mi/sǵ׸O<83-4Htp-5{WAJ}О.gd fgH$N.E<6S+k>lZWZ@ W\CQ7ӒĈw )hP0JEZ!@p(bI2m ( 4"cD5$yM46$P9uC瞑o >Qkthʻo4,gOΟ Wi1cr!;ff ]OEP8;v~r}&5noRH;FyܥaC'nKi* XҦN$*`au)l ~vgi6{,u`sc$)Ti2~mWU% g :X48I:&tvC`9!e"Y颈QYٱ?auVKX #KO,N,aBv*;&KY66`.\X+.eh1HFet+e^6hU+L tw*`5x5O^MtBUe!Z#ӤFKٓFPhb7:$5i`.=rxV~6POL8/Ʃ}; ON于T7[w^In/u;R{z-gGNu?ƵґƏ^Pt?O۰}p eF,x}&:OYQ n| FcG,/e#늷>-+ZLs't%vx 94Uz=-93~GX2'axm0#F@uXY7d$ȨK!d"o[9rl#[ U(wjʝ ;_Y,V8RDTJ19P\YO}ʤ&^&S /P=.Nt$z((/e۶qq%H4EJ)eS8TlwvE7iK ii`dlS v`,km!_MK]dH}v)mX7[: #dk0QǣxwhVPS<[t>=C<.|! b269LҜٜ3|ƩXx]zqzUWL0D]EAnЭ.йkt7vD>z}^}=Ek=~ҿk8F=z0OUKs}QrvTZPwGl߳щj?sJķwv@@:1:ҎL5hWM{ /,2/L*>K#*E:.y#t@@ ~Q ,5&Bdok<淬-]/<DL e[u4 %q.FgP^.ƻh0%  sC0%w ]Ϋ՗d: iDDw#LR^I^ _ dfyB *̻h7Q\2̀nzH7l3{Hw.Wl k ::c'6]6N8ȟ>=ط$dD+wW.svlHߙ]SSOٯ2u a1wAy a(=N4*qH\(fF$M&bsN]oѠcZ6D_h!/4ܰ7`]/$;:H9 :*"֯"SxG63X9]m 6l*mP+;PA(EU+$-8If&Φ%x˜aQ!:\ upR1#IRk .1+PL-]D;Y9a:5O/p |752LGf>:/tPhLB:I .Mj4T  =x?M>8[+ug2o*dӁO9._C~dshWJ؇ /dL|vJPl+qj'>j2/)I [)Eh(9A4$Qר$9רZF%GyGi_Ci%Du}3M&K ޭki\-m7fnt$1a/ihZC&hʘWGzN蹶\]V|, -KBtx|WbWVy=4^dWuh,sCG;ÑbJ&U /`)G:qX vթNgt 9FzSD2-FTL=s鈲P eyi0q6A1K6>}Φm!2 '-]O;.$$vWj+h3  5VV C ?9F ax7 ?XyExUJ |[N>bkIǕKM$1lBBu%a1 T\pSAl괭I||l=wAO><7o>DI~ة ۍ&leCC_}d"-T"~t#R-t'(I(&].Ѹl-_G5{fԱUXh;tЉz=Sv_<9+_Zn*45B듿ZX_ n %4t5€_+zƲA Wvr>glBQP+ƃ3hALu6R Uu jԁ0a M ◌  ^FcFcFcFcFcGcFcvF&GIlb`mTB 3H JrDdzI1xXv5%{^O@xTF$Vp ~ %o1GTKْQll0 N69$L/!iLA5:jz3m?\xo{3T$ObV_^ZԠ5f9\8w(nHz0Uގ(pW&,#JLLmb3A:fgA3BF~', ]# :`!cΟ7!`7Mƴ2 |9ܖfTYޢ}%g4;jzX %ga \x!H D~v ~_YV(N0k&Nw¡kеr%[A *f9 sE)=13~'gOn}U_zDq3Q/ү-겝-UOP8n՗>N3w8Z,['_b~CD(3x:4חN2=齻e y`zy6M>O=!W W]ݯUؐ!xm|ꓽOVdSօxG"Z7S8r4*w{2S,`;iNDH+WaԒ:R4I+I,uTP;kHoA S;j7lN>'Qa?s\hPoni?lD'?iUv[۽j1=؃9KD\m{P" (:l]vfmSKӆdD#Paxx6\и"RXQ& vx5,}B߁׺{n[ SE-+ɁIJ7 cWZBhԺi΢{}rK,&MY/ND2J%/{rm_г+KW7,ݺj˽y 1$5+g Ԗfi$< _j 5?j3@Y4l!;|]-`/#$DH^PJ xaRKC(!]Ɯ>L  Bnx/p… .\p… .\p… .\1)jz[)xAL {"&B1 \(Alۭ$N fwph$&OŃG;ēt,DL43ϼ_NRdDK):%:`/\[7VJ7Mʭw޻z? zH2+8ALWiT A.nc)YQn>:۱kו;Y}xq{*)gBi㌴qCP8IFIcx[[q@mQ ٩!UL5. g>z hwWƺ1zW&/KSx)фbga6SG 2a/Bi.5Tļdp6et$:@L.* c-ebmS3>ӈW5uBZj]VCp!a+ |ny ۱}И4[LK>SSi <6z#7\\G-)4\9eЬBM;\3p(nP8CR[^2l / e{۰H9ĒnIސb0׼~fr`˪ڦ4)T|7^׿5}̧}<ߟ\w>?t&uFա( endstream endobj 832 0 obj<>stream HV TSWY!ILCb !`,$mHƒFRg5vn) d H''}.\"V9Ívb.]&!09r\d,Lo{e (t/ ]tcPgg4\&t2Esじ#T5nVk?I9v^5xmTfXn]ccl.'&UٶW.h[o=mWUISK3k}#]|n@ci+p.54!bFn&+m}N Ap Huw[TƸw~uW yt4~yş6:xZ~qb\-Mj]~Q?[R;^ 3- n~Zܞ!xb2L:m{Mxዌg(%4 z;~K}ZDW-^v)I&Aq9G$ lm;7eX I~?O ߹Z`9[v8+'7N޶#>pY|%F^|8z&_lӀ9hvV`3+zBcZքj\f#*h&l){ &//;_ӭl#y(Ŏ}çM] Z1DQv2>2_4jkjԘqEF=CabIkx>F\B2Go %ARRGi"2#q WEX *l+$J1w6]`#ѫh>\2Y2A2O~a#\ZJ5FZSr15-Br댴JIKNRw&$3cv&erڛȝMKsh:}.?;O$$^ݙ) SXwn7L5"PH,w7i%OקRR%gKvŜUB3BPcU1HݚT+8O=a %t1E6g')|zvLMXAkμ3(T m%ĎQ`|zo,,1zFV>}Cǎ_z~ lsy qR/ukXq6Q(Z'$!! ӛb#,cbXnv^rd>@w N^ۜYS{krfUڅγ;tyb]V ퟏ?X2{z|N %fp.&tϔj^Cmm?" K6ϚRrOz{և)%QtH;-l!mq~1uiϪ'!4CoZuRt+Q7kqٛוw7ʸҗT%wmnׄ,8 η=cQ}g5oc^q*[377W?f/:{̡c}[@bP<rsӭ(hY^t:&)oR W*tI{R:giql0kc## 6 p|?'P;Q<23t9j#U*nCpwtVapio3Eyyá5UMOXi6~P~a'P죉%0 ܄B;FI0 'Q$ +r|MN&<&ԑzR14;ZOi+#a 7+f7>$  rІ  ;z0Ws6#Re&ԛ!f2.ԅxP"! 1$L'Id~>YBud#N+9yN#(kz1zqTIIZ}ޢ/WƝep&)f>gj1GY`G?m`ϳ߱?lT*wpft.+q<̅ /M`[d7͐NpWp9O mgLI-p*P %ԖsfC:HĒf+yS}Ɓg"؂i\8!ܸMw Cܨ-FWb mdDXaV⾽ dk#f3h‚UxP! n@[~VfoD2aD_7"!=c^:E &5}0L֭֩I!)eBB?W{lS?}bhXLk.I8)i8\l [JL0($i]iڽMH4]֙jӜ?V2)iJD@5I[ w7 ٴs93 [f̰J}Ե2(D# #toaM/`~;R@]j2S !):VY-fcj6K- wXp/UUZam* ) \ [ccw脑&3^ z̞QKzZKK*3[ּѳb'R͉f&p2ͻWUn`4Qi+q<9Wz0P5> {tLS.ϾMO/+HK=%nW1+TF-4ֆhkb]WK'P'i6mP)]l_чh %H'!idTFMN+jR8(D~o |& ,U Ÿ퀚oCua?7{L>Lo >;>lӿl 1iߞOgv]ч ucv_o"pf'~\qtMv>1(n%^ A-D6`1Gǵj=m+8k>چ#X 9F8>EZv8Y7 P lpAc -97đùW?r|Ȉ}C9ke~mdnM$ۜ_9ibż9HO̱mI9[<)˜-Ἐ+g\QB\ɵEH=,qm].JYP;wbÑQjws)okMm8\ {=Aq}=RL?p.ss}Ǽ325W2j>R_FkB>޺ =_ub|E(}h?n]zRߦ9iVOVcPnP2GqZ)w/ፚ?d]{;B4ߝۈ+?B#{+Cp|59SLSa5_yy {\w+^*4`r"7$M'|ڨ>.-FsbA3ȇǵ?'obʵ I ;b7gyZ몃}rm|/YE~ss_`} \؞+o׉҉qj#"Aԋ ߈B~w+F_xjh;_?_؆79 دg)=jTkBG#spr.D67ƒ1{Aϋ ÑO*0C8b^|AlG^*Ey;qY~ÚmV|\(+C_ZeQ>\/T*r2ȯ|\Y!)H0^;FO3Mhݗ@, ?]l\SOQ|=:J{C~⯴ 8#2t֨_$) =* C;f:c\T c1&h;1uaڔšC@{}uد{~WuTԅ6 cakx|ڰNUáJ?yc#6Ǭ xV 4[Yi|'+H\yn(WC%?z_C";:>zaڨFF֔_(jMF,>Y n8û'݇|w8}p$l dز0Fg$JvjU ĸ6ĉSB xBH60ĕNqm~%)L,=2M{7>{?nz,gKARrx O:Ħ3Qtr3$難 8:14-~Fh;MLdS{ОS+W1wi;z.3(xjWf[^ #4W^)?"/ӻ9@nZӺUn.7^i,]nzaҥzu"fpwP$e]m_ɻ+J5zT>HrgiYP%ҫPQZcuyMVWgI )SX)Z\U1H*/ဍ{X@ſGjMʫx= 냂L, h<ВtSUf6_jׄplQ҆ˍPpū}[5-: mbLy<1=o $>#d  BFH!G%~NͱH R0W@ǢaFܰλ{K)s.]X?n6bִ`GxQ5RsSwLFFn:!UդFK)!` zy Rl3YٸHW9PXh'U47)NnS;g fpsR 4yӗØr$Rzudl$znuxCG!,%ݘAKpg~Wp8tOZ=Gbs~'`8ڏP0p a5BDT6b#NĈXAHNp$9 vW̖Kr vVDH܃n5ww<ޚDg=ZX(,¢R˙(XX pWW >8[pR`hlơUº z\U4 ƍDAHєl,4'ur THX5n*}w?nko]|; 'I^zz\\/>~s(n3G2Э팽Bݢa-$f(SZ}wF^՘fHN-V[ tvQ?AXtDo}֖D-@@n`v`~ ĺ:>vl|{yA'嫕V$,z>xgdVu'?ݬқWŊ_Ev6u{9}kIɍ; 1%L q TDF4U!;džOѕ3F04bK 7c,4`-B`50<lj%3C?/?![Tv]  [ig =X?̻ݘ($ڗNNqQ  i0 Y6F1/PaJa6|-m@!?>ԢǙXD$H>Vpb4Nv[.TQD7qyl%Z:ͬfm*u%V8\y kLT'ZaYˊ57Oyy#-fs <_y2q*G[w4v l x@ V!62l%f2l"CzɰDwvil#Uݰg0t`t4S>PW2V.(;ʗ Sʘe|3a*#f e 4ΗU_zP|D-#K -}1Idwy Ф`d+6PQpX9ď XvDyġ!E( Yls9 5S M 2Iʥ4<08Lo=Zk3v ~- QBϔj8f H/CXYh8kh(q*/?( ͖#8fe3bQpߺ#g/=YƔ+O`ST?`wUS2}|yf?=>IQ~.v/,\ b:tVhRTcc:T@U.=e(zyn{V<Os.޸qX>^rG3iMf͞ ښtb<хnr$ Ef2BX,RGlgVTlYQ3 ,n$O>lC0@BÍR1H &N8kYu.aU^<9!djJ\vS[t QzM̋85T)cf֪dk7 WG1CKK͜P27ֹ'e$"Jx9:pa+ט.-z1 Jشz\~$ݗK|pF%Yua4se}ڣk2r&Ggw:2zvY1mZ;/o5DͧE5]{5%.2IOq/&v:ӈ8;a8xܩ|d& AgF+w H ƭt솦D1K\-(79++M1]9M-pj2;VN7Dg?e3S*=*wTgկUWjLŸBf> cjH\OA8.'tpM1 ^V4\ mǁWHw XU;8+},Ga6f[K[V?ҿ }lHFF/}$@9cK1>9?DC';)ԾwTj.'ogS(jEGj(P_@~kY{3@V3G8 kb-{,&ñdwH= `9u{\=]+u#ΟB;^{tzȧq+Ԑ#(e-UT\I< oI~m9&!u0Xx$аy&+ mTٍ}Q#Q tH)1iI84F+5gn kq=QUE1JUFجH &Y=*n*| ƣ53%^lv+˽JOߒ(HivwaꥆjO}kɏ۾7!Ȏ<x@Me{5v bRZF]*O_ŴQ WOG< z^W%;3vaWcpl\yST8'W:;Ϣu't/P ޶Ii|"m}`M p>n^eƊPZf"o"ٓa7evD9, !MMM/JHl ӅXbP.D~A#^ZM+3kjN/j?Q<=>O.?7Ko1RJS T#==j2B @t]͢d?o^agܧV2`/ֱ} Sgے]w\pbfiP: ˯mJAGLgS'Yju|,:W :+ܙ%HB 45 /]CSg ۺ%Y˔uMflddD!bɵ'DX'[d_ ,VL<IH d&oHѪ!Y40iԔZB᯶?=X+CŐhTXӪD3d{$X6S RY "o%fWڱj燾RYKYr[,}%NO[mw dV˫l^h[IOy^q.T![1q >S**NݕjG?hi'8ԙt 3Йy/1sT=qn_eʍox*0Iw]7 Xc7ps[)E]5V5>E .$& d1()BQl} GaB*nx8x'0m>DEhQdp6!+\+>rMIЎԜs26k2wHLq3 FhӮ m]sWT J\bn*h35T^* ?VyP+Lkav4;;5<_Dݳ3 8N(T*Cf0W_%b Ӧ%TS-LeMճYks>] *21ΖgxgAvCWo'o'דh)H|0/y6?έ`Zs H| HFRq$-X.ب#<έm2֗j})emyVK#iƚ,pW l刖x0paN# (D{$ǦQ M8 ĀUZBcw45^_G:gsXcu5dJayPS0S`ydѤT80&1nu 6*XVn2;ףU |؊FCvDxAX"4,p3y/ט3=}1lm.&$!!!I˅JM/#MlSM[6Z"֪dkSCѩҚTi+MsWim6~>9:߿KlQKI, p[Nl/.?.I x4)--b:>a3F*A: :]/&R l{?4EQU !%J}H&$K  1.i>z`5# '3#R{aD32 IdV.ocT^;Ư-qM>y5Ң, ?p&pI;@5iWy%,3 7,<#"gEItY/~gV]"'лi̭ke1t]nZtFBӰ2)Y}خ9ۉ;a=PGNёD3nn.PԢH Mۍ|wH7&WCz#`ZM!% #¤pV($m(,"hPR\ VX#^6W(&;[?|$˭Y QŕĽLar:iRh@αE P2"%@o+ Th UW@Or*g]rO;G:6 GvL`tgC|>WmmkW/n-fF&o-b3 ´h,X̰S~-0IJ6@Eнad癇I[AX(it$Z #i* E@ +X6;||}G_9DSY@ SU澖w'Iz=<o`ru s]H'4Wߥ5 Q;tugںmTNpϜ`;2"!ij]ޔ]LvUf rh&i"5/AM)*A \>ޑ9;uJ1F`QT(lӊ`cO#Ekz* n;4_+qi ]mMīY!<:.Gatն!ibOà^/U΃%mm'p>Y3/*A%1Bw iTJQ O[dagG- GۜFj5Bq(@GZ|đ-?zjφg/ -Q^5v}Ml󡖙o_Ro%ǩȯ0'M-!l J/HNxoy?~ey/f!rP8n f6SJUOӴlKͶƴ Oo?sgaFI<#.QٔSrL89O !%eWw4K4jʅ:8%KF\p%pAΩ-s g߆"ZY"+uq'^E>xo݊ Hme˓Z{򥫿H -ܗE^r(6s :KWxZZ][Ms Ǒ ? \eq#EY|>}y77*)%j.5H^**A5qt;(a3 Z?㿇QxMoND)RM 81͒w=51/ijRcs5߃/0Vtlttuk #yT@Fd$(W\ $q<`EdI 'x FnQUkm#{*,==Q8j>fQha a$yS751>E K$BzC2+q|dGMZ}` vs#8WVP9~_~_?R߲`T ?Q*n7rM&ug:lozUnZ7E Ը7x{H81Z T/4H&(M|ZTۦi_i|T35jX4Ԧ]C1/K$rQ Fx=K"X? ax>t< md o֤.78#3]J{,_osK}՝!9U|;S/@J;:ޞ$}ϵMnj5j^"21͚hk%EBjnXݱCh&F0KjS*iM@oo›M[C`/%XQ"^Q >@A6 7!.1Ff@}*8F`(_:AwRRi[$KYŵbH1dbY."V7O| `.OḷzC7C?S1k cxվNqp`ESom[ԽԿS$7 ˋ^r}y&=_+fvb5q?A&!c_a{ٮ. jQdLRfe|vBfl>[bg˂'dmӕZ5kBcclLz҉ d>'{4E;IXݣ < 1O24g͋!"heF]\Y[  SYtFOOgNϞ&Nj^Yy&u\7^/i.|f*i :f,sA8WSqpW@!j(&hhkonʂ"Nk(&L5{zK1.`bhF$BffwE^{t6yBv4+`4躁!=_  ː8gol πEɡa3vه:;_?iICCzun.MIOuEt)KVf}.8WfGĔτ,=jAoXNRlwԒ(Bh2Fc M}2u6u1&^ r0i҂@T1T\6ų0W#j:.KMuU5I{+pʬ@UΉs }ύbeg9_*?[~FWf ʷ΀LeF!|&͖ɏ6R-G Dmgkv >q;j;@/a%'T0, lj65(OdLo'( hNo?NŶGP޴a⛨༳aݷ"2$4hر~by(ꑆ]>,')my=ankBX|"`qWMlU^ql7qפq6q(uZM5uhD]{ozZz# NUBR8pBTP9 0oSK@[}͛yoͬ6q[Wϊ=<2^IY-|sݧҁPTQ]Xs.wEC|ki^| ^',7x\G=z%J?޽ @RiIqac^%ﲌo:id"dݻ/1J*6ݐƴeD5ĄIMq0=ζ_bΤ:cpb6 $~M_QrZyC9\V("Q t-CɧȁMQB2^R}1%A*'lTzJ!Sr5r.n%Ǿk~ I^!kXbctqՍZpe{Zjׂ|G+iOL,<PVjmn0c}?W .ݐzt?<>xfE1 kh^ A<YX5@; 6@n a :ꨣ:ꨣm(4!Dxh۴;fVݢ::}{GF'` {3g^8HJ"jP}ar{ccܶ&~ӸkΞ)E>ڲ (9gE^ 'O @?U?dkRKg]-ޚ \rk#`2t5mjI70[a9.{?X>>d; MxGcWyWۋ첯ǧV,.]t  O endstream endobj 833 0 obj<>stream HV TgrBkr0b !`\.IZeM2!3\EEjU<'hXwUѵՕu(ނ7ں޾~TIj$q ixB<ъۃ:0-jc "y.<{u4?C=7R7 R~yE@^eB _ #LVDU܌}uXH#ُDba/B#p+QLNǷ΁Fnw˻, ?cHD)}9O UX.Y,;6/ax C,.96d`9Oow ,4Z/zW F44ʌ vZǛ݊V0["i9>ʆ?}8jau6CVAX>drza֚mP(hJŤc|(OPc3R,_0`iPKVٖl$`IQXDvhjL(5[PRu) 2G/q)h ]وGDAr1gr!{ nLig;n/紝]#Cv+x{OWk uٿ;򤦗)=u7xK:no+ҧ`iG%Q{lnIxfV~-UMoYuGv%z \1^;qQMJ{x=K 6]x_Ln5溎s!chE^+ϩn=J̚[ӖX]xSWMX`cIE<i|?\ĮM8lU,cJz ~eڤ-^SZXhb\=~kcI=Fu 1jK-nrxv]Zni|cឩOvUttյk=-'7%[s|c3٤xazwY_(hkΣ>1vjMx4F>@zo/`oC^ƹ,K$O;ذU8>NkRVlGE{ygKCIn||5SiO Ɯhy4p,6۳46c5[}k QG`7hCMTYp0 Bpq9ͤ EEٙZbWp2NPѤM%ȵ\/p8*t}*B _"' +bol5Oe42]+LQj^!J>w[\?ٶleD]fhT=]uعK)iH |3X[kY. ;Ek;zOF}S}rݙYqβ~5^+_s̃ҍ3GM7Y cvS_ ₃v-ʟy^iMSp󤇽wܞ~= H{QCYosAseg&b^=\׀UV3[Yͮ,qUiOcbokFr-cpY'!cs.e| ǜܨt+FhNńXtrZt&36癍8M@s_0FPL8s 5-_p) Dkgf`bZRCΘ=n#UBj<&)iIiIɉ*}%}:I括mC6+d>s'qMS ],̅׻K0 ͠J75 gHߣ>UVޖ^GV.ߵ~@nm;;#gòϬ۶28V M5'z6t^ s<^ȕOδvoi)u{û=|Q2&dju_]5^o>- X`4]p~F3h.0u 8؝_/%F<`ax39vDY%;§bqAMG6 "7T`h!<,0K48cUh-kq \~nڐ- PWHTō^\mn[SAd쉛!W}J7y_*c{Jz\_#sߺg7:?4|~x/5ZׄPF Lnʮƨj|ۭ =9e*\QUQ`g>zt@;.f1] 㓷v|$)RYلQxﯮڴ-|w9j2WT~yeSQS]‡ͦ7҂=x4">f54ZIN|vù?v|d7$lDGY_ nb7t7+_kj{rР[{ZIdžim":~gKKvf5֡&d>њgǕ.g VliiaCsguE\6bk㩍rkט ~LleN?FKcsǂw@"5fƈ3 JYſO2CpC\կrp3Gf:8\{{^p=n9;y !c][(\=m)X7xH3 ۀ bp=C1 WJ2|aC:!)uQw?_rPQ2ȝQ@$S _#2\!5/PCH /~Ja؃J'5̂5q<%&ثO$$'/%M֜zQ"p(ke \:NF8$,#4Kc2eEv"Ʋ8 7 B ! KP vCPPf p Cx CĜ!A$]G$,"$$;jNK54&%t-~Az~ψ&g1:=>F_p0h=FAB" %!eUpj E+|;;t¯X2,_r J LЊ%$RL>!H7->t&M}MY4i;}@31c,[gL !eaZ{L7 ds?Ul-{me`q\85}5 lN}vF܍hi FrHY)ыp:RǸŷA p> 3`VA1u(J rf Nĕ@:b w140adBߌ^nb4ש.2y~"?ncFii1b 8p jjI(Oտ BU |3S!eJ^J~J2 32!_}!@%!8/FZc:{C 4,%4CH@)ؐe14B*2iE xSWAuhvHTSdUگR* i@Sm4ݿwrOJtcj1)eFL4Ղ ʚeu-[5b$ѐc-Y fDVUphߠٕT:Gjv8XBGov|Cl]>s~y6[?=S_ -*x:X(_8q4'Zb9j5ZA0IrF9HF,ÿRVC{w?=WkBL0ﵝHĩeZhM7wڭeԙ䖵py8Q>7nS?:N+Q_#{m$){3qI{3) t~*.mqfpa5VL˜ZʜO"41b&X&w2H44^=W'PjH_/E@ŒfR^J,iN(Ur%W)ҪF5o=Eξ3^ !t ^(Nhq+yǨIM)Jev`U=(➗~'&Y a%Nal6LAݦuTgh6E3dnܳߨUj_>ɧƺ(uvg Z}wVKS3w|V>-')x- K]j֡ ~uMwb)5B9O+a9MYcژ Z(y#BK|d͞M?/Y~"ʁ`IzD!tH߃Xia޲/'pF9o/NeQs˓ylXw#mj[iy2_rm/=ou Ë OrmùTԵ q}Wsmw'?r'}q'Ibt}ի۴Z;c~5w{۫+Gc^jK66Q[JoGǸ2KQ%itbotV#~<"'Fuu TDnT+QvVE_Pg0sː+[qoDu) Ny ^>po߄M ?϶yZy^Vz ž~,< g1_";ЃE)psPM/?E0\Y~"s?n~cE+O>]ԙ! +.u?&xx])o5>l=u=X'|q\G-;{|s׹~] OS DYpmX oFl8Oᛒjyʃދ홒WS}>Sxr>|a%c:@ ˀ䛑ӓjno1jfU`pj0Nԙ4`ٲ{bㄛe!hr9 Kj1d7䢢|(e|}и1rDqUC;i$4"5tC,aad7%*>0Ϊǃ2%c 6 2GeڎJ$J|}lǟ|w8&\l'1;q^lC/oZ&(؎ihys0мt*lӘj($l l-hn?iQ4/@My{]ԨëP(\noUūb\[uOq1ouxggR3wf;33I ( ($ E$Y#x< v \!N!8"Dx.J'$E*eS.!h=%ܴ!C"u,Z,,e+K,{db$ wo}O/ρ?Rߋpx8 0 >@3{qGd9,!Y2(>Yd镥[,,yeɢ7p H?ƀ'WL})ܒ-čLeR{T7bR;bulYճasX˲4K`QMmDԶ(ݾU[w&ַMi -u%O6MXhG&L:nICW`Ū;~"OO#qF88m!LIaJ |:׶{q}m}ګu&dQY nb 7ϱɚ?a yv9t. 5U6V6JMڑ4P]kʟd\ך8WFHyIvZS~O ڥ8[I@xHm.ء+[J=0(tȳFJ}"@N[ b;GG |B*#-<,$XXzWc|*H}&EH%?E77(ZgՕXuV =*"??FEuXbk\A.tHl6賎JuUD,iVܪ0߲ >n a)LEQ)_gwb@b?X^n=p>iۣp< V~qkps.5|c˙,I3Wv2(dRF2ǤqLZ斪3꭯zLBl(uRGv&`2@簷>MFOxi~8V1Z۲v.[[W^QX;Q/o+~lN \(Lef&ʑn0~VQnHz 湜u`)R5-6]o,poc+P<]Ya i5$VCcKrb),15,B#牙J^K50ͺ*FE*BW&CZ5IP9&"R?WG㟈M*|p[HHgdW*AG#o?Xy>`\;;9{?ggU _{ûqᷤxXt?t|p@HGuۮTS2UZ6o˥9Bohr\CX"+D:GHGk$f &9#E"9ACV`'L $ JȠ% r Rz&F,E:oԼzA%J*W=^TWUjH=Wڦ*T)5 ^)/BV6yrS/[| ꜈rY04'P3uU!2c #!~hp09UZ| Gw~DMNIfHt|ƖKGnyֹ~'}n{RPGouoӛNs֜v̛gBMt=i"쎨)v dΡlv/rGn3K '1\SYTaxL̬OEn-tcW~ڙz VK="IbZw/S3`"=;XU> xf_YH\2M[eӏ:BnR6=9fjIOl-L,fHħJùS9jn $cޙ# W8h4nR>R482B%sb|U9ԗ+UiΔ桨2^2^] @SU B|c\D3IGl`L+kˎX$Þ!Ȁ ve+,CI0+W~C$SwV8NbI<ezuB8F?rgʤDk wrYʼn@΀l8#^3O%U6''H!uQ[$Zk'-7'7+Kg+MP0D5|Lw8YP^s2.^Cޡk9\]>گ4Зsg@znzrdb4),2vQk&<M3_# ٦KZףCe0$ ῅xj@BAl BBnO'*; &9-͸ځ EKjϫhu_ |1VH& ɤda~85dZcex4)̞qqIA3;eF:c0c#5i X|vrfsx ̏I/uwn!os9Ϛdg"h[B4%r`ghF=gA4q*^d f}Mɩȍ :ȘVS(6@hO ǃmL̚*;Yt =WhdЀI%X Gz~V򴁈)C2?f͍j {(\ 2%p-X&j h+z\ek:8HўĈV= ׁ(\ tHR~0aXg"ɉ<<1=U;''gB79zpH~Ir(8(7,MˏE# 7Lމ]/%M@b,F݋-cKWm!:-Ҟ򲕹S/m߃GhOjSz7ά+]Ys4U>&baDt:[QZ_ҀEy`6XK1=5 -2[l&7󛓛˛fݒ+0O/bCU+Jiiyur[ P_KE/>.{AKd?AE8ƿ[yq~?wy,꤂I4 h/j'ֳxD%L1P`2a\ !axAt᳘i2<eKjO0#q+SX3!p H]VwA5 *+d?8z"dLp&m G ›~q)h{d M@Ir9{!qH(iDhǦ.辴GI&^B5G]kj"n1m 9F[,ݾ~,ihre# ]Z{i,q&`n=ߥ? %{Ň ҫp+OqU)NҊ!Ilw+ʥRn8_Pu%#zHb9X61d8,Wjݍnm CbʱT\%e˹u \Y5ᏚEqit}ɢ=6 Utaۙ4@)> *m2[}~}ra4X;%kuȐC[ƲH.C֯(ɻTL /' g5-bRH-J'a!OWvY9%b!u(%i' uٵ4|ms`"*2R؅NoeB7BE/ᥟjH wWmh[>~KWW%YtmŲlɒ/Gc)_QnVI(:cj>ڕtm?FM!?V~ ڎ ?bZ+0بs% #cs:^syG"7fUFG#јS,y>1& (GITa>ފ(h$v$L=f2``UrHA^Z{~.O}RPjx`Nta4oP3jj7[[5uxžGG&{[g#; o1pj'aS36[P4IvgKbwQF4le'3mST$ vS%Შ7J\GXQ : FW",q\B+" 81YGf#WKY6Z?W/:oUUit *1+̨і_.@N@QUeoʐC_cF`тׁi)>Cvh!WX{FZ-ᦁ5znP2 xl玦 0t[Ϧ}!)R+ӭf3bOLA^pwvc)T3$l)G%$ GĘ:sb4 .fRl+/L߬S(QQ7#~b|L+T$o Il'58t9 6'WƆC7gId+I p k4@ +J^q+G.Zu9\׻.**+ dp ɅLzakO0Uebq5/ɦ{A]U^D $LOh,E-)L>[E>}G2ǨA  t4|4DJZ׬k3H&>q̻, HduhKEt"W2qFw".]fCoqܝT]k.h NZ&7s@x4.{y"G$$۪\Ѻ"uc@rH bO,OB wZXL]-vU@4ϰ:wכlz6k)+"HT!p֣nc5ҡ;. 4 QTuŮ.o*ǠM>$wo6V:T9J1T 4<;0zC+=24򴵍/].BɫP\Nhۼ -uKb2UZ TjX:Zҍi{3/+'Tob ހvHP.l6 g腩,g(Ֆ%FSy:^5Ŝ: m\zkm0x*n'mm_o6RD6k$9FE#4q=mg~\V]cT7epeH<ְ7gν7vu)Q._ϳ"Fşj!ܦ.؅-(皜y)27PmxvT6d-{$\UyT>pW3sjpyX-~D+Sw3)߯oFYKۗVNUIҠOMzVO|mv,EMT VkFF҉j3wn'$: w*FVɩ~ :$RZD*|j7YȑZPq:^פ+VVJ4o@݂zDqT(xq>0~?7uj;B?7~`Fp`uMXV8Iָ5{ Ha$`=2> endobj 835 0 obj<>stream Adobed        s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?+yy :_jz V_o),dUւjO#u4\Vf *$6(p UpM:O3^.4rZs2ZB3Hq2qee@(,䡭*+ң/-٨""ր:M>[rPpJ\ް!Џ n>lU77M74F k:l| PRoT‵46j T5*w)yyo,|%@6'}S]Kۿvi?+1W?!ci~Kn٤ԯC˿+I_T1-WfRq.cK[w'}S]?Զ]OJ<y-/?m4OywZ_Rۿvi?+1W?!ci~Kn٤ԯC˿+I_T1-WfRq.cK[w'}S]?Զ]OJ<y-/?m4OywZ_Rۿvi?+1W?!ci~Kn٤ԯC˿+I_T1-WfRq.cK[w'}S]?Զ]OJ<y-/?m4OywZ_Rۿvi?+1W?!ci~Kn٤ԯC˿+I_T1-WfRq.cK[w'}S]?Զ]OJ<y-/?m4OywZ_Rۿvi?+1W?!ci~Kn٤ԯC˿+I_T1-WfRq.cK[w'}S]?Զ]OJ<y-/?m4OywZ_Rۿvi?+1S>uX9:]Qev"z/%ה45]~:%?)<|Qgos,htaBe RsՎN,!DrLqN|su T3z҈޼K>t,IE 6̒w?m?.| 3yṆ)-Hkp"ڄ s'ǻ8UWCƑt2̅Mܓ|KFV+5j5gHKMR]":63 <*l=Mog B+k+Z,[;g鬮܈^0'T~ЂGWߺ Ǜ6eO!qV_).eO!qV_).eO!qV_).eO!qV_).eO!qV_).eO!qV_).eO!qV_).eO!qV_).eO!qV_).eO!qaӵ ]O,7J[N XѝD.(MF'=fet).r| ֳI+.jz5s%ȼ)cX패xF+p>28c/Hgˊ:o3m\κƯ=R8I  e#L G 8c9Y蓳 23ʱyKOtb?S&7I- V> J-˟!##gJ^@>^ߝu򇙿8[s:&k?0٨^Vk֎Щ7V>+38SvƃQڟjAD!"ZqH#4`y棖jj 9KA~ǘn?P#eGz浔ˤ{ms-kJ[kKqcYց"*pYʡnɜ:?ܛRvi&G߻︔~V|n5o*yOINف]:r߳A3$U<#iJ*;D9lx; {k(O뺦 nlW{ KmR3kd>` y\^si[ZZǩ\ou r[K3|Qfqy&F_6bHQ߸u&;P#nT #s^6V}/"UmBE0 HvrKpnC_?)psY4rߘ1~yu, b!pce8LzxF?Ov֘G(qNb5 8u[Z`΋G"t{{[8W4b(z~ğ.ybY.7zq,Rhkk4-9 ni=)xVNJJNF IޢB/Qw bH6 F---l:̿Wi92✒9TM9< KΧr!⑻)#NnJ;m9$ |e.-ZAHVIؖ܁Q?h콏;XK^iW[khe+L-%A`r&RNr lRX;"<@㕌N\ѐ+D},iS;Wa~Y&#q^@̤|q߯\$d-7GɡW?1W}^#bG]x?1銻cw|?*LUW?1W}^#bG]x?1銻cw|?*LUW?1W}^#bG]x?1銻cw|?*LUE9`UB5@Њ^l{@yis-jb!= پ~̖hœQ1,4I#C>?؎&|i>||KIy_4Ï/Iy_4Ï/Iy_4Ï/Iy_4Ï/Iy_4Ï/Iy_4Ï/Iy_4Ï/Iy_4Ï-?Oy|8bۿIy_4Ï-?Oy|8bۿIy_4Ï-?Oy|8bۿIy_4Ï-?Oy|8bۿIy_4Ï-?Oy|8bۿIy_4Ï-?Oy|8bۿIy_4Ï-?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8b;?Oy|8bB@75O:숿.=?1{s`}QJ;L>O?.-ū>U/4ۈ"9XwZL&3OpX |Dl@'r3K6Sr?=+q݊Tm`~gw6[gk5Owo[<^I~ڵ4vlsjT,w+m_}mc_6j^7Sivjn2zl*•j0RYX * PeSM#h湷 -kGFė◄.oŮ'kx"3D~`،%xB_]q<׏JOMӌ$m܌>$",ueKDIͦi1Giriu7NV! q=bO.0[Kd42Bn-ad*F"}rٌЀbDO#[Ht{=7̗Pҭɧjr׺K9"׏%J\CپٞQ88LA~ˎx@]guan @GU⺒Bv-#~eM!!ֿ;%h^bNu-Q[y=:ؑ7IB G|=^[Pn gQyF3 K*Z0JfO*>Z2>;}WQ/jv-gy{\W$[)+4hryriC>j=j25+8ceh_-Y-0 T9dc c {wat88e J&1nb#6K Y.e M+.d8BF8|<~g4~_i[mFdGonȑtcSJW|ꈗ5GqxËc>I+hn7[yf cTtӨIBYfcEVx~%`1"=vv}H#.O G9Sӟ$f/kw^ud\ɦZܭO 2JsBև,9dN^aֵ_/i~bWѥin-WԊyb8I6|$^OYj\$7Gq< *||Y/Fg|M#b|Y/w6/%FT1d!Yؿ>,;k?oPŒg|M#b^l_CK57cxCƳ& |Y/w6/%FT1d!Yؿ>,;k?oPŒg|M#b^湯|ujJ{5$T]*<?Bɚ.O*Kn/{/ʞtOnfU'Wq: {K-+x8аWrk( f_bcfτ|zO[mgck-31 ]5_.mx}MFf?E=(dUogy\/%qMoX\4YfV;fG1b~%U>e?1KYhLeuq#-<, 3OִGLMW5zl?U{Ѯmuqq(tZY}^RRYeLVe U򖓡jwfDiq il,4ȬZo,9e,Oᐪ4vC.xi0h:`c"Dz;$P&{S<&%(c;p?WKb}GfZKqPOyQ)U{c%br?B8ߠ.Kp&iz7]͇$pY oL5~$.?ß1Ɇ|C7#M>M 9{3$aL;#˿Մ?pRiRk[8ѵy)Ӭ?G_m=./g.jrMGcG52'1Q|1"y]ݦe-hv~d:>mSItnecCoiȒ"|l8/~f-xdax8N>>(N^$jU`tpC[ivuo(cŇ08ƣ a`wq| w+qOHɨj0xQ~.k~[FI~k~H]~wi>Lu/2&ؾtmQ5(^}MMVI.䓌jW}O_&iwZմ~y]ך#N&;M{]]C \6ޥ(2aՁo+:oI{HpKJ] 2W ]󇙼eͥY[/+^kriXR=J%7–aUF`(0JSk{}vX׭:=OSPދrL !K B($dX/&Py5{91}y5/$(؀wKo!Q-j{P{e-&-# b m-7yKNɖjHi᪝{Uf־[7Gr+ԣr'hrHJr p+fl3Ȟ{-_I>:]6i.fIK]H+JZmT꣝ #ssETb|lm3L毳Ç1|Y`UثWb]v*UثWb]v*UثWb]v*UثWb]|9;/f/ ԿLgjSr[1}cj|+d-%Iq6'ۙJ4bMeQ.Bғ_Ek{}ckmjFY-Ee%s$Q!0oM"67oe-Hsa(y\2p4ipɷVu V9A>q[J ]_Sx4mzWݕg}9PKƥPf&^ZIyNThciMTx`7C.ĎMOq;=NJG4o05ۋhѥJ<%m^K _^G|ůZjw[IWRETmI]v*UثWb]v*UثWb]v*UثWb]v*UثWb]L/9Q:3Gu{>Tb|lm3L毳Ç1|Y`UثWb]v*UثWb]v*UثWb]v*UثWb]|9;/f/ ԿLgjSr[1}c?Iy:ͿR.iMce +m"Tg55Bx*_hz'{'䵌/u5KH]IqRn蒝'weQr~R_/3J¼ZѨt{l$^fC+x6P]U 8Ueˍ+=U2G?Y/"4JYE,]ڃJI'ʯS/\o4ȽXWʩ.7?^xlT/DV6{eˍ+=U2G?wyEzULq"Ocg]*_hz'ⱳޮS/\o4ȽXWʩ.7?^xlT/DV6{eˍ+=U2G?wyEzULq"Ocg]*_hz'ⱳޮS/\o4ȽXWʩ.7?^xlT/DV6{eˍ+=U2G?wyEzULq"Ocg]*_hz'ⱳޮS/\o4ȽXWʩ.7?^xlT/DV6{eˍ+=U2G?wyEzULq"Ocg]*_hz'ⱳޮS/\o4ȽXWʩ.7?^xlT/DV6{կ%iCEt\jMJM޳88c6P |_hcif5}?s=ߤͣb]v*UثWb]v*UثWb]v*UثWb]v*Uثȿ&u1}AW~vPf;S ً^KSO= ]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb^u^g%Bz.E]}?3oU 9_AfуWb]v*UثWb]v*UثWb]v*UثWb]v*U?_tMe+P?;RY3KOlxy?I/%?f'}`Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb:g/^?z"_>WZGg_g}cw/hثWb]v*UثWb]v*UثWb]v*UثWb]v*r/:v_ E_PA}(큩,§bǼv+Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWh3/Yн^Wb|lm3L毳Ç1|Y`UثWb]v*UثWb]v*UثWb]v*UثWb]|9;/f/ ԿLgjSr[1}co8K=OwYydثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثδ_y俀{^EȫWϾUև6&mWjg>CK,0v*UثWb]v*UثWb]v*UثWb]v*UثWb]GiQl_E~`o`j_ &i{3?-7g%俞u;ݲ UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UZ/L<?r_=/WUث*ChL6_Lp!%m;v*UثWb]v*UثWb]v*UثWb]v*UثWb_#ENa4Y/0?5/4ڟTܖ_X3_Snr}G~v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*&E9/r*U4퍦ɛ|wگp8Yϐ~ 6v*UثWb]v*UثWb]v*UثWb]v*UثWb"e0o[,_Bɚ^O*Kf/{Iy/N79>?{lv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]y֋??{y v*ʿ??;j;W8,{I}F]v*UثWb]v*UثWb]v*UثWb]v*UثWӲM7-b @l Kd/ov?%=$uQ{A]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]EɟQzK\|_hcif5}?s=ߤͣb]v*UثWb]v*UثWb]v*UثWb]v*Uثȿ&u1}AW~vPf;S ً^KSO= ]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb^u^g%Bz.E]}?3oU 9_AfуWb]v*UثWb]v*UثWb]v*UثWb]v*U?_tMe+P?;RY3KOlxy?I/%?f'}`Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb:g/^?z"_>WZGg_g}cw/hثWb]v*UثWb]v*UثWb]v*UثWb]v*r/:v_ E_PA}(큩,§bǼv+Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWh3/Yн^Wb|lm3L毳Ç1|Y`UثWb]v*UثWb]v*UثWb]v*UثWb]|9;/f/ ԿLgjSr[1}co8K=OwYydثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثδ_y俀{^EȫWϾUև6&mWjg>CK,0v*UثWb]v*UثWb]v*UثWb]v*UثWb]GiQl_E~`o`j_ &i{3?-7g%俞u;ݲ UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UZ/L<?r_=/WUث*ChL6_Lp!%m;v*UثWb]v*UثWb]v*UثWb]v*UثWb_#ENa4Y/0?5/4ڟTܖ_X3_Snr}G~v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*&E9/r*U4퍦ɛ|wگp8Yϐ~ 6v*UثWb]v*UثWb]v*UثWb]v*UثWb"e0o[,_Bɚ^O*Kf/{Iy/N79>?{lv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]y֋??{y v*ʿ??;j;W8,{I}F]v*UثWb]v*UثWb]v*UثWb]v*UثWӲM7-b @l Kd/ov?%=$uQ{A]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]EɟQzK\|_hcif5}?s=ߤͣb]v*UثWb]v*UثWb]v*UثWb]v*Uثȿ&u1}AW~vPf;S ً^KSO= ]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb^u^g%Bz.E]}?3oU 9_AfуWb]v*UثWb]v*UثWb]v*UثWb]v*U?_tMe+P?;RY3KOlxy?I/%?f'}`Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb:g/^?z"_>WZGg_g}cw/hثWb]v*UثWb]v*UثWb]v*UثWb]v*r/:v_ E_PA}(큩,§bǼ>N0u"ySL綰n|&waww0Q{qz,Vnq{d?l-m|=^] Mm[SrnG:.Ϧ8P*utko$Rɩл 53$IULR106\xG૵?/:h^b]%n-aZ Z-ơc'JF"vhJ2œe,^?(u[Kv˗.23 d /dtу4BxG૵OO/.q叮-柤>"۵oH繺XZzG~`jwǖ4mSֵ7VR7j-zK8M*J^Z7 8xEsӏWnoq -N<]"ֿ广Siǀ+Z7 8wZOk_)4-k[?xEsӏWnoq -N<]"ֿ广Siǀ+Z7 8wZOk_)4-k[?xEsӏWnoq -N<]"ֿ广Siǀ+Z7 8wZOk_)4-k[?xEsӏWnoq -N<]"ֿ广Siǀ+Z7 8wZOk_)4-k[?xEsӏWnoq -N<VvOVS| c 2?^ث*ChL6_Lp!%m;v*UثWb]v*UثWb]v*UثWb]v*UثWb_#ENa4Y/0?5/4ڟTܖ_X~Fy*?5~UyKZ|ɮCs4W6["E0GOߩ`*MPYWʩh%T1ުoIWZGg_g}cw/hثWb]v*UثWb]v*UثWb]v*UثWb]v*r/:v_ E_PA}(큩,§bǼ<+y3ZwCGQL b]v*UثWb]v*UثV'oQWZyOZFW[Z.tV3PH&=$dLm/F%S>)!;k߯ZMr``~3΂$YR9 '1yŸwTQ0-6u'5>KXTTf !bˉjGX_>u%w6YN->$o@U \" ^Lo߆FsjU70^kEe4hDF"@m;UŌٞJ %2_5Er&iԪ?*aTJo-}Wx#^˅]v*UثWb]v*UثWbSN|l//N?^ϕ%ثX/u};WӴ7֣k-&He+=RWVNW8,{Iz7 KITiL=?Hz,i]=?Hz,i]=?Hz,i]=?Hz,i]=?Hz,iR?6HfմR%{uee4 xJ?K1*[Իiqo?K1*[Իiqo?K1*[Իiqo?K1*[Իiqo?K1*[Իiqo?K1*[ԻiqonFO-[:¼eU,Bl*oUg]ͷя WߟOw]ͷя WߟOw]ͷя WߟOw]ͷя WߟOw]ͷя WߟOw]ͷя WߟOxγsMPY[Ul`kh`b OFڹf x @l Kd'ov?%=Ww~Cͪ\⭣XX8ƁQ1裩O&i+] ]+] UR P]+] UR P]+] UR P]+] UR P]+] UR P]+] UR P]+] UR P]+] UR P^io*yUֵ=[0_Iv40z\"ECmaqo?N$R*BA%w'^?w'^?w'^?w'^?w'^?w'^?Gǒ'hV[[;ye[+%;K1;>^.m*\b^.m*\b^.m*\b^.m*\b^.m*\b^.m*\b^.m*\b^.m*\b^.m*~\*GO9 kWAùNJ[HVҝ3Gu{^Tb<}?w N%:u$d@4k;/䫋JO1H6G&:ٽr$pD80F&͍o꯶q)+-wʾr[<&O.Rqnx\qu-O3\׾~%:j:.BDJ[vŚ[JN4HE}0#!z;66*UDى~k RVGROMkj%giC7#-oC|r#G@;^o̽/OTǗWP RX'TZL1yQs #(J"\' L+aUm_~ݧ̟-[iًQӤRxu ޻“GgշQ eDGO:<\ѷƶhqyn.rsrZ,um[V@(Cf{h{s D-XЯ^F|'']wQ3-9L+ľ]w H4]i䛂$%X9~|`3r{uO}N.{#O_z'O_zxOrWIjDŽ+O_zxOrWIjDŽ*S4YtbaY-DR-,E-)$ vl"6ؤ8/ ϕ|t-vp[JqncB\{Ǘn/ǐ=;G+Uf$tҭbUQktCv$qpN0^5>afwFΫn{^P2z+Kϗ_еrnQbCFq “*I#jJeBV w$ʿґN_+慫[G2^޵}Qf:7fI҉bpxY"vmcc*,dyd{2InMg 1VcgYlR鯠v*G$p"1;dalwq)WK.`TՇ՝GimMq/6'PaH6dVQo[OjFo6[kOxls b#͠_2BnlYG(MxM|Ͽ#|WN zLMI5=IH!`s'`$$'LOw@+\bwI'ЏgпaI1X8Os'~пaI1Xw VՏ W~пaI1Xbut{,P4Q3^= IB&_KyTt{GH9f@4/k}lXX;ɉ j@Nm B=ޗg̶&uB1Z%A$SXdGh_>ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >ԶG?n#/xR۽4п/Kn|_;B;w-O[1 >Զ-̚wq CG !ŝo.yHըk΋kbsZ$m>,K[%O܉'v#@|B*KVʰ)}s/g~ԾOO~:|)x\|^mΪ/+]m ?ߙrvw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vw?_vRT/??W޿; |\)ָgiv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_ endstream endobj 1 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 1>> endobj 2 0 obj<>stream HWko_)@w-R$E(좥ŕ͚&>=3%)ْ])Ǚsf.￿/?˕_HQ?rs=?Tb$nnn4as*Dni$O7U]-T<*ʬş%;}bVY6Q6OgQIc7 mH&;?;m÷oCuA:gb[f)Ш1RQ jچCVc6VxF7Y')6 ,,G|] 1 .HM#hVl2hQ82&DX'eAܪmM&]onhJ=6EdbK gzi<膾rImn||{~ B,pkSvVSZ&MCWE-]IWY!_2I`q=9oA\~Vnlbsj渗CSXt],ु2GGo4m`,a2bT@X̤'n׆{"+E\}z ьi+?gMќFB`B'h]ѕtS]x/,ɤ7{IZ૭#̀z9srb~$nn8t:*L Y'GFn,Cؔ'u!1I"HikZ}x²żVӰ]"M]!7׭dF79 39BrEL5(v{Qs%Mv<}2ޕFs'g:R/0/l2LUT&{E;-~lWtc7<U?e'-?1D%Q47/Hz3ZdZ]nWی{cpЦMhDG+#m" ¿OfT M)*lAE7ĚxMTš6`bdmrUbI+,^R{w<23Nzh3 \$*#GiO[2Aq?3JCPn'^`ܑE?4ݣu`^*9K)9oN%LV@e5jD11/yً[sMlFdЗAҒz~p{;C|f͒uLxxW] R3TY7{$)J9H.[Mg$Ga;`TڏгU9@1Ȏ>ߛ2L#-" ã e@O0AS}{M#2[}2FYV eғ5B*LbkV ȉ髡'3g O;;ޘi`^%̼P5rVVfܗHLtslG%0Kg(V27N`[>$u0|rTap&tKO@=f(jC'rxZV߁9^ heW>*@~F #LUN[5c}GTw E`y.Sko=I {fIv]`rLYv됺 QdG#fGhZFrȍW^a\Am?"ܔ%Wˎ04px8m 'q"$60$|V 3iX%"$wwbi N}̃u QaNA)[^8q͢OWM#CE9zDobO͔9Eghԫy_ĎNo5}mBI- ³|0QDcgn8$+ǝAwF8J̋|&7ETrPq[ƹ4;>,WMXIx6$OcWs:%2Oo3M [WhD-^\Dq/}Dž܇lR }u+)$i;E,AGin2M$5y>} @m!2mtg*q7uӲ`,V;uڬ, 0.gg>C@R bm9i["0[U* nwA?>?*kf/ᴲqV_ZOw zs&l/^?:G!4eA}{TW>?ܗ;(vPVތax[ E/?ؐ$&mLQ(ے!gT@ K S +h# endstream endobj 3 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 2>> endobj 4 0 obj<>stream HWko_ ,,>IVmE@SV"u]>$Y)˝Ǚ3 >R|B k %JxퟤضŻJ %VRzR.LJ.b %z_ st$bxiXN乫LedJRFd_̴4at/CMڕ%Apc߉nWmwNOŧqw4tƬ3e4W:fOXg]&6u#&ߕO^XI72[J,Sy~lw;$`N.SWelwyJ4(IOJE)8:Ľ*/KN/>Sb}5Tv;KԐЩGBG)?HSO]S2[ԚD;TsFZ.߳=&5FIRTiwhg鉽Uk1QIl='cr:0K).5ҎMѺSTtKfոDS|qS6n7'];1ғLTwQo#vwȳJ<G*g:Qqi8hQCW=!>WPuwdx~` Ұy-)yZ97\DZdh6N֕E߿cAnഺ5 !0 P@Oks?(+9~ǡFe#TSj4={~0l KGB"٢bnVklhH~O2&/'snj.}{a< ur4\6GS="´rc,U"Tӯ 75s, ^^ZՒ~qZm0[b UL 4""zhSxy~}ͤͲyS-PUW喣Ee*rO#ֻM4W.39a(ʀ Yԣ&"{p NͶDn PU ƋP"5|hx@ w3RӁ?שW {6 1?n'ip~84>mL| ^*AtuD-"ofxӘ '`KLB߰02F_;/ _6%*scV] 3Ryʚ2{DVd0]ĎaU4ZɜpcA? šGj@?DХ,^ۑ|\f*2/4L#Ӱ#K2D}O++ŧFG5Wlz85*N#9wI[4] @ -7`>41L_œyJyo.wlH DP"uzP@igɊ|*!4(Vk(2mS6-X=dW`7|񌏁 ebȱyƼh`ΡoWSy(8 w)`.{,:+CT8:$D.|g mwDݎZ)Hf%3|8iƜGlD3n"'̢14`V"92mƵU93EZ+_-kPΥaN,0┬TۆbJ1q w}*7e&E}#% QM72;H6@OsfaM%k9頻YI(V|fC40៶`iο}Ӟ]_h7 y3TLA#Wu}+sF)/2s] \{6foaQ9A"ҢsAҟNo-qcGuC.np{pZ :I endstream endobj 5 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 3>> endobj 6 0 obj<>stream HWnF}Wt0/@nMl&EX .yvі74鐔/[ͻH AFSu?ɷ^#}#tIB.+#ʋ7W #l..efGIE6OplJ~~o912El/".$ <`$1Ea^Jŏ@\W]EŻx9Lظxu#EC?"~"W+HUI0EbD9ber ˘T<"1i|#(If{tzt.i|9 ՌreƻI}Rx#<lDYEކ]X.%s p_eM1ٻ[m7Gx<*b7 c 侟qk_ +#q[qU^[X.¥EhT\z#=שW9 j 2Bku.Xա6H#6k(ԍڧG O$N@'Gk#8) 6WTV |IN󸩖 XM7=NCٞӚhsG|!*hJ)D0,Rkqʖ)IC;d~cjÀO1iytu?-4tv|KEMW;S嚼G_0{9_xx:M7y+#ߋqCm+L= x1SYF'YL3XL1,6`t,6<5MCL)FARXGQxf`Q!ze_Id#[y\JaJNTT*L`|19Zўv X` +VC!5Y o֤<>7V (aSc^* iզ_^una8L9tHvr}'AyO Ӱ N: E ! t AqݪiG y훯X_:í –=\7ʩsI[)/_i/M'ǭFys(R`=z(D>y+>޾whE.^MÓo Sp%pqؒn:5 D CRM@ҧ^Ὴa'@R<ˣ~?F ;h~=s+c`PyGl hjrMLQ|L:@Z uK6KXdWڃK{AMK+ >b|~Ru6?mcSZHv@_q0:cg}0 MYP![@\gBq +Xu#1K4% wS]Ɍkkj]cm31ь3ʣ1~sp}"gl21U<$5XŶȇY?`g|RNefP*BZx^i.δu!#?e_! $3q0'd&1j"dK)V9btl0,_ 3heԍc+ dԠ#< :v5,ї##/AFh 0< v)p¯&Bͪ}wi%H?WA"]+A p)+_7\ 'N}5 c#9ZLoi=ud0@ #pR W*W`EL Dz]G1>=`_ . !y%H:D82$>@ i*5}QhE&,[x( >4JĂpxĬ&d1jT"Ɨ -bR(kK`.<3rEAJoJ\}=2YUgĿjâ5/(j5~ˏvm^pHVZP7:}׆iCl@Sȁj~;z4n-yWdnpѼGeR 2ټop=l:B( 0hƂ JpO`3+c(ݗzKHuO&PIu2jq+5P.ZBna=p17Bec[7;ڥGۦ=4' a ^M6Bc|gۺAv:cOeDޯJӽ1_=K\evmv#?E II.)m+q.L1rm5yhˁs3.yy -LQ!hr5~yӱUS{T,ȫmzX|#ڗ'3HZ[ endstream endobj 7 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 4>> endobj 8 0 obj<>stream HWr}WLjz.?׻TbV$%Ih|}NJ4̓$t>}/ݻ_>|~f>felvg=ԳłX}K?d;&~85>>-*&$$3>ʘ-gWޕx+ K)16Yɺ=܉;rF܉|Szה{G^֬fOIIkkb!ن mlI-2L|/bKu>`FHY71ppc}@C=@ۗyovxjƾx/il hDGA!;(  F\Iߏ~+7.)X+c:e WHbE t@8paBǻޮj(˺)įI7G)2J1JLo$U b+&i`Muz-VY֝BexdzyR:If%͇;h=}.C\P4Yyx^ew+ d9Maʒ<<^u ̀$LjC‘ܿo%ny}lhbї*Wdܧ5О{zO$Ms@ F#n -$GHvE?AXj~W6^ґKxIgiوCD:Ԅ˵!ʓp-H7<_0!9VꮃpdGE,lʕJ Ư ;9Vc^HpHC{ۦJ VI| dؒ4>c/ el.Y:\˖0q'*ْ>Wӗ%*R52K+MFhb GWph KzaM{!Gt3'4{+FC콸bMdp!.+/%SIE2Ef_N9Ξc3sw1 ;*:qS?QA[>88(>K+"CZU[|d%*KGSki6UaQ]uWyJbYlC%We˽xnBGA" wUZݷt0ņZe_|i$Babː)UHFfdU&Jfj= uЉԺ[qmߋsHe;Ud+dŤo[0m2&!% 킉vF > j9YS5J//jut3a48vǫwY0Ln~Lkز_qڨSc/IҲok/D]{|J wm=5f8{;'+\}@Ǝf3$Fİ&Zj;σgTq"suX.#1L 'w%W&jf!xBvӭm-6X 9v27BsVv߾2UG*ph]Lu_Y Ep{8Wҍi؅nC6Cn&R:LD:aEYHutS Wиd}20඄th9SXh>1{}Fh@h{ |##W>]gpv?vȾl/.JT.bz:_U:[z$& ȩ==&mčGaȃtίhʯLtkݗ;͕U4$6լ`I%mZV#r]<锕T,Jwxmwm*"f %v5nxk׻"t]DܹM>R5 0ˉj !q@+}ߴBI}cET54GWlլrb1!#7 ~HjE=P[-ii HrO0C%v>+؏\^*yd?eX.c"Z+c}8"cIɶ%[V5ӯ-*@ю2Rta/_a۳ L1Am=Ω:eWDN\c]PD3vTBM"HXRR҈ؗ4Kx[:\躪m3(9j v!uSeB4#+K[ĤN`?f'Od䲧RRqa],$kɡ bl5r@|WUf&aH} պ)1ͳF7vyblWS1gcїk3Z䵞f4묠0~;;+JgfFoܫ%x'CͶOaW<1ty7ްll4zզWJ[m `J XV/rI.rTuL>U%hݸpn,| AhS>ᑸq]U'kGFd"Ԗ3X{\뒔>$xۮdHSìG~(G(#1@fTqɑd@a˺QF'B`eƂe vOe8{"; ytSMtxᦜCCJ1%_w<|\S4A>nQwC؃?R-Hb>|_n~l.>kB?cly}o?_n5LITC6h ˝g ۽{~Q$YՆ^{f0cΐ$qDLV~s?%Hv=~ Gj( 4q=*4"Uo4Fu}9\2z2=q0%g(^+ < z{$:. 1#A뚖5_B ]4,ѕyrA#ƐGt2 !!A'=i %F/W amWgld0I NRbbdYTdkh l `Hn0[v.( 4aqӫp`9ݿѽƏhͽ Ι@~bJy]ɏtBi=uzX̏Ӗ&bk%U0)B\l5oZklmc?^<{(0ڞ44+2#å޸Wi #fh?epcjYwtMK)ۮTֺ-uF%Skϓ\N5苺4aȗdSx &t 1 {68uvyoQw{@6 ])1mK  €JߟIְ~y:}s}wv.P>3îL?O=e"Ţ`^nu]?}s-Hʘi.}|@$U0zT c&Roxq:k1׬ylf創\ ^-O}B S9,r^3D ,?bJiѵujUӵ(6.DXͫc))! o 3wi梨 vD>5cywV"eY}!MU `Rsn"zTY 2a vo^p% _R3Veb{ujwo3"Վ@7$,H1JFuM+MF-#:Lc'EnuHzkdZ- 5[:(D#)u2K敤+ּR$*YH,/&jU BZ:# AK;=bxICO1ն:f?&)IYZq'jř")vHPl:I̐CXzdSFV>yJwz(Ay=qae8 y;_z*zbU8p. zl$ JyƎaè,OU7I ջt{"ȔG~P`V9Բ@SŐ Q7@mQIn?H[ag`"Z<1/0|V[|wG|qIEi=̝I5J( F#lVLP c.6aم[v?J^2h=OryAnRQMU/)!iR߸֫]ۥO *GF$y/p}= EχK$}Iv_{"83qgr(b3ZXEZO }E218l̬ cBV}8IǍ_M܅]&GasL #)hX3FVM4\,EB-Zm(Z<Irvբ(;e(B$sɜPP#4%_2]dW#_rMJn0VyRi"}`Hi6ZeJ\Kg<:Ti`>h穳55ǰ,JqL~0m>5ul>V)\`m:W`zi`blp"SI-~_~fAy2?SHyLnF}}vwcu&Jm^}{O:I'F09mfxiMrdu#5i$BNQG]>ܱ߻5u /l37|@*k鯩 FִzQ?=V}S6aX&:6$UVe}մͼ<^ $/})V}P{MO=F4%^sS*Z_f2h<#JD8 p e:@G-[cToe+U`Iyֿ~^(PHG;E5On= ހLIj ē`"sS^2)d][r}<#AWGI*'[xZ1܄y3X:꾭Vc=uV[r5-ˍPכ' VzɞW6z43B1=X Y5+bJ:PuD$dU?XC¯UBժn'bSķ`#ǑpbДih- km|*A/;>8!.sGՑr)Y5¶x̊N< ~;I'36ݣZ>8\˸MwJq$йaȻ/W(bf endstream endobj 13 0 obj<>/Width 383/Height 292/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f DQ"%8^"?Al_^xK^K/Az^. z^xK\4A/Az^{"G A~pt;#E8d_K m / z  z 𗠽/ z 𗠸ip𗠽/K^/ z %/K^%/K\4%/K^%{"ނȎK_ 4#@k  k b#/K^ z 𗠽/ z  z 𗠽/ z 𗠸ip𗠽/K^/ z %/K^.a-dq(//_<G)~>ȷ>H },Dp/ z / z %/K𗠸ip^𗠼%/K^ K^/ z %.\$%/K𗠈@<8>Aȗ#9E !G A  q9 A ܐ5Ek>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>>/StructParents 7>> endobj 15 0 obj<>stream HWmG_Q E `.={v=w33fq~}]3^@!Zzyg}'/z3v&ٳ_>pf/g9Sθ?/?ra`~F0@OmނP,o)pp\3B0=?o6B `藺BL0ꮬ5NJiRJbN`skΤ䂾`3 k5VDo1-NT"NI!s"T!&EQ2$b>)HNJ(|p^pIaΥ&!m-~R,G@e)cXYM(-cW5%㴶L |.}v+frX@*ϮQnaZBˮy%@)=a Cv{ĄbݪٮͺrxGvJT+&0H[B, d@MYǴǦ$ (ǙSXY!8sR8ꎾ!X=3``%r R!f* xiU14g@⧌dنk(3}L+/Fa'T3BݱKl+s=ckJ59L MɜGS~qdXFHC*/zDfc;:*45:(vY f;z 9UT^UC=Q3,X;6CS_Q %T5` P^r- V~Ey QK[)@rvԂ8(ӄ~H83Fӂ˝Q=duB@p˶:8{;]?20I %/,}NTK8l) FؑO5$,&Sw< ˊpc:4֟ HH=<^9t1R8!D@hɸ (s\+n:H` 9qAdv^Q}ၡQ_JNfkIoҎg 3 S5>_(sD62⍸ ^@mRc(sF6TrkPtL W]wDzܔ2E[%f&v E>xp/ُ$Q'Ȝ]U D;H~cphzeYe[<+.,#Q_<+\RGjN[gz]Cн#~x("9::wX]WշsMTҨ0eqJA nArXmE͵ٴk?WNPlXzԧe꭛m諦_[TWc]bƆÿsdS=g?w:9]f'^z~|ɹfUؐҥo߂6}K][BQ^z.J\1 ӉFq=ܬyPVpS51G#kH{zi8䄚9_8{o_{9=lDqlRC"WQeb9It¢buG5[*”ۗM3wjp8E-6*@I3'U;Z-&/#$Oh(n&PFaIkm 0 'C}PZEFk.oGJ`$m & lMa(魐YV\\MIv-L}8 z 'q#4 z.6Rq!H*T,Mee\0sl'8*W(Fri:q;-g m.} ̘hbJx6QOH{ @RXKK<,P̤آ_a|w8HǙHƚi BWztgGN'rcvͶe!u;Q+XF"FT5lu¢ieU'Gwmι`QԐ~;R[}h2Z\;ئ+4L)ET'޼$ AD:+CI]\a5q0B[,m6 E}.9ᚹ0)tP' ;f>٥}4}ԟ)3y5e0.(b_"e툦1fnʗ [A1 ,#@Qjq)FLCWj  )E8qD\(KsBfJbcxMgqQc5C j- endstream endobj 16 0 obj<>/Width 384/Height 291/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &h bGdp3 /p3Gdq^?_ _;#! 'C Dd y2Ld.@4g 12F fC -,<@Z x,_0 @/ / @ ^. \ @ ^^^^^\0C0}Eu%A~ %AxK^z\0 z^p~z_\4Id _x^ii~ \/ dp3 |H6'H4#l lp`>\  ^ ˃=^ek#H:  G He8$C#?G\ #l#J8#.#7#&#7#dp[ dp[ pV a a a l `G }l#:GO8-. a<0*28- eGl7^ˆH3|2k2Aapp$  !xe$8e$6dp\2CU|) ZR8, h_\2C,,{K dXf$ K\2A.! d\0f 0 8 006 . xjY d[< x)g< 8@fW  2̂8D242k!9 mClrc EG"E>E9r1(QȣG"F9|9QȣQ"E#9r($ ZXy fel ֲCmGZ#8k5DvG >(CI,qK,6A WA VK!>Chr~[#kGN@75@ endstream endobj 17 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>>/StructParents 8>> endobj 18 0 obj<>stream HW[oG}Gd !(K,&6Ml^H_3d8BJlr滞3^{-xWbD_δX3%.wiТ=SRYD3r Έf'*h)+UJDs={r2PSV++=2"`YOp&( 'K(i鴊l|s*^C{#2&(74}Mrh}:'}.oeQPy; ]w3u.dSHtD _}٩;LmI&:1L }5huX/Ew]<٢wovbs!vߧg,87lz>l&/q:v&H!0\S- 謌U\҆JNhwc'}Xi]8':?zkvTioZS5păT'r҇-T-3t2LF]A&=G]20r9ۭyE]eKШ7Iq hee/OaÒ0x?a 9%KKСP'fƀNUxϰ(sr]m`uȇmPpTG?oC|/484>/?RaU7aў)ENvb}d_ڠ:-J\D}FeqU_mA !;Mzfmˏe:%+Qa` &ҡjaQF[è͔9v7zsd9XdĦ_n ZbjM̦;:a5o64Ö=-Nn!Y"S$m@HQ$jrji|;nWLoX'ֈ ӻ2&3W4Τ26WPVNĮㆍeg$Q~h:RHxbP tމ,acJ<|:H^{Pcq92M#>؜~̙j[1BkW(}oooyFe<ʻbuEɘ)xl+ſqZn4W11Zhbɋ5t* C{^;HzP#kk!K13`Ŵ;ؾLt8V ""b f` &deu-6 p}d0! 1:]?sǬor_-!i<ކ.&B`fʰE~h1CAR0GRI@\2k$'yHFX:zmeb{HXxbddL{Ǟؽ<=ڱ FZ8lCPSwRY!S9/gGvȼX9 f]PO8hع~EEW`4}aDqrYPo%ܬêx^=HJ` zwrBgsO58%MyӌIڌr|K[@>527PtM`kx,w[0<S0}p=I$ptd}9f& }_$/ 6S<_A*p)OJ8 X06_S.*G+} 06 endstream endobj 19 0 obj<>/Width 384/Height 292/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &h KE _׏_>^C%Gdqd2_G?TO@ix08d@?xkr?G<|/\?#_~G?_?C0~=qEynxH? Os~<>o#( ?GdqOsR8KK7s~<>(H2!Ac 9s/9ρ@#>"?G φ#@?" b*q;#" :#G~2 #˿cG d#G?E9s?C2>G? xjO|c|G|/c6!9 m_Pr(QȣQȣG#"E9r(cGȣE>Er(Q1ȣG"r@եqy 6a 6Y 9 k!9pU;#^ Gdp"A?~p?ᬰI/k qd ik6!>)^< x4 s_@ endstream endobj 20 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/ExtGState<>>>/StructParents 9>> endobj 21 0 obj<>stream HWn8}Wc 4xYt l ٍ^l+JvSw(ıܾĊux™3b^-YRûW Ç˫06~z0mHaB^JPV Bp: 0~ o%\-gp=l|0sI 0+gT-}gR; u~b\'fI!UkJH}w$ZXٶn`\0)VT ,IYr˓< cDbuO`^WOGJٔBVr˲ZX-aTWi1x<AKxV3( 4sd<ͤaϾ0Rh4Nf`| "=nJA7ժ^|ZUc!k"F(1Nٰ%'AǠk6AxJR84'8WĺA;h[ةp&: &xZ{}g":cۤ 5)c3Q(zI Rv*@th<C& r"x}n ݨawL# KzH4+EFS0c6X^4ɝh }2T4PAYN B;CPr$ a(HΌ3) 8 K5qN:Hkef(k)4K JhHv .4f70BOE!Yea2ϋZL,X*H}Йn jiQqb&G7Nu))} EME].`uz4.+AGSLu%MݞR(#xtև}8.SUֻM@4z"BB$|;Kz $On-$0^>%T*E 8re|EE3wuٴS4 _42MD) ⌖8j\KϨ6"5.X'x% 46Mp)# Y̳F+]vEAWv7"״%ȒO M?h}5_ endstream endobj 22 0 obj<>stream Hb``eddgcccbbbaadggaffcee544466QUURRRRWW033SQQа111 tss sppprr򪬬,///))/,,LIIIJJjjjkmm8q)SΝ;k֬ӧZj[vŋw޽e˖˗/X̙3ׯ_?z/_|С .>/Width 381/Height 290/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f _ E E_׏_>^C%Gdqd2_r% Bg ^C ȘXr?p2dFώ@'.# L"( ? x?~G8 z|,"%@C G0z C?^C,}W넇A>Z^A[_iAi~(~/2?n:\2 4H@? `q A?G8/K?𴿈rGdqi?q)z\G8oHE_0\? G(? l h ɎO$ ߑG>#G3|_@7#G?A>_4,l@?.G@`PR>h瀞@(:#B" |2FGEQ@#GD{Adva;쏭'8F`ar93_?E09 pBkdp[2Gl8A_CE #/7] .쏂8*(-a#}|B>g$)w> pB!쎁ya ULY/#,ޗ;#S _2:>!G~#8@ds^@KxC.!E8-RߣÆOGx7 <-C 50e9PoQEGa#G8@J8B+d/H'pFg@aOqg39'l9O"|~}>抧#G?/R&<ds#Ldqxrc&?>1>#> mClrc6f(|9r(Q(QȣG"E|9r1ȣQ"E"F9r(QȣG iKqy k 6Y 9 k!9pU;#^ Gdpk"A?~p?ᬰI/k qd ik6!>)^< x h@ endstream endobj 24 0 obj<>stream H}w/@xmS?mCzK%RӞPlxwg%H΋4z1G'?f޽w:; [^ӍڰK?1vD]5ywp&;K.ΚLMkTF}ݳ+}SqtiN-"d̯ZFQiN->O_N-DmBG\&⦹,4 hNە50I{X,,@ CQm,`1mLXƞ*w b!J_v,.peN3y⫴ؿ8uО12 Te.kxD/e㜇оłߏMs5F~Y ڼ_0 [4@S0tq0oYFϋBԛƞvqلr~U \ׯP)1ʏҢL$foO:! ؊ӏ_{mCPq,ÝVՌ?x mA\ ʢq ״aa1<uejލXԗy7`Q_E}w#efwV0fqK$1FYbujNX+NXIhcؓ:-bjS`(o&R,-YECbOBâHo-2b ;XEU,XEQ9j1P=S zC/,,Zm*g,2H|%a XLXL^X]%.JR. Fv.p=I{ŕm"5ДkXTѰZ;vhyI,v9ڸYFE4p5gFM_ҴIhsqY`k$`5;ꆌn,aI$by"EKbX zjQb b gE{"жD`o+,,,@7 ,#`n "v"h ,@P n TaYĂ)X\fb:[N#X\#mВpg5.;zF{GW޳ pثxjCZ5/w8GצED"[l3`{u:Z-Bq nup1$Ow ~q۱24,eNMuhXˎ=G5ÎCW_hBC?횔p } o8U6lX^7b `DMXN#j|>qtM\Bi@܈T`#*wIʓ>oqu-C&}!i_aa\$:A;TYԦ]KD].fqk Xa1Zx,'{^5/vnq ORK/äo*J[̇-98[v8{1za$]b"7CUAZ$Q/bpٵG{FЃ8EU[TNE7kw-c[E!.p-*/r*BI!q~tVz{FyI<[XY̶N-[LsZ8o_MبYf9*]_PΖhc\\>%• wDɏ[ň*U38\YXqKXzټߙE͠+Lw?;]E!4g( }7ۜiBM!rMqqVN brS/L,, Ec"(bA2ECcqV yُ[b-rl4b,2bkzF{Bcq $\l =ۡ-Cp b}K/6Z]/sI1FtZnFS*-<ְx _Cwbstc-~ܡC7}vn G-J[\kvY.kpNUdQ\zæW;޹KguC^^9/CK".5BQ[CW_ ڢƏu^Z35ysI.6cD7h(i[ \j>\?ΖY/Xc=tr\,i1O$bQuc5-2`FwX%EۀŖ,*;Z7 Eu,?Ҿ[,T6,GopYZ?IX)(4Pn. <~ ]jE-iktGu^zXeQQbZ٢A¢TdQ bb:w*6lH,؈(FP{:l_^,* fY8=n)K E8Xc' Ő: C bAVvVmQU}UsE%X ڶ^gYcDULհ^)>XC,:YzZ[XTm/U?c.H͢C1ռX/8,] >xh֕w ;8.1t2/4,Faq Vor'h{ ,Wj]-Ӌ+X$\ Z;.C/9v;D|9ڸ`ǜdo41!9hhv`^LX 2^7\lyXye=l:޶yJK]Ws݇eE޳mWѯh4}\ϚzM,-^cE]zq|P0j|BBbCŀxX&7>/XObject<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>>/StructParents 10>> endobj 26 0 obj<>stream HnS̥4#,Ml8.։6Q.TWX+uҧi8!^?,şg/:{'Z'.7mYgxT˶_r|o9~X6_!X.}_m )x{x<>rxz<<}o<,x߉.}f Rmy`/sNoyH =XqK}'Y> ];/+?//;^,.pٺаR: ][4dcWnΞ{{v{>hV# 1G_/w #H Rc3jcV-r 0܅ 3E)y_:չtR q!W͇wo/oGIkr a0Pa.ﯖw-z{'1ڭ6m|W˧02$CY.߿5ip#}?`v[: ݈:l|k&7^U}Ztd]}hD`Iq"p>$IipS.*bN qPiAZ,ˌE<ډ۟۬ $5JGMӺk ebS"8[,8H Z,p$rA$@3Er-DE$ jqhDBEa;j,߯% V$ .@BvnNVb- %)|ԣCo1;Ǚl]vr&Hۀ\ _3lH_dB'=E[MM\ 싏LD lzL򻆅T7s4f=TX3&cJMbU*c%Nvɓ l<`~ ,~5O%ۤ<)vl=jtr:Qc}BJw7t'TO$鞸s݈^(&VfH{;:iBԩj 10cD1UM3!=BR%ŤNڤ`Y;Iy4LB*9&Iۀ2 ^ԩjy 1q)kDyWː^¤N%IH9= ! 3m^й2$3] ?"(qgHl\7+Ψ& 6R% @`_,.H r*Y˱J8PE?FBE:$A-/{~$=|9T9 }urMT`;PET{I,x'+\$5B*Xw9VIRa#Ԭ&Iʵ :mjvTBET%vC{$q*ՁTYLCtMt?%9hI&ug}ufG0Pð'jPjG._aH%{Br݆+'  fXtUctxXvH=? æMަMo6: ? @A]gݤqߡVW9"3伤8N TN,NHNeyrov:B[j,z˾u.8 @o/ϟg:/$1(p4\eQ7'W(>0[IڛO o endstream endobj 27 0 obj<>/Width 382/Height 291/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f DQh"%2#@0G _#  @e Np/ _8c?ȷ<4UDvG,<1 5p M?D:5ᵇ8??ȷGdrGy<7r81k`xea_ j?_{!GGE5BE?_A5_ EGdr#9?H_cDpT?_!111d[Gdr#9##$>F?cc!###$?-S?@5CR&<'d' HxGdp=dp>#>Gdp(A?C8/;#/,}/KI/}d @ endstream endobj 28 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 11>> endobj 29 0 obj<>stream HWn8}Wˢ23IE7&^R$E8Z8V`)f~K,*I5g!y ޿?AbcP@´}L{ijޤ%Sqn?VK}EGx}7p-ԯVv&RSC"b~zcruNNS|`a+nXɈ(U^9Aϝf@tt^\ o^Zf1+:~Y% MiMի VƔG^qxWtjOĂȈ Ѫ=qr.H|*16nKaDxܔR՟]DHNHzE{A I;P6IRx%)ݒhNE*/Iu$c"BGҋq$W(IE6IkE$yHWKR[Aj.-F+QxU+I@W\6<խt/v ؑɁ -7.f9<ʺr]Uvd(Ȗ| ?[sz2| M.t3"%qWy֗ w( }? y>1),0/~o1ajgwU? d p04 a,*1Fn@a_"Bf zZk5t &mȷ®[Ct3,2G2(Ϣj]RѦd@;L2gRL'W=򝲂eTYF(A^If=w) `GS4 U95+g{VPm.mWSR;2BVw N 4z1@LJ|m;D%|jJH3VkPVԵlM& ­jdi*l7A#\}]ݕ%J9,0oMeN~Ÿrd'E rR:~jL;g|w"2T"FzyV= ˀb8p$ ӕ]ՈY>5>/ProcSet[/PDF/Text]/ExtGState<>/Properties<>>>/StructParents 12>> endobj 31 0 obj<>stream HWn}W)b Ph"DP5U$\.rn$5cA1"/ko^ |sӛo #~7dH/8ْKFWՊNVw+F`n wX=Èoj ?<#9-:>9ܑCE%ߑv9_nBq ⇪zy7>d\RJʭjtcd SDXeY.$H#FY׸c}8Y:5^Sni=fFW=u@nxE8xRD'\ , T ąx-\ }"1y:@rs샵5+ &5{&ۥ6é NKт F 3'g&L!:?W,z`K]/+r[d%SYOTld<IQTQT!b iH}8vOO7Wmi$uE c&r@F2rTŔ EhNyLKEK *)v`D]QOQ(?D=VHįB4DCVb8T+!x14B:j3 G)gL8N\8W JC!fo,uJ£Mm5dX0%e L7j c(؅.%RwY>e9*T/W{Ym5,Jv*PzV=@t^ Tu 5m~,}\TMy{}ځH{!|֪}n`g8a( ;H~ A Ħ-*(¸ZO"5N<)3^!a8VGqC_ )gy~Lig)ӆ-wqIZdHy\2a @IlIrق$\"J&i]O~'_]qeMxP%RHLkДUֲ'^ ^1ԥ}#DUK)yY쳲GYRWxiLɒn ]r%c2`3n! F;3qU{01!R;0.RDc|Z`S zvz^6, 6K$C;0mF^&uI !/\0fZ=K@o.M3va9Z~^yzQڑe!߈b~9WBuIrOƵ!sh%z6˽iB' ]'Jv|7jaL5VP ,$9BV_;l :&UT*ۤDR$g}{nc npl/? ?I&-\NY//p{zӯ(qPkndJQӸ,Q!'{C;@A*z;*$x'R;0].R(\hEVH iަ}>U=>EC[/*O?bk|J*s<.Mt51(֜Cc 2nZE BF [RRPT|UL٦)| 0pR2:A2HV96Q2f 9uHKvK$*q Zm8a>}^%dD*4C#3oD$8+eSp)aFx9mPB$yNdoM 0ԚŻ?OMW"b^FQ#RN[(R덠?JV!epTe<ƄM; k0zb lSLUbU^nM@py^iS:Ǔ r.0#.JHKZ1gwn ZətXS &gbt.-& &' /'mEMRc͜x(1*Ht.TG!JW +vyMrޓ=UrWPm+? us͂ĉ> SCu 2|FQQ G֭~5y\7SnFR y*L33|{B8wQ;!EJnv%2kl=.T#ሢ˪o8M,d@όlmS} lSd}z OMuhH8"a\ǺzBxB%wQɛ^${D{eH#߱

L> endobj 33 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 34 0 obj<> endobj 35 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 36 0 obj<> endobj 37 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 38 0 obj<> endobj 39 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 40 0 obj<> endobj 41 0 obj<>stream HKN0MR]<6A*ѭƶ^G LJbn??+Jz[9|Q%|۹ܩOeq4 im- & Di2Ÿ+3 _qX'1Mlek\E g+7⦧aaMkۖjܖ$aqQnΡSaM7x-LԊ鈝)^M\͋po?0@997_ҹğqp:awhՅ VJ94S5- endstream endobj 42 0 obj<> endobj 43 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/ExtGState<>>>/StructParents 13>> endobj 44 0 obj<>stream HWnF}Wl"Y} @biNl5A0mDG"'_YCR bٹ̙gًgoL/_HW`&-B&SDMvMJ"~/\HV[.&ѯɿ@AϜP9 Is9Ǎth B"ãyB>13 įB#Gݼ~OÐ#|bCnܓ[-@!GFv!7`|p&d^#8!?&#L$KDڻJR頛3o:gy0Rin}8f =d,wmH,>j<Ҡéa aɦ+e%ظ}M Cuuܙ|'䎤M 3-gjg%h o[u r`$WHbXebF^cbXw36,[mN0`/}/Vl-b՘4j8q4iyŊ[6dƐ2c,=-wlXϊ]ǀP<cJJk\8os$]/W `V^\ ;xaY1zp-=3(Xq:G9*gw~zR`{?=W8ЩF=rUz`ml}-"\3LR:t)\K$C^ռi ؘ)x聎 `Ir]fmFy#D+/߱R,rJ)OUVY@p*p-.JӖco[F:Kxeo<%URp0@r+A$%%8ZG,cKi .\XVl~Sw(܃3NuaEVذCpQ-hz#_jh6I=HQ; #9}Ȅ&8ۊMyf&W!5ȔE'|ڦT.pc`KO4 , `Aa{g4>!?gݱ܄VnYx3*J?ݼ n_{XADaeeVtڱ!,/]]dPS5<@,~jPkuz_HS Ey =fp3&YDzw%(yUBXx$)o[J;e񂝫Ub#\˜}˖ۼ|Dk18h)IvتW-$bH'/ endstream endobj 45 0 obj<>stream endstream endobj 46 0 obj<>stream H *CVP/z|D(":>_l2i:uԩSN:uԩSN:4%a. bp9fY Tq ;=@Hךm2HTAK\Gߝê~4? 2h.UnxZG}A \RZWVRV}tlgt[ݳss1\oXMCb&8Fwl(Wn9u'Ql+ ԷY+TwR^S [%XE/ fq=R(oJ1xml aOYE/zUaœ)$0.HN|ցW[Gw͟QBq-4yOSCO{R(c,+;f/5K/}j @8sSm~Vڢ?Łp7͠gnxuڥ4>Ԍ 5I333cn:B ,Rk3۪&w[(an@o?~sk 8h *?(c/4CbVXN|Mzhm^flz4[C7[}uM?^ut:=V:zޣ9آv^ЇUCjlP/Pow74hEeKR͂¬ѫ#F0+O+z"yh֚aHdjk"3VKlD{#3V)izs[FEZՏ~h4AZ՟U!"xcKh%!諵'=--aVtҋ[v bq+nfi7NCǯ@_#:@D(黎mT,Yp ?yj@hO8~ELЉjww۞_ѡv_#UgK?}C AS-ŒGNqE~P'f"acw۸r4}8}"+LJ@MH樂0h)qY()^:qweF>t(}LP^~ɇTO&вBqUn/ҊB^V}*CizOi}Ƅk0=FQvzu$/F&/Vca>) W3;@#~f'izb+(ԦIXSI/DM1&=uD m̗'鯧 1=S(aWITAg zŝMhpeGK aa<}hLO_LņO#gz3_CO8s3Sd](]bOu={hEo1sāSfh9qƍoSZWb7=IS3[9 '%0t5̒ff+ չuJzDAJ9) 3hf@WvǾYL)Q1fM(7'Mc a(ze&2~^DLd!YGB9,^$(a(fuiVJ>^5$&"v Ex]i`_IY7f "@w^=>pZiAVAvU2;L '!+7͖jmN :aE%1xQt8:x:M^;o6S \c:fn;FN{n BXQK\NRG]{/zʵ_V>}^qv)uh(!5~1{RfVO^ìYT6)+`i'ħѻ 7N m+"WN7~B ,:WfwE;۾B=q`A/= -d^zj y7ЯtZg|z'd'3ؔ8w͟޶ tZGJϤwRίS^^.hgfHkGpz:Ai&zlzK_AIнbcҬq6b֬m~, TPI[3\JMT=d-p; نFPSf=neOv n%Uز@V^]+ZԤwLpJkOǂK-Rr]IKSVVS[{EFQ ?S??~ir]sGG3e t.H)YNqm,LoktL)5- Ƃl߉iX&v{ނ1y9gNքٻSN:uԩSm/bs endstream endobj 47 0 obj<>/Width 383/Height 289/BitsPerComponent 1/ImageMask true/Type/XObject/Subtype/Image>>stream &f 9VC ѬAo89( Ut/A~/A~/XKXAv*," { 8HGO\pC , , J iXK%h+At+.TY@^AhAh. (p\DŽ@ |$*A/K v PKZ ^%a.T XK -/K xKAvJ^Vz x#KpKᠶhpX!-.V%H/AizXKZ J^^AZ]%IzZ^it%C rKJOKJX<4$$B:^J%Iz -.Ҵ R^KKKKKK! 9fAr P9q4C4r h8GK""7@cxvAfe ʲ vC., !9WprPG`<!:q,OpGq㠎?h6>8m<|y0g5z#G8< pdq8Dh|G x`ˁtfXEA>V\_. - dpZZL VdpYR cLKIIi28t i28m*IOIi28)IOKr>#% i28+KJ%I28+GHezP@G6Io/t6#n-&GΕT#dpZ_ҿdp^᧤J#ҽ#I285XKIii284i+Jdp{4i28fm(#_#( &G "?##~iRL 4!/Ai287G@>#|4!JdpG KK/dp#i~}__Z^~a/@j/J?^_pD}~JzB#q _Aii|4ЎJt K-/+ . >/@w]QC@#@3G 9lAr @>(?2H:Q>xvAfe ʲ vC., !9WprPG`<!:q,OpGq㠎?h6>8m<|y0g5 endstream endobj 48 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 14>> endobj 49 0 obj<>stream HWnH}WԼ46 t4;Rn*D Z%JˮoU7<[SUk{y|~ ?:9%l0N(EnѓhqehɄhAgt~ë(.LAO)s:9 X9:m+vf+U\ ^kr7}>>X۷wPM\YD?ۡ'(R c qb=#w43+9*RAٚ'Ylv)!whꜮ1R}+5! 0 M{;X x5%X.m%nr&v4J^ uAOq,l PW CX3HXIOT5o[Ml²ziCjĞgȉy KQ:2tH̀五J8&9>[Ctӽ&е]zwEf O0ka-4\/_RJOj{Y+91U2/Yě#s۳tdFZkn2&)@mX;ɫnW|Jlob;DbAz[^0=8fu[& ~4 c*ǔi8s%_i_Wq%iT Vr!K3=y5+,w4g1!-qZ! ٸ}&ҁMiGԦ\m;҅rɶO`7(⛦]2װWkKv)E¢IɷTxMF¥)OlM4>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>>/StructParents 15>> endobj 51 0 obj<>stream HWmOG__wq  Tg>wg̍oU3ힳG'`~dʾOˊbx~E.CVs/qA5hP\ =ON 1(ԐҠ4%=:KMW pfP@KT -cGN(֪BCUc~ݖ8փ$0c\fXbZNBڂ|H{Pp"Ϩ^k jҠs!JVr$:qeò*%vX@Jmɩu)S*Rk|L+?4YB L  #c?q d{rku#ɕ DROWDw>stream H  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ b~ endstream endobj 53 0 obj<>stream Hb* D<# NoMjb$1g&@4JB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B! ]N/pklV[^7aU O%6YGt@a LUc3q]RĄE2K˺qm uۑVD֫E6tMa8ŽԧJ^ #j~ q9+w%EvUU[q6z^s:y#T5.k}HQi }vԹ'۷tp˫{t8UU~ tM5SǚZCUJ@^fJ4Pvi XޢJINR TC)ǫJ? :>՛f.e^e@uVx׃w1Fzz&qv+Q՛EId&7V!+WR~Ң~G˕6em2 !}nFQս },dz]r}{ꢁ7z'gdp]B!N~q<[AfA]z(_Xʢ~э7SVկ`|UAƨOzz$WAģ^ |u@U]n%`Œ1X$+|Vnɇs;pGj.K>hC]}CͲ⓷7B i"L}U;RiGPڠ.U mV^f5)coO>A90V`7tq֎ҖL6;ϛ@W!2}'zՋn\#EI 4s4`sݍ0G^)Ny.,&݂]l`JvQDX}-hr/.PWu\ NX^ T,/Wdb:Iu3GRw֝:#Sәb雡1LJ#ֳF)I߰0@ s֫3ԽpBC2tX,W@(Wպ_T0N8X3;+H56 < ΃}c]E+c Л))`n]چJwƯb_:di]`n v户1ܕrU&V`}hUU^dJ! VU͞K]^+*O8l 7/k@ SSa?!}jZ ze#e]Y5O&.O*'MC:J[Liޟ[u\G, ]ɷjW8[*5EpdݛG^ms>OHxBs2j+ A,XO*EE}+^!5%*=.J UBZj$,'}zaFZȧ vWA >G߁y8I[lK7WGm:en?#a4[W@|,ڛsG탨.ATTN,NlA tn{pRVۀ ]9DG;w h(3; ˁ2+GI*pXpvn е^lݏZd]5.؂xmu*?O8Xիꀝ/h\D<?nx-]jQS?u:8U$vTe|$+^%d-A]D IVD/q#/rF~e7g7ցYbam*&3!NEu ܻux?Pj<#?Pum cI\*-xxXwX6Wr&z]ŷ59A{/,-o*P+:jZW00{k> ~Xadgv k0"ka܌Opaua#J2H,NtdTZ+*m-ahV6' +JnAkfhObB&l*וnz%ڴ(``h&$,fV]/}!;?r.0.ո39lY_;²)?6G)bJP{XpXwZfp]E X[g>Xde &V\WUNhmu%6{0c#61pX֖[WA :,*&x'S'?bĹVAѬCyK#!DDgr@|XhϹ^IUkC+t>4>+ !lRhv)=Ea$/R<ՄլTHay:a-WM=+⊮+#^VMFfc檺JJe$ Փ%_tUQӅd&>;hvզ1"%@͟NKT=ʳX8{X bb),OhJNJt]6C2eӂ@@5Hl0H Xw֫pòA-TS AHJMAa_:D!MVU$P sE4bQWؕ(ϒf7B*Wd&a"d]9v cda^dO,3s`")pP0 F 'ޟ=&sKCRjΜGg^4'WqܩlzuSE]a_`^zd>HFY֝Mu-ٹnvPzy獩BeEι0߉*iu/er#wPT+7&Wс;VrZWDrsJ$uog 2}2}p MsW,XSXwߏL @G›٨dEakܓZxp[Ѣ⃓MZ*}@F{zEN&e^-W}ΝZwuBj%>퓁/D!$W"р|6@+Kr.P8Jh$$[^󹻓Y? mz#̗[nN&ǣURmA}sDZSI6~c ū*%ˆ@><*_.@%,kCVksf⠀ =JݭT_m%UJJ,-׺+'/z9^kTQSJh MNFxuw.OVwRB՗XuU8#V~_|[AĹW1P\ĺ3'!ԮhWD1QWD +^Z_M)1`+m-ђuip YW ۣI͉Mu(|!3 _]os u͹(c[J,|us\k,QÊX+% ŗ4,(siW7F\S!ެNÅ }Q gG]|u{b{)K2` v=)z Ik,g %@gW)Wc+/X~;ي M~WQ1֠"A*fy>x'``gSL'C|;*fT "AH$+C&$^AEtT_U ;hhC#|^$ X lvP/z _&KW/ +8d_r4 ;ȃpz"lM ΐdzY NϲpR|% \}mY&H# \Þ5v:L,uw9I?Oo}GK3OwwUL4?0 Ǡױm?!΄bN}A8F郯$pm|c{Qg6+CAӰnA~X?=X k ZٷO %L\JY;Sy+J̜ ch>۽OZ>n<Va./m'8|Wn=%{/ 1'$׶Yx_Qھ +Զr\ݏC1۫qڟ;޼9d{>8 ,6) 9%ҩűXhmv]WM|jNm_/z۵=wǿ8:ٶb=ffd>'lMi}0n?-]7y[~x $u=;3nۥ%BY" kJޛ˔B~pdnO1.fZ{UWyxu; {}>«;:yUm` ~H'\WPTX|v=6XFj=R}Mh;x(H+C+EixC*9硴8i٦;Ja&Y O:fۀ|MFލuD< M?ҫ%O˰rR߂#Ɣr| m\Ԝ||8@ͲW¬ ^ӭPaEmsڐб*@%|RW4Fj"9Lw\ CWy0j^zacp\?ǫi^>zF(>Q1榗vYWSj!fh,d飷K|:NMp2B1T^J՗6窲:3W9w}NI:.4/{qŗލ:{ 2CUnv0`ލW*AWo`So+Eur1 ꕪk:8lS; 0" endstream endobj 54 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>>/StructParents 16>> endobj 55 0 obj<>stream HWMsFW1޲F=T%v"s-VeS M"e7?$6߼~}>?xۛo?7bI؈+%n/bY|) #' oJ-I &$xsv]s'„JO^Vʷ><}O޽_oI?gRo;V+ɔedr)uV>l6jG{`ﯙUAJ)dJH*{+kk),6-B5\J(U1NzzF~ΔL'b|}>/dǻG;ڋ{})(6eƶ1,"e ̓N=p~:?<1bz#[ź_ۣ0*q99ݙߝ|,h0+(?:hٙg_u*[6jO*qS-kf3#A&mHmS=Dǘ,Oɐ笍Ze@G[2%v#6 T0')(a 0,R R%VD58⸒TnPtkkbwK}#i*8?CZZ=#I VMY:F'?, 'y}SԵ zRv8w^mf{+n`hr O|&Ir Il y`wͪ~vP 6^H >Dd0̫aaA6naja-[%o4 Ғ($v$[T>{ Q?11@uVkYmu~#vg O,wOb)f{`!FA{;s4vXRMܞY]rN5k(aq-ww]ߔKKӶЍ/(!ﰧ2ܞ ~XUk"qDZBC:8-UkXm!e>{kZ%`sۢBT]tD-,52^]YpE^+)Mu6ڐi y/u¯2t,%Xa;8 {r178N6JR<Ʀ`Pl5<jE&KA]|-8 ( R~E(lPSwnA_V7ės30ME'1C䲩.e\ͮ?cl~rʂ;b~gol\%^kU5w,Dzx̴E^_O?|7NǷ\ǒߏ̓ iԠd6[7ZnFaʮ͐K,H apuO V(Q!WY;aˇ/B;Y3Y2x+b] ǖ8r\)ӽ$n &M mgnm훏?|ߨ:u[~ERE\S֌z5 h: endstream endobj 56 0 obj<>stream H31Gj0bZ,^Z\\a9 Tw<>KDb!6N<'"GBV0,`w&r&#d!+ȕ8bI7Cxg1,M\ś%ŏ9Lf6Yռ|ZDePjJݤ4IWiHIRԤU#YklEkbUYu JA9A"g{g;ڋlzk<%8\o}c~qG2;qC{7?k" endstream endobj 57 0 obj<>stream H{o*GUU+DjUT-$R bZD"IiI^PD]0M|۬/@Xb;`kͼxw=ޙ9aEΝ1 0 #Zl4cgK>aY@Т=q~МY7x7VFNHY$;f8afB"CYǎӥ96UggVUU0 ìp Dhr$uBYwa B͕/jq0 0s?~q[JF[!G(DHT;WK.0 0 |2EmD=Y/Mt~.<({>^A3fPzE(.7.w%6J1 0NOͺ)d{o|!.?*F YjQ o7u|~&aFz8܂ lMhO=K*>fQJ#,5(K+i$zSaF )d w<7}'>u?4T)d,)m zSaFFS^`P;)dM_=M?#_ MG YD› M}8,-o,-o/f^/HiES+rPf+2% JH[.n)M(eg*4ޱ`n0xO](1R;y'l7&ྱܱ_`Bj% !Ml)dM%tIljBU-U-1?05i—jZ)H 7% ZZ[J%ޜs2/LZrBOӌRgf6556qMC_5pޱcEܟH4)dq%tIln ި^q^/ۋ=z<zJk{``: %U:$lpu f*י%Wvj&I`y JR7lS+T46w`FI4iysg={ du\zi$oߺY>0}^1N^5t(PNҡ8c56-S)B631moX?U7hu6Sn/ 0sExaٹ"?3hks-H!klBfJ)Ԅ^5p;wQ̢)do.KfGǭnBiץNw`Coڅ}g)ɕqb/xr= Gy|n%Ǽr{iMc7npDxGLbϝ\Н@[PKˀ[B؄hRfE杜=o_+'o_]7;[ڂm-E_>KSw7[(ٖ~2=I/yyt,>t7W4vXZecrI;.ryd֡~K e MȌVM4vlCrB;sv4:i 5D=RӀ.ɛ@"ofg{=|^ߞI1"eZieUQfm:^*JA޻f'. 2FaյY{3kuaQI t^ }fR,5!7m!diPVA=ys5]7{z{0/zQd#ң{AkJ}!q1y:gW`U`5Wq2#?}A&Jy{3"c_ e]u? Yjb17n ei␐ՉCTRD  #ߛ>Wg&]m Xc+:Iޛ+M"s~'KX1L&/ bcy8/U*iI{oX (7sV[NtZuVf򽹦Z{mf4VՍf`MU@ Y&2j]OMйykgSB%ysv(<>11 MTfx|v|I:ghlZL)%t7' JM|[6L0iGuMݺuͤ{\]S-3hJ+* 8D YMhofˆm?ܾqKZ=.ɛCSScWSzpaaH]}{xqRf0VnA ل4%̀TTRIRc蒼 >}63Y錆6gYbF2LlfuxFb;omi֛X &hÏ8}[B6AM4O}?|߰7aBVn%ysdx$27E^E^DBEh/vTb"Z>0H;:M9WMeuN,/Kq͓'y ìpo?zfLJɬEmn/Y'mM,2:?7 Rx3280+򊚬5 O%&mo87X܌+.ٛ YfnMa7ٛMa,So*ftMٛ+xxR~ $tiyXc:k־({3#qM-`x4 w.j)HKׅ*_\pD%j* _R^%B ʖ/Ʈ@M51zڻpĸ8tf:S;d<7e@!>kwpr_psMMQ8U`p ,`L7Wq7y$G͌12,ۉH/Ge^#Ǥ`p 0bOc&<d߯<9y1p fI*9&"7M8Gn׌M0E&y}rGpx&xM Y\n˛snq_7M&¹IŸ7$MYx+<&ͨGDݼفz;8@Fۋ65`)?d 4pm2j7/mnʒ?>7寬7ׯ:he` %? 3p #G͆ٗ^?n`~YVV||\Q'׏`0XztQQa}tn@ ?ZZZ7ߟ팔\^v545R:W`0MMf28l޻Cx]&k4ˡ;RBs~޹sK E488h0;V0)%4tǎǫ.˽u'&⡩sBBzh֖*z3lsѫ"(S2jSAb%̌Sm;H M|:jh#7_? pdb[4 ltid4f=Y&&&.\cGnttDCþ~^Jb./\.kff֭IZ#Sl+x&K> ܔy &7Uqt~`c)335&F}{rd~މR"<--⌌d2BhTUU]]GGF~z ǔ%11̑!ց@77) &G${/yzGW#7*;7Pb8F0reL&/ 2㱗/rlT"5vKKјR)23-7oB$&1+)5/MX:'SHINrnwww_kjj _?=7g .D{{MEEjuB`HLЪycy>$MJdk}HZm:=LILLn|IS) |?MꀤΛ7zz:+LIlۦ;y.VdGF+/^l>p`VMOO)+'6==ͯw@rIbnыN;n٢=s"Ea:C>G](Ď+|GM|IU>6nU ۓZ{¨REe̅h2?m͛ixRrN ۼYkW<88811a@A ɸWdzzm\7dMs[jBO97G˅sd{fsJaL=.U1Q ^J 4>\@r&EVVʕu93xm  jIM¦W%d s_S qE>7V/YM 䥡{v{wwסC)z}_ϞX\F!D:=u8N)+ٺ5>.NTFi;3gFFJy&(h%%7q6%VS"mJ* 7]7}󈃛/9nR Eϛd9NՊƑ'O~=% ߼F4$L0/zPNNQ D( D8xT+z ED Z>|wޤxS|nrSW7>rQpTS>P]`ЫTQFcjOy'">~ݻ߻h[[+ӧ[\yDPI@Dq-]^nNƯS)#|y?v&QWnz5;;k,ZhT55ׯ-.:Vi$0S b [ bZGc"6& | K;[(1RN)n[Ga GmN<$.xw뙪.''YwfZNeE\7uȏ^9}D˜-웥;l i^Z\T&j`к&|'">stream HKn#Ig첷s+ւ1(f1,[ɈLɲ,w)OO2%榱O3~Q +ێ~t>1-7X6MEVHJǼݍ銮zWݡN]x̶LFC'V3LcsZH2Ր}Erė^#qEӞ؁kI_)IMGrG/)#'K]Tؒ-!3YXJޯ<ª MuҘTLVVEcY~;q95, gb#L V_S;c?u0.bQK ZՌD Vqjq$zn^J]y~%)rt8ȫUu\Sݨrqd?@W+Ы5fVDEV{Ԕ]D ݰ9ӎs]h`Q]BSu~zMWT-j!XFY*2t@{F9-}&[תN5үtuhTT4pnlJW9fDjQrJedYv8*f,doy魃_͌"jɊY!y#RZ,i nac#g&"^_*'JL,yKtk/%ѣJb9TJjgBW/|]ykf1;<9ܒyt:Ҽ]eG^KG*@JT[Z_i lCW٭(6NO{%:VhV\Ws"U% {ivv%y%k 4b7;Rg ݋mD!WneLɝڶ̲Fq&ӻζOZLZ`6|7̓rmӋt db/>Fx~!ѺFIKJq2/YRiHm޶m%gM~ .5{EXEW%U]b17BEgfPLa9y2ȪND́! b-BBma Kd[mj+5j`Iמ#M_"-X_Y92@)qJ7:+FJY5R̈́((L̟ N0szLKFrҢ(JWw#)<5DClRf$N}pρ8=eQ9?"Kӊ=eKY%9UA^hfS _ei>_n_U`: 'Ȫ8›w;l欭L$z6SmCݏsv˒hER3z"`3Xt:!.tϱU[C1GN{Y*eeU.=[G}NlyMRt1zW9%ҷ5jK6&̍R^}M ǞqG,d P.$z)~} ϧLMSSƜ,+ww_M5Nr*#A'Sfσ?)UWr}YEXٓ_~|cO' 5tjR JVBsv'ݥ5`қv5XF6!yi"τrfTڕR*źJg~ӯ,nOG6M&(+WR#*U_L*cڝD此̑7oZZW֨x@?InT+w!6}7GW9TQR:|J(0KiC#~n̩*#ۃVs_p3aB8󣽦} iP쌁xd#yp]},.,&Uz,Mhͻ+]˪w9wqA=fWj-QTۈ*"UmyCZWF &_g؟ C,!, >_ EWK-IFoRuS>|l-J B&$RҼ WPWC"qUd+Zf}:s$FJ yʠ[T30o?F^9hp|'bTG-˯njGQ^zV.Fb7N;5O4C<%:VB Y 1^8nZr5C^esӟz]!O$r6ݪ6ړwB>(Rz i|HVBc}ltWLxyVW٠ǣ=`hBTؕԥ]3UW` iQ{N>XҒKשj>R8[VWPFq϶'e{!ς-EAc45_Ot_"s'Bc6r>k:uZ=XO,Wv`}m$7^N}>!m4/B2/OZ4ڂz%ϿF$M ϙ\pcb"ş{ULPL^K~Aq:9\á] ګ M+O,Z b?C-dE*^_Ïu4Ii쮼P :4AQZQl>X*ߩY$ uֱN&V8(eJ&2i,0?'˯05cJGZູ }Tdcyc#^9}(H=L,-N%I$ymoNָ)6vS.v{D?C`%EL"\$#nKm[M 񊿂(i8WtyGY1_*U$rJ3(> GQU1eۀ?^w-޳ŵȁLrwƩB~oыjdPhqsp% ݀1Y߸'^!d_̴nVVn-r/f[(a/tQ /6'gu 6x`R)Ϣ;ˎsmH-BvE<U* apIHqđ8eƩx*UoXuntv 'jK QbX"]v\~u\Tj(M%)+ז_nEм/uv0}'yXnDHpճ !@"i,3CrGI<2u ;XZU 4_@8}p|~RXK$S( zXTE!?;TY`p YVRMZQ  !Rb܏W H`|q.,vV킖BI6ܟ{LTI.оScSjhL1l}} RlKmsCOs,W=vDNL> x3IE h]i.263p8ytܻkR+8f@UW2vyX`Q*. FQPȊh l rpxQaQJ`Pj*i|Jӈl `4Wi$TL>V f4',EֹȪjې ~hyt>X#lDm&,ӊGW": rE&M19?pl:źwޏqI"!&sHg1]E}ҧ1+ίWh-.L/u.>x8Yޱ ɞ=%e4 oAqŻ)%ШjB+v "_ Wێ8Mط ooH~a-i4,A0_OQܺn-9t[)"YNi?^>Cp$GTeK$꽦,CGiƉ0nF!>^~OP qB"b/cWP\T/WzMV8%wu>v6AٕmW F“eEQ"Iˌ=k>Ky뺚f0o:J$hB ,ʭ>>vBz:)g3fWtg_A?cT+UVfk=߄y*Hz:/Tf깣K V9W6]W AVłaxЊ3yΝT|@'}R\c Uՠ7=Y6ʕE% q&Խ{DzDzbe j`sr3obdz)^u]ѱ\~cbc.0(Mp U冲؄nZy]"UXSм;YϱZ`RJ$?yԪ\8V_N2QxWEZ18Dw89M~c: 3`l;Cl,_&y5^[zF:c0]ŵjǻT,YS:tz0nQh_^RK48,tϒ.yZl~O}#qc`n7S}Jev A]NF~ē쭐b7Rn\aԼ2^"^+/Z"8i;l=Q݄=Ύ*[ILJAy/Y=zЂglO8ո6z/+΂*(wb$-+d|b 1j Vuٴl6 nd*P,V|K?9`@<}1G.8^ݗ<=& ;ZSQf.md] XWN/n.88xKf!{$xErB+ǠdLfo UժKjR YAKަc]. -t  D#J?c#KCwHaVlpr Rcb$*Y*l'JUjh%۞^$9IW̢UU h64~5m A(6 f-`vU؜)ʦݲy@M.rÞ|(GWK ,1+}i40S5J;+~q(Oz8?jyŖF:ИusQ}5[?k8o'(^ bVWo 7m`z⭾dF*wd'!Ѷ0k0}t[ơ~|wB̟==0gi>.@]VT/ 5wlQL b9S^O}CJ*VÒ.ц]x'H QK|,^bšӇK]x _ [+*v%:+ȉ>xrTԴevGP\~Dٕ|<4~;1x%J`:^]θ?!+|q^u!M!7f_-9HTaԮP;AzN1I$  > #o9_i[HS(*DO/^ Bp%׃z (?j9`!r%aX} ;T2>P#\' ^J΃:[nVZ=Y;/ eBqC$m+4s`>>d(7΀b;6Wes^,y;;fDb&`Z+i?<Pg 9j-/ZN&<5*]8䁈,g& : <ˢ޽A`O$]2@ { L;?bq'S4'wR*W #Y Z,y`p~Jx%+c}OrV%Nvg,ڡ|F_PJVPRL0M=iDVa*dԓ1t\xG U9),A11SP`[Xx1V3+qp 앵dƊJ UyR1A!ԹNm6,@ٿ]^!sƞ&" 6KYÚF8`}U#%p^Nx; qZ$⯚^ MN;|q?,0uV8W{Lxk6ᠳ.t:4ΧL,fʀ]Z60á p!yh_ X2ŰοO JpԥZ@Q0PSܓ mjGieW)Ai~҂؁U3y֝~+yLROXO0ŵ!4JFaD;,t^gaR?<%|m{cс-_XJ#.JoPVe֐2`ćE0B42N*+YG],uӎҀnJ(!?$O GSB$>U: MY5;Gv:t'0\rca<+'BHT&/#ߒb%^ei/sW2bXmiCՓuYzL+ZC!D{P L԰|"TpKoν瓶`+_ᡈiy1++*)B+Y%EDV>qӡ];8R,k!puoXZP,] +6tg_u`Rq^U T͂]WSdžCk;u$6*TYK)0$ {S /D*r@y^:2V,aԩNY[Ъ*H]鼛V aNn'*.[*Dڽ0$YӟSy<>yPeY5f-> z%[)3V0<=0WT~h5ꙢXnr_ 8TTu^:2_U-yO6%Ti[AdX`{ӫ/@]7q =}62./2N5R}_ukgnj"U%Շ hr"IUڄW`<зL_%/c5M~oUsc?C L'E>H<)mzP'>>"V.~=]X+/a!1ѡz*C"4WV (u,Ʉ=]L!04,:4 W__L1Xfby^)ɀ`{-ie/z]6)*2)-5W zk1-hA\b]rgdr=u+ ]Is)~.O o7a*\721vGb5[Txe-Sr} z4ᆅjȉ ?7+q?XXHrh3j8ةD?macxDƫ(ԋf%1U)z el@X)ax +ǫG*dW)+ZYk7RV=k4<c2 n5B$YhC9+GG!iPJ@g8UZΐ8wϮF%;#dWrp4d>jZaIR5֕a p?.؆c, ` Hg!V`6w [jcf4=&JS~W}Wcs^m2OxoCX 6σxMqMz3(WM 㻸`;pt zU756f1[/ACCCCçش ћ9[WQ[׃{5@:M*>v!#)2yv,R^jeVzT'ʍZz2_(U,ζW]1xP4vtYc[!=Ǎuz5@7ݬa[xz%W"C\[L3+>^[9}- W WL7Q'I\ 1DjKnUYoXt痸_. BLUOIvO/ݕ -<ȅWGܝqOL] Gen9tV]-Nt]mIɖŏAR|3J֕WX}0tD;\sOHU؁FW4RW?%_|~CW{J^{cU\ڋnW?NJ}9!WG&b1h4\ 7Wj/DWTq43'qg!o؇ҷ >@[>Vs ,nU\UT>r.؎(9ǯ-z6We@g]XdܷQ׾^k=&u,y˜#>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 17>> endobj 60 0 obj<>stream HWێD}'H}m`gXXqx[7Y앳:9lJCY{>FQty̏ELkD1n7^Y]c]M; `$,"UN vO+fsٲl2/U7`D7 EJ }(7P{Wv:Rl&pFbƠgWτхHv =.V?5y}갘vXP]STKp|%ԗؿ Nz_ϖtpD~d~pb'vHF4 3S3V9j}X9sMF&O}9 GɩIeIljGSalS5I,<g'ne4H]P)3\GH!ʜeVL^߭iXX Oώj8ZRxgPzo;{uN_qOb,]hlY צؓ5/' OGg}c=QK֨O*]0xa(W2&Jh,4fa~968 NIAaHM;]a=W~XBp&&I_H\b`8x+JT;Wjf8 BUfInܨ0uLzKKM[}Rlأ1eJ xHgc۞Q|G ]xxC#% Rޒe9n79NfaJ᠀sz[8(76* :VSa%恾\ݕֿ)Mꦍ,,pnQ?7QWʏSIY}cؿ _L|8BeRHsAcJ4PV,9l2\C9ڶ8گ܋[l58UkbnRpτ^5.׋ϡ %c_e-/덶娜 _-?=S[Cƴ BWQ icg㶥ktYϫƞ+6v]ʹH ʏ$8jC?t-_Я'&CH%CFQJ=<.H^zmKYR)yk{BNB[cCdeFbtlV{dX5z:<` c?gYK~x~ϰH'̛O&Haxopbg:ӧL2';k&$9t_3)VN#DϫiCڥS:kDԵ7W0v 66U[<*0 2htXte{nb: _!tQa_5t[|A}Z[ő~B5&ȷƬLѯ8 ֣0< N?J@ƙr.l1i6ӆW|A2ݶT/ ˈvXP"(Ш2S]NLGlyWvϚ`!Sd+l?b:Z4D3n1Lɸ +> endobj 62 0 obj<> endobj 63 0 obj<>stream HVyTGp8d3 L13+@\vDe5 (A%5O\]C3z/SG6<5q!eu׿*@ zrr)م$jJӆk+ޅdYZ~D l_Bxe=>|D&lơr h7n; J H}q 'h#U. E4|T'YmC^ŠG0LyV.h='z `NuV þx4`NҤr3bX=Ak3txm[T5UH a27"tB8!8Ưt(}E2tK`P3@` XL$Wy:+S?.{/~ytЁeߖ݌;i;t}L y|̒de>Ћ=ܲHRf)6BeP)=)d"i7ZK[I"ݖcf*`T W4hyx"R1]PWoLxڗv;h@B3D>]%SbʅS%+i˜Bmqzgբ#coI~_nqr670_P}ՌgOl/P]~󛭋Q~=aDR6?5f/Ry6Z'&J;[6d%يdRֵ]k+VokHhuw=f񉜲Dፂ58ѕ'kbrW?Н…Y?7חٜV:7Wp %gMyCtRHo N~mcX"d,>:U)۫ٿ2՛9Вt!e "=.5HV+W'u JKLA`E41=qdQ0/o_w֝M EEE Pb CuP.Ӥ+9{J2/TM%pcd ;<ѿq*%*CI>v`qw˿6I}޽ܩ]-mTΑYߵ i}%z(5ǟ)- )[vPaXb|K{7LJ]宾qCJ$|Q],GOjk0mdɾ ֥#VVN$I%уNhZ+%X:e ,˩݄{-7ynC Čoozә5E]kkԊ; ^^"j?_i߷9̚3TBꤛ<'iɳQ^0_Mnp m_g(Mʽ4=k*IG<wN TF=DBh (\=KYD\ qxV%C[оv%\a՘];3: nZ.qE>Iب}GttO:ng变Cnz | aϛJ:v󅐫 Ǐz#:#xXMpUT^kP a iʣ z$N2\dIf)%\b C0,MXc& ,Z[@.r] -4fBLň&>G Qc ֿBώm2pBMε Yh1WJ#ȣzϕ$XlfVXeQd TřZ%Yi*n2"5s4 `PA`P&sC UFT*5eN%ZURޫ+ ^h`@ VFy b=C1 Tq*ZQEԪ}J]ۑVΈ"U,Zu)$ :~ors{9。T G#H+1CY]8Fi9Vru8y\&q,6:\SLdQ!LTxN#{\dL'qDrJmBF|4JҠ-6#m+`j\Zil J"*2JW!idl[JÆuJzKYmE)VQu rUt$gUZn\/*QE)?i3VҰHNj9NhY'B:F(R -zZfDHŐ:cqFB2a:jL*.0]ۚRfƴLL !O4zAN3FnDcc3[30ΘbVG DG9`IF qxtP -ȣD#Ny"#f`Gf]4 gg-i3$^_@68@28(O2ӁɯA}M/)1ޢDsW`Ţ[*_sD։\m 4Tme}u\x'ÏoHj?]*V}l?RU3=Y %k_X;Aʃᢣ Ȕ|wԩᩋ!k]d!k_u- F7Bfלm:b(V /u%wr[vNح]Q .֯>{NRynOqZq{4ҠHd J|fSFT| ߒQ*[qؓ M}9RN{V<3 C: %rEw 7^5Qׂ/THɈ?w+v69֥~x|1OhVIGͣ{Ԏ -^7r=0߈C xo:]\mמּnX"a Z gp7S[*ס $:L2WB=TOjI/&}k>gE=pD[ r>|'cd.ĉT ȸ[pa1,R',$~D.P#Lͣʩ>Ap/` X#wgP  Cd") !zEZZ.1v~ x?d h} F8 W)<%$#RRH֐*ʧ~;"$2L8[ysƱ7#чbbbq?|h#⌫K &9$Rr )#FAs:f6S`o7BD0;˻S%1ňjDm#~,^;&q'% M!zOͤԑ;T7Շ*VSR7*z=}mUq_w.:`9u!H$-ˀ$vW($d++N-%吊a@pBc#%0ׂDep\ P$X v@J~Ww'!O>^W|o Q,#" %GO%qM<@m$[Ҥt@Z*QZyXe_9|r(b[6cqo YD)؇ {mR'BQH<7t6KRi.`:t[2\\ d{OX=ΛO |61J7/PfC,;܉JX;RU. P>Jͤ7hc=PSDbVMI)=' gD|#?hDܫ0Ϥ6 FvHR61NࣃT'07/Kt IXba;榟&d7N%3#׳YPL(ƪMݑO>RE,a4O&gxPyf'+D|G~nۥGwQUt`w!ri){2ٸԜ'9L'lkpԳ2%$>x h >n}ȿ>]=kyӦԁ^x.Ooϓ4Ó48( ok!y6j(Z[~ |u1lj HVYfxB3Aɚ?`$i~+Cj?y Ѫ !Y i g8ieV6Imn7G\TΊj* Ys ¼~#" ߚ"@2uex4~C!<(aVsJwRuZ҄ PחɺAe dQ*%T<)Z?ue j@'50q>WRWNfE FE$A Y?uy C/˰ Ko7t ˮu~>PSգQ]b-p ^223-\8|XH8˖xFmKEт rPsZM/UC0JݲJ)m AoB?|Y~փ31n'GCP%l"y.u\sTN#zsoNv1a\klo1=ҟh\zWʡ$QF&-l'(N$G3X,)-Z @{n;yaRvvd`l gJ:=|=OpmPk׍#0OtG*n6fTuqtJZ@۬x0jƺa0P`k]7ׁm= 1N{9߯=oaߴW pϞݛ&FB$%qoBЄ^LiEQK"Q4>f|Š`t0E!hpp1"Nt؎3VkQ?woB;Ug:;Ξ?;,očr# a.1`סB%_3b߀ T3PZ󔍥:CqLu$gj֛]j;O7?iTufڡ!Xr4e ڋr1uo#oE?S(#W7Tlfn4"n?XmJ$.sG蔬iW9W"WӀusk٫ >puEluL}6>jб頕z?z?RZ@D8jB,~ĸ۱N-snTJ:l}EqLmM˫XN CXOsWiU(04_n~IEj+ R4Ft'j9` >s%ߨ'Ms(_SS1Wwq4r1?/kt8Dr1t(_Rj1fS %jZw푿Uj\  6i9Ӏ6>ՑTRbZc5Oo8\8yW.{|yyf瘝߽exlWCs: Rond.֬iО\h4DǏ[m?C6`ףݧ03p~YJ:ӁQ@{9{|#ЌʏY!ZA;cՇeMׁ);փs `?ƣ#PȘxbP/c˼8܇:ż7om'C Mպ?VXKYXKYϬ%:WYˡPYv^l}oϴi^2 X9m1oq4Kkn`#"!{n"ctt0uj919;`ȴNՙ^=յhF8* NADP ( \ D0:`R|2ۯ>Vad=+NiF4z$T( Ҫbq3#9̴?۲x~V& HO"wC\zI49j4ǭOؒe:=Br/‹ gy+gKxElׯpJm?z836RxtP2L"6*b~#?̋aQ޲> %d'?j'RiȵFgke)IK:,[d RmHIuH Ԃ@m7j9^kF2qf<,m4I$!RI $dj3d&6,Yq{Aܾ,nώq:n %(Tn^ӳQp+QڨSh$t:Igr*o)U@v4l 8ŝ1&5r^'5ΈJ(Pk]$rAKsO'-PL')ƽT.\^ (z[X-79SE;tn6 .v uv^MW|;:$$>$|`KaEZoCk4$x!7&&CQ62 LH;4a:e48i5 ~d}vo׉(EC,{GOCEJ4-1 3TzjapJ x\\%=t[d8Ԁoɚ7 ׂۤWפC Lf^~Ҷ[ZdmHcZJ9/uoImR ϔskZݚzKd;/yiS %b<f؝lU%l]̺X'k,8#Wqc88rܟT8Vad R3Z[H PWT7Y)";DI `|2ӅkBǛ 3"Zs'qFI E6l(X ܱK8-ҽ} B;i5f҅zMRөIB2}x%5@xew $3~; VI 0/!vIL ҌFR{D4 5LWx5tW ;xȈK$vW&H/T@ʷ ՛u}#JfVMשy|x}U+B;Yv'Q"P8n=Xx|leh+ҙL9]'E;Bv rvurI7]X~s߈, uۻ3Jʱy.R(lR.hz_imrӠH}nXQ0LiqcM rJhnuGG,!A *rd{ɢE ?гEjZtU8۹|yWγ݋'㳛h8ܣ, K练vܽQ9 ; !?CMV79=MNSj7g5,e,%}qȎ=G-0F! U5=o<q/oUEJOa0OfY[*%**-%!HDPBHhe_ˇb#4lRѳwfbc`_,* w쨬;9zGϩG3Cb=oaOĎo}rxv8wa1Dݔ-Š߉:R]zyܗyƥ1 z$~P p6n!fhĦX]Mg\˱cɯ%rl/C$I!6!$IʀciKJ Z`@[16^Rn=}v鮻LJzaHr nG%Y~~q@6hh"ٱ\D]81I@)[6``KT8|3 &LS& M36}j1M]^笨\';E242&i|)ʔ1lM*9& *A :&F*8_phOA7[o =Ϟ;7QM+Cqn\Ɛn;3{̙CE#P)LF+bB~G$`#lWPw/#dHmB%].s.iʹvBR&+C0|? O|(U ϧNa6кӷ@Pvjd U TXwg%HoIc+/Z***K$xZUWbQɇ_bH.#Ի,6*4ʟPB\CC}k?:7Vlu^]#>_e'nto{6,N> ѧNݣhss]ʺG}cUw4p`%p1b4Põ-%\\-XĦڍ /"ΘQwjCZjXnfY趱 lY 7QI6JwmpŰA_ (4'bv^wo\SdRiCکj  V%-&2ZT,mN 4#dk'8/  Br*2bz3MUo3?_Zy%¾);Yvv˛^$4ֻs Ѣzx!zSc ,/aVPY@IH2R' msE)ܳ_l eOHW;aBk$['c +k, (u6R/H4iR!I#ק1uՀ(7CQnIqq7|tn٤XQ6)eRqhwU: Ѝ) 40gGn ¬ڶ)߃կ{a֦}'Rs<`- v6*m:ӓ[) 3ݜwږ_G+4ۓG85b^-UexJ 0'^S, 6Xws2S`Mכ,Chf1د f?>sw9~9wKlvbuK_8iڬ%)iSuFnmJl Z%c[v}PJ@:*_IQyIݓwKHnn,mJH;}$3BsA5cGDݑ]ݶ9If !hLQF(9DQ1ymx-; b."mqcҎHHh .ۂЎo2Z e*xz7DM}R_+vaω\sj{YUsw.I>oavSWT9b , $'2HLA6b=P?T{_h͔ -qY '~('ErCLqG}bap>J'˃;_#&9GiMp4c<8t&R'_/.?qjGa7S3lt^+&ݐ3vZo4Zh ep`6+3iyj  P<$ SK#nV[,Pih\2B2]9zM(:ّSmxs~ Fν=>r{. "z/ THJ K4t{ƺnmaP x3igeHbW@*lV+6zJ'tdR\j ž?;ņjc4a9Xr5)Y>fGXTCSWt:Vg}D6?[篩dMVhWpJS]*دe}=Ϻ뵶PɱC[uzn'` B/Z:evͅ&b_",p+`R}$iMJyAsPAcB8nK>qiZ!QҌ&9jLSIO8o8 WY Θ !]D٧X[hGzIBN`euk,4h;R~/o<_gמ?Ƶ,oNl_;lq]8$0172_ٷ*+fyBye3'3ѐ5P ^b~F .o'?!tC%DJ0fHih] .ǩ)CSE3 hyxYɄg3%$$$p6O2*|{%XM,Og,figυ(Ԑk ckj ;נ|y6bZ2$-Ow`ܺ3\۲3^Q[]V[? b٧aϗOa^G}&,5QE1{!x? eKbX/w}1!@R hJ'QR[3+&瀵JN)^\>2PQ䛜'&z Z³*V|,KwTZ#qezR*t\Ψ-i*5f L,E]yM'Ab `ui~<Z>܀p$4o\(j]2okl`Gu]fdN_ih]05r@\׼3.IA1KGK,v_,T^ur.f[|qw+Kqgջ#Ю|Wi_Ο%H55GQ["E`X%|FK2s@ca%JN*[lZ kĸ7"GJ\#JNss[sdJ'OFVDKk<#ߕLHrRVdR+j69<tB59krނ:S+n͵#3l ~/]A5^`(8y ^> l ^I"E)RH"Ed]6!Y+Dmo6><(cGtx xw{ 8:+}\^ m$XtzQӹcv<2^\rZA7~ao]-bGfr<:=T<**W'/k%wmF.3rVȫ9/:)a+Hq"U% UgR%nIx V MqgbssYY:)+*fOӫ>%ObhuFj՘ ZOxk&ɞ]4ۢhW'=?FXܚo>stream HdTYPW}=3==:i qb J AEbQB 7\Qd@FD-TI(C Ĉ+hr}R)EQ~!n-kL$'4rc>5У> !ájZC JjδILJ78]FɃ8eADA2&ƙiiT9ղ*ݔ0hMN6tN3LMr=EP Cf!|$HbpY!R %DP @t*JT(*eEFOuLA VB;^,y@ %tVO!ShVx E% f+oƹ}nM C(R\ROǛ֙׮L?mY݊,L CM)UR6%iEEQE˒89[S\|8Ys`a$?" m̸,L즙 [/] :P4KO(K~Ry5X)qS!Kit 2Wda 9PhdZ-3^Wm>[{T@WӺ>{YMW]=0 |yM+׷{cOtx%@{Mw`#5:bog_VXsO{ g-6D҇~TfVʳꓙ+jzm > X`s<ʱbg+ϟ>qP^guoϫ7ec氍R3:/d p6KQ dNP ؙ&[iLum0 z^(\V3bX>v2!z[~4]( 2y];QgMynr hqSMX)~U&8>"t2x$;8O!w`F F ZЍWa_6x^2lT lgWY~ƢD d .`2*ms l<(='ξiπ rtvNjGshNeo:w l;hH8&Qa^Xğ:p]A-={{'.=zTq8\oxƺ<8' ",CsLǞjە%Ccu1BH|E&qC c=Zo|dN޼aOِrh{mr &$\6)f (Jk;Wt' A4|$Y}G)C|f;`,DII@ .ĕf}Ej @/o'P nnGp'2@'}_lp~H/Dj/&n%[)S E/vb"o<؍ endstream endobj 65 0 obj<> endobj 66 0 obj<>stream HVyTG9 ؞z8Gdf13j6Fz:lqQQPJL*4=|~F O`H2)ZIPx 7񱯰 ;eK@+Jv8k*Hu G =#ʒļO4$q #{A_wH̑FJ111qf@s~+JĎ̀`4;FnO_*]UIk<~GOrmxxb8Cr[*{{6F gQwY>-:YꖹZ'h[\mצvIn奁 Kxԃ nlmmr[9;#|cSz᩹db".7Fc8.Vn*Zݷd/yUGt*wdl4a)F-d,4ap8x2*;#҉m}4Pk4 N [UDotġ$ɸq4; " CHꈃcx[eP 30:/R!L1i d$*ȎFM'(7@r0p|ѕmM_>rﵻ͊U?HC?3*}-}ؐu:>QMI*/#*>O5/]O-9T{ De?Nӟ,( {R].펯۲y96?Z(sLm-?LFs?+{ I%NQJI6~<0.? 6rŷz2W޾ѝCmnpFvys]їfΩYX,¥/$_[zꯚӽ{%3BֿcCO6?~fDb}ȡWۇtJӸv7 y}ã굄JqMDupBlR<JK,#_6 P9v< /kss0دv S+нv9 r]_}SxXY 2]Z o^Bߞ䛘Q԰׭{sڬ-vi۴tŶUFo=th47 [79brjL\ofiYgɏM?c3'1J 쎓ALRU g_Wc KhYny Qy5P`%FUA p1pRAdb)‰Ȅ`$P^_U$MqG6 ,1 #pӜ,GB+ʞK0vwPƪG)Յ4:\vBH!Z*GѲ,,_ R{AV 8T8ԯHB34N3uFB7jRTPi*jJ1:xx|n1ʨ< M^dmM*D\ jJZVPܵukXE:u3Vk;-7(.sN{gr~z#F =i:>ٖl NN0* #53UOW\:ykeˎӭ#?L:H@E@ۂoվsC:ϨOky\yn+.Q _Pn׋bf;6d&3e'VjϨ,:ݞ2*OֽT?:6f. eB*rԚ9hY`'z|!smϷ8>\|fF%sˀuln^݊R7˵ܯWT~滳GO~7%WVDn\x;rrm^_kLlȜb[@58q|>^d[W}=%QSz͊Z|chܔMhKSt9GZM\ YzK [ƤVwx=r9OmÓN;dF  S%+ Ɗ,cϟ~ޟv5 ۩pe? X=&`U]T6VvSfw5C\^>o{ Iyk.7tj嗐2 ߈tuԽƑ=\:YI}wU'NOuf k՗o:0)ϲ Ƅ_nFҎU_:jņO446>ڳ:۾RsU{}]q?ڊίut96zf{=v2} [WwnW# @V( _I+h;=2ʲoΏmK0F8&"Icm9۟I]vP;&IXhi+OD7a"4>ƱrJqN8~$! 8]"@$s`=@kjGÙ@GLC"JOc7%qM I)= _Ǥ$XGYvۤ |iT$}n T!42xCAjO#aibC s8NY`ǃ'(%@-cv"$"eT)VJ$@,rp֏&j$0[sMWċ?`:̄lXyP8O*53[" КAq%dFr:e*ЂQNEheG2 $f2!#RB6r a\%RTBW}3@_?Di b۱IC<>Hs4"Y0BVIJ ^<IDVr4QoLwL SƲۚ^.(IeB:oA)0鱽7p~.b"Q_G1\\ZN%&c]Q/n)Tb0@(~`4!eњa zf7FYC|?Q!qdC+Yz1Sl&|` VFY21. ލiMIMMb)NGijetXP"xHFsP1> Kaj`=6}11gdD;C)$%uD!mJi&(E Z5%Re{{?J{{3f潙G7|OB)\g~AG:qn [}J5 kxY S|R*%Jj)}X7kʨ*QIO#ʷԣ)N԰!N-V2+o$Zs"L'mʈ8.WjB{ DJ5TEyI4cȲ7Bsp 7c(fZ1?\ /?^Xi"Nwr/s#[YDy;6C4Glsk~s᛹T%Kt%Qƻ[ * >Cy(?3kb;cU)yP,=k3J1NGhψ-R?5E(O{[QbpRQ.oR5 nge[ Y;޽F;aznKtgFnR-ѠZZ׬|d7}`a}xv+S~4qDW_UAnǩ&Gzv|܀9b!-eX]5TZZ#y)مr;NO( {lļ.POn}430ď1-įCWtI}^C48fcހu"Nإ{{ ~0n5-ޕ+*+?lŋ.(hރEs9nm p̚?#ozn4gԬ̌)i)UL~=Ⱙۀh65ǘZMȮ鍍&GS*O5sN׆)fG~ۍ fwfrX݆?\vьt{J)fZf-l7D"*(- JzߜI Li66u.;)5סך%bjzj_1.;6M-$eL+:3獙` R Mv cfo Ouo(+a#0bCibo(h^Jb~ o)zml 5Ir,([ש-Amt顶XڬOi9-fx#3F$I[pjX,KUSРIPǚ'RNFG9 1fH96/盎" m2-I)r&ٔq 5mĜ?_H>vtǐѷ95|۶*ntp1{F]P2EXR$(yk$7AIN7Q<i_sF֠7q6LIZeK[¥T` fj~)vPw!*m k}Cn9ieݛWӬ(ܯԟ^@aX4F$Z'at-`!]ל1£'<:dwVAQ^kn ;I4pm(:ఆ3Ɗ$V4٣FD(Ia/QMUmbqi Sǐ6G^-T#%:nGäGyS_foG1Пh? 玠e~:vtsyˑ"t k^n21cb/ͤ2FefrR2b]+\΄zi?2 r_/xBV)I?6yd {]5LopA[R38{1/[] @6 jꕐ]S;I% J/ƽÉ_<2i.[n@ T \>Gy,JE F`%|^% )T&8ʧ/zk!sLcʚKE:~rSnkT6 ($tjA̓ Hh%@ `p_}Fqraw%@~QFG(BQ(1H< Y~8TI a;{ Z2: F %Ԯ$lFnF7!D={{Rܦ1{L2Ew+D\#mî>hqiӜF^[p;5]5}DܜPjrvxuRUXئ+~λIXhb;8aaB(l'6q`8al LkXӪB'&V FquRh2~Qj u([?4ι=sh-Ź ކ9S'"Щ24Wd{f|[>r t(E7(S~pMɹۆ΃ Em5 UێN:?|֓ @d]L1<-Frf h'¿E%\(bm%=s}>;Y:p(j&k{IDk3Fn]tO`Oܧ/M܆v#OL|32 Z-ř/%AS>|g+|%wsWffb j{:;83;h8k__f}rḌ4e?8"/זeO?$zБggJ+O0*G;Xk?ND-u㥥|=^BNa?}x!]. llDb ? zt_ўu ݡ?W7 &|x]~'c'VF>`!]VϟKZNE%f]D`n}j` |?sؕ7CsS;>13\ιt^9AvP+hDfbomW>˾eԤo$ V+1␔t%nopHfnC#OoS >fqhơ--f؂GGW.#4hEl6Ð͆\yܐ'ƒMG6u cPRiM4B1WC}?JO]xfA!Bb+U! ˄7"!ψ&>śoP[vUޣnUvep♒Mb3"6z%"PiAɧDOB]dXPA~u)ϲ»fd&|ɇ IMp4U@(K>P-+xƒ>zsםqթtUNҩ:uo6x5W(^xo~͌gǨGm[f瓵IF*ߴ%5Kv1=~L~gj6yLOiZn*19LvŔk1g3fs9Ŭɜ)7-KST9K\_cجbh5M@5gl|&jXNM5jg a[ Pi?M05<%UGrjc\vw!C!Lp8{{CߝYzCX_sn^lb0U rJ[iRcUMRq#+1I*z]V-H+Tv }6۴Ze^]R6 ͱ1$n>`S6Kj3'm51< vDb=wZcTd5&FZw-mXgz=%a7^1:Ǯ kec}Yƹ ʍ+H?G2Ƙr$Fe s[ f Ĕҝݒvb܄KGDd*֞Mqge,4R4{]fIMx t)(_E@#h5sGv2M̌?_鿿sWz{)qmA]ԂT߀^vS`pGİ_Ia(!Xc!=qkx&qB` xd'^.?E"]P݊B|BunR5}EI͵ux_ۜKA):@8g CLL x`:tN<kq8E4f~޷3=w AuV^rbJA(|Ҹ5zcМb%>PC 5!u8r SamBgj0o8KB"$)JzsaCh5ɪ9n0@* Bos&@?n]d@<6 5ЉFF0^,D PPJrQ'"h@ )9 +ho( F©aљ m @_'6A(QVǠhq$R(PZfQYDGDV[cqoJ"XKϞ?X^T+Xo5YtZ4\K` ¹s KK BaLF#E5 tEuٙ T~AV41ԏRh]<;f86pڮ 9 ՝Hz_w!ǤQu(РpXHA4g J8poXa8LɸGc 54[r~ū.,_ǧQ;¤Vql FQwt9Eٶ>!|RͳYjE#H$ڊBH,Γ]Nmly# =] ~*9*@CQ3C_w;*Jt|#;`89{хtكmNҚr<pXqfߓ%ѹ'g?ĭW j1&Irؿ;:]9$0V_0 ;Z *\nYd@CM2еM[S'A; y ִ)a ҄oa4oe[6k0-2B41B|ϖkAضj80M׾#|D>t/=K:bFZtRXyRkO |za!bCVZKF# J mcݴw]w _rܪL4B}PX+ʇ WZSY.:8sВT֎N?H%OdPv O'LOY(`Z FƋey 1YvECYcYƠˌcKWCvGq۟۟r]!\bE# qБ@#beXN)ҩڂS$G(Z2X)cR~{w;ᄏ{Qέ*"H[8(*V5/ D#\ې#ЧFp/q E )&EZ_C>:"OiNzF^a"ݹ*uK8HyoGY TQJV5RPD^`mJ]_2Q|aW%p2QGh,}B'Ҝ* ]"SOJ 3>XDycG" r+HyQP^˲Vp݁$*,׆ , OdO GaUzd~&3J )/hNty t?S<78Q:%Y#V ~Qi :‹at&$1Ύb3X97:Áxp/~>y 羽ٺy3Ӊ+ȉ v0WDͿx0Ƴ<+] ?Y^~ ]DdS7f11q"G(~ !'E)jv }ʋ</=}JzN~<Lzŕ ++ǥ>~kyH/kE$;ủxX/W[l|k#-BlU*_C 叐voѠKt .f|Ց>Xj|qիB8V;c.=6xu9T`Ί\qӉ7W',]ԀDT:+>UNF|K<@8 pd*N6&9asau6Y uɒ0P f8@ $je qW5 iOo+^%&=(4aP0 i h 2cêGG.$GЧ"=MVi4xOmW`l~3kԴUf&u ;5w?AvZß}KzI۟m:<[+?ٌ3t[Xy[:XCՓ8֏QM Nq7Q@|Ӑ ĀX.p4 #~eCCpE<St[Հg9fEAa 1' Z(x-|ya;YYA  at3[tśuګs2U ٌU\g*Yt#J&'+nk_J)KR0KM<V&܃6'Wσ+}$p8Y =ְ--''}qQt6_Ƒmұp!+:}\J!yn $OڱD-@m߇q* (F~;35V7QRB<0 `$}hҫ )"qUv U sgs1sΰZ_Y̏hc}K"<{!tv|N-7|}Qjݞ6Mna_ZqSt|~, Pٳ3JW݉췐e-̮싙=CqM{jܷrB;詇)` ٛR /G|,H8J6(hTm.39K,v6o ;ٺq(A4_)GDNL,'>h5pJQ*撧f"9xĜAJ3I,1 ̓MM,b_ž$g%|Pdu3J5Tĺ7=|nUd;f?\GȂvoYYVwvKslU/m{_\W59?\ zӻOPCHGoNQ&HNBG}W-u NeHcY0#U(HiC\y!a޵6 ) qf=qް08)(G|}@n:';˦حt`0aQ> Pj~TCQbew~7Zf,Nͥexq]zMjoEtr}btҫO ]>ݐ1#GHttJP4& WkpwwZ>ծdV[~`P m&iҴCJ2PO=2>d| <^3PQCV;=8*ʧZ8ЫiU6G %VXȅf;Vbi*s񘽢^G޾™/?bDIy֯`n'<3ƵdsTu?y7DM򄇀>enX$>UyP6 G"4nbs;yB}#{̺wM<2&2(W.AXC^@LN ";y#rC'bjaCW? /ζOE<;~H3vMB4A~th7-ee7&2e -ϐDE'&}bL/;IٜnF fYJwgw՟=ɿU]Q̓驊#zs`65Qr䳞t,Jd1x)aK 2)f2*VM24 x!WrX }lԂf] K> Uy v u6a )%՚cLNuh%x(;I/#I wrSrF"ڒ0RS1_0 1\nXb}( :VդS[j 355S<{;YSS] ~iԀ&3%^z'W5D?ZחnzjK=omw*?^9"$+Oz+*p>S׫;CH#m6$"Z䱐LzGݕhi-ńTZtOGv5rչq]!;nswI2fh`[33AxZίʯ%GMdbY:͒iL_'x~q~4tQNGՔWס0@v:sK\.E)XfD9MDp5-e/bO<}gOM}T-iCϞ4^p;rv_x` ބCw,OZ~ : P |o԰w/?xhZzVnC' G[+# zמ"PngVڝG-SUz[DU*n5Z V<'ijl|uE2Rb규Z)C`&A_eZzB3fz-ԸY zjZf3n<>C}/o/b!^skp[MmK@p1a-\ 6v)\yRG~sOR*F9F?uzF  i,X|"r6Øh?AݴO z A G#ZjE7\ Zv$HVlAL E(a`'gMi $|a :`ar!#% "8MUbJW,6Fp)(5DSPalrSƐ$WX^9%4YARkd)ミ ?8 < [wSu?Hcp]~򯧖V~mK|،00Y.CC6sknl Ѩ63@>I_#ހOx@&E8jղY!AMUgTVY*"rM*B!ZJgwv=):ү`GѾc'Ih 5֐?8[*@Z^͑_^eMM̥ o*נdnap)RO=ya!<0vy:=:$8~7O߻,M|tKĀ8,)T3_&UBh`Vkȭca'q>hkr| PA{X/|J6wѓc:6e~qώc'>JjF,0Ǭ¬]77ZZCHfg(hA"B 6GF0mB2X.](,iQ-N>^b6krs" ZWA2ٌmvZM&5I (U;Cˁ E(gD gNw_FwQt\#NlAEtQ6B DCB58/Fy}}ϱ;߯~q|$M,> ZA Vd*Tc0ԅ":*"V Hэ2H RUUDGyN-Cs==|'>2;=T&cKS墫K/SK#P+~SqREa(=" p&{1v6`giqw}2XnR},]xfDk#+( !B9䜍 %&i)-5M\&]&W6|E—|y\g1.ȜD?Hp~d62: A, tIYj;h*!9K:Z#9MO}Nk^gJMKMAk?@Gf|{!n:gŭ8'4!-}1rwQa:l4Xi6>PUӎrB<Τm"TJd 2ReF޸#~|awpTc?  z֩WHDV$aTDPk`: ɺɅ7藖D6GD k=p}9dc=gSN_{#ʕo&3 A2``@ =0Q#N\ p,`ֶ 8uCXf/~H(KqVaR}z:GRXᒴHy L\cs"+ЪKmOs9)\ӵJZ ku‡c3yA)F†FS8A4v hCf_a A^#8#'$kZZP9L/o暘-P4ʄj` [knu[d,l ed֑9崷l}V|.&oj¬iX>..?ߜG" YN. fqBiEy}#KxT|L~\٫kū]_Ǝ#JRF`;A_kU#MN]_ +r 'sMBƇj[$׃dQU&Q ٢.9O{M];5oN"E\?& 5-{ EVN+]q6R'n=Wu`@?UQP>ľ8GI4 EMrxl).a(dseN6cjM?eSY}kq=wږ̕SwsӸ ^@Qfm:3I}oEUץwoIowo߮=;#N{^%K}odff/_.zFgdLEh"RH#^,jg=<ي dߌA,7g ;SƄ;^8&+Vڒ)i%$_K~aD! $16N1Ei;I v:M'4ɤ1&mLm Li.ģcb`zǹ{W{#Ng S.`A+rQzet2Yjdg} u[yX+"jܿnxr QwkwABLcݐEi3[̟ YVy&-;!,Ͽ]6l37ڗv̼gV8o?p_) ? jƒfա\%]+#/%?o|$ӐxhM!D2f?02fAˉ ZܜJya}MY,k)7wtoͷeo5e8RHpbv1i.-$2GL֡T[<= ΄pԽ@ԁkUqk 0# `V;$NI`EVdRP:}ZW_X=}j:t˻}wӦ߾2 S!TCm~:o~;ҥ(,m-E`>M2 OcyywA=. :JKaH#?_nC3&;#sa7\  ^ v/PJMŐ'!A({Խ3a֐|}i{a(=z|TSݍ̙?ѨFgY=(=f](~ Dg? 0 AoM:/?77CD㛰ÉBM=Njk'I$It[M[Q{iob6_a44/H.NCOw2%H:#L"nDo` f`*9^^|rZW'#L]LUzʕyIߝjĤ\wv|pjhs3˿˅ԇ\WV )#*h4NUvo:zyx--Sx|79qyST,+:$|KitRXGB']!s]5X UUyr;#^a7 8a$ȂbʦPqHhQ=J+=GVVr2>'oPQ*g Xv0( B@=dRk$KnKb&)$g\@*lMFq;Kx/屗Bxn KD}XGzA4fn%9#""ԐaYQ+ňH2\!cW͈JXW+1IR˚5bV-E0īfT)eM(hH#:$wct.e? 0b`R+}_xiie&z nѕq/`Eʮ\b B.%[{g:t Gǎ" }/xMR<8Λ+MqmmT=ފӡ&=фctNTis2 a>I?t~ 5=TT'xuCК3v;t`%|(BPM$`9촩RTTm~{&aH< < 9[Nù0M0RK *!P~#PnO9#0'[_uy^+x/h_Y8޲A.kL&ν2c ;I%Dp&!SP峃SGkPjR(xA%gēOfa6S3r@tJL'\Z`~hm3 Gy8ꂣǑ8K'YsRnOH(h$SYDgݜjB}×Yr cY|ufK3g^:ѹvi&Nj;A)D1kd(jUv aґbuMA̎P` WYIGc]e=uGQ~w8z4d^[%7ۄSoL_~ҔdexG/l/7On`y1+]?sS\)x!Ņ?jY )[W^5Pw7?^޲2h8uxݴSڿsnoy *3n 6^H+җXU?G-uJ=#>ȆDW ԕ ݝ+R /~̚**ZX/[Oip6%AuUcD#T!"W-|?kyۣxT~k .=BAB!5q: 18iG(R ڝmkN DQ̴8- jS m׼[me\LΡa`.05 ]]W v;S EJB^>;A)D%aPNW* TXGg&Ĩ  ̯$a20^<<5鱻KHdjH1PdcD়%'Rة 'FHfJpLw)j=zd3ZkuK-k`#c-uMk(UiUzXscnBig*!a:`ە,TX'l+Pfz,i60d+Qս ^b6X>b Ny]nLZݥ/F#4=@Y'o4{NFM@kZC0T*l |[ڶm F6\n>)r{[VvjPNxr+ɚ5ro×| 7;'`Vaulʲ6E؄PNdYv1a<cQ<A}^ /0?K*\TI2׹F(/y*9Xst8AnO0A jkI jI׌TOn`kg&Nv>w?,(s!r &ސ D` S\f7SɀؐJ!'B!!jċ<ϻA,-4YY&ٮeC DD%U w M 9~=2e&Ir @qĨqt0֍HY4LiLF$Ck)!5 y-jMGGՆ=R噢:f8j^ʯ5%Vzc._632Zi_'O꿗t@PBSN5RH_VCp%kGj0H=k&;}>l>㻳8!'g#hZiItM-B2MP ⱶDU :#c0v [#$6k#B萉@3?p JWQuo1&hOMn3ci,/wSQ,RS Y_yߤYz̀`Wp̲'Zu$_8g) :SsХm/ vw8JṿDUO ͕tB~Vx- -G uiϡuk6~7k}q_d=^ /2aJt%]E8mtIv1[Au=71\~^٦)*!20JnmrF@rAz\*{/!nT2R D?+Ѩ`w%ë*B~ Jڇl6?>T%dsst1=~!=fSѨnϡr"-4>0в$43:ƿWXf747AFbQ SϵSD9/oxSW{l[W{ubvGjN5ġkV/vy4emunrvvPĦxT:MʀiA16VD5&&tV<$^|߹߽_!"ظϳbR7_wR-2𳘽1(LmnorK1VA7@E\8OÖ*G2M~R|rq aozbqfa"gM1șJg:Dٷ؏5:*[E񷔑\y+ѶIl9*ՠ<%6e2U”q{L&+?XvǻvkΚnT⯹oxc ̬V;Nv̹蘼/ vWljp!dy[O[_ nf2xk:[c6Mf;i28L&^O/'kp|FkWjIx{-xQdϩrJ$wĜx+.2%`,\-^yù8OQĊM_Kr5!w޾Zgm2C>O{@pgx0%Sp TgJwv>!|$kg5 !h8 l4vk3N׀pO]`w> "zO,V`1Fcv&i`w@ LCm{iɾ/짵8 9 KpE4;{'wGo@;J؎}x>A8I<NјsCA5N 9rFaj)(P>9![v_HVbHenyfϴbT#ʐU lrZ/yIf2B6,q!=*$ ɛ8ɃlɋCBEW؛N㩹B^R432672ԟ]̥ܘt|b4qF%g#bv(椹T 1\!)b@C[0>h S"J9jM+G'<'59RՅXAGYJ49c7=s-?%E?][y- ZuCUea endstream endobj 67 0 obj<> endobj 68 0 obj<> endobj 69 0 obj<> endobj 70 0 obj<>stream HV{<=^rq]V1.Q2`̸;eݐPlER.kS֦V+M[mR+mnsv;~}X2D ux3rPϠQdRЈAyA 6%z, $@J {Py+Dōfwn*@kS-`{ ЪBjPV1(C\i֍a RX8tz~xro|PuP/_NGTT.AV|a/]Wtb ǡܯqbh8£P K+/ bXK _ Ë#/b%).t~dH&/`"l) FTkm͏gX#W,d |BA HsKK }V(wLɘ cS! lyE{%v훖 +=ut#9zM!_gM"C1۩BȲXT~셝A۵g8t;);M6cq(?1PiBvg_Q!Uۧ%x+oU=Khzg!S 3ܱ %%7=]u[o*Hw76藴dޟy@a>s8ɁjV}`Ϭ"Ex,*pX  ̉<@6ڑGP| b_A\!>o13YPИ<6D!|&B 1okflQcSmŁB2y5WqP"<@XZ9VFU5+84.Ry۠YVO6-oZc󃾓C.0L Ժy~kx_C#_4uzgPQ~{5zH-ozR70w_pI0fdX\n[ɪ˻Lj0ٮ\(0,~#6@e4DܰCmL.I\lh;֛ϴxa 1K?؃ /@9LD':  h ~\1nj/ P -2?"x(LD'&{ Pc,f)鏪 ^P Nʈx<KlSdʈ0VK;ݧuf#c+#(q=.R_'uzv8_x=.-R_"1+Z6$:^nG;,YlsW{e#\SOg~O 4_?)_X $&U۱NW{v?ZTc;`c ?Tㆿj&$y^r4'.RIm΁ t*tg beJAb?/x7Yi˔5jD9,CcXJIFƈERU!*)]RnZ(eK!*K~gF3]>yV5 ,0`,>{C&)DGcetWH7ep>peߑB2BLVp?ZُO&\4 . DOaM][E@qb^4ӈ8v3}v:@E'r'M=N/JzRZfDDɦFÊg [ʮ7&uێ2[VtbЍNmh̵Iȕ۷kaҖK/r].G>Q+W$U%Ff R2 cN4oiH?}"Xz/E|}LJPRŭ>S48n[r&*PK|#8ǪۖIݏvU"V )#l'*a]>Фak59Yd7z(8rʲR<-NSF#1 o -[ű/=)hAa# ud»j/τtAR[[~-m}WdT%x* n'uYq?b$` #$E?8? 4#DC444 .wMGnku"mSej)eOr<߶vΈ|m{K:D^!>:! qSؼ?,yiLF)E]+Cjj5<\eҼlO\ynTlE'b"*e E޼JuT%™]Wĭ9E|;91N.&v)hc ;""+a#YC|#N\d[(SCσZ.O|6Y#ӕ7\բ-O$aƎ>&zP_/o\_u{߽ Nxs7t)+lDf%,qk0k&_q`VŽyQ}\-.2$qztw-4|X!Utщ&O]wIov(C-jOQ2+' 9&nhZb1ػ7z3[⻪Q{BV[Bf<ω-S\E|%,E]UTL:/$$UZHX([ɏ Yj Z—LXlf0_~!~A qv-SՂBvY[e@J G1XS+)Oe岾Ҵ'(7W"BX-H@ D"Bo+0_6)98;z*\vxQbC]jYN><<\WR@M'ΌgqXcfUKa΅Y[,Un=>X/:)M&L?2?5AuM4RY~XUf~ԕ?y7)}mÎvO{'ڷ;ި^ƌ* 7No^إr޶̶E6/8ؼ~دtmN4f;EՌ?nYOSꍛGt+Y7  |5n@QiٱOa&G,ZBg|2fTyW9Ds 6W9 Z}!b!@^zKUoGn[X o_l'4'*`T e!P #d#]4vA Npzbˠ!JhSY489X C`ͦٸ\:zQ{Dރ@!AYZHc3Te>4jx@9Cަ< Zz1\pide (8q*2S@O򱐬VC&h * OR>p T08eg+F geJ2P+Y`E4Rec!S!Qm.|eelCO&˰GfS/EL' ux(S%~4]~MYO`[0*|OU6Mdϲ6^qJ+投*e={K aEvPfG\˨`hIR\Z܏4^kxo&ɬ,@cslZ NدBp6CZv_pc1fL=ě$8F" M % ? h[axYE+u!㷖xȕS;Uy~oeu)h4MdM0C F:7ȽP-g,hT X ?+P`6ٳ)lEZ;ߩswᣛaߖwOsV=ʍGxjl=*UcQ e1.O^KE7VԱ\F&FVk⚩]T3EGc萳`؏ȋ`qNͪQ=љ_ҭ]#A"y>'n`csV'!tPHd|SDb!iEt"z4'dA7u%&DS=7:@Sg>r 蓇FnqqFL)~pB&iCTZ|Eu OZ^dїg;;*Ll{[\'tYPWkpU^ʅ*dg$ yGZ£T0ima" MR,4 ƚdlf4Ŏ2ul+}L5V#HN9Pi~ZkOy:#hp|7$4"iQmħTŭO++I])|[KrR4)HѽbZXcJEq*7JRҁii7ةyOz)33:ro ^ 4`nAY$2WC͝pGxfEQ_sz4%˲Uyb)^SyE"ّȺVr}zj(=ҦF,-iߛWJ_m3)t,nNתZu~YI[H.(9kzV汬+iKJV"\<U0PjMPV Ju6.tLWV:3&$>zTJfUBVO)M=3m*f5QL7̓f@4SEb4cKNIB^{_)1cٍebAƖϒwY^jAqĬEbM9񂸵f!@U>&z)uXn~oc0ʤaۨލA˹wR~"kN^4DvIf~٩YVդ?}8iNX_? V&]q%'Z&3Jd6X Kf0昧?< Zoy{NZ%*N $c\T d|8s,gSc6o{qc͝c~Mrչsx׏τ8HAqn)_G9䌔sN}"荌c9_F׷zȡozs]8vsnqÜ GX1؝Zx$.uɿGgGy~"e$[W<u^ҟ,b1|X#>Q{,܉~YT }gb/S:ީ¢`wcYȳ46^:L9щO&ٮN c*.o l@1mdz'a?*_|H|/8=эY(f*Qo2qc<~b R~T3*˜+F0u¨pUIV/13vш#~؏9K PWc{{cs{we #ɮT(wPo䠚q|Gp?/4-tJ~>JrYK3BxDgUѸq+wh_30ØPda~C5_!D60+hRqW)ע\[fo1м{~w'cA{ eFsk;')ˑA#f=~^)m}j2.IEb=yz :2Vq];l8gX?KFL5gYbSȿ$N2n:c!?-}1f Sw%~C溞>VK~w ].Ss|q.`,xÍ ~ |zc?h瑩|"F?#n8Uػ#> ۉ/)n s"H cA9O@?r'Ocm<8X(0=(a~u/c &}'&ua1<BڪLr[Fga ίůA_W<_]K!9ݔ#JX93'fsoA򎖷z6yq ySbJ ?N2aIi6&5MӴ M3%Snd1ݴ@Uڡuw~ 2v|q~ԵxXKܼF @g#-cs-^dÚzgs5yE_ˎK+o;Þw{j@kY3}/~\fڻ?^=}|ΥfgqKt(>dӞDž[_{as<Ƚ`xBC`X* [>#Y2x =J$/߁o7^1m3c&4'Hok̰\cG2vQ/#gےPL,0 .0.pD1NN.c'`q} ,.|;·m,.|]ÂȰ~^@oraaa#/rTm-F_X+ US U{ꧪ*T@c(T]Qug5TL <-TDt?W4l#ŴS$W=\Wk9j67w*C6 `d ٕ6:]&ѝI./nU˼JmW桭ՓBaqduS?>P!;HHݩ2))4~xut$!emz)q)&fKIl~אtWw|}A1ҔGD^H2D^e(yYKgEAJInܢ7W9OI}jvoҪ\2~ϐ]Ztv[4Zn"Isj9`^d%sekqZٖb,b-B,s3 O5ٹ/mg\BuZYK9(nhQmD'2tֺj(7iь9^G5sWcIJ % !l J~x _ ?DtSv]ni?knd+Q{0ތ-aC#( x7T3Kv*T[ږ֑=6^RVKCyq oUjQZD[DXB͝9fE0_]xS}w ޲8ZqUfГ!^gFئopZ׋;Ob)|=&A'AYDSD Q-#4?I[E2\p1+y`JUu3 Tv!M'ADΎy&&unMӿGqu.ܒԇ_^b&:j dgJ'$7: FTЍIƚcʬc\ZZɾfc[GHIq1d1:}  xj+izQsV0>TʋLJ;{q1<6U:ϙr;br/8 VYvBsQҼͮ9:׻}E=sv+v3{7?zv׸RP4W4XرSQ07BiD@1.H)?FHЦi+@) *.>P>7.'+]z9t\uiF*ʜ98 V$=0k!e^z#8, dE(? D"UO)͡U:Fϲ%n{uO:$"և7o8wu7/w9s%ؚ^"![NHJp{b{B؂{P Х:4p@!v.+ 'Ol[!e#Q&aK%"Obӛ KfP ƱgAXaDe`ʣj:s]|G#Sk[}ւwm;G^8|f?L7|[ Sb8ΝYCaUc*UU7âYr12,o)Q"ݚh~yG,hXߕazhgm{}V_nP[ NAioU jzHJ3E#U'!j"^䀒v!QKPKL$e)pe3k0]^\)x(R-Tɭ*"a7{`p$/!D8K My5j8 rvյEa8Ol2_rDtLj'߾x']'=w DP w&~?(g Nz, aM/>eb4Tj)+A }[+ Ur^H2Lj?-wCc"4( fZX_s\ 8~$r]ˆ [-?q=+l gg tb\+嚡FX.buvMt18nj5A1`k3Lc#UNF7\/G)SL3 D/+L"Ks"j&{'Yxx<4qz˼u/g{^C7wogCճz~}+Wxf=s/_LOV6|O}M$ +ȃObk.u˜$JXJh"(tEG)ٴ}Wk=NQ5#]NI:dEQaU^=>X"lND_ƫ8 ss޽&n>]y,UXBD*@E33%`( u T)L+/) HB 8H;ZNZ;?g3Qw=w}?9.r x~LV@A1U m 1?g+*C*tA"[H/裗w0 IDƵk( `,g\O0+,b+s(D12 \r\4i?s4Mݢ^oE 8\ͥkD# '}m\] M4 ?xC#\,I`' Y3̬yn|uRd n;1,_beME^ n@ۅc"˄ m;;̝?p[G T)-eN$u5 \2l3HRXa0q<`I%-UӅEbhߓ=5&%o8ojo .Wemvhe2\ɉjHrO'R!_Fz , vBƕJ?Lqm$b@}XeJbtnN/$5 |EPE 񁆗L A[B/\lX緇ﶱɜL9K98oH0ɟ5ͤo S`y$o'lmיuHX"luYK! V=㈟ l ]A7`Z EJrus1Y?^$\MkZ@@dT .חcP=^I ufI!r%:ǫznQ2JjX2c l uB!Jiʅ'$H#w7cy@L0q;8J; 8aEWH 18 $dcqΦE~ynݤͰY5ؤ72Lm2퀰;9+s ؿ'ڊ0t[X8]XyZ϶ݙh߸=W'`ԻHCQti8``4PJ58FPX1ǿlYЉV{V+ >ZY}68ǙqS$,QND*Dy3 ~plБiZR2\B4Ren d0jG,b:v< Za̅s8v. x?_)8yu>P;lpI.>B'_ %X5q!JUle/[6܌vZX H?)g.$F735L0h ƶ S =L] -l~}_~I3f:]H+ fuH 7M& ͩl20`e(CO}E V,`z9 ț:VKƇW|}LK_IVZvnˣTrcn\y4и3_y2鎩?Iגr7qT!n$骅暇v#j3eabff;Kۖzjw7w $nTn[Jҥ[w` (K`"&\ 7 Q4>oh/PHD?3}0:(v'E)Mkē"r2欄2|1V"]Q [نJ޸emSǘ;OXv&2v:vy׶/cߜ"N\ D(/p u2(qټ.ɱyJ=c11"TTëW{漳˹sf1-rDDq?eT>fvQW ET/A("k(CD |Y^6%W$C9)gnsli6֯Dd'sX3eΙþZ=4_F+Xt9S0IM]f$1C ҕxg/5k+ݥ<27MFx"7GUT@^uڶ-V5'υ_oLg2:a [7m/7#;_km, V?D>}]oY_?\|r7Rkn8;|6Wh;N"$9-RUG~/>*f]n"Ջ)斱ͧ!/Ĩr&`:E\Vr0tl߹V+jd)H|LxHLuYՏf$B&NY(7WWۅ!2$Y.Iyќ&$Rw%tKv:Ҽ(Caݒl#"<(bIp>)=]9<6{IV)KߊY,+>8H@vJW}]ԏ;e-^ Zy[& ;'&U8WUVQ/M̓Svs,;^[!zm'V*~z,`>K$^Bb'L*Wkq&ܵz5OFL /Ndͱ=SSρ\ ,Z5>0{f}}Hjp |s@C?k(X Px`v 0` 0` 0` d)@0=''*p#ʠ)k5gf_0i8pfZ :]+ݥjNKg#}Ñvə>ipR#A;עsyE}:OWa Z :_9t.@sWgOPZ)BD\oEa E4!Œ0B֪H3+Ѝ5aiò̵j 5YZڂ=˜ ! x1D6`ڏXĖGԵcẓ0e<Rqu^6+w&ڋ;h?YϏi'=&Y?GeߨdU* =D{ꏌDXDDh0*giTݑ+юWTŤ4h@) JK+[`75D`tFUCUihƱio7 ƩL{s`G)YܘrX+iUc~=1~Tǭ|JVi<4TTu+PmӨZE.*.VNܾstjf+2}Vv endstream endobj 71 0 obj<> endobj 72 0 obj<> endobj 73 0 obj<> endobj 74 0 obj<>stream HW TWy ѭKEy$aKQC8&!R۪Ih^dEji*Q|l֥k(UWVj w`u=gٙsw'Mi#a|(H7z1֯0wJ$9ve& @@)`_3[x*$wMqXtX V7Ce'P7@,$uf@t=D71#b\]O%:TlK Ͱy"D@Nc>tDd<׽J*KJPSXX`X< kQ(_왳xS{YF_ωڎ wf/y h';;j\CMM@Ν-9k=RoNKA9'}dscW \mhlZㆸc/J].oegj(u/M*=z$zJcƲ=ѯnTXigl)/Sʭm1#?卻2s[ǒHjYcul. Vnj3&'-] si<٩;(>9f&D&6k Q3)pqӍӂRc5_ԓx’cj1nJWh~^Eq} Sy6}$Cؾhǻ/4>c˷+[U)g {[f㩴d=,o$uS>!??6a Hi}!o5TĺGy̹]5n|upG΅[8=B3?I#[KD:i?uXӊ.6aJ;_.?8w헳Td؀wb}Jjlsf 652f6Ʃ5}ж$7T]1Tot^q̫7aJFbq˰9e>3k~81/ea[-kPH.}b .;Ø//A[@F! FH=.lTBd(.rQg&)h"4G 4ނaqy 4r!ISB0 R4іUhFhH%6e%i0LCD&IѤ\E `0Lֿh/h"Z%"7 R'QPHP45y)@'c*Q(!ERd mғD`1тl%N2L3MR; 0 Q'2Tit g  :LKq*UAu*zŵT\Щ : ԥUJԩ^g:fiJT!; CC%pߙ+>3 D@D 뮂hT`炀]w@VtAh+5&|ŵAj1(5jBQѪޕ~_j{gΜ9sΙsfΪc`=> &:8< t+ PYTA a e*CQ2< A;cTQ|DLTDZ).Raђ)E'022 Py”+VEЀyJW+Nd(Ruٰe᱘BJ2*5#%YmJ\ H IJ/w^b֊>'= [kS$ %BsĤzSKŜ䙮H4 J>nOҼKI2ReE>dBSK*11ڑHmi.^WTC-2`bQFi(nxGWa(7.M,=x9Ccd??ea 3}x/{Ԭ=:obn'ϻ MgjGikG/h9DãlZcm!=[Su?hͩbt--m̻e\թLk;us^k>oWU̻gݖ|35]s~q/z8 ʶ}7g,zqq%Mݍpozqoq{>mT3G/SЅOo>>S}f,IV{gFuݼxxPF>37;ɷ*n>c!][Ϗg:j,^a7g1@u2j̔޴g#.o_ۼ5/4u͎p?ArN7r?op)" kZxنjP i4i5aTjUH Zn%2jzsTFBZѹ waidځ.[>C7mCkAԋ=/D 냜L}r|xlIi5:D)Bqa=^2oT)#HZxڏigmY_. `DF0hT.`#q4N[q=Њ ^Ж]&hgcX 9!!oJ kDJD`5աzEQ3:)c 3q, DžQ1x;n͠YIƃ&d&-אZr%6GR2PZ*MS`I_11e32nwL"E.Ok>SI(,YPkGQ@;'{eXp /}|l\WM7#āL/I,$[6쇈l$'erlM-eOT ZDP* fIϡ:loowa' C1n. f fDt7Z^eGصlv/9{΁sH99沸,{Bt" 䄯B4,rXrYQЎScة먗2Gm(Z-eG 8. t JCuS7vɟsh̤sRT22Z#-s$Ԇ֡2PlJ fR2x" {d< :wrI=&̏1NG9ۍac܌c*\t Fwvw @HBy c5":?p7qpb~6+]y W /v57vPM+8; ^阮X+Aybc88]q$λ%Bu_4̉:$0{TIyq䤭)hT-tVX;mٹÙ THFE"j%tLBHHs}};OiH/W}/a4Q^ާ䅾.0>H6JR{ˆ[Ѹ<:]I|1u\'Gr)3m>]2Ql:V#ʸ hQ^hH/ Pq!?f ;->W3C.v Ѩ)0raԪIa3@B} |l| <'\Q'"ج]N +ŏhȯh!ե?T{5 /zOSQW:4*m412ҙQZ`#RqJLHB.6tKXphF58TEEԛ76{Ed-xn}nvH>l-Fezuơ,C߂%w./4p0 ;/"_aRdzD6^DܸWگ uw 'x_[`1-:#R[ӇGQTOhBqa\U4Bquѩ{SUWC Yb[Զ$X"*1V; Ȍ.*'* It",o%<)W^e2Ʃ8('_=ʕa4`ѐ|m~ ?.SBG|{7ĝ/ h- ҩR_e5 0f5DZ܋0n +PO: 4| NвM'X;F/:6 rٲa s6iΧYY9Ì]]uǶ -:Ce~ ﹱͺY݌q̺tذ\br?Žׇ9쨖JA҅vs9.gU.p9e~.=\\<ĥ2 ~ 9poe}10fo:M.sy̥K7tpq -5 ~ ~.28 A||_ JW RMKٔ ){H>.eR6$= /+{]r\';d],d,ʸGj >=#@ўzí'/P ǜcxp|o*>aIYļ#f oy^@t19Cß]2I6`(/SOwXa|"NW1eLAWw$ {+1 Bxcvg}|W8kpWc)6[0I[%]WWE*+ZV?tܤGk[jWuڵ` "Qu,X/wiN(޶V jbh&ZwjN ")x[g8OvTҋM3Dmzm}´mϘDT@&YQl)iP[U(ZӶ3m2}LrrjN9uv{p٫H2ĜKgfTJfYpb697 B2:?PFҩsl28s>c8 '&J(pGgTz2$g#u.'fT[&DؚGi, ۥ[ڨUZf~,TR x:aCL0M]{XCdl<^Xc_J(ϸcɁ endstream endobj 75 0 obj<> endobj 76 0 obj<>/FontDescriptor 75 0 R/DW 1000>> endobj 77 0 obj<> endobj 78 0 obj<>/FontDescriptor 80 0 R/DW 1000>> endobj 79 0 obj<>stream HTP=o [uڡRtJo5iw!C}!`쇟.`ZL;o 0A<$XgҖu2%*?sqJ]I Er~ԣL;x}JŞU7="했 M B%Qx΀3yS]zZ(2ΊeU~);LXmC~b] 0Em endstream endobj 80 0 obj<> endobj 81 0 obj<>stream HW TSg~YD&CJH B@IhKxh6 EDEЪW*j+*Z2=S ;:n#TR`u9g̙޻ A!e .7c"Qѳ_w+P7R `l  v#= g)-"HijrM&\2(ԢLl؍xX  `8u~n%x X_:c~?׃<FM?A| Ku q"G?fx0k݂Pu`H}~\Ϟ&H.pc2ص4X$vjĀ B1Q?ߢ9ךyϥ?Ou~p3ʆsFvxAMZ+ 6L:}bzi֚l@, )""s?@lFTFLZRa-,4 )P4RtLcq@P(3ub ^_;n*FPxb4:F5}ϜAX+.rRW:mGc"vz7{koG;jݜGNm~@סG]b+)DŽY_/ܐ1Ɲ3W[G-ܰ!tdC*& &)W8q[;9KC7E|.X8~ɿ}=+x}q^V 9uӼ wfXϒ'[T2۱:b:`u~ʍs IKD/,'m#|vpGjʦԊ;IIE: q?KOx<1E8mj~`)]n:*BD^+mnyQiY,~ɍSj:NRoC\[/|>{$L]ڢS%[bwYk{uCig9|;Cw5J7fo8B\~?KK6}(޵`BB['uN8" Sm)S&l)ϗyF>Zxʮ~NUX׼U}q|lOEǑi?Y 5}ZJf>]! xvDxYrGX4u{m÷d0~Źն[w3ޱ46}3aBpoP * xīPحVi4RE4N()9*EW)I18Yx?NB%I ! %F5 v`;i(E^tHh\kI.X4Ǐ,ŜgX PXp1@ 2Fzyq9v(Q/ڞ+`fiԟ<8iGmR?ԧ(<4DnˑDh K^9ڝn_2YEn7L74Txcnxa-yO-_i7D^9e {N+G?~xa]rW"Еvojk?W?/g9>OPOjs=ieY?Lp;[ cL-5gUI;^2.Scr]t}GҎâ[,Tr/ ~ӓ͙39Vyڃ|ܑ_9pyQ};B=S\%y̳.gpgGfϹ"lmI׻9Q7\wt(W_6Ԣ Zb]e2Wt~̖߽_($7 ` x Q˯.(C`!梐,uYw~qb܇f8g竆0{|8nҕ&"kR_-2OKr6-lK? 3&UVŰdM+mV7EP{V mW黾LYvrΧ-9%V5ݎY:ȋ8t9vܵS_/Vd>٨Wt43L4dWɝӅjURxbp^vCٺ'O1޺TK੮;-9]'A©EM.Fv[gǃB{j|qjݐ 'Nr)&/0m+,wmr6#AFH_79=7V4U|!VsL|q3jtybPsH|u̦8*M<23E۞<$ ,c¨k^/d5MIsC4/Z |kSs~Y}<~=iO}[6'."~6-=E2'H%BGBoԹIN_ v7{8 ❷=]_eM+#ͥKX60Nqg+ >q8"A,0ΙU  `0D 0hMn'x9s9O`1vi pF[.~.XQ!Nmޙ&P j>%I{,V ?PBf(q"`D31]x刺Zψ@H8=txy6(NI-4\7PRn<o5d&DQ%pRr Рuy(^9JY ܂(-bQFơQl2ߓhHvc&gIyB'S{:MW$Z@+h%/h `#Vyv5qT\ m*ov ぷ@U:/]8VtMbx V;J4Z+QҐuh;Fj[W ݂fx/=>S2OYe!)d #Es%B9Cn"J" t MtAw =13/6%,mgOnVªVQn%pkn/w;5r7y9TU)Eb,1L(%RAAsP Usd>#c@PCzh =0h{*JpӒ(ṕ>(?%~K?ge%-Gw?(~z#&f gt6FzTT¦FJ#6*|xfb'878S;&}e;nfj.y*hEtU-6jQY+T-KuS GU+܉&Ku=gνw =[{LxL*->\yf_\l䮐=Kg8SRX,0}6|?|/.1Op} 4)Wi#ǃ]_ tvn߶yKSߧ5z=TYU騰ʬҒbHDoIzTvPZHRUP%wS b_\\IJ~UaDUr@K5߫WJPpC:&" %I%J{ON5jxAhBքPgIE"ڑ@.hJ5R'hv'>J£n.P1L%=2n.*Y|͜FZ::|*bX4~x.pZOG  }w fm"c/M{1XؐѸs8%0QIQhڣN$qnܳUU]*N5l =8u2T}Ye d-3j9;b%,#%\TU0ƚ6Ha7$- 'g1JS.c&UЈXNVWxi-)s9vvd ,cmS&,&b.#(3eY,2b),gV,IW5<ʩ]o0ˢy|RcJ4,66NZ - y'W8'[qQZ̄x1<E=d\(Ԝܵ&n̼tܭ&˝uyLXrq Xdӳ.l?i^ƵmCtX6?#zBX+EEg'~A e[0𓅚NaG 5fb;\ Kxx46_at\ҽ 8^Y@1"LhBy8 Zзc -B{ lºVЀ>o5U,"~\A5wie@+T俫S%W`c\-;zۭMf\8.#z${UZ+P`zݙJ=- YD$ʬ_LX{yveEȃlEL6.e~#eJI1)e)+evHF)I,dlKb(˲( 2'l5mQ`fl㓀#2_wqڦrR~j1*g Nrr9gsNvj!sH؈B 9bA!p'.K{oMj/O9>kW%6k3Lѵjz963 ˜|u\ ]bI5:Hҋ''̈d /qz]РQS/0b©p<{*8 CQ5IA6L ps@F{aC6}/8},48"ɡgeIӫɈSt=v.}:ݎם7 b|+A0?1.f*e|N&y`2ڢvB*0`&sy̬բ%9ñ#pu7( (F0\U$Zy1w)g~k^ @w`)мmq[<چ ?4h3vf&KSBmWjK]&ըuDS.](5Hݍ%SV#5ƈ76-EU@ go7+@`~h^Ć%s Xۭ[$7o!$XnomѺUmenәj&*ϳ׎Snl*ٗ^',k;&q mHi%Ҹnv**^JZp"QCOHV.06QNP!o7ߛ睑`#hlB 7s3k[ȇbgp( #ǧw|&%֝BsG>s'>/M'!iCZLF|(LCbR&2帱8 另(zGy 4|T ?#_x)qI"#V ݜՙ҃c9A{&3>N^kjn9LfƵq#^n65VC ?=wB]0jx1,] 0gAp -2-B0pf^ 7Hѿct߽ʹ㖏%/0oaGZns>9v2|yJ`(eēdԦnYNo|oكpyֿ.|.ZAv)0hq%]6"]3wOQ)K-h^PHьZb}]ݠe9JbF2:*S 师JҴZFgKRRiez&9ϫJ&(*aw p`yPaWE!Vȯ㣈Lb{70' lԐު72J6L6 S;ͨYWUKW`f 79N.yZeO}tnc-9`O l.1-o7sp<0/ƌDw& endstream endobj 82 0 obj[/Indexed/DeviceRGB 255 22 0 R] endobj 83 0 obj<> endobj 84 0 obj[/Indexed/DeviceRGB 15 45 0 R] endobj 85 0 obj[/Indexed/DeviceRGB 255 52 0 R] endobj 86 0 obj[/Indexed/DeviceRGB 255 56 0 R] endobj 87 0 obj<> endobj 88 0 obj<> endobj 89 0 obj<> endobj 90 0 obj<> endobj 91 0 obj<> endobj 92 0 obj<> endobj 93 0 obj<> endobj 94 0 obj<> endobj 95 0 obj<> endobj 96 0 obj<> endobj 97 0 obj<> endobj 98 0 obj<> endobj 99 0 obj<> endobj 100 0 obj<> endobj 101 0 obj<> endobj 102 0 obj<> endobj 103 0 obj<> endobj 104 0 obj<> endobj 105 0 obj<> endobj 106 0 obj<> endobj 107 0 obj<> endobj 108 0 obj<> endobj 109 0 obj<> endobj 110 0 obj<> endobj 111 0 obj<> endobj 112 0 obj<> endobj 113 0 obj<> endobj 114 0 obj<> endobj 115 0 obj<> endobj 116 0 obj<> endobj 117 0 obj<> endobj 118 0 obj<> endobj 119 0 obj<> endobj 120 0 obj<>stream xZYo9+ adO`` v&H˰qRĘ0v8!.;zC <ơ^š^#OF2/<A䀃z! a'sa@zP}]¾Kw .a%컄}]BwPe_ye7 8v'؝`w v'؝`EXԉ |}:gSzPE^yoS.Lf|5]M;K9>\.}FW_d|0\zr|oo7NdoNf7rޮPr 1u_D]JUvy^,WSiJJT.WA6+--X!4a҆ҕFb]J3֥Pi4jŊwd&Y쪙gz\?~>4%ߺv:j08k ZrSϩ/_13f~w9.:u7ɧy{{:%77Y-;o>4} 8zwYoo^i{גdnXnl|=V Z]/u !Yy,ŰUzo/ώh4Ҟ jMvQ}٧..6؜3Weo>ʷ0ۘss)/)/)/)Gb=~:7uÚ;Y !U<*8nyQٕ0K=.~{ݗSw/ks[]aXO܍Y|'fYԝ<F[%Ubm?#X YΓ0#!=YMQ~=wge70lnI75B4ag^9ųmZ Ƴ Rñ|zi>ٲ9w΄#9`O#g}&b<_]+*aWN.?͚=U 𰇆%h;VQ~D|U4}\tC'^ejN,f+֧ŏlfBu?i 0P@a @R@r@)(@[Ṕ((C J:--$.d...Tr]*K.ܵ_KK endstream endobj 121 0 obj<>stream xXMo7+zi/^O `;j$F7޸FU)4}ov%y6(z9"3pcjb5>X|A댫7>%bCHuh LeKD[L &;GkraLAT (f8(D 1@kAA XtP/AMⓇ1N,P RÅ%0G!̉$0'I\`.e3RjAe,2jH+*V|&p԰pU 2zlu*_=(+,V:FBG"YXOHLV(FJr $qXv*rzsR-*C+p,Pc@QM0WGZ\R; !rrP8*V 9 :$& 6!*>1i0`ΞFsL$ `BtJӊh"DGNiA`}9:;W~uٜM'lٜ̦w[@^2̭t7o/o09Ҝo Bw$NI8$ny4 8]܎[<$q$II8 /nv)2peOUU:"Ed1,H՞q8 @^>o5GY0e}Ͽ~^ l>;h_K{LO73cW4D$# JƑD%q$II8$nIQ;ّʸ`ӐcCVc֎YMüAnP~dꊒ&_pXMuu&/0bV(,EYHv$֌#]#_)L]/.ځmd/Nng1vZ$ C9ˠ}-ݮϧǎEY?im3UL+LyKn}sx׻O+nVYZk^ծx6޼:m7ѧRtPe^Qby2h̓_7M׿3u秂M}ml7E}+}/n}ocy7)ou7yGK~)qMRHߪVt;eԕN]m*ehWKJ`+L%A~Pߩ$c.kFDk!0|֬g 2/̷k1"BS23f "_ G/ endstream endobj 122 0 obj<>stream xYMo7+\~Xi2TkQ@QG,'nT ;3!B'!4hlU4mFM|F+HtJRMRj9I Id$/Ag5b$Qg YTCDГ`GұG5ҫ /c0]r ѩ$v\9fr-CSˎSA|dD.A rI K \Ld8 ++++++&\1mG@(+B̧ >gj@޸, g:4AFS9qTΜ].uXPGne+b*:ĊTNĢYRT^O X $ʫq_"S9_MQb0 @e s#9 {+b9bCr9L8ALxIrrEbAAF9ō I.p*fydNf 1 _2qï|9Wjy>=Xim{?lϖ7׫T'd~[Hf[;q&U$ٌ=h/sK*^ /ϘGL y稕Z/{sC{txèx8LW8 55KE'9RɥMZV .jPLV2nEk\_9kp{zDwu-0_ެ߯0^ofnRBs9LכŸ~\Gj||P<:_7WoVw3 /*t~͵<8 Sȳfw|mNt*Fb`@>` $HI@hH1R H$QV{)kNΪV;IZdmjNުW;\du]'uո:덻޸zqurw]'wqurw]'wqurw]'w=]JJ3Ng( j( Pz`( P:M9p|q?9y~/~a=13bcﻨS+X~}}Oej~K./ji5N/%8)[R'û,K4ϏO1nwuzvΖG?~ 4쮐aM vG!*%0WQgTK8">6&v,' 8O^RaS%IUg%Qr%Ur⤨/%HRHRT'UzAjfEjڤ9i*@1 $\@8PM*RERu]PN=jxJԯ\ayȦ %KxgP` } endstream endobj 123 0 obj<>stream xXMo7+zI.Zΐ `m 78UP4}էWEzA"<<>rw]2x$5I 2#J63Jg<{IPqkڞh9/F a2Ƌ3Q&F'b&;2.&#R)$Eΐ#rAu>DT4 adAx>9X9G GUr̰@Nb:8(AJ4l 0ZeT@Oe'avZaT'WΌ uAE)Al읎WҰ0``rPZGX5 BerV9kf@ISͳq ZiPg+8rXo1Pxm)@Y9. GP"X!B@Wz$&/)j0h%1/1!Z}Bx&L8ma]` .Kd%Tːd餅>,p  @M#u]N &u nD}rQ 7{Wgb'WUu*.wo-,?TM-*;Ϋztu"f^Fzcz>z7bިt}tоnr&Gy] ]kxs3~GD`6|7b#ٰw5sVo xT2J.g4E.-~.W| Nm|ڶG ElqsȩsSGmm5'U-fbwSUFiq $;h}^Zb{j50{アMp"A4yMz`(P7:Y}Y;Yb~ݶseMfx ccpY?mhCk=o!٥A8)>cQOa &!>.9Qg$ }7U9eç{g|Qcej~6w@.ItH%ɮ{6w \c)@c2{?M~o+1-Gl׼Z6*g{{=wd;l>?NHL8\b~O8T@q @0En *_B[vى嬧uv^vҺӡ7𼤼IgYI֓7Q\Ss'U(Yo?r;+pbd_3?|:._S/c;ʖ9\czy6ǯ.ż~ i]էyX3iku뗾Wߝz.-7ɥutKKr 鎐fT8zkx^[zk+:8Ȟ^('ы4"]/Kv3=$G)[?WVZ_4Zb1.ͥhڕO 0Mʼn endstream endobj 124 0 obj<>stream xXKo7+z9$ a"iV,ɿ7]Y%cE `K| Eg™( gPbTBKQ "F#"Vo0:a };I LģAhD묈2`t"Z&J TZ(EX"hIa`X[2޲ՑÄqHV*L dbA塙@U ^rTu&B+|Z+xGL(VBhc- bb f {7.9XՁF GƉJ8Qc8cfODG1:LӐ0=&&lW81+I XIX&@̺V :,+'&2 "ЙyH+I!\BPjGYCLL Y VrYLȄt d}@$=g39, IJ"UNkex!0% T \ı7PJ|‘mqQ _)oR:F1_GO "&BɄ{a\F ?|c[?d4-1CVJ&296NձZs]U96},!k1PnlQFGur:+[clIlJu3r7~Cz-Ukh8J=dyq|1.J'ā(( P5J Fcx3]o.Ws+Z|8bf[?F0ZZ+/?l?bIDayW!'z^\'r\0'H\7?øZ.g_ժ24d@Yy~gޕOܭyl:to!l6OۓfNH3l'?_ݹoba{aDI~rxڀt\ —Q^ĮO7c2-yyqNMq᏾WTqn Ow/u~ɭU^tf&)[{|}XЕ ]b z~6*}ܿ3ߟ[$O"'6ޤ'ھ%-ͨ63|^ymi汽c;f~m]lԐ|s:#|_*cj_ANƙk++~Օjקz^֙B뜐=JM:>z/Il3vg٩ZӶX~>stream xXn74jCA+- Fľ >(5h YFjWlkP(C<<>r5qLָ{KzOCĕ 75y4A 0 ;e<2)(Iـ+`8hES.rT,?@, : bX0!9(q@ [0 T,AѠ EYx*CxƤL]_!  rU8LhE `Y uu(uPLpPxNOl'tn"!@2e"'LeqѼnNw9כEd6_ܽY/ۏkóg奉ɚL5qh`-ٯgzUj 58ê xGwsRZSQz_lOoڵKc͟|qz@+Stӧ9M|^4Kc2v"*_bWR]Z.:[W)$GdwL\W%W)&U=UQ@(29l@n]TSR̨Rf E+Ofv{ ] +;~O`e^`h A=%}^:~Z->H_MGR]nm1ROAy C{.fД,r2G!z_ѡ CQX 8ʖa!(D0W)}a/YO R b9VqCG?OqnmL{0ޅLn߰1!.gzTr\!xAyM`vvm;ɑv *ߝS =yd/Y8wAO|Id,L8M,'SJiKv&9-?EĶ2ߢrKfmssr69Hp1sң* endstream endobj 126 0 obj<>stream xV]OA+7Et$Ĥ(j#.IeI{J##{9c:eID&;E>I!-[ΑqdY'~&Y' ~8 4 b($Ylbue(1AV*!*@c!Y9xVCM0 vJp" 40ȞA@8 ,  trdq92SG2Y!`a$pEjBGJ"j#8TZ\L&( 2  hԪW2d EH]\hYPМ36NHG+lBR0Ь.BSZca9ekC[[ջUc~evwSs5:QS5>\};&Uv;ƧU{Wztj2 >ex mO]|)HySOt)B۴1ؿ- L$wPaa) ea,̗|$P IJ26]:1#fz55jtç>jugo^@#m6󭸈ڝϚymr^WYZܥX7eW<pZCi6Cj. ? {WW;?i V4ƚ?̩9p,8C9mYn.9A8o|Uݤo&s!h9s OS>;6h.r#̲ v0I? FxgP>stream HWmo8B_h?lwY@mM⍝z KT#yeߐCYr6 "9< ߼ŲOf㋋Qp^UƦXy0ZU:)7fe#[ۦV)|:+8[yS5I#rE|(? dNvӺAjwIQZRݩuq>8 u_7%u{4;>5سOSX\qfeY5 MV8%8!$ubU4Α;5lai̓ hAU=_Weƾ=M6ww>\3pلAGH.Wy~e8cy]57 nae[>]5rUխAݎG3m.eBI5_neR-V5'^?oغnŋd(2Z:Kuzg9? /үgŦ)V+VO:'.bÚi!q/Sf]O/-La` Q>ҋ2N݀=>YMU2 酲f734:T>kfZ Jz-S&qzMRfeQlڪR~r ^E!m!xs6Nʦ8YF^=~bt`XrݚjnEj ݰMr-%QRRW0YV D` iX 8va-3W%u27)$mڲ]y?Nlώ%}[ٷo;^n >.}*2z=+^} aAy'8T2 7tSQCB+ ) yN[jdCPRJ:nK+}pO0'Y/I]SA!@'Ot=$%K^Z&jg^U?5NuwؒeEڰYjJ$2CqޖĵfmRMگ]&3 ;7fzwÁeӬy|p|Tw5\z mή.b<9L'sێȷ02@>L#eV6}kϰX2_|R>w^s\AŴ=h Lo.+lNA˳ҧH=($EرIʈmrbJY_ʸ6w_>3$ y$e|GGt[ų@$nBr(Z'7bI@eo:^o5KzXTV*U}<PПH[yu ZF6þS ȫ"}Ƃ8DQ8b/Ez@IDɬu?LP&R?2G.8Ij kE^lhL@t0637\Z9_h dX]r-cޞ\SC ޾AqM%fGnzNWuvc>?'U|,Wg'WJۃ+$s_cJ#^*zeO5U@M5^`&!onǗ@%L۳f*·f>GGGIОV{}LԁyY-lna3n'M {cیr4<ߺV C1fۋ]3It#s8"7*8Rwm"9=hOb9fOO_/aK3G![@ljScOp"/?+13W2a!&vGgojb24HM[ToD̓CaO>H9&Kډc|q{. }Fq37zw.R'kKXNTfB_I?\(Ğ?HU~os?dlļ˿1zoOHE}D0CvЋ 9r4YqÈr8ވ }ˑ 3ִ./)#} ?*t1?;W7XK;9ԭF.3m>bV}xqzꝚ!#Yk3A{Odը>D;Q[biGc 04bJ~Ayn/Rs3͘zgWuALHQl-Cߵ=o*g@5`{[ׯ|dl7CcOmIް=Vƨ =<.άQgC)[T}YscLTĜQb|gϝNj"m#Ĝqak!^GAN˺u!kW3O>8`c?RZ r}`gegPZY\ZTX[ecJ-)-S6:ADĂS3R 6)[X@)eɩ\c endstream endobj 128 0 obj<> endobj 129 0 obj<> endobj 130 0 obj<> endobj 131 0 obj<> endobj 132 0 obj<> endobj 133 0 obj<> endobj 134 0 obj<> endobj 135 0 obj<>/Type/Filespec>> endobj 136 0 obj<>stream 10 Using Colormaps and GradientsJoe Chuma endstream endobj 137 0 obj<> endobj xref 0 806 0000000000 65535 f 0000155406 00000 n 0000155682 00000 n 0000159051 00000 n 0000159339 00000 n 0000162846 00000 n 0000163088 00000 n 0000166071 00000 n 0000166337 00000 n 0000169758 00000 n 0000170048 00000 n 0000173030 00000 n 0000173304 00000 n 0000176149 00000 n 0000177026 00000 n 0000177299 00000 n 0000180028 00000 n 0000181257 00000 n 0000181530 00000 n 0000183357 00000 n 0000184513 00000 n 0000184837 00000 n 0000186101 00000 n 0000186507 00000 n 0000187953 00000 n 0000191938 00000 n 0000192200 00000 n 0000196941 00000 n 0000198493 00000 n 0000198738 00000 n 0000200354 00000 n 0000200681 00000 n 0000203597 00000 n 0000203776 00000 n 0000204145 00000 n 0000204206 00000 n 0000204575 00000 n 0000204636 00000 n 0000205005 00000 n 0000205066 00000 n 0000205435 00000 n 0000205496 00000 n 0000205865 00000 n 0000205926 00000 n 0000206252 00000 n 0000208062 00000 n 0000208160 00000 n 0000210950 00000 n 0000212438 00000 n 0000212706 00000 n 0000214137 00000 n 0000214432 00000 n 0000215824 00000 n 0000216676 00000 n 0000221877 00000 n 0000222207 00000 n 0000224318 00000 n 0000224701 00000 n 0000231328 00000 n 0000244627 00000 n 0000244872 00000 n 0000246716 00000 n 0000246995 00000 n 0000247364 00000 n 0000264148 00000 n 0000265678 00000 n 0000265977 00000 n 0000299881 00000 n 0000300188 00000 n 0000300444 00000 n 0000300689 00000 n 0000318599 00000 n 0000319172 00000 n 0000319561 00000 n 0000319683 00000 n 0000326273 00000 n 0000326512 00000 n 0000326705 00000 n 0000326835 00000 n 0000327026 00000 n 0000327324 00000 n 0000327553 00000 n 0000335251 00000 n 0000335298 00000 n 0000335666 00000 n 0000335712 00000 n 0000335759 00000 n 0000335806 00000 n 0000335860 00000 n 0000335977 00000 n 0000336126 00000 n 0000336236 00000 n 0000336389 00000 n 0000336506 00000 n 0000336599 00000 n 0000336729 00000 n 0000336926 00000 n 0000337051 00000 n 0000337256 00000 n 0000337402 00000 n 0000337578 00000 n 0000337686 00000 n 0000337798 00000 n 0000337940 00000 n 0000338103 00000 n 0000338207 00000 n 0000338311 00000 n 0000338490 00000 n 0000338583 00000 n 0000338754 00000 n 0000338892 00000 n 0000339000 00000 n 0000339128 00000 n 0000339262 00000 n 0000339425 00000 n 0000339542 00000 n 0000339659 00000 n 0000339871 00000 n 0000340050 00000 n 0000340186 00000 n 0000340289 00000 n 0000343081 00000 n 0000344537 00000 n 0000346065 00000 n 0000347673 00000 n 0000349181 00000 n 0000350604 00000 n 0000351617 00000 n 0000354715 00000 n 0000354752 00000 n 0000354777 00000 n 0000354840 00000 n 0000354968 00000 n 0000355085 00000 n 0000355120 00000 n 0000355315 00000 n 0000355394 00000 n 0000359404 00000 n 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f trailer <> startxref 116 %%EOF extrema-4.4.5/doc/Using_Colormaps_and_Gradients.pdf0000644012702201742730000223331311274636625021420 0ustar spangspang%PDF-1.4 % 613 0 obj<> endobj xref 613 17 0000000016 00000 n 0000001322 00000 n 0000000648 00000 n 0000001589 00000 n 0000001631 00000 n 0000001918 00000 n 0000002344 00000 n 0000002393 00000 n 0000002495 00000 n 0000002754 00000 n 0000004915 00000 n 0000005455 00000 n 0000005720 00000 n 0000048342 00000 n 0000061705 00000 n 0000062378 00000 n 0000001131 00000 n trailer <<5ba6202e6d6f464e8c7d29ea9844479f>]>> startxref 0 %%EOF 615 0 obj<>stream xb```b`` b`a``gf@a+sl`bp d700H}euO0mVvƅ+l Qk˪W]xb";SM5:or<| K"YDȴ Ϸb OWv/ 1d*S.p;Aӌ"PebVH02plU7g7gXk `طH10mG4 aN PXy endstream endobj 629 0 obj<>/W[1 1 1]/Type/XRef/Index[89 524]>>stream xbb``b``Ń3 ţ1x@;a  endstream endobj 614 0 obj<>>>/LastModified(D:20050831121816)/MarkInfo<>>> endobj 616 0 obj<> endobj 617 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>>/StructParents 0>> endobj 618 0 obj<> endobj 619 0 obj[/Indexed/DeviceRGB 255 627 0 R] endobj 620 0 obj<> endobj 621 0 obj<> endobj 622 0 obj<>stream H|WRI|Wԣ_"&a0{cz-߬n$`&Թ:*~GįL̔Jg/iш7%no|%*BJ91Q1Vok geNe%Bǜޝ?nf )ɔ2*1퀵VWHCbMT+Qg矑c1iAl"io Jp/$%b]>dWg]kJBGI8۬6}FHc39x:pG0o U l&=*e։jMZ&eSݸ"UV6f_ئqmƟ0;SfIytRcjz-`|[EJ}_ϳ}6D_j?wlG<ɦ4v%0p9cLJDJ캺L4%IN:c#5J롛 X=TѣG@(,at)LͲ^Im}=qZaJli;NMNIctq6Sh?$G4rjokэ lF:pt aԾ2IAK4Lim':D>s2y!&r;T܈lOaMgDzL zWO(Vݴ)ue.c*36(;n^eaU]nõhn?Е&F铎) 4ll t է2zMlU/;7lٴ[BvԱ;{ԧNqjlЕdc0?}=g `X*m[V|}hعR J9Wb o* )IhyUQ/#T?|cXiۘ}Ǿ(?Ӹ^ {`gX0T.@<1P#$} ad&q b˸$푊4и.A]O\)%fX*/%ق%Jd{kFE> endobj 624 0 obj<> endobj 625 0 obj<>stream HV{Gdd #*"!? )KuSݢp <@NT,~_D2ErJ$'p*ku-B|lSBDX8P (-d 8X!P('B]5 j+PPXMg[rl_9?[b~< f|託 WO/Ozt/}%5fڠu*@+* B*e mhKllC#2/އ=8ܱ@ǢQ-SgUz.5==!lq>COje`at­4O|)0e,&,~6uT Uuk?[`v1MkVDVNW8< bwJn!mWUoU3 ^9plx@m{r|eo<})'2Mw,՘ȑZ3˳ʮ 7Un7'ܟx@#sBɩC)U J8(o)NE.~~yGuC 0K-ֿ}| \f63{h;@c\!ʋ@l)BD"2>>b+f,Č-X<ϔ %HjWD`|A@SsxAY l%9On#Vc5:-qp~ۏg}cfNh3}>˯wk0v H{I($S^ MkkgIO{?i tO,y,=7%W^4&T{ؕvng$SZV1;hj^*ٱnWz_E-a H*YZLx-<+ =yqZ5M gQVQߵQ9(>]rD4D Ejc Eʱ8!NJ5+(JItG0wCPMň0*7AE)S@Mb Ya_ j=vYҷZ ےPHӌȩ8gA\#2T5k_>r &c4\S]c\.ݰe eýY'?B!:$+PAnN .> 6(DF(GXGzsX!BxUg5>LKՃgCwt+DQ<G8iR!jҖRBDդK/} 6'>:zvP)m]WYa-Wome|z0UQ{mKRAe$g8<(;J3\RpZO4ڟ\_l;fn}/*g^\9LsKzX Xo׫\u;{RF>'ʓ"Ͷ|yc=Ʊ_Ku }S wK4xBDÉ;zʵn^;kihZsMZǠT~ .(Gp`vޙ3 +6/дzv1:!V|XYvz/ǂPΔ>m! δ!׹̶U$&m[jJ\S膙yi2+^kƸ_uMvJpQdҺK/Z. 5÷(U~N]ܱ)u?Fsg:1i&gL.kk_P*h]{ UXEkGYM& Tn,]MV ?Pŝ gvrq~nׁl*b  MAj=P_Pmm;{)& ^ #e%iLE9]kF9Qq\Np(r]B8]>{g|9W7v Ga!e! Ib., -[&ٟ a|X[+6E$ X€>4DaKHh">O8N @ZE~RwozFZ <=Mޢ J2|WV Ch$%xE)KBagQo?9f6^྾D׷Cd8vOaTtT?|^2ۥ2b"D^R'g9W`Y5:Ϭ)A}Iɷ5'fƆoeWt& tJ'&(6U9Py]LN8(2dK,gzGBCk} F}C6oQ (yw}o4HV| @I`{R XPmC$t̬gXɾfu5ѳbemEoכ*9 &2V[Vj]LZCݮ&Vwܽ|8g8h(:ԝA]zrd5sjOEyN)ܚD21G`vIQqe<V ʖaC&֣A3ŖW=iw8i$V%qk v-/b>+(qn&ksv=?jPgGխmܵ7:*PLp]S:Jhf`QaKBJ"*wDM [ncsz9EWZ&bt xRゾ\G3.ѤWڎ׋.%LOtJҬAn?DOԪ[1̔HO*g%ŞZHy.?fWUF48~`w2'FK8[P [xG\öh [Vܓ26B^ZCpiNj$/ӳF=J#NvPU]iWJ5> EMSȡ6BŅCx2"?_($OL jJȽ|a$ Hd'@|_ATrMr7$/wx|ꆆ{"wy ):3/Gqvmfg|BJ'!ݺ Ӌr3e!qmUkO̗4)"[-JK'(BqJi'S '펌_s#t.rm9f;g*cLNӥ^%(k5l3ۡ$IOY'`'.z8r避ݿvP;^.LeOUoe/8He-0;C|֜]rD*|7%1 NJN57~3A1$t8Q$}K$~V%J8H'(iL Bi٩[4\ Br80 "`3ta, mz8|Ӂ0Q{/ΎeC?OQ\8N`kǯ6Y:: GT|Ci镺csL,IaH9gpRQ71?CYNirUCuDr a|l*wn:"(/y3iŒ1 }1S]:ܹgJ!bb{w6>ꑗ>MIң[r/ۚL:IL%^R}Rͼ0$T_#R1Yc%3!an)w':b^+;1NupvNrFP!*T@ &8XAr [ !~:6` ~ ʦ$Fk96[Xoy,TM4k+m+@871ެ]6R+fs/@q%>6?ZР(GА z[ۖ_|#9jjY_ѓ4{_֧JZLo*|smǟf#>EcI;S?Xg3Bu:>0.p|8Ke ]<=e\n^5=m6ݔ8Γ5zO[KΩҁbiN So+ ks(Fnr%"&W(Fx?C%`-S M/_FK2*Jzt1L{vk9ws>_ksFnexFlUǫA.{3"[~;%εXiw\\8Ѻ5]Pk[Zp<%ӖX*.Bb+*2{P)20ӾTk&qf SenϖP nTu9&.KCiL+ì٭x1$h(,&fn{-eg})5 s| ~}Fڨ`l5pqF%K*.}M#dns Iw%>A׭vgs%kx"Q *06s_+!0\#jU,YF ޻FY_\2^J)rY9Ti>:ضIucro36q eD8EiuMK{o}զNVYOa:v0 Icrh-5̗sve=XgzܚfZW^v]M5]B VA:~Ʊ&_>1 1EXzY(e܇ps ê'5r\n5PaD꠺dƫy uF]Pwts.szl,c%b{3ҙϢe=惯׾þfIed5XB`%1|~D͊o"nVC W^D d8#%(9ʻHc5c+XR%=yXJU+:3dSSj \CO] u9z^w#+j [iuɪClk89CwOghly ZqqzCUh2sz^C+RDY'z U$L؉zHV Vw%Z&):Y9z ;DTPOh*{: u]5Dj}T12yv 滛Z Q[SJ)mTRJ}&-p_"_GRmzQuZ^UW: pJyz胎3/BDK_^j*";,W͛5}IpF ԯsutؖV;5ZؚcwODSn_z&sy&?Oꊮ1.=v\~;o/uir$7lǛ:#ȓەLv' AY`miyeM $)%)oSw;W{rx4 ͊J^{x ?בuqDbWYLEz]g{LΈLUug]|ܱ-a~ϙb.w1s:LMh`#%m#BMn$M%dT!V4*6%-mVoZy̼yo޼7{q#֛;,ϯdd:?.y) xk"M$eُĎxTv`C?dnaIb|XdMOb&-+* XRQğlsψwRr#5U<;crS95iJ~vU~a~@l;5~ ׻?LM1*_+Hfь]nG6OЯƚ\︂Skl}cGTlp~^Z)7 "@-o]Yh@G.D *BWf&6҂~ ,%?jz @J;f35##NpX+-m(d2jD^eFr@H¹~}9CUjڂް-6%n E%{B}RR2g U'DٿLIowAda:KYsA=l] )p_8'@H뤉I_b[4 k CWZ1mM1RC.LżfiITq!s:N q!SQ:i؏wus@92ða{(aye{Lqc\}98=uad &YǍ ]3?Onď)cGkq(%v+SpUʽe rne2}jXL Y;>D&)kT߻CXa B=͠;OE|}>;HwɵZp) bY$S!걮z 6q&͆2h22u8ꡧ1kȲ!zg%ߕߡ@BR+ȋ<5LsAZu|ֺ֮h>TR{I]AG:{^|[e=w>g~6M~q@ͩk`w0{^]jWX8O]׭M LeEN/8QqiY= r?Վ}@Ͽu͔rr V+Eu[˧gԗT%ˑ#M<4V%I=dN'ߠ:Lq5 [lKPaCr=2_א4]92߽~rRUGsL5(4 m7`-wk*Rsk^To52gs,'B 4^ T Qպ*+q,MWdB*Cl@ԏaeԺ%6Gi`N2 TuE^M˒<hcda ޥG' .N|NJVlS% ޣVk)q\;P}R;N z|%o()ojԩ^¼m9qzN\}u .7͠OT-'Ϸ^36Y_8y)e|ފo{+}}+0G(Ⱥm:$RpX_Qre` ?I{&ly`6~lǸpk=C,B>Bve<.ur6z n=7G[`dWC}PZ de.޹iwiAރ xRp!.*ѷ7-W/pߕCJ?|ޏ'L8y·W-| C tgmF9>!KeTSk۠q_Q]u{ee TI,$di" MCiAq< I4Ă%),w ]JfiqqFcM9{oK4|q"Vq_ri|`̼>"Mc%%R^ <5"Guq%-7Ww^_E *d,!\M\~LT yC( @ʯvf#G}ڸӘ;| x6yB{ RiUg@|//O5u@5p8Cߍ>~'y~Ge7DxG{ćkژ[;cǹ>i}wǸSbixb wD1cVy7Q==z:=;"YHwx[}ws{ xtoܩcswV!pE `{5D®Mnpu>¦s1gl'RZ=_ wZ?rS"=GVeF\d0|V8̬៳J7K8 s,/ ,N懯E'®ktY+Qpx0@s8)ᤃ9mboMڛ>%`? <})a݉+~+0@//$Zaa] D}/d1*Y~ 6!٫l+ϳCd, g_.ҏe tÞ ~XWE]w,΂?(JP:;@R 8 ޞbLWߨ9ЌpSߌk5&;)35! 1Mi¬oH }@.0;1H7!ۀg1~,Xd[iLN ܓBgXws=YX7'rRm | Pp4n$ @eb~=I[֢8Ԓ ¤4'~6DPcZf>wm܎Z㬘ZcH\d,ז,ltx~#kWmPsj%iFm֦uh6ͩ4zv{ϓ):;iGt/ۀI }@#) T<;$|h^y V)u{d>?/|OَuH* Wq.nd'S!.NVd)SL+hK_x1O||K> |5?8mÑgdHݷÜ3R=͸wP98 9s< gpdS,3,gs0LvGuqL6I'릱f1GyƊXQkF)Ɗ؅}Lwo),Q*`? T9]FUͱa~kK)*gW;; v'5Uzd~s*>dمd ?& J|"e.MuG=7t0qLˑZczN'SAi*auGrc$7͝.r,5l]pL Є'1S Ko'RIz!*RBwCb $E@9@Y:420cf|Yז9$7dd}I;}ffEo@z$e|8yx% #,)L`L{")8T\,N,8Gg)*8\vHz3JA*#gT#.1H!'YXuHwWY5 .QtC`M^֡j zhgn<;d܀b3.G䕜徊Qu-Em{z -mXmLeRE@9MYc9[ɠT^T"VV[r˴iPU/|ba>յ(1ZhO, ao 4J`!bH}Rԓ:5S$D:ebF |Y-) ݚ]y4A08t;bz|l[-qkpV4&4: kA`/Nutq.`*[UMj^6[L:$!TZpehFh.lUyg|/}Nlp$68 |7hd iaFZцߒu?%n)$`)VtEDEC jɟ?ߝ,P`oa4+. &{Gո{*r82iE9F(YwCO?}~nmfStqs ?g|VN@V-B&n`1ͣf_7-̋ qTaĞƾ܇Ư1)Τ NXfn PRiW)w8RȰYP˔o-sk.܊r5lTU<ǛoT &o"CMʒigqmWjZ$0啨`m81Sj‡>f.J)B]QJޕMMC_8pp\/xpw4 _hހO6-kuѧkvMYkzDuHڝIhl=}TfjAmW95"U)Tf=]; wNe4l d?9G.+?B ='ݸf#Z~d1$yZ ]~ I$4&bævLcMۧGo; T#2fƻF5TǑ*A Ռ7A$1f*{'{#a#\t hyjh;~yx}QO\\=?|׏^tϟWp"ְ\g:ulU}s5mVۯF*Xro=U`c>`{C}j >sopYg,rZ-\ _dHFHLeQ?KXpUC ( џMÒP;99=¥9|q7g]4;h9Kt.Ƕ6.vy؜1Ɖſ#g@vOѪ$͇ܧ64BynԛD*h 8TMoqwN/[q8I ْuByۙļywTJ0fJ cBa 4dqld i!ʹtRJh;iq3)v{rҴj7~=By\ N٫r/ "oQ{ oePoA)[\ls-O[OC 9pVlztOՑ56=ڑخtݺ`u;tG\0ȋ"=h.e)qQ.O}۳rԢUZ?;4])M RiڥMujM kXrlf;Kj ,f-EZf5F` tu/vں=a wXbW!s*~|~(gݗ&fK>IeDވ 9Dfa+X rAe"rHr $}'("PF:%jr;qr;_~v;.W?0FwJkL ,%T :5VxiO!xGkc߾sy)OdqK?;Q,U2hA?@z'8v%`H]AittX(z7i F(+7ћ2:WDw59 o0C+.)VC1\D_fzx%oo): eKzQpH|9SUG³3 "ϒh/XZp[nC;3 )! ( 'I%&eOPPSs͹h%զkӷRFqTxctkl~[V [ɏžF/A/ٸ?L'MM(TU0͚I1GU1sY5VoȐgh]u˼LJy&MJ.M&,\а>\WnG- 3ÐjXfXT[Hm"`9tcƍ`쌵[^4aQk#q$#͏hk cL85akHfB1 ^ HV"1wDICCRD2Z$tU }AHi*`c`JyyoB6۰$xP d9¸ldCM^VW=m^>͡&7sVc 6?x|s3:f:su"$%a%9(gsrW6f~NS(7ZLF yP Vż,\ "0mYTRM:L4/qsT @S]2n5xgOt-ޚ7ض}kmS?roSq2WpzA"^֋J`vb*aRI\Ε,J;r{H{鰑=ӡ bQla%M<9f*?α[;:F캺ſj / lBnݸo~1p^_VIIyJ)uqX`;AmlDS7UFޕjmY{wu$+q ig(MRb&flGJ dQp@R:Lv13&$4BM!w8 tݽs1ss=لӂS9Ⱦ\K(iGҍ'*Y-H?b(=S-SQI-Sc1AF'tFsJ^jw)+bѦh4$bC(S< !>2 ?@1ű{:r΁W.P1FF0}CЪozlG'Vh_1PZo~pϡmw}z.̓:!UB`ŻwKU@!8tOY끆t\.xO_Z_k(ջVGm+/[pGYG{=ՎN†Ѯ~]\W_4A6߇nGE{ؐőT4Űj.l+JRPș7v{ˇ @Txc_%&Q&  ¢jYVKd"dg%))̦AcK^ zz6e&P{|YY3tWB[6P)%f),6pTX* j Fj@j("Zw'ԗTkv?R،?ބx5]GEY_ct 4eKEo\v==SdqF"*}B}Cf0$v ɾWsCF[Tѷ ۿ]蠫zXw mMJ!P8]Mg}޳c;s;vX PКAQԩJhHZ(t*u-  JNdShƤ11XMڭg{l>g[=r**\o8p +3l0 ڲB? Ofw%pn v@bWJeBQ]-0^5!UJ0<ϤP\^ bA-:r}h'v8: <RcEa&Y7'3S5Uo>o. ׅlr8|r8r5\$QÀ(BͺUWBy(f" Ū~̈́C!|ZpM9ΐӅmޙQ7Ewiڶ0;5J }d\.a d/$pJpQ8 `HtݲuEl 9jmXZfh_#nǹ0vs\Lk3qm6.WUYekoHsػG)#`NҬǖ zBI8:7G0̄/1|aVETvwj+|G=82]z~~fD f.khe8KB i\2mNpށ% 1P؍$8ęz;Kޘ"-'6ئD%-t'q^Nì|Df[úKCK.v*P5ߧoF%`(b`b) @jmk -X]>`Cu6TZ$7C܄xq 찌~iծ ƣTلA&`İLQ13__ p-gm!vڂ6lk_> ʁ}񺸣֕Fip[H5Adᬞ4Mø;2DY\,@'bq.yޏ:ԁ֧t߀k(P >fL# !v:is_: }tNg3GŨ䝊Vֻ~%8dl݆3cXq%MG_)$COؐDRAĤV #chp^ahYyIx B#ZC-}O楫lz@ߡ5: eaZ;جcuuF#t^AQW80p/D.OXǢ lxl5~C#q >'boM/F=U}ī7u|,z*}>=~^L9ݦLXlu JN9buJSDǍh4Mz$aKC OZ6X0/YZI'ݙS?v:]u|JD|-^(b@8(k11.l="tpb{iJ(4eд$,SP6ErΏ9l^NtΤXT-T ґlɒ 7Q$ry@)'0CSCԟCktk )AԤYVSY'f02TJ^rK`$X4_.Cz_W0@iFܯ/mpdoˣx'(m]wij:RGLf&]^n'8q &%ͩ6W4gˊ>F2m[|[*@ 3-ac9P?׌c Dy{bpt~%*jPۚ kk:k67S b)vs=BOq&YW#%#5֤2 mΗ;>|~8Mb'ŗQJERS%Y=*QhCAiJ]4j(G3FJ7Uǀ N+*jK9~;SKܝO8G)wjt%ap$x`;<6nRJKK|>fJh1.帐ŵ;R M7Q?<9[ }oG.FDNFFI|CDZg zK^}xJсDK`͖{nm2qVgccŶf5KdIa !/OÒ}&]s(vˇx,p˵[5ʷiW&Q[>ͬVꇵ_FYŮi~_e: / W:oKAD-jKU}E6KRjCgs:0=3 Mx|t~'ovo')JCg׎Y5|o_՚[;~m}k޷b*TmWxadvM/ c9Q/ɟz0F10d23~$m:,Q8H-(KfĞ*S4·$> 05Tp$F`%h9Ƨ49&ڒdď!&JLqkc W?< C't -^g% g6'yl~xtӗFL==V@B.HY1E[lYZJ|S 檝Oa .$},D\k:w+́v.9*9[%01_o,V *oT |n OdOJɦR* C=CΠuIj-;:6v-EOnQe ^_Lw9=v7v _g3㉣ұ4u~#88ιCa(KGΨ!7 jj5=fM K_W8ja%[d>R9ER]&IٝbKW {%tE"yL2I3L0 UOi&&hy8!QqT&gyQeH&e&D'%DNtֱc$E'IDž( = MSLOC.<׽hw^pJ7]>o]eV:` XpH{؋}Vu#߈i"Z]=;oa{`@ ZTK~(gч  RĨi4d(l1&h <(% C<0 fR-S/QL?t.]퀽n*C\WZ5?&<תkdsWb@p*߱ C= IZ}g" ϐNSCH+z 8MX ^o8Wۙ&!  Wl>Z{= x96c["d[&0,s,{L=\8f_P/h]jKʻ;ޤ`UrYxGpñ`0$*N^TxaE07 0j\mYXK,2H!Z̡̡"1,GL4RLh+$KG0!8סMؠQl>B FD&Q0!kU).ĤEڝRW!ac{w;wϿ>;9%cѤ hM2U] EuBZU*v:ҀEMXENX5mF%I}Сw~>$1BmT~Ed4!pe! _:~Oi|/.vEc=R(҃%"suBN& VeiP I-p`@\' P3 yܑoAi}s8q@;DAyZ(sL:%X2ŵ>hx#-A#BHf R%_5y{5&FkCPAk.<~腬8:Y>Z`4Ys}Ri8 |U"!v}+?-ˁ?X -\䕧Ƈ>ۂd}~QU;T_(OTNNZUu >})9Y^}w2`r&Ru3{-}fhQz&t3 ([)ˤ3jN7cS&2;e::'zg]?~zM}/z[WNsT7xHūUj^@\G; P 콵\A;QD@M bcM@oviR:*y9 0!;+fmOgY*[Ho6=6>)\ 8vp BH%b 5sTT]ŪHרAġXćX$otsfp\E(_ UmfvV{q}VYŝQ PvoNMlT@Y k4-%Z9npq@nc|}~u؝vM$$yCAOF^;qm1doUpʢ[ДيL E\Xg'L@(Eݪ^44 hVXh12 QD<!$[y Gٗ! a^ا _ 2~!sT CA0 |_B;@Pj҆gb]U5ESjlΐ[eCN/9Lvs=sGS"(QPOs$<8޽,s" j!IWZI

%P}~j :Y Cj +Q 2:יEmB= %vv1DdB1ǘ:'Pn?3><ǥ1ymJIj`{wGbwGbvbJ,-ucj7qڢjE6PZ2~ݘ4MR(H61&HJ(ez={~UOSs|Yx'qyKrL?f W/U 2`ׁ0Pn\aAlfI5f0'͒9o.Kft/kQ&՗!jU20IyMwnרqdԄ,T@h MZ@vrAg:TT*\5]c˼7oW2GXCr1Hag(+) ?f>.CnV\ lBHg{y36Y`XzJ`ү28@zӜFkp^K a;_خC?G~:>qVWoܷ+'G|ym?yC߾TL=G #CB>C'T#ex9r`"0,J=(LHl7 mGT)%XRZe%![l::_uŽp"%RKq0a^;A7Sӎg 4afK Θu=DjV{, w%Tjz':ԑt`(jAjivkL~g3~̏2mmdHQG4Ysbm4&(NĈ˔o%|P1 \b3Vidarp }b70dU{nS &/5m{S}sٲG?%Nv<+F`_# ^vP}euzrDD SR, !P+ɉx 9QY`r(s7:'W'v:)1 " ǩ#1kPvb˃(Q$/je& 0'N8X*F21F'9l!@$I|QsDXaV@T]gm#6-ѬPF'rwEHN!V{A>`> Ty.luT> yO7{XR n{I*^eX;žw;=3 {OO9fIê'  S$,ڤ p>Ԥd^%  ʩj/8%ᆵUɐ5~2Z]0~6=oXM4mEKȋg$C#WlR$KX$ɒ!KH찖R{}Ź@ }HlK1a|Lf@*>O^{ ^ʃ6PG}< S٨#EYqYL"QP#V|o(喝,ɞQ@&`x2S*K\Q0(X:o}>իo{3{Y~7?ߝYWj}P7BKPW;z$-8%R=I+֟Z IPIOEJY}t| Xi"bd HC&גL<[#cƸ:c;a6SɃ?&Lwwe+n|5 4֕c6[5i04(y , e/r"@Vm3*1Zj.Ce AGXTEՄAIikTn^% c*&5*>n]U_)05wuH.]5ZO,^6:f^go C> n&2MSKRS6YV{.E1|r* N3o.9wo;NO}*AB57wq#qS!EE^PQNq[hGT :"J6Mh(t%)֣4 ƃ&${LK&yZ|7dAx9ksy&6##X ޽ փ4i [Zdz cᱬ )-1MqKgS,"u%R( DnV4h&2%BWhwmLPFn;)~}'r|qfGY+6"qZ\)Х'НCx ZRHP.rDzJHNI@ɛIcrSPbfApT!4T$SG$W">yHKtY&4hc!jkZrfZw9b$sߜv>ثlp:y4A;q^}բ,Jd#Cmd*nxߩHИ/{!ç:yQA.MɊV"kqp&">4tݣۭw(0`Zp,fqnsC6x ^uZLm 1cMPh4ggdнwDmp)ʐٍ{KbQC6ao|u ")sC!5:5&<{˴RPɊZSzO5jU5ب(Y:}2Ca)/ qWl hNe굺p Yn߰K 5T;1cdڼ6UԵ>_~,IU$+bMl=$^ ]1>rwф.P_&uh7qk hx"Q73ٞJ-OIE('meW>Z Gȳ/^Zc NgȺiP'[8'E;~45݃twl[t w0Lq.EZc)_ַԴ0kP\zG8/(lEV[74N5sSc}}< Ħx$gIxrj] c5Ý"_ˉḵ֟)m`ﷃZ#EmE 6dɊ!ߓYY)rѿb ń߹6fb9Sps݇Dgmm~\YrTʥ $)`w %GP"ҫ_@&`/}ML+56e"bWe6E8:;F8ˆ_S?|C u2z{ 4\ʭ^`q&+s*M T^'=pJ<%%9ߪTrKԘt85ߦg"܊﷝,b4lz >֨z_[<q!K\w\wx8j:_qUr*9Juպ]/8pZgizГ4'. ׷=xqFkhfa5%GkX\ɓpw:Ϗ;@e/5<orpٱq/mun݄O\OW#{שJ{,,KB@Xj, FY~J# yڲ*]UZMoYg=}NA[*aZ7zkNhGvxF ޻ӻtWܣOca/"Uo׹$MNBIZ"p F42"砶p vHYqU؇`[DžOZCN{W@yq6c 6d +HS$I5D&ttݝ42I IL҃bӕ G8;JTsXHe"Sî7.]t w 3-q;Mq4칾;)eקxڐC H'T˥j!U<:'tZQ!CmL7+oD;I{t5go9Ύ=$:mrsJ1P@>``,1D&U ?aA'C[^T<Қx!R1:WTn޻<{3>`ۙ${ﴒz"m~-x>ę%yiDt2\S% ?vEOư(\;3 iNGJqQY%SKvMq܏|?/>?r?|g_r]F ii 4GC@Mu͉B7TbCL,[Y6vS- :h]¦E7~/o۟>߯kh)MbVB'hcgX~|sW}7s9.ZCtA! Ո4~6E.=JG4CpТ8"N7 O' m89tSFy9"psѡݜ-oBRa!_0Ҹ!Q74P$\ɆN4Ċf2fCB'ߤq:j&^r//>+Mz#(B@)4-!> j1]M- #EE$$qo\'ԵOwRǞ~+~Go=;K>ύq,b$*dK|UYx'GN#GkΐtٯcrH,&9h˄GtUpUD'RX]u[r.y$Eei=Cn~~X02r\TmȈ^ .N5k:T C?tPWF+&u1LkEz{ [ . +<}]^{#:i^*#VD2Si *E ݀+!Y\S\:4Gr5nu229 ]2 faIcָlx5h[W'qYD5n EB?.z z3@=Ŗt(ѩ֡ߦ H('x!Hev:C\60ت/.u5 JΩomv ݹRSe`I2#R tB_۴{:4UxxtR[+ ;#rhrݩ5<񍲈X&.m r3aÕJ֕ʬÃ0p& cr}H!_]-EH<`/"V`^Sɏ~6T!b۳.uhfЄ9LXAWԯ[͡Vi wnWڍ^k=(8c Za~HQ6{]n춞ƕIuܘ*߱__P^V_0g_(}&OGgME^me7Eʫy1S W5*V*,,J$M a슄GL^|aC$%c|U+MJlOܽxîD[{o`J7\)ݔՉ\2f46!oML`J.kX ^ECv K樼ە욮o;zN|OVjKLFW5z2}?F_-^o"rpUr5њ¦kNMYK$_mjˎTjƈiQLZXMAX:"BnsҤ+($V8.|T;D{ oE7#}hABv,߮P?'o5M_I?Q읟xȄ7Dxthֱ`V97/J~[V5 Guh_E@`%m 8 0mNkCM?.8_=hG\V2.Yb5\rbYǝ@5N ;:/s!=VLD=%8 @{`v[D-s'/tgRv;#AdO(^3,?'S?*]QeL!OUш*j Wt^ڊb:6qq;={HObתCJO )`Rc9䡪U|ss^aNTF'+ (9J!ёQir9.?Z+ _y\z.髅kԵB/GZ,L9EդRKԒ[ڂ<$GL+r!MR5K~  m^KMN]K8GAH'ĹP%s U=9?Ë-N4oGmE CU u%K_ ʘQ~?S t;qSi^0j5v4ςN@?6 su?q?q?qo{mcNjviӴBˀLI ъ%c P *!.kӄjk:UEVۏBꤺ(T)9ٺ?X={}msi<4DF r!.h|ԅmӚH.܀*e|8'BpPvs ']DJ R|D/%q3qHdn\.ŢSJXU3`%}*=c'i#5߿q_3#ig6{FEA^ݸ},/9z6ih?]PBAjX?딎:f%԰D(ޯ`GdIW&D&n"'c#f ?3P4^@drFVA?^ԘPGpw.9Q 1!E0"6#1Ӝ6xLwJ:Be ;+撰,hñT6_Cc4]K̊ȵzGhZCcW(Y(B /#W[WM#7};W t^4h _yיέH\LkⓍ&쎭::&l{}j"` 5FY$oMkvZ cue{L ^?Q A:gџDtlyuYX%J)_P]Pޙ+=TjXK=)RF1TCbܐTU*ꐶ↕auv3\;z~E=^d.ܼrEvU_깥+*o=<@bay'81ub:DQ$^WS8yN|O|bλdieRu J{ZVIҍ$%qbzTCQ> ,kZeI&K (ze7pYX{/3!{O *)ba!iV$mp_%K ڼЃ&zp&.PB(Pʺq\i;ք`WIGNMzJ @Wh " /q79#As" fT Ur FC6#eP Y3ȶvVDƳȭ1@p:q5ͥĭ3m6tD {VX%ps Zfm& ]\bmq笔70XUg鑜Yl`])qb)H > qZfTL"*R',d'r(;YũUk֚j,&AުT *,LQX=9?0'Wȸzj,_ޖPՔJnNEj.v!vA`35DHfwv47MT~tV8[WEk1wtӺ{z7RJQqX˗es|%S)<{Zy*?Ϳ$L)tzʚ'JIؤ tR8)!'4-C> !&&#m& *_LR!. d2I:+c0]me\ߝñ}wvٗ}%L}ڭkmӢQhDhe J%4A?`mS@4ŸUUF*4.{N؝y|_yu#_a(ðNQ3r^QjT;,;Ditg~2I$ e2'Q@KA0 O,xp^e8.^Jrb^hu A @x'dDIq($$b9GLLt;o!S\(sYN-`Hv,tB%Y˳.XWV:ZX5 -EflT&఺)v -,Z{_Y} @f 3Ai1- %DƬ0(ƅ<̉ŒQw75#orjݤK\1pRZq0e_bx3 9Sߪb䌐OrCWep.m-[ ʏOսggthZʫ9iN~S]2B@DY,ICP,8tch ?ȷͺD?CJ4iD3„T|B<_ jfQ5lܑYSSZ'Ҏq27#s9ӌr٭ZVց=@@ hh0Jj<|yZBcr_6A48_) \qV.%T*)q/HhH\奆]i4X["D_jyjK仄K 4{UiPcmAjb!68=#L ;HSzGZwu0#C;w 2RKhRkjyef9C.No熠4ºJ&i<.RAR[ų0PvA&ƱkDok kdDo^ dѭYÁ?&Ü苄K!v%x24ŋ$2sTM˜7sL-TMf.Yܵ<Z̭WVա/ʟэ1z䀏!_egKq%mTl>qY:uNmes}{Mܮozj=nSxW4_,iPQ%b):J}Jwbectc'7V>N}Խ `"ydcw[on3S*VA~i|6i>=(OU #zx]q.]bBԥOEÅK1~W݋"BTxF1bQ_ ݿI+$]F?CNSzԈTݺuk7]:1ֲue#8mбf׉\RV֭<HLD $c"`"!FF1>HLL}691#x{_w9M}_,o`8h}zj ৥|n 5?(/(ڊԏv%^s S!ƶzԖGj]n.4{Tl̷=0y>T~n9n ?n<b4Sƀ.:T| jS3CgpBo&#rқDtr`0|d֛,Ƥhj%G4KItFJI1dd sHmdIwļA.:D{ЋBay g2Vߖnk%_ YzG4ꕯwh%Dw86\>stream HV TSWYD&`"^@/`P@*!& HikIƒD؊ DR7F=CGDž*ŭcغ393gμwypTUH +ES#eLK`.^aR0%q2ZF5גg~^q8獣W{JOlR]!hx#\ƇY˵oX6Qii5]Y7c=Ϥop3f>IW>Ƕ Ye~sыk}CV{QFO8|OO|"n{sONI-OM|1WzA4SՌSXEoJz>\7i7/I9cwj8+p%;W}RY{8wB:E.)OĨMΓ9ҔuJg(߹`;;/|ncK22|#^yl}fI_W~q*!VV̾Lw ڔݳݵOZ~qp?QR/u ;._Nj䁉N[O?u?cڄOL?>.=#C;V\sL.SB6ɵ+jVÃŁ ׿z%]flNqm`1L[InyΝWmv-͜stemr.ݼXwo3?r>vL5M1$~& r.F1.t | F9ZoZ}K}bəѶNҌXEckqO~=)?QGSgsL[UN]r!|>zϵËݾF-?o%-Y}z+w{Kw/s[dy7%znv@d|83\fb?]lӀUT]Q*w+y~/~ d0')󡙰졘 M[qeo%JrFib.&dF-ʞ]b^~{-{Qwԝlu kW֦%z;-6a<8Xr`)m=؋EoQLw( UB_KDHN┋ P/ PjDUȆj@kCeE+P=CoF;sq Z󆏫e qaF;ןNҰ*6+ /7z}G~6܌'ޗ;:j%>e]'OTnԶ}3m`c-N;5}R3(}E]}'L{tǶ.꧷oRuj5k~'[_~՜`鍲3{7)g֏:'9dKlom w?pseSݽkz[?cϮצ> uvXk/?~k55{Zwa79x  R/n=0t2+]5nje؈ ~v#RM~BT*2YߢSvv.<#䣩リrg ͯI:* W9֟O,zKņե 6v3p82L-_ ė_u1iwۍWsOp_ǝlzbk,p<ȍ!x)%w94#*~&$BHh6$6wQ _$O@`S P&">|g\qE}(ei)Xr0miK*m;K_OCv<{`!q? HzFMNװgD-i NވSwBz M:D`OpCC1ȌB Xq 8` ShSA/:Pfܔ9UʤĄxŬq3bcrbsSdS"#&I'M '1QY~+gQLN%'5:ngQ(!)5ى4eQCYMC`*]^MUl$Un~oGS"H.NGN@ @05cht&ij VCsl@ApBF9=,b^( a֗by*6ƢvtHQUPNl`Е&Α4W+|# AW ɹBKAG@@el04`aD2"8aBXk-K$(etXJDRB{M[9mt5y[;xt%10t9I'L!"3F!yGsj\l#mj{G(VIphAK,2I54Ĕ#`ҏJ)I0;Rlo@ 2$4$!%gn.@[aVz\}2VaaJ@c0gA/ bK/Ӂ,'QEf d`%4f8FCy@ LT (4qʎ$쇕{9aE匈[I8Xؑo4;YpM8GR+BY>#[^!}3O6:._/D-p)E9hۣͅo*'y=7_k옓 bK mD!sk@SX bQ¤JV:0Aئ):cS*4T6!qݤ-/{}!)MkJ]F}73M&0 `:X z~ ]'TIgfpN}NϠ&m<򕜆=mH o H"c:2)OJ&1BXa)X{h@Uڼ"?g!N P7]|')#= iMŘQh:l?o{.ouHa}$ƿܸMsrʴ<^$v^kk9vmWJ' lW̹c5UJhhC))y*@XMǡӼ>')Le]O)Fpmi}P,Zb gxM]JG4:0V 2sj|T2`2XZg֠u^E,_s4wlz幞}}}Ĝ}Vл ZمuТ^@gް潱6} \7_M[:ΞFaL5izKm~|B~c135.ߕyw`QE[fL _;Ь]:mQ. l#=42b:JM}tA w*|*aĹ̀܃]>[~w%ǣb? >1͏Ìk/?Nyϛ8str,xVG@|9&p^ƱlK44y 6 SI6yZpNԌ?`ݻA^kڤ٦<vVYP~osӧP>Ʊڌ[p|e=W[^BbLꗪѥ^3iἓ䶭Ffsb2ޣA]~es?)GMf8:\2b8~e؇}T{i >ڧ%H!(̾HL_kP~8_+>aIA^7iWn|x-| wo779+6(2߬dg?;E_.ԱeEڦ"FWy>gb6(/Z_4qFol-WhB;'( *# H4*I6cV*Jɓ❡obBC[oKvK{B#:C]X]ҮҝC_p|m{ Xֶ=;&ڶn__yzVu[gIp ^pݠ T}@*c84.e?22q%` 3q l'z׺kuڰF/8zz{ˇnn5,=glU>47kAmؼelU FyAO* A9Y3=oL<) d+"QW0v.tNcSNYQ~tz<ֳQQnB<rZ7hnLl2ZzQ/`]M%pVe˲/ :fG~*/H0%[<"J7l w fue6gek8q<x1_ĕ5=k~DHf*QlV(3_`BMت#VaUR*2و*|S+| =(Gԩ/*WF]MoG12D䵐8maeŭwPJwļ=1o(E}ea--QEԘwHI~K.=`FX\&;ED\JD@`-HDuINlYȲî76쫋H~_5ۺIգ( Nl8<Q/9n9$dvnZO=a;ͤ)%_&b"f̈́G*9&2䐽!rF(Ъ} f19_OrXxKn'U˲{؆ IB[5fl(8b-]7ߟt3$Iqd:J(~Qێ+ 0{w0U"s$ /rk/\JQ*i׌Y=d?||:g95U3~`[cJvl6D`<0j?_P%\ɦ90GiTx5TdI, Ct3;8Y6GH](QNx8h83uDu9"(U4 +z3 JYgΰ-r6|d/3%{'hܤEFwU2jMfA7]Tg.&lˠVb͙࡜,a$ J-j(xfE<9%~ ?#AȤjw RT$:LJxp_-O_:;P;v7x륟"ZyF_qN}؝}q7tfpքE-:jY<5iTHc>N%{dGҚ3/lJ.'=&ĸ[#ytp1_{c73ZpոGS>af W.g_*I&f.*9̠%Ǣ!UбZRw;=?4\fPa\63{#" <?(>%0*Rˊx7KF7#_}]+P/><}pEca$ NX Qf;q~fG| 0kp_vJ tuT9[`IgHnEӿ=ζ޽b㹜[ퟲ}`X)7e 'pzԙ/\#3'js:dN2-b-&QbfܰI%[i ==Gskz(cJH@4 J8N&,5fFLJlCp2+$OW Gw 4&BZތP{~ԳQh9jX ) 3E8L92T_yʰʹ!m̺ qtrJ9Pdzd1Dr&IFT!SJC%c ] l8Teu+U {'E0/`^XH҇M bYM(Z&~0OZ ;WWeFI6HUᮑ'(ܴ]@3ZxqC㷟@/w)+fcg<~Ȝs7*j2hMfECPTkw498w=]NÞ2]҃~p߸o|h.mG.n,IufNYins6F ak=RήQٮe1TAVؘ0m8źRˌf( čMrg)F @ѻZ͂1+f-]1ȝ҂a+ ϯ'}srypnnv~W㐟-8D6azhK~??˿/\0wg桗5ߌ9-Vfz!qLy!= eIp;(6a=eJX>]g`W1MfeHWC9vpTrRer$Qvl :Xԉ6@hAp" ![L&4TtzEHuځы@T`n'|o R ?kj^z xO(zՆCG@6ծ:ß /@DŽ;{hF&E_Ůb (+[X-e&HȢ.J&SXToM7ǹ8J2bbdDIZ[-RjjiZ LBKkj"anQcsK6\t-]vC]Cj3x߱3ydpHJd@-Z{Ʌ]'a*93a( i 3veb]L3c(uDf@OIW<>KjA"{Rcӫڪn/>ZxGp], }#OXy3ˆٱ8ȒbZ`>g5llئa[„  &N-L8l\5ud'1i<D٘4BpBfHpf&ӈ2:FOv.>rpoKJ"z,s^0+O򆺔_hH1nr`|b*P2*e a|KB!=B S U$gQ"4ᖐ3pA>9N$J1˙@wُv_Qgf5*++(^leK7Jn$I̢]P&~YѢ+W9MDC@SdB kPf+4D"~)?s/ oϿaUWMe휻>m؋/ fw;+گX ΛF+gίdLZ64V5}OOXJF,pmbe{KJ:ͫ 7EY5ՃT"6kVk7s&(vǔ:%PWWc.6 ޕi\nG#:#)m±бqqOKjK I/;;/@".#1T{!-A"|SE CD7PcӒ.-ȷӕ+:VvUD׬_C\*M9tpJj-P7]GSȠANC9R^ʴL2[rܗL8ߥWAg:HTr ֹ_o OP]STȏx^*"o7vd"z4982}]"_ܚ dj0dVZe`@i=OS;1 #z&ŷDRsϸ3aDȐ~sL<z4DoOږZVJ5?5+cH8}1x[=L/uB*Q֡iC/^<#rF!×ATStxH6wZhhwHmB&RNh m6c,I;{lCho_W*NI٘mj4h< MKο\R5*%?W2F2!"Z=&E""qD;zҟ" Q<%x6}3ڧ"oo endstream endobj 627 0 obj<>stream Hm(uRYfilӔ4e,u lF#6/c]ccͰL&ym4[5ԯ9G{w Y8)p. ,p JTC-XB <p@ {030` `nyxS&-_ TP0nGD(2RQQVLbcx%$(1QIIJNVJRStedlVf]TbLRMd^MMjnͦjoWguwWr:54dp|5: w; DH#,omrQ#ċ6UyeG8dVˡyam2y\fېWh͢-9ɧ W.b:7,e&WxJ֫٬aVvۀ 6ԁ0AchMi4"ZFhm#rN! endstream endobj 628 0 obj<>stream H׉W(Ƙݨ&0"jL@". h&nY45mR+XZZ];L=ک}I$y>Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4FO~p?䞄1L2ڿ9O5jtM8iӦ??ㅙ/+7fϞ379o -*..Yxɒ˖-_bUVY[oWVVZaƷ7λlݶfں]۽gކ}8xСÇ[ZZZ[9~cǎuttvvuu?~'!' '1?lןpRg*Orq\%dї ^)_tn¤Sՙ9sՂ ERTBTUTuUohU!TT1VD0)e=1L>%h6[2@ֶm[l!X k}պ`MXE][py'~vKsHvD? IsunD`5us:MUMRBUUF&PǪ&]TeNvD%,)QGa8D\tjLmYZ" `BXf[Y,:W49X]3t+WMsaL_JJHrQU&-@UT ܻרSŨP)Q/\|3f}.ŇKhLk\-eh`Ufke9XO1W rZPXIȮ,YŪFV

ʞ*FEGsʘDTI}5\,0EĖmlh>6n`If'VBlQ \2䰯t >WjiAWuXTa®bU\dTEŇ*4%'fuv_BZ܈Y҂Mfɒ.X ibM&C8X_a'pmAW-+zcUHBU**@>UfQѡ#S|b,LɜkQ\b l!-(D;[2bYtd#K{xQ2 PÂ4{a gqeYaR*Xʫ@_9UCeH~UfrmZ 5mhN7`ٓEU5=XW!J!vhe\ ĊހYs߀VU;bT~rST['|1>2ËpB[xrrNӅ.XT<&]WW\y-(Yq7ȪjEaU1*9TkƔ,}kuw<s"Y|.m,XӻbI&,NJZl̊;p3j:fFU#FE{ʘ3ŦKO 1/ڂEׇ, gׅ#JXvbaz+pnZƕ<KH"UQU USjUtbPѡ3gM](c]w"Ѣʢua,U+gB3 cWW\h7-HleNW*~ƪ.sQ溹US塢CEwTOc6!c]rӲ}x?Zh,9Y *`ł>&6nnBp?|ueF; i\-4;YRXjۛ65`lZOV`s 0#hO)Ҁn軑{7%wlݣ%Ke⓵{坬xXpQׄp -ݴx͸*]EVz_뱪T )ɪtX'VԄu>tL HkA˪l5SkXU[QjֺS 9Td /͛nGIʳ`x/J mh0z,,C9Y^:*QVK&5L|z_sHs%]ZYqeYdVtpXmjgHU=Ui"S`N}{``l!?X^;[(iʢ2va ,^aQjNw8XϠ+lA-mvVVxUEG U'Dհz͝Z -m@vᅶlZpDUyhꐇ/xs.La-X8fVo9$\%(\y-d\űJ}êSYձήHUT*?ʼ *P5t<@Zܳ_|玹[wNr&,^\rL L`Z43CՕvq\fcEǪV^*~G E ׾BTpPՃ=bZ+wӷ7IwXE8'ʐOYN6继t5&ph7{,+mzs=T)uۄ +T}Z%#!>6,n[tD>d̊NӅ {)o&5sHP 4-oAlAWay  *@Au,vTK% nV #cdĐG6L5D%qhe}:y ˞Ӆ“eaU",y5wl t\;+z h< -XlZ?oWp@B D 6 nh!Hs5J"ēB59j%,ۚȲG `o g>qmFn2`5X ^\gUW~;dBl,M-F ǰXVg I!w,TrbbQnMt\ׯ: +f|)7U}V\t)SRTQ5œªڬV[BK1 W-=&)6 ƻ2:9:{%^Xnbm k[p+ehT +PwK"UיUݮ#ZI1iXʒʰ`a'Kӝ&VW=~u -ȷ +lRVnYqXUbUaHT}dCݡHw`T-n[ HSMzh),/+܆7n,\ΰX8 ub&73W++i/f/eU 1@VׯH]v٨[j!4`PDlV?&Z}vaݽsgY\ee ,wzaQ(+ ,&6++)\ ^ΪV DҰt՝TUVezLMKcO\bKˑd ,Ⱥ-j5.C%3PVVIzX|b 7aM_]ՖGq%UVo*vwQe;=AUjyee8f'[R}jQ^[kPeo3 +.Q(7܄ag~WW`EJoAiAr v`uD +b%au) ՇIIvVmZ-jk_CqV S\ fi,,eȪXd:̰X/VX eb1zxO0lqE-Xqށh JV?a5qK?UT 쮋WVWWE|^jEUK%%OE\`,ҙ"bD` [b ,lwXڄ2&tV[`\܍.XSN*V )a *e%1Lsb[V+!)),!2+2Xo?Gk`=[տzxJXaZeOA:UVrXU eaE1LoW'VCmyZ+ȋUՕdi0:`8X3X)x=~u̞ )؍OFna5[O p`eAQWg\>JhЋAz>%XQJO_]=[duHXfV8xZObXWv`ʣovΐV˲>U%ZnX9:qY_\>^,jX ƼrZx\UDDxwCR7i o^pO:lݡY krWXЕgu0IafuX0s*]Y!h$jeaQgU-!"[S xgĜj%} -]|t9XΞ9urԎB`VYOp#:EM2Lg&6m{K²l"Q(AYz}߿Cs12S\ V`ggV7#̸b}jY%Uίn 3+r%{5湬PUgSm-[.eC$^YlKeIZXM&{uaUF3$*DWVj$RRuU :LV÷gB p0р(G M+KҚd,xƆ++Υ;ˬ# Z /d3dbaMNUWaw#xj&U=d/)QKA%^Zp*2j5tv׮YI@a]Nl[#+Ʋ,fe./0+K{$*X.+f꾰3t+VŠ30XV!Vz74t1zԷ ), ` p45n0UW]eqfJ+[+aի: baM9>X G?0Y"Vw 9frZ!+f%x6@bŨdC&>:: _ G u`} (WaՕeJXM0"*:Zb#P3VV>sbJX=~#N{<]]뤪ɬL6r˒4JDe%; |+˃\,k0`;+pZL&$kTa2Œ+Ce{ ZAVʪueIJrCP ;VL&ά2}2.ŕJ^! ]Lps]e)#syrvNBV1 Pb)iא=G( DRĤ~0%[<_*-ӧG>q,+ ;&lLWbzJK)z[ru\*\)V8m'ĉ#"0WZggI▧0uT9C$E5B'dc"K VI˭cLB \LW VSruWj+UgiBUP g-ᤣ;xte\AKi}*~נȩl*Z. Y' X.+ +V_ - *W+լ*ML݈_pY SJ"ŋp٥\x Za偪:7cpP"WYRodNj[+YwHJީP=cAJINv‚?w1ߞ0W`+vSpqYUW)WHJay|REYy<pcMuel;MASKTڙ{ܢU;gIwB6>ȝ*r}EWz}XqW B_Nu9~,Wp]1* JUU?>;nt,=NVDKWJQVX $mﲺ3 )Pc\UX ]W+-횂Lr̦+=娫+*;ᛂ* JRP*j ɚxQ0Rr])WgVR[KI W:xtU3]qD.+=ⷆU\#U{;mV;W!]Bg<#=|+&md)ZlF֓DYK˻ Kp%R, }>TwO+U5PG]+VCWƕV8vŽUJz@n1#\,p{lg}< ZѦJ5"W dI\IvC^'<6Rc)X$W^SAXŠ}lԒo]Lpcuz_u5+J;t\)X"mFF.z tRv-/EU{/{dZڴPBw\Yxo-///WV.,ް>.-IXp.7*JNYs]uO2. aUPWQVJStN"r4FdNs =~n`QY3 Hih7KSI^f|YHli"b(N|.LXZsaYu_({տoU_ګbutzΓį+c`ow;*$ Z.{ N^ ps+Aw9I.^:i)/o$m51'Kf# b q֫`]xryZ6,io>UJ^XEWiiO R&XeY!Viɮ! $Ȃ0W+Rv}p4H!"3kqfh [+) +u.: AtOIX^ |{:M_ ޗA+^*reB⪢Vn%b0<WKB0`%/IcngҼVO0Y,E-|\BV^|%GqLXZ݊ v&P ,Wlr>_ ])WTt @+iUU)UĊG2$bϙ%Yf)ig[.d)Y#9߀Ke'`]\DagA_rkdȕ܎XSWQW`Ү)( )UUU(Y(tiAfrHBIS,Y (eERhd` ,WڃVR]UJ`YR]i =m?V TUMBNumXŔ]hiba3mgǔqL-# -&mBe`VXG^XCruv.AXw)(,\UN]TBW++ulo?zpKnj(US+ʶ ẹzfqA?a>f:gU)z%M]+\-2)Y\X!+Y a5\,W\W,_LAJGS Uԕ b&T奚R⠗kR+y:U7-[/$ Es6f[Y7o߽Qۓ0 X,#+XVV!+ȕU9V7 kW+K@PfUJIZlbR+VBp,OCAa=s Vʃ W Sӳ\Yk/u}ߘخ+a\5EW8%M?0R+*`׺)[J^MXpU1=0p$-WJp$#z k K wBT㓳)WBX"WB\ >v1UNs]w,Wyʕ늭om럟 HMMTcELWi@|:VƠ3u&YFѸ!UrZr,˄%IϞW{&`%ºU֕ ק1L]UV F<G+yٙ@RHU-hʰjB7gZ-1ܕg/hmMDdat[Xm-I$:5XE˭%VsaɄ;b\p-Z*bz+v U%+\%[4WVX&(J/6.ӿqZzبsѠXA)Z!bS2ϳߗຨ޸g<%taESSS*5m"fDzdfGY4Bݴ/Tc+T ,Sw ,+!x!;OO WuLr[}خ 5*j\ bmpj\˴q\q9J9kVJb&}gfZ,bM3i,Xkt[Joߑ&WXX+.Bu+3,$O5ȕZ;7 p~\l, WO^\R{yVhւ\&6}JQFLgg<ha5żQXm\fz]4A JnX[X9 , "Wa-U\1ʕo_\%*רA N + ҤhêM^ ϴ8c+Bƒϓ F4ytDK ̮K;­h ;#_Y`:E]0Qsg`2;8`R4,WA^^qڕaUѸ+ UU[)dMFgHQ Xe2'Z@kN)9q!66\)St_j*`\wU`%:c+Z{oJj؏2SWe}^!P>W&/fjq&O4r*T<~W );GR2= [nuRk0rLp݉lmiH"Km#v U͞PoP奥%bf ChȊ)XXfX uPl`z\Ub& ,0U\F֞RkvUSVWR+h;W\ +Z3q\gX;88#ɓps-%l%oxp ZQh)YEv;n 'Zb.,++ V͈qahOpUc+&Y]+AD\WZԀq 2T+l6A >p4@ҟ2Ն3K : fq#XYyDb?ZH8$WQ` ~aW"3~\i y\\i XA٣b\yXmK;-oi\p%XLaE2b6oybrٗ߈ٖy akix2ѡdid5iIW&n}T"}*;>B%P7؄\cdYtƕ`U zQ j\Ӥ^+bC^coWvBuXiW,x'?AVu+ ȱff !ZYhCFfLPzB?+6"4gZUEꠎiT22Rm=j %,^AOYΎW"S;Wә(XԪ`%T+G^0{ݢU3!@p*0"K"KKq%JI`+)]+R;+{"\i Fnq˕@*{X-zqj\Y F\x\+ Hݹeq55V[[[P%DDqwO:9=9&Z>yy yRȈ*ZCTY-1x+ 7x䊁â"ϧg2AVʎ+2Qzs$z^4*WAgv? +Lau*`ep^j0ŤlijjrX2@KG\=G,WַaU :(KLq;p`11D!Ɋь+/X\&EX"|;g),¢b"Lp_4,W5Pή4vԒSrEVHx^u W2|6BwwOO/鍌>zכ_Z.iN"Qo߯~-I0Vq`ixhUzX+Bg`DEXZ.a:Qk>eЋ+R\\yX+ n*5(\uܹr^9{P FYSvţ<~+\K..N%ɼZUl: -,,Vos,B+Bo#XܓExkq5JVAn¸2#rXuj U!̈́j:%aLէ?}"[++ \ZB9dM K57kdTK`%pi!2\=c2*A+v/pqJp巠jNҸJs1rÛEX*niɼ3 9>4޿{… s %yŵpediX$bdX\ &W~-BIR (pE~Iq.CWuLqŹq#Q(=h/+{Ujb\*AUZ IEFGLjw.Z{Buxtr!sz T=_%2vOp4/HldnhjN!ތrT5KrEX'sExmk֞+bJhWIg.1?(`Tq\I\1cq6l&#vX]^Bo޾}zi?.>GdmU25xD(VktuUdW=a%$˙_ vFJ*Aq%Y*Ҿ%-(&N-!D_:j\ɦ'qI?~y <#Vh>BP5[sͱwD :9"Y{BL&+Xu)XW&X3#|zNKIJVh^&*1UJ*Aqupe-|*W{)^RTcS ܿ? 5:zeC>YG  r;]kaa%s-=XWR8qWҋJVXP7:{WʘJj-U/ ZC fr#DnOqtu܉C칀+ap`ŋ*jS\m땿-\Vav]-4CU']^Qlŷ;Uuĩ3ZZ;n` GV,IX}f PݧP)RFJ%# ,!k0{zU+,bpR >,CdE`q%ceEց+իz6(XUƕՠ-V- XXK,b[c 5xzg_*fJӐ?G2h-OL0>19edBY#C\k-K4wV}HgсρP T*([DKzS, EmExnJq,ʨ_a#^a` X}Հ ,g :t⊳aj;]4J]) ` WRv+:CoO[7AoVUqЂ0a K=zӛZY1MN!U:ݓ-e!ɂ/uE]s%;  MKWǵaR\51˕RWpU(Ni\q4gwi]Y\:z%589NXUt6E,YЬX"blTVB;3VBHh ;E  5S1*8yyv3Jz<;J,Y;Xl!q++XZ;\d2=~.kP `ŪB*1B?My,W;;pZc Z+@@TYX@(X4!quT+R[Nyq͑*Zwh)RW,W҃9j*WsP:RoWm5q"֗JF^<2-H0orE-㊰z`; ;,XhB E V[Ӷ<VYB^ܽkp(>+ĕA+Wy sP2>ۅ+O4$6sgpMUC-XQ S%D FC.|ba RE$;-"K"u];/BV;  YΎR A? \\G++[\q +A23PGsD jnvj-uVN\q nh!`HLUڂ?XA U 1,,jB5#EE8(NOKr,!K,p7!Kc+[IxV-WM16UOz5RmW'Z/rقM R\ V VaTJ_;ǢEdid` ,7Ix\ Zwm[撺M] ,.BI++a[Wٸj*Ws^ͫ3,+*v yeg.X9\[ r܂$ WW)dcJ X^b&r}m0j.pG\  Xh;sգޮ{c ھ\q\JHJwhvlW ׯP R\1VV<>7GYYbu"{a%0 ]7(X݄ĕAvΤjwugP XGFRT3dH+A,pwK®n5\ӸήXX UTG1lqfQdoTݼug]k<9:<sV RRM q`MVIrk5rUOYNrE5\i` Xh؈pյ"WEE~J`)WXQUD R\'8quHU䰲T)Q Mp % 4) {vz:H*eO@4\ʂr`ZL8W>WIU*36_y=XRZf $x q֍+A+-Va>cBJb*'* Hݩ ό (L*J^nJznR++s)_Ձ<·p5+*݃xc\Wh+dzrjq+ jPiAr+*A` 0Y Էݘ=wԄ X*EٯTЭ^+p;Cã>Wi ej`Mrmbo@dd݀Q*۫C$+c%T}ߑ?C\߾ukjP㊰tJx:Hǒ%U M`$@;wX҄tVW"FEq,Bj쏭4k혃Y"1+U\M V+sU]RR+aJt2W爵}E51Hq5-qjnvFjG` X}Ru08>X܄$eplx'݅\YUߣJ=AU*m*Oq>8(Ws5mU(B ,W&&qae+-`u$L k` `~fV&tUjKU5J􊹢G`5rp/yjUo&Wp_C~l\a^i NN[z*m+Jq%n ,noN &!̝ú{6!2wΪbU)V-aE[PfN~M":TKSbrUvzC\mT= W\m8W=ݫA7 V*+!ˀŁ)Ÿ92GQjyqj"NtuĨPӴpUZ܂A5ze }pJUsvvq~\",+l(W/J`RSo/^x ٳ++.X&ai"\ד]~lz0UmDjBs[7X σj0+\A_x?Wyj WgB~%\%}Z_xxluW9,K[V1=B kߍ-Q-Q"L ^kkB ڙ)+r sv`FKr c,A++%2#V?{*k=֎VbJjP k 5 \s#U\+r5 \!s1̕qVp ˕j{VrPʼn.B Wf 3W^L}̕]VXU7Uՠ|LԯɞnwֱJfJt#,X*+`N|'yEA]M>s5r\e,)W;IMca\L0<.*ʮ($30cSPA](IA\]We;=4mg}>Oy羯ts Ľ'$ \jpU\*WrC]<a1r0W",QN\U\}걹ڡ+Y6dGWMQ\`") \a\8.\q2+U*Jl͕MAR~ 2= |mOdypUl"f抯(t]eq\Y[_C W' BG뫊ׯrqVթOjq#q& uyu8\53WO*q!pŁ%` A7PVYW$X8Oۃ]s$\M\WՙW? \2fZvpu1qlGk>>^^ڇUK?Fm8ŹcRՠUb \IvAh5 aKKjJC܁-gg<:` t\A "WE(Sw wWw> ]l 65TWa\IRbhjh*?Jda n!E` X⪗jGlqwa[r+\0W7&]ρcNRaeWV j2W3ťuU6*B .[O KRܝ)*B"ԓ * [Њ+A௰Cn- *pTHsgqws%u*j3\`i {#q?.EX R(k++rUDE 6&C\ \Ns&tegtYv'WooޔkoL*B0X8)sIxv tp5$rsUUn7 7W:, %Rp-IEE;EX\_E"$sׁuFT#(4V/q5_@ճᐎ+5Gpj/Iw2B҃Ps5 4ڟp"v7W8EY➻G"\kŹXW,'5UVC ..?1M.MAUOކx+4]{a҃7\Xv; WUH4NrUZa:+w`# WHw,KqO0O*Ee/e(B0[z`QdYG12%Ek#X;w)қj-X4>Pq!B,:W U4XO\"(W\ X1` {4.u;ӮIhe倊Ċj]U±=5%n+3j 3JME̝=} uoqnvfz˨;%PƊjj 9ªXcVԂWX:,V'WL(Kqcj\q2+<;v--c W2EZ*vp%__*hPܱ7( Aݯˆ+Jc别9u_lGaϺ"؃/#'Wx,(=*\ l\C P"FK+ mZaV0M8p) ՟ "$>~xq-`-n, +2XE\uq +$EH\5W5QW8 ¨5;Rp` kRdhT\hXބqbc)*@9ickWq5*ZSajq[[( UBK^BW檟"WvڛXJ+ \azqoqe 4 aw*=q(!T,ل QYP [Wǩ;buakq aZ VzzU r\ Xĕ!{{sU^V]AXĝas+b; Eދ^!.B,Pf }Q,]܅D9E@:6lym1‘j+`*ԁy+J+7yѫ,21*4Nr،.X^NUe]E(V`bݾ.$.`XkwI\Dj%"3GaXwgU0f}EŔwj1SqE残pU]s[W{8Ε=ےXJxG/^S`r`qVA-XCldX+X3 ,!aYpXmVaoVRyJ\TSu9V} saq/Ă\T^ܥ)[]\,_@.EZo+XkN,,/?- *RuU3+vO+YAv Zg-hibeoG Jq*vrU¼BB:4W8Ub^.X '[֦D`9&Y`Ir.X;zeBlXY,_9 P9؁(A`K :"WvnZo\y) :΄?q5\)XFavFz8rھ'U]VRUJpUBq "E/$W+\ϱ,H!Ņٙ錌,OUE07ڀJÊXVqp J v> R*nmۛv5[e+wVj:ֹr른`P?W^si zK7k`e?ڼiw#saE]v}}MY,C"[zO*ʨbZ qv+X; jOk{:Wi!|׸\8qXLU[lZ_ũYBq7rUK!W)qWkrV_+,_ЙBEX,A+< FQ tXXs ~(ok葮WWjgZPs5豒tq%zUuU)wdV*Pj(˙V:7+c'Na#4K]2T\ Ұ[XY\=.^qs/XJ[c0pBXy ]\I ^\sޫ /R*:I=.BJ!}N.BE;k;+ImdKZݛ~%x0tYYvoW +-xaRWPʰ +^ ֎՟85U,Gbq?W^D)X.m\mhEWRXbٟ_|tٙSF%LTB՝Ɍ ťgjq]kjvr1*AؕUЂ}n &\*Tb+Ay&)Tũe0ٕ+K&GWE'XZySx1Wu;VT/Di+zEz<2,#d{a p2īqh1pn#D)059%Y`Ƅ=[FK?S`u#a-jp+ -WfWCA\ +WyWC5jMr%V_JFGc E;s"lE2`bBRUJ%,gK(GhCuR 55TiX:%J; zITkW| J b Bvm6K ""qEq!*8l1_6,҅'Ȭ9 -Ak !uٹy ˬh #}`~>iA+roMrUo\^A*n(j0jUW*W;`" s5s,~D:soP_AauIR@4.Dd yGL(P<G NͬajX\jn,m^퉵-XXi\僸Tx;"W=*XrcIA 'J*.r"gEhߊ\u_XTG[# 5B+>C9̪ljDXNMV㊹lQ%\f.qҸkɕaߨ:=u\"|P],UWXmz_;, 1555=5OmUY,C! ޾Hp˗/J7_a+v`aWWHSUP56*oqq[-+0%W<>*ڣlߛJpBpErFh\k`k2+ᐫ ViX"V,DVe/&+,ń@Iټ{=ZQإVJսi059T+uWm1W\Au\rz%z_]ƕؕJn1ѫ/VߊpgWjXjsGefM(A` 166CjP?#Ç# XIl+9aP*PU[9:] WZ }=PĂ11*ŕX|5UR7P59s &n c@˳5Eyѐ(O?_^~o2Ёeh^'PaHU]Rj4".zj'۲UP/BVkj?oMLq $|Xy1Xr\8q.YY`)X7,UQ, p$diF!~' +IeXYjNKTȪ[GŲ֠k֨+g6.st5r&‫{#tExAhkW%<ŠoXFVo] hFZfpTbvJSggrsv~rR4RaK@%TX W>򲶖 kНj;+WZ;WY0un"ד" P&澡*m"d`YܑkkqM[!KB' ɒ{u:#tUv+}#Q#S=yJ7}\i ʕ)Cim\e@__JE8Ed1]` W,!=lޙh-BvΘWsW0{{?` ξ%]:`QT]"TJae נ>G[ :9I`WbQ \iU$"}=+= S} p_M=ߝp%`,N.g2mOd Y|rDkC2TU`JulU|[ήE}jȒqu`z֠vm WjbZ+0)٫p_8VB ,Gd5d%J7.,N} l'E3,??`ʠbXVu\]1| Bm}NǕAUhNBuʞ#1cEsVձζC*DXRb ,bpY s20"k[ېL+Rm`671Tv^/8ҁLRq-ʖA+Pd+ 1OcӪ\{sEVmu%Rs6B;WB4aw#2n`"%@v҆{.Č?뱟m4v  \P`UW .^w\ V`MCӲ\ZB̅Aՙ ,jE"Tݻ"X$e`*X̞,뎬ʎ-[6qq5<9VVnd)|”B`24AՠpuŊ0X[ ^G3sk>VBV1 ,g(B`1]՗XB`,9SHN )meFa䰲=0+m?aPqt\}b\ WRJk<pڵkmnO bib W;j(B1w "g\ufs3us),QGyճ c=RjE WHV+zڞ 5֠wNK`#k%\iUWj73(3fհFv,B%Hj V` Jd9 XsS Sssseğͭ XGX5: jX-|Ը:LUM/UhruJTk\ge\-$ ,2OE/i|LM+!(,C1nLG|lAtXoTc^?Ī` z"qqurԠ4դ\iU,BI+gڮ{?呀Uz EN#%ɢfՐʘ2 *ܗ08g +V_OA qUc\fqsk0~Ĵ*W3j Xi`1=WKaW-Lۦ`cYŌ,,*9A L@SS:= + +U4(M2<tăsqk+NGGڗaUկkBEhV=WXI`#hZSd::o`,Y6("5Q%zZH *)!U]ZC%Ք[WnlFqf#cVTkU,`}X 4Tu﹒oy0LǵA.KRTa#/#ilZuH Sjdd99917V.4#BjT)S>GpA9UʞYUW+JUӪ\a`s`t#.:X Jh>1VX===Z9 Ǚǐ e$T JBjt *]YaE,<4``HbWWbW9*_]iqKeӲ\Y`|`Vʋ I"XJ`K`P/(5 <_V&bj (b@$"Fژh!'މװWJ׉PRkz՜ק.AG3.X+ 5KԬh)FT7sͦ+eXժ)Ve *=K֩Q~l8JrP{ŠꊰꮫW_ W6*ǽgOd-NBFE}V[+$xspiݐ)j_`թP1TA5h.0)H]A: IW{JO@XˍR JWl;==fťhML㟵R-Là߾KJO&fԇE ,b*ݱ2Fce%pRXxu;$}z Kwou|ai %\I̒j:!0Zd-!w5Hx|'T:-js#A~"<:Vը9ME/mnYin\A+:rUI +cJsH%a[kۢ-ND>py(KOj44aƔD*fwr7+AUf*#RROAU+'p u.ZurVrUzGB7z{<@!, ,RNmL֢J ʵiGdqsGyWdʴ7pSQY af])ផ+ } A̕v=stc%\շ\e k+{"Sa%`AXn&8llFҒBRWRffbdd*k֘QsrL$SAU`V2 2V#tSxneb]}\Je ' @Xx$#aG>XwG,A<`E%KӰ6MX)nUxC "+C>cX-(UKB}LOA-X )h4MWӪ+h{X}UGa@Xaqs= =XQd NusKp`u0V)\4DM:9Ъjt*ȋ]U)wzujzeQٹeFXË*=Aџ].%\կ\ šiBXNXRUX?%dPOUdJ^]I &ƭ$DX&c`u}E{Q .H>t%W )Zb]5+'vh`yªBXSf#'v ,_=X XzhYBZ,"Y63,S'rd"0"PF9X VDWϡ+? ҶofEW\˥[Å"U!!cmX:&`ўxy* .d ZJKГzVxכtV,"/3Yn1PZ "Yv}*<\kբ*(b!/=>*85aCXDX.4 =XٙC%#+kAZBuӁI8jT:WU Tѽ-W9#83ЊRŲb[ru,>;S\:aPӕ/Ε)b25aMBXs"DXq`V|'w:\# = Ғŗy`͹L0Fd94Uux^" b+?]AT;reg`uX9]=vXW롮UBi/W (eºzŠ%\DYLL4|wW84 SoAw2P5`8&(X9YIFTul谢.f]a(Ii/ -'\\pu k ªnAXTX]{/|J!K2YNZY b ,6hU V +/*,ʰs` cUzTVOgJ:')+*JЍ?+* 5՝// kw}:wcAX'ֱ8&kW,:h|Ubf uEXbV+@ Y VO+̂ջ`dyb`\iq+*W ,T T\/Vٶo>d˔ER6֊oĄ KR7R*U+NAje]djL+V+-l*(퍨#_KCbt]XH*{SuVw =WrGK%`k4`(&;hEdy<}@i%`0 :*4f8jwXO `]IiX ^pV@ ݫ{$^=JR,G־$9[!Y:t!Á\R1]ʕbu'+UqVl`+1 R9v))xU}K¶OB.l+ CR,nY;5`f( N¡!*@E8»0UU:BLU+kVV|Ze]Yle.7,f~ RՅu4 e&lL'BfLb,#KPG,4֒l*Z3T-̓AQP1P&Mpd`@v\5Q"hvqHR8[Y4 j I -s ^Lu˽ͷ\u/~NZwA(̨Vĕu$`7:ZyR,I2qUЀ)ijLVUU0BVYNz#аr\Ev>|Ϻz_~W$5$ALI:m3a}y7I4['Fl IEb2Kj2fm(D`DEZbPJǚ{}rx4sÿ;΁bXPDZ$BZcY :ɢe%âTwwwn+/ UO(VUL X[Ȕ%:+~d7KDWU-SR9箒SSzj\Ku77!$w²^yX((d: evu[z_x)Kj!dAj5IjM@jYi&%I ^{SZZ@u$l$|L U,}_$~tT aaH "iҊeѳCZ"h 8Ӌ$ a +*영j}CUJhhXq R3q)nRjLjn$MeW, k ‚mGvwPE {2),V-i*z$ʨ~GHtuTŦOCe}\ZfejKeҞK$+vU\-xMS# VwzCW{67_dX\uh-Ϯ*1OhZ!X^ĝ5=Ŷj,XZop<@K: M0/d$۹Zi*TVȊZ)O_n9:v -)SK[#W`UsTP9 M W+$!$: .[ ExggQJCmEurwePP>HюHX*.*dG^%`{adj**W]lm\VW_HD⣐˻ `ec>4rՕ(W?\ln\VW 'cXX+eŅr$!kלyXQ.EGVheQͦpUUBjbbbfOLD$-9VJD`x$ g>pyY鍛ٹ\urje`uHИLa…E6E*Y;˕,֜܇$ D,YPI7aRŦ&'iad ^i]V9 wABYeNDY-1+ӶI;/WM.FTT+ Q>k++ǰVdemKi=˕--Y,x"H/-Eq%تJLMO 4D٢˪qȲ򬜪YVoWՂeUV׀U j\RW.4\IxVbIwV:YJ-a{ŏdZz]+) Vcnlp\Q/aAμPad2"P jyr_MgJպv_ +t)X5DPT. }ZQ8Daѭ,>+V­ŁX,ZY2v+ g4(˪H,+Q*}Y%Y}PVK+ S0فUQturZ2($X9ePNC~eEvI,֛UK,YJ IQQUEJM/,փ;`O9"e%(1VU*׎^jY).magV#W`YLB +tw= ZǴ kׯ,EKiŒ܌nPbq@PUlZaE*_* ѳO̬(+w V.ԟ\VWg;_bIwWXDa/*U&J V1IIOPW,LnNg5XyV`#:}0bIw7G! X3ar_Y$ le׬Ey"Kqu5]IҙBRZ\&etBU>aae,ol{UvNA`UU:mSNvIT,xOXL`KȢL$YYS,ItJ?L`UYv[. <ʰhU9VU/z)nkʪY\VW'O9[IT,rvAwX#e`ɳJ,yt-i,|b20^*4+i';AU[V_U%YkfAd3VeX5;V VX(TXXr.Kɲ++X+%h hi!$7HJM9Tb ?3w!uW*b2JeU YcXV?jկ+juU[w*VX(|GagwD!aٳ0L{gX ,jFZ8yiٙGR}TByzM)\f˲`[==UgUUSNԞbQw‚ , e,DnC.-e*L }}+>?y9^U\ؽUmSׂ NV`UeSvw< O岐;;ҕwrAA26EW|rAR~s;H W&`ʸ2'*XV? H=b5̬z,m VթGձuGm8 Gָw[<>꫁ŲvJ́HOֲX 9dFe&U($Ͳ 20d5&V:ES=v;$v4X7 0 -,^X+]Yf V<>Mu;4yU USUtv?Ϫ`UFX=v\^I:OS Q=wX`M,_0 }}w,\X+ CGvs\x?hЭRJ&BT%4Wkj3ޡB=+V?7G?tQ(n `= a k'%!K][YnmEyH3{QdPm&fkLmXUrD2!>fχ߃nukgp2k[َ&1KL\rM55q_3hCO0aʈ,2eR+B$(`{y~=rIc.ê#X5Wx _CcFmYns N,7 /a}BŷʩBY=?AbZG|PyEy J)UV& TW XV=̪ZT+=W6446oԣPÂSF3g+‡ [HK-Bba)ZZjj(FSy*S{>>jR: `u@'V}̪+fXm7445(AX 뚅evT)2 W`[AyQQx9)c~ĊUئ5v+7g`uxfV"^#X4 g.SFKޓ[KcXC`{M/FT_b)QTNI!DiǛg$[U(`uѱ:;U;j j"^u Vk CQKB,Y Ò"i]~#%3(Os zX麮Tt Vա}TفUVXmdV덫ERujQ\wͰaŒQX\%;BڲɩxMM}rQJB5E$ | iVFz*3 ]]/gߧ{Qx%}% # ` 7St_[rRIS1Wj^pT °x?_Vgq =|`_OVmjYW7x%*Srɍ-[.kowOa&`naT0( &=.->)<͓fj*`TIX+PXA*@O-Ye2"^* F!T,8sXQɢ[xn\0~r `iJ:~kjJt%+y7+ k+JTr=qeduA:Yu+պLMu,tU`Xvukgn*Y\5,xQ tTTũ$̟JgVo,jc/Q|VrY]j:X)ql{`# j^T]UX,[p9a ^ѰdӔ,k乃 Vdj~BoOy6޾eWЮ&'O w'X j_`XXS]Yָ[+UW bIwװTbqƖ, ,XY9E`ŬlzY ]_6daVX,*j,tX۲;L:|{sS;wVbYhQfsMWoz > UWWxV%OR5jE.$Y)}[-Ab.SVWsxjjrlMXquF$Xnc,G qԚŮg#+m6.+_A`E ªAb%}[[k˖TمU+[ERujyKKk\B_:=a]AX\-]zX,˧eBVX֌U4bX85y +0FHaPX+VXagVۀզFZe +V| bUYE7AbXp>QeԸW+Xu%M;֟-]{,dyZ,jV,ݻV|y:UՄF"+rQN:ʄmj0ٛj jqAT]-sV;XU:Xt g;:wcr;BfڅqdݦaiiYt szayVFDUz~V*X* +u|0bu&j_djųU% V| wd]YX8ad!@PV|8`z%hWg3/[aUH@+ZiV}GXQgĝ=SSMKY-2~_+=WnxXj& wnU(d:YHfV4Ǣ"jT4-JҤß8UqfD\םYrV<]goXU)V JKU`Z_[O%&a-Ė5h"C؅ ,ZcÇ;X` jUBJ7aŬUQ]Uٰ*-Wk׬ZX-yX6%KصW,B+)< 98HkZzR%cc.- +fE#UraeXZvvw)XQZj՞Uq"^ZHpVeB`mΗP*BY %dV֘*,aM8+ +@5nL{N}|8¨J+VwxF3Ba`S:*Wj%7|ERuU`-Y *VEeu/Tw ta-4eWdŴƩYwZGQҏE-pr?aV*VJTah!V٣r g\Wn:X7,KWmٝbqw$ߥK͊dYZҴEE/@x1'zP ؔ=<ㇶ*DT@VX*Vj r\+bd5w|bp +|`QuחP%%-KᗦeeZ K e~)ȓ'OCeU}kT t㰲^d՞EVn r\wBUysoW-╪y7% սBXY2 g:(6ʢC+ZTFEMHh<*Arzjߓ' Q%UA]+gմ~B{ `U\՜_J‚Kȁ/!W,%e9: E˚!@DYx Ŕ< E#1|nUJ@_*G XVJ;և՜7bu_[`A`kg{gXGV25Ks8#-8F=P9Y|X*}4'zRUVWJ4NŊ:/W+\9VW*╪[C\2E՝.avG{XEV1tRH}(a P^>N9# W=됫 3TX[ma} K՝R~م,=zNCoZּa6%uO_46gFNdQJ-O0U%SNêvV)B\!Moc;T\eYPZc%J/Z*[[޷$D E@DPRSTSSVvPGɫ*@.*j`uf9{(WW*\AaMӤX/ sefEd :+& K8XZhZZAk} l\掏oGDJ RSZi*@2+-ZXQ][ WK됫 PXh>; ~UVZ:!d=brEp![8b̓( "-TdcY Lc8+\PWr=]X~BWYːuD#x@/-CĐyZ[ !D<虊R)a i'@ Dz-%%V$W&".THcsz;/i cgC8d*`hV 4Xo{d-Nڗ.WSTzܿ9掅] Ё[X"听_zEk(d3dAibb.oT|%j>* "BNcUB_*V 8;U#W}ڱݮh ,u KА~/s5%ݕ $8@ Qa@TԪ"JPen`+@ $W,V0]!Mj̝ lXvXRYY?LV+EVTZ(Zt@V>D$1Kʓ )STfDUPUo?Fg@>eU#I,*U!Mjǚ-=n,$KEOUYl(n{ly!'̍\y@ Q0e:ERPqUTXeYDX9g:.r+x~]r5+^*,K* 5d%g!YxxR4^k˳p1]V5\HSXTv*@=J'0(jbrE+X\>%bB,;6),TTV@~VxYD֛Gsejڲl)\BU$eNbY9( RD TiU0t L ;`TYc(wWݪ+EY,M qWXO` q =Yhe9L5dqiRkl&\.k`!$ccʓHYTGPqU& *ruueY1^!˂Q*G)K4lTX`X ^,&@V0vcgsiFh{Kb%N|,DcLe"4*PP|U`**aru5J7'~oWc׸cˊZC2xϝR.KY&˿.[tӟ|`jhWVì]Gek~e-Sm}.\W+|ٚ_zi WGXgGGh`Ki2W |B9999999999P|M@)$u޽{g~%z֡ONcoWSkyfj홫%sSCԫ_{ƪ8XiVjz1kUƪ1)(RyN\bքUCSߋY 2V tI뗚էП5=;|>5޽[9L endstream endobj 1 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 1>> endobj 2 0 obj<>stream HlTMo0+戥Bl/kD]JKh8VQ!x{fn A e)K Cјriea:a?xWj`܁EPiT SGN%qpjm,;6&Z6445G9B;4&DmI/ ($EQ55^$/LB*8-IZ&59Llň9D E!fZ^7bPzӥJvtU=;{WD%b6Hd  +a׹bW٘4[̍vN?tD^NJv8)O ~gkЧ՜/8MZ|ڌ$JBm[ n+jw<^gbnH'Y8`^*ϧW +Aj$F:3p1 $?UE!p7}5bWրZY-x 'oo+e۳+_4ޙ̾Wի1k|!+ݗ1 0:- endstream endobj 3 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/StructParents 2>> endobj 4 0 obj<>stream HWmOίS+ɼTU%$T/WM ]9^ΜoN` ;,6_$W.:z=>z5 &" d+&E'aR "hctl|{#ih|4z;zrk";+? .V*dH3.cZ'ܚ[ӺWZk㛚)Vj1MzQi"t)ɋYåf&YMB }SkV5uo]  ! eҚk#D:M٢قrZit ϾQu zn["itW)_ڝ-p򦺫wU*pvAҍs#JrLnV0-ѷyтN-:<`)a6褯Ӵ\m˪3&Ղ]լ^LPǽMȪ>㞉EEk#=*}e-7'j In8{wE rR5{\‘!ly`(ܨTZzDjzh"P1Ǎ `D.MMSOيȣ]"RyS !\l^O]R'K (o[6w HRP9ZlãPI6;4+*sPu~VfbDzN =^Q1x`_gmwN pQ8bQR͋e?ZU{0v(y;C(m;C2[k[ڀ7 TrÆ׆%!XG]<(?lDĞͫĉ1BNh<>}|̾OE -*oy̞`.zFs@pv8AXی W5 btplI̶$B`m1vcU]8<6 !q+MfY uדt|B-͹@< -PrD9]Ago{/>>$7$GlGpR=:iu&ѻAмXÐdZ<{ `KJh)ۓ|:1QND( 4$hޛ7. 9zONr/)_hQ골?v' ˎ/EfM za4V>:| A8 5|g|>|v988@|Gimym.Hϥ2#&EӚ4޿&N F2hҘyA%p}a q_. NhhzIdxq P#]_}j- qԦр)yj):C# [8^vSba'GǥI1e`qDAv#%'%iւJ\1:K׬*NS8l}yHq qvXHSXXK;F:Ȥ5PNܧ&b^Tye,yR*NU.x{KĂA:,`FK }gr4Fvgdh ̄'&{ Js2f3&e=yP:cvۈ6IR\>Z75i 6iL2tvlR-qݠzfIۊ]=B˼qMvL!i&f56CҲ'zGIWvum[c68k2.;nÙc=ewռ^cpS/ج9hrCx::[fl e"gl3 *4^s#Llu|X=RlyCrR)B endstream endobj 5 0 obj<>stream HQHU[?DD""z8DH8N" !"q&B$zC>H4ˆŇdp$F3 s}:z=GSkk}k,lwκAbH;/D?4JljlE ҝ[dZ fI/DJworjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE ҝ[dZ fI/DJworjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE u_٬-׿W"Uj̖`_z>.'k/_C0gbH&ikk{oY\. &'ӧS2 ^ΝD@޽;88br _WMee0e՜:u*(NW^fnnٳ]ĥbȿ T?a Q+~:PhԦ& 6^loDD·sDgMыp,n9`Q``{#-Qʫ`b1}lM:}kK&IW[[j YUU_mNFǏo,][[;$.}QyqVWW#ݻgocF16h"Z 7ҳn5J|&خ+囃~ilT.oc0=G-~i62G:>._緛7o%sF5cN_K_lȖlԕȨcccO>3g8~PWMШmmm|C\ORF1" ]Y(h#7QZ`{촨F46>F0F˫{sM\aQ|Q/] #n&1vب׮OL EF- 'N𑈺΂rns)')cB. qLJ4n^o)y|Q{%9Fvl24-zs7fbonk ȊSSS|[[[ >oT>?>Ϸᶱqff&I\b7βSTʾ߿yÇ޽kii{ɓT2*zj\aBDDiFQ;Qэ5x·EttG}B'ǃTjۨn7?\0=44bonQ/:DFvNorjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE ҝ[dZ fI/DJworjͦ6&]tP<)9@Eʩ5`&tB@t*ljlE ҝ[dZ fI/DJworjͦ6&]t=Bpņl6jvoT*;8_Ev4Qk崝m:YF?k 냵5g,HOOO?oyz(VΕ[$/ᝳJoSTsiiwCC{Mxl9sd*]h`-Y NB]]]\޻./>bx/omsDm޶2nn@TL=gF뫄GETXQ03%)ة2TΜ&RGutnծAh>9-*8ͧljWXz91Z^N\II!Z-@ÝEMJ"|,&s߁VdwT [ >CJJh$"utdznhCu:xl As?}};iOnWuvJT͂kcOY44i~4crX4>^_f˳*6iejBD-X70Z{~njj?ot8!G _T㧰nN?? & lc=K6lAڶoHT|3puVcK0޻?gщ :zo IjN)( T4Iylh`?MhXlg їTjcRf',GXÂl;w$AS6ۋEAeZ?黰se~!LGQ H2p Be%478Q$uu΢|t)"I-,[SÏxDS%n9BT* \LXXr7 '$0Ih֭T"Nc"K$?ѼmV)BOVg-꺚QGr"#*L" T(w̘ANt.߯kDÝQTւ:գ*ڸnso\8=(*kAQ Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(ttC]]Q?1/F$F#5u\1d.vg7mnh1];1^EOMSN}9bVoj]EG+o ^)MQssIf&D5.Ϲ^ԁ 4eZ흛7=FTU:4z]lJj>auaԯmE}#jT1y@Z:DZws5nuuׯ֎z۶K e~( CStQe2GJOL&jPHH1)\@[g êgx1; EuW՞…V]Ϗ KPSee$)ҕj`FɁz#1#!nnrS|'*e 7>:3ʺ0BlSPS>=R\dZi,#Ѷ;wX$2m]aۥ߯XT]EgFnl7..=ii1I\5ų@ks3+9ոuןKO"#UE祅z],4!?_Zdaĵ])Ix$9(D"F#5u*t%/66Lj 3* Ѡ*:%tJnt +(SEe.(t Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(t Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(t Ee.(*sAQS ݆mv \-_y{]=#[AQ Ee.(*sAQS(*sAQ *BQ \PT\PT悢JPT悢2U:2)ENEe.(tu>3cDt퐺Zԟ>ƮWI?G?,fBT/_/X'GLFQV(*sq+*P9Fa"&: a깹g>9_xGQaLg?X>o7 >VNP?6эV{7҄:|ts|`^_?: SS6Õ.WE]|߲b"B18pδ5bٰWD((w IqfGH[HF|( -"E!Qp[N5|ɉ* QP E+F_CHd$>1 T83P%TQ '{f w{ϙ9擏;-qVaV /ej858QmMWU:94װA,I%._?[+8Q3F<'GaSj,jϨܡ+9y6fRiƦE}ho3EIG(:GςȾ/ Wl[*wC| `[ f: ,?茶AFv ~$qjpi ӛ7mナ_s3>s5w9qA%?˲SCu"8n#QWGGA5'wG?-9 V|~CDDxLf^ߥQ_&ytAtʅdH^ +&.D&Ph誥ʒq$jpbP7iw\ f>rlD+wjW_Q1xԔߩYԇ̟S_^MzϜ'ߘ͊χ_}6FNT}EYD xɉW hW<@L(#!2 jU R]#. M 3qj۔nkݴ~csxnDu9ktDE67}=ɏ~liyd&cf HԞ|6 Q[Zہ{Z(Hp\2͆ld`ME 8QQ'[s#D5N 6{"*l&:N2 皷 KuuᢿwQ18z.ݳQmmuڪ/~y vwvkÿU|'!^ˢ\]:M dl-8xQ!]*5 K98O|zX ꠎEQ FLP*,Ucj858QȠE5HTSȠE5 O̅De.$xDe.$*s!QS$*s!Q *"Q \HT\HTBHTB2U4xw4lfO}7 iauMwWoD?ͤR6r,`J _26 PTl4qvEWTYan#IHT㗡EY:HdVAKA>Ӛ,!_&۹+p5SJv=wAMSZ+.a]Z}PvR]6W5b;3k"v;VFpaE8?uwz~<jxڬ3ٳ'55ĉmmmڊn{Ƿ\.ݩ77֭['|Y0u{oĚK޹sO#(j ,]w;KKk]XtÕY]ݮZ4=V__0+.\V\vwjk`T0ר$ɼ833g5eeQAׁ?\QgfflFgnyAGݲʫWOzY5 ϟ55eQAׁfeQo:@'~Kk1*n|tϬw880'gٳDM^>z43ѡ]Q?|wu <|l,1w(n߾j1/Vi ̬i(.壑DeQnǻw}T@g(#ǖm5b3OǏOHHHLL<{kv2m~~[&%%f+++c7Ӎ14?'vP n-+;uxpÇ0ct_T3י1o.Nj-.,T,ȑɌ|)0F: ߂3E3F]`T#JGNY~"`TF5"t锵9Lj)F]`T#JGNY~"`TF5"t锵9Lj)F]`T#JGNY~"`TF5"t锵9Lj)F]`T#JGNY~"`TF5"t锵9Lj)F]`T# p ՞wP wuzG6zŊ 55O}ut0OI~~|8`ЫHu_lԦx.((شiSJJ͛/_̺`fpXRZ_FG|tᕎ;v|)_~;܎ϩiVQ:Sr~31;B!Ԭ@ւӨeeeIIIK.n׭[wu****t2!8َ _(45=v ihU[[[Q[\0JGMoU?NNj;w^_yqqUUn~urv3\o{go)UWnq2v7ߌOk{-//_lve˖b*t:d6jUoW'?~npT寿~0YtbIy'="zG758w71zy_)5;{`I{SiT ݨt4zC;!nǯ^e66RA'H4CQKGnT=9WGa^tRD]Ob4[T,Qz*N>m6M7Ӎ,) ੻w'>|Xof Y+Q,i?{V[!NzGܜVůF}ᦂ8ogi iڌ5jwwMFmT;w+Q/_NW\if3ZFM|vSoB0ctG3h_ *>`oN7jyÇpj;;Ob4*oaal*t:sssx"WY7L7jO?jk(zX[\KGnm::JN^t]<75t0>%ѨH8;{l*ШD:fT3*_FG===Ο_ofұ.*Kg"gQ-AHͬvBV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jDV)ks֏SjFd:6g1E jD>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 3>> endobj 7 0 obj<>stream HWn6}Ẉ I]X,dt 6ȪO>0J$ү h\L\Μ93>Oo.|>i X^.ir+θP3LFA3^/|6 5/CB់^kS-C+_A?A~r3kx ܴm ,OH фE#R^*MV˚m] >5ܖ KᑧpZ&D90J,IB.`%(kXT>[B¾Y8;8b;h?O5S>poO8 F pr8noqH /4- Z)k c־W7^MY(6ŌK,Ղvbesz=L}6q24ʑGc@Dp07{q);$>m(ʺQ"HBi_XI[$m{IɿpA,X4q/_XYn f1401 bo?PKJO/ jX8ErSW4Eh{y;c(c84F̺&e$U~m5mO02c"7wv;:򶘤9߾x"`xѤE&e9Ɋp5qϗWg}Mߪ=p҂[_72O>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 4>> endobj 9 0 obj<>stream HWQ޶ }~d˒i0aҬlC%%s͵CR/xyw_Oj˷_5=t˷뫚~o_ϓV{Yw: jv~rj !LzfOo^߼!_?}xCHHIy9~mDoj^~jehz?EM{2a&N&;=@ nmˁXbYh,ZySjGIYbnv86c1,&ߊl,P, ,<=[,$_.LyƢY ¬+f,BY5na2Fa<ƪ˯m̫Ri4ъ"lך\C`Dl(kUݽL}ttQn,x6jMrY/((ؠ6zI_oe n06`PmjCHj!k5K W<5lvFyyjL42:sV"/ bTvסD tW <*"xA~9K$B{;p.VY %Rt,H rA2tl2)3/ 25c&i mz&#SܺO %,ޗ( k.=_pƋI]b&do3lɖ!92ItN$G>ȭWйg-RA)r@'1.mQt%J9?pa+*Q V{H(Eʝ$d3'PJDJy RsB);RF>"R^ 'Zfh2NkEײ'k%G'H@k!#>3#}^#.$Ӳ;fūggq > KO65}ȁ}M{d_39d"B<죹 >}Iў}{hDX%`V|/.Hg';OH;O65}ȁ}M{d_39d"B<˹XSTS"3!Z9w˼C:oʾeI3%kzw4S~Y|G`\̀hr2)&bBr H5 :-%U)5J̳ %%SD3Y:?S*Oi>&NQ}*d3'pJDNy Ss);rF>>]ƨBI˙ZW'5deq 4 QK2M65kȁnM{d\39$"B<죹ʴE~$P^Z+.Ta-iX=T-zJU qKU846#6푃䐃r `r2P]ħ#EJ Olj'9DGuFgC Iӡ 2EdGfe/f,fPf'~ƈ ƙԠ )<* =~): qىTD~#]fb+Ajޑ!` 1Aah t/MLH!-ҡN )=5zrQ w=Ps.aCMy_]Dd%T¾y r'zdcN->J]~č|$ ԟ(]}Eh?Q}"F>")pB; \! }a^/DEƅ}']>u6_ ]s#:li璫NH,1Qo\[n|*J@w}t6ZLJZ稵v76PiZ;Qx ܶo m@g}U6?KTHn  jN`W C)`MQ:0;nqH@tǣN=٧q:u9{%BFeIOb!.px5., Yc[0DZ+Ӂ;{Qԣudޗ,.Sנ-=';[= 晅N\ʆjx Fp}o 5Lث(ö8\n-wH0至FZ"j~=cل9L'.Z,(s +vh]b p7cmU[wusά$2BPɆ-oQDlq|SJ RjU|e?DUsI02LAisȍ$|IGh!S`XM&Hv]PMճ b`I KMM1 Dzt+ ,2@Aֵds1 +r(/-e)@cFL9;#A`q^qAIxٱ(uF7XNؓ GSh\KQo40ǹՒBJtUc nՒ #(Y,)6m8 .KQ6bظ/lȍ"J П¯\h]Vl@zX4З |30İ)Z¤HiHv+M!,2MAa1u,#b0͎!0` UVk0M•4p͆eTWjcԬƶJ]tR#K$]ubI$^•FoЖ?P44@;?un8D z_Z2A!I_]./P~D"7% uhoަԯ7 AwQ_R4x/XHvWۼjhHXW˼OAsz?fGwsYX%KMWY4 @n퇲~H"A31ER×==ֽqM_#WNVӼ1oVz:ȭ? ĺ"oGq>`ƮNO )O?+۱侪0t)LJtZ/ڤ:Zkݎt╗0=ѶOC3{w[kͱ/LYW׳hU+ej]5t7zuFk6 3E 2]|[$uqvh-SZfZFgSq%ZϷK>AiŸ|5kM!"([GٴNApK1q+QwJvɽThf!-R=y+9D%ևH#6~G]#5gx-VIr b1S3i/VRw6_jq(g"\Y$"gVu wV/9).g9gټ䜎|<;W)K _ oV`1S o|M 8>j,eN}f>ۇu%A]S uäaI;{MJ7].ZZb׷0+gը_[|ׯ}knqge1z6Z$>l3Ͽڇnh$[+'ybmǖܙu' H 1ۙv/ ^AY9īkM5|.Om=U܄#fIbpv<93),~>ow?)O/3ͱg<>yЊ2W:ykYpOvjbێENÞ]1n)jĩt9g9y^/6gl=9:7g-EƥR i; ߿3s.4OY*rpGCc4 \x8;&l.@mGv\خ&ۼKuR^=>fݷ-!=RM:5U7 EĬ& &#/ Fϛ5[բ"6ŰBCdA,A$UlRzL!]C<@% &UD@_sTg&"j_39jĂ B?E16G av1ϚhlZ^qFV&w;ʠK.q- Jlj#1X*vh5)͕2C,mL'([@\h nV8#ǒq7)a󏈯?;]#ȫ ԹZ 3⌠Kf3ez% _]Dh+lFU =kP{Հ J7{pWa?~']?~xP.+ӴG46/C}}6=U(~sYIM`L%c*j&H"bVqإ&n0A5GHf@yܪEkDWDhhʼI=f(\- j) 3= w] Y\4wa] $JVB TL5!\BڛϞu&lـf53Q;ZMXe% hMh%Q4*nb Zg Cj@3KO6ؑfjZM`u0X]Qd3D #bB,Y rajT{1%XR6j74!J}vM'O<a9\ǒrp8p!~'+.b].DcɄp,'JA&VB PCXYCkB$p iozC'_9r^X~%. Px%j&H"b[q&+QskV7a D-b%^ B"B#pJl ODezG[N'>-E5g;ZYw@@"Een٤%X՜i9PZNYg,nL &C$>%2awyÀn+D"bUР0Do6S^ʃbީqSsHm#xiB㓸| y[-.gA!Tv0 GvSvU6O1 {4j HcDZXqЫ6XP7o(ԯ;7 !"o:9 -.e`B~BC4.%B:ڤ2S$w^|2!r] B&qKeqʷK'9ϖ&yld]]6^: )-}MvV-]i]2Iueao̘dWI.g+[b$IFNlH<{/_6TaQ8Th<{mT{TJ</Vr wgy Z>FI\s.=d,7gōCFx7-I"ONI;3L!I/ XDeULKk)S΃sAG9=)I]2$>=IOEZ ;%Tz1E\?JX}lSY$NLv#ړ{/Sv>aḲii^SGeuNnxD'L!pc<4OXtކH&dph$yFGh8]_!/sȐ)cu ܵ엞Cy_W'6~☥+K\c]ZcCZCĄ<2XDp"nyۖ@ mM(NMR'X >Ld9L H<ٻ>yArꥮhd'BEo\+O.Aw bkgRϻ-b^K^]G֠A֋nu zጧFEJ[4@Xg<]nNe?cY8+,Wf@ak~SBejƠB@H6)K%b|6 F b`mU@2boӶ 7L fm̦6 2c(2e&hٵ`efOI34o]f;WZd7nBh8/;Sw"/%5 ZNK1jDvltM FOټ9;MB#e:7,iOamOF7)r;ݴpx8WCv˶qDPSoE;80j;YHq IAh/s0O09Sn -;h4 8i.lUvD`0;xx zom_w 7iIn5hn{fKӍ@V&P51#kn$K1 >D)VU'? O­ qd$ =G9FV@xrdxhs>P#=xe} ȹaz"g`> 9kc#J~^uCTR̘E׫ijEBHD5 钛pܡ[!Bg_#[#5zQ2kC:<SSbKr R-1>WsP #ZqlHO4Mpf++ʼnM'Y:3F[te!$h:J&4Y6C{ MNy@69QilNZFSm <.e#驝w@?ȴCRp):l>&4 nJ~e@ G4Ex]uuh|!⚏q!<)N|B_:R)A +bn) :\b]b)ƠP 71t]G"t^$tS<|V* GfH3?2eYG3k7|:y >ɔH*9aqBCJ?-C2(W؏CzݪqFuR*LNJOKQh)N({y;䝸,>N֗gjj IWy=,(`AT Ȯ?AS<>x˃sY`ַFv~~ߪO] p1v#m;[FZn4|銵QWaࣨ|65ׂgײ@+QBˍ~3+hyFЁտ~J"$xБWm~Ux[IS#~{hN~o?-ݙcz"{w߃7<.'XXNj]I^vIV.;ͯ?_?uA_wgHv*?~_ۗ|tq?\KC_uT9 _~smfNقۮ<6|R0ad3k |E AčnoznҸ / %+a:'MΈ5I Gl\Lr)$,HCI48bNy| JWwXpUTK)j a,ڛ n@WBߩBMM(:i\£cu~>Xlw7=/E߻x5>֕ ͢a}xs&[_z m^!uc/lw>QK-L/;T2m@8.o` Eo<~կ4`ŋt{xj)dK_Ǘmo9KH.#![E> KKHXVˀl=8H 22enk ?P=_9 -]84ƙ̼:#~R- sMiڧBoյYDzkyiybhyjybhevdzQXCt.GPҢ 2Yh9s^āc9@ׯl╍rec-f._w*פ*N߉HK.ZE5NN A>o +_YݰxX,tuƨkٸ)Z6F-c2k!Pr~M1Utfb(k(eVW#o^_S14^zf127ػԥtj]h]@ͲZ䱗YX(eMK(bzd=e.yO8 vc- mpH]Ks^.K8~^ODa0`7/F 8QQ8}HevtMaS lۼln^/%6֮GYoK.` 2nXՃѼzpsu%Эz~ͪz0T;1M[u]eStj&k mtZJݭhXsYs -;\65m6@[KFkouT9埿/'ig|Ir\yh:z,#fejz!٭ݽڨ|z{6U Eo~_m_"q!څH=x5Bw.hN4g4-߭-٭-Yt%6M-bp+nk bmc 5Ybh-ρYkS\xNt49EthhK;mnmnfgM؎6fhk q4]b;h-}Z;1vL賴3\K^ytYuXFL6bB[{{Q3j#8;]8.l6q:}%f_e-XE\OW_lv:j2V ?f̡|ʰy@8@.lnF05\6D!1,lWkGMF[,K@4xeZ˿sW=]2Ӽ]Ay`[&-OE, 5bT.T7 (/8<&tG~dl_z&cY'Ǖ۝y D2#weJ/ q,FV;R7q]@m153Ht9^i+| >ۊ*\}#U?Rqu?U.yx_J3bEKJͩɓԞKIu.K|Ÿ,KbkY h' */2'{ʫe0hr uIyAOЖz-.~{_%Q_Oא5\9-[@Q/7I5Uuw@U|*I;1Ҭ>&!FM^y_~ 5٫s>Ʃ?ol ʽ:G+Ŗ!]˸|-|oM§<o ;Lb f}xw7o`:8<gTĭw . M f:ҿJAW ސ+n*w45D3<8J=xQ72а7;͟Lvzcؽg])$& |Xo2 O/01ws)ȝ $'HCc?,lx UwUi st>4,XG h  ^ē>o1!( Hy3 H8K9P=Lp9 *KletdL,I{ N$HƜ"c đ] TL@‚FāS/ǠdS SAˇ)^e-Ǚ"1z^P?aѾZʞAt:IcR0]0+#cҌ< 'x0ܜ͡eg3c)'` mG~nbD=G6OX%vC;sbuۏ>Cb)7OXFI0".!QT&K%p2̷EV):824K(\*mo n88O8'6Z-N@DĢf4PӸv5S4[R+66b z" AWhfR-PTp_yl ݌]ܨV3ꋵ(tUnQsPASkA -jON}Zεqo=H:nmUzޛ ܌ T23bԜJD[k=SeiOeI4!}d s҇vbuay 2HάXDyu&ň:Ǭ?!P*H6Yѧ%IAazZ}px2b?(EKA :bUL5ː[c q C'e/RdC䄕Z9o?bGZwLc)y9$B  A Sб0@(A`l!3b։E, (S@C5$ZYYlUsI ZtE% ze_ qr NHЏd8âCQ<і54djI50NyRacVLf84,e6k65جelص)McY Gña'xa Aa$kRHo! Һ^Öتn$堃Ue !J*8U_J3ߖJ=֬<ɵ!eRO Y(PsˆM@1?FAZ1^ܘԘ Št%5bWBquD},8FdԠU*O xW-@eq ԣ`!}DEzjzP)SˤSg(DK#@e=p|t  M++GǛ&7xqQJ\i9I^UPD:Vt}ɇy#Y/!̛鑰UPRq)V;4lPZlSճ#GP,"Z-^#O")D>r Q \ ߔx<%b}OZR]*=QhvXH~,DF ?? Jr<4bG^NGF$/Λ{1F䵈p P9;>>$`]G/4hEƁ_/تJVU,ZIV0e_P@yj/|Lyg^p^Nd RCL1FP<D$!xUcZ6%O^\Z UZĘOvA7Ovgy%PɍT)FbJʩ@a%[,' 'P򥞽FTW;ح7>KnC= |#?L}y]:JԩF'Cҫut8AK:A]P$ *'RmGɳ(p<۫r/mU n[:v+{4MmyKqLԾ$>AzKz6eAWNnusڷχضSo{9b|{l#:ftñu"Y$AsT=fɛ{S(r{|:8iB2|<J;鈮(Bvk%Ccxzݷ9ٸ r跖Sŧ3nzqQo'VV7l8FU^oΨ{(>,]uit}nO7[{KLܝzDwG|:ÅC"ܼ?>]Wtuqz?h <SMm>8!A1Zs Xuwe 6 %dߍ%; PXPO$zpc&nQHh{=|gcr.򬲰bq+ƖǓ;.|/ܨvҵ[j-׹rU|^>D>fECrca-4nk!2ه ɶ,Q1!śKk:h׋FU01+.XH;`nK5.7PwF&Yn3H*·̾#\]!VA%o+d"U-Z|{dƳ>䄙>Z/$kL;H1mp8,@s͛Gv݇(^m1U`kX]A-!XB `} 0~X)abjbingFG'TOF/G"4$ek*^sJDLk uzuJ/D1䠷}nN vV#yrK#U!c8*^cFHk1z5Fo~^u2WR魟 U#iwzU8Jwwf_|$ˇkc *HkZBD}/^Շ Z&P3ybkz[9dƁ`݄(ŇmU"m-DT?$`?(ۖ(- XAn:9Qz&|v#t[rKQ7>>횏Tٵ!WWAUmu JiU y߯vMf$CNjZ6M W ="@l} >LAi0bWu>:L#XW8K29T,D@m-KLۅƘ|LdF&U!ȧ(BVBbۇEbE/o.6Glӈ7 hl<<7z=]q#,a=yzF{c[`7 d|X[;h},^Ao~Α6x=Pj덞o6)2ĒTCFpbOuDZ)U PtUKpUX 6q9ѥ*Z6PW=ǜ?:a٥gG6z+k1zU^kW]Az-!WBz黗ߋ'3z!'K^-sLkck´_@yoo>r]MA;ĪdbU AU'J(}pS~TSژ ^d02zGY(p [Ss rGvN ctsݸ[qMm+EPj$E7vݝCt_'fX5[Y[|' 3'h&ZPp7Y2o0rRz&;{ -,i{[+^". ]/ r|gY7 g(Ǫ[,쇗*x3kmRL8_yY|{YJnzCO3 BPqǨ1L6f9 *Ū:Ҡf D-"qn|8^Mg<ԋ#^\nA)_+7/:;P5̾t ҽō 8b?x]8=0(,8O[WVjNlS:#(uiPgs6mP @GAg:ӱ{WSC筣Jvˠ~Gȩp^~@Bm gh!{P˲G;DAl\ &^{I%W[;>ErF/x(.E8^6(j2aklߜ{&x}nbW&w /65+"Mi4ms;':JNv|c,v!83'c߬gHZGs+H5ZDB%InȞN&^ ho4&/'Rg!pWR̀: fh9625]=֘WB4lkF(A]\jfgg\s)gI{L;ӳ@Y8g_SDztw;nP%FiG3wx[w#`I.gُ&MRQ݊iIQhTtm(zEFl4N2*J Rjյ̳ E̶c߸LMco24CǶtg\1 zSvǿIY~3u`0>`rFg$R|O"?P.NsfzZr`8裡pƀkJplo``JS݁aq61ˢy%̜lVsSp4:5<6A.9]zS"FӨrvBg5mrҧkdQNApv)=QN-g,/iH( bKI1ENGiS*6һ#kcSNU :3oe;5k=Pr>!au[#LR |$KXo=RM)2BV#Ob:YLa)1s@kF l5#LNtmxs@ئ A 6*x9lrrUQg:`Kg`j)+2<lN*5s|} ۣ}d?b~Af %Uٱol6G^jYhd\5Æ-T<Ȩ)١De-"F 2=+ғ3cl.(L'!Mvj k^2=Ė6G>˜p=93SmLUG9)Ya5E<c~i-G)b GAf>1 T2XS"[hxxvV˲c6km{/h 7'#T c':tR<{m}ß`<Ԟɸuh3=(q n? bx21ӉZsZH<.3Y]C+VrR5˹ls(-o>UnҌ["m.aM 5\cMg^iwqC;jh`&x)]jԨ_ Gl_1Bu y |Qt=jڸqPTKiA %Iqi hR#f!G J|6F^UfN3eV4|6Lg+YΦU9/TTk:-Ą.KDBʘl`i9)sR0O:4h@TS-YV?F@H_F@[#X/5-B;f(h|3Bm@D4L]MhtU댢S:TԬ&Ⱥ˄T7'MPq=v䠢&T ck|3Fc5bnoO7zû=-RpJ?)ɖɘTN~F[}*ŸIPР"-V=~^EL~^`P{#uQ3\:@흥YsS:0"BmN< ~T$S"63E𳷈8gXҀ ?fYRJB'i1NmRɕV'Q=5ޤ vC}CO'~%r'l,Esg|L,t{e,@9w#ٹIfca[&4jBb٤aA1Ԩ0djtj`"pxf/ᾯj</e(0u/8>N~a wvOCDH]h4v5|2hΡnc8Z4g :;ܰT-SC(ΧewC vةr@2ǼTFj5UAuW  0N<>x$wCnUSRQ7Bu39uYF"@ȎV~nDM0ThXuşi肩i0›#g{ 5M pџzH _bM #alhW* Ӣ%F,  MH!UG@/_O0 ħH+Z e4L]iu m2N !V +Or4S#/n35L]\ D͛=nF~ 3rK-39D5il3b5^Z%U)% dmYDM e&q6U7t h:ҹWKJrӗ}(ny^~vMeٶ%#ekVTl!o_'UfYLR,) ӜQyTT%J Y di'kxN!jwW@6Yxb,w8RP%oF2luRڝ]gAP.H^5Ld9c˜xSU. M*0ۑrV!񚲊(%&fqR MCҼ2z'0zO,nڏi}9[#ܷ80<0oijr#A*3 YKHLpJ 0x;_C#Ӱ&T}^-'U*Cb -pշ}H3}ϟmK㭀#M 8 pJm܋ ^Tu|1ll+qpu%b>_~SI1ecb(__x٢uGK_: p5Zۏ|akcW,z辞Ʀw%[`i(3[XS+kP AD+qgrfZ{H]w5۪pz'=XVY[F[ΎKG$a-:út,2E-FF եuzMa܈R|Ld.IWDmqkycԜ8ǚv~N2%:ZqzЋm mE QWL?XMc}A_dIw@Oo kF9? ꕣ} ,q?";yclU$.8FZMjWVX-$V~/ q;ẇ'ތ=\G, p&JpDxxhxn q6.߅xoh_ U^}VvFryP?]Ao{Ũި)׉IaJY5汁=葴ʀT K NBJrejiU)&*yWI5>׾\1]Ź*(V\ϥoTPhjR  ʙ@_(/ !4B*~9GS,M͵JȶD4} @6ķv eߜ`m}Cza_;uLOmL2U/K I!g!ܧV օ_, Vd!0# 𽗩EZ=BAUhȮ_P0=S^< @y 3+|'SN\P4v ;9+^wU}2%Bu|LmLU+K I!gP!V _, Vd!0#~zon7զ74߼?i^(/ !4B*~9GS,-ے8AW$m #cE=# CǯNϨ}>=|B$q 'gOGO] vI W~/b^+ ^zވEցLU'I\ t},~ә :^1C0>\L?nզe$. ZʋRkf qV#씀9lKF|\'{,;Z lR]P̪:*h*r 5}A^P!%E>Mú}f|ŷcS[5EQX?:沤E(=\-N[7NEvSS)F7mil*lI [R)ȖAdOBdjS-9BdOd d 1)U +2Ʒfߏ}nA Gjuqճtu '. V"4&"^Y#^U/H/;% .-a|bJh$ iవkeW_tl H/iK*R8iRYm*%Gr!#q7&5&x UcǃTqo{1ڜcF)ĩ9ʙ? łV"4D&^Y#B_U/H@vJz9nٖ y$iO.TJзBsoyFpy37WC'X^Ƭ4B/K,9B`NcZK[ZK{"N~L~L>w/{/MϜ*4~ṣF|'[ʹxܰL[rH7iS_2:R.v'S2ežhzy^Kۓd=+2Hº8mѫzdu$cgtDrx2p\V{ |ћꑐzP?SsYw@u6h`PSw2F2yrƍg2 ϭ16?2ӫ1v^BP`3h&5V>Uq]O/y39E}b<&z7( :=0d#αԀui42I}hj 4ИCi#4zIK2]e8^i(?iUB6|̀P =I2vV)lcB@ŮzI} *)Џ'{}1pxmawgV.KalA=850H[nՕӅKFpn@ejVf)Өp[/ ڽB?[/ Zi{Nc)KvPgh^r>e&9Oo8ԃLV{+ʅ% ;r}|H$'`Eنp x `xm$4|w Lr2Q`1{=␈ Yy\`%#[Xy=w%f^CDcLrn]j߳rpU' B˞zIhfV eL1wmVୗ}ڲl#m|*_ Τ_1%epF ޭCO``mg'{~@JC&G,6 ш7Ǟ@$ ;l̘1cbw 1#eYf iV1Mana j\Y}B4$%񉄁_ßc3^R.+ԁSg10R=1P筗%aO2Q7G+*)?rٵ&rwZn '4v8Uq`AUdNS{o~{vS혉1w5gp#&D6@챑NH_gf_PyFOOH4 HOb?>Xd|]}VAFQ&2ZK*6PZ%i >py!SYyq@.!m Ĝ{@K4 ^F+rsE N(^*=9჎pR!@ڑN |W8`$9FF]ǎ*cQ d+b2zjҁQ|@F^ZfTTpUȎ *` a7H(u y ]>U uiD烸^VT*XV kyG }ݓAA(*0zm> $} 8Sبk:Bם^FH]c'fv.0}Ɲ x:o`ߑNfE5B鑜6z3?;!$jGpzyJbNizr}\cxA9'9.q4B:(>9O@\4VLE0Z|"z͛O[Ӏ^Sh0 >CxgmL fK-*).Vlԍ) 7,/j 7W6(]9-;ʹ]T>"T+IvtՍVɨ7vvLzO9=YX֟Ύ*4PV6D\č#E<-k$S^0\Z9Ҿ UPq骥hug`hE0Jj%ZDʇ7$]-Ct4gAdiԔq{9 FIT8{2 F31YOK[_xo4}zJL9p* UFvς86avÀ'*Rܥ{Įy:+ ӧl|tfxµROZXmnJ=Qy/䍋 vJtrTe`7tƘ&pc"3"Ƙ"}] $T} ]DFkGedU4qٚA"lkzb[8ou=(PzqU  T qa#Gh# &P'>TǍV'6X"8,H/(IArn|b4ZOQ|J=|r0Tf.j3)F^wn}ERl-_TʉHMq;Ng t;lajrLydAC2eh=zlk qz}(eƴ*X: e {*4B?-ep@9xK\`ϙ* ĝ*ȹ6#yk'ڠ '@5avw`^|9rk|9 jLpԷجڱJ53 ͰYagn.5)_7P$sB <@Oa>T>/TAG6F gVd郂SLTG6׊P}GO\q lPOHWiu@o[+y4lqvN}ش)b6fYk ̒ |a9ؖ޾yDlkӣ($RՇ/Y4b4E^86ϩ^k y N}EDqQu~Z8ί*ȉdi+~Rks _]Ŀ&cWoqq qz=^P\&]\ ZCJ&.z=0gq]o+,4@Epc^4{y*\KF[||V9'x{S4V>ީ +?~l׏֦9R"~g~?u)LLSճ4j]27-twݶ6F7v=5W4Cy nzZoakw'l$OrZWνiJ\ho|Ql JlV؁W WϜ;u--i>OOv. xbw_zGPFl*Y"_ 8&kx^a]/-cdZEۧ8.3'ev#4U*I7wWAqasH將2 %`?u^U tſͭDŽ_=%?kq}VgӘI$Uٯc ACVg w|0oƒ)FkZUGHFkuZ8vCr~whp\`t'v*?)ZMLJ%*6ʥE 1-{ΧR~1]6>]9ik?:*+epTzaP쒩' <[PzmCѽ-|S.Al>El46m+U~}% um؃ѹ{Ͻ (;h6xwXG`2&Ao76C`kH^y 3j6YW#6] +[~sVaQ~uv<.̕NJ )*V?E>nSLQ!"?sR|Z}O~(>7]fh_ `&Uʠ?a֯v3>ϴͭ,K,%BLZ+/y֡8d?3a,vXōSVMqpd"98!K~Rf`ZRbfbM[Om'OGRuG:]p٦Ǧ޻>bSֵIϹr˩z 蹭_]m<{^G !kXhCӡ@9(f9&)c\eZ&H$. & e#K@АJ&fH*&l k33wpL:,?vBϜSɖIO 5(x$c"BFeƨ@9>e3jHuq3iv0J+0hȪ?;G4;N\ hwS DPc%.p ޾me՚$ڐR1}W]GJz8+5Ioɩ=MNf}Bi@mIC3 # 7LQϹ9 K?=RX}(>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 5>> endobj 11 0 obj<>stream HWmH>nW$Si>x:6g!쯿 )^zg/>?e뛷N0W$Kݫ_[Wwows$f 6_0plؼbRp7/T\PJ8El̢Of:e-؞l2V𙧴EA?Ոa+kwOfa؟>i2AAB=tGz?O\"7ZơK=|KmIT| ~K (&Nf*jfN%$K `u֫I.5z'_EO϶IOᆁ!l˰.yxhb8Tgeݤ9aw+~^"Pk]E;(T90~/dOS,)!%rS[x .lfO8,4_v]j2ۼ+VDl_.zC9vlSd*c0OVXS8co,i^|z#wDhUj!T(UVc!E)zhO7R4r>Kɡ7Bbʀs)j*m7j'`P7ש!Zz wBQ̍^ȅqʛ+Uk-c3{75LH%~%oU70/@xÒ7WlrnV6v wdձF&lSm F}~*jO- 28X Á z~ i7w,`$ˀet*EO+_`,h?bη5=zY 7sF֍f  lK}l鬠j:odxWJ3޲gZ7L I`Ƞ\K+u O;']i=4a,;ַ9T"a[/\{ZJC$1-/2QEl)[3"@gED}d#0F-"V@[W@ idȁU-d/A(*8k]ۦ@JCje.r"p#%eZ).0v>%7Qk{Onibj_j[ JfY*]MNeΗhԥPh%ʋ_'9n2puӾO6+`D09*5X첎jQs'U%B4& `_+Gw`ݶu < Y.آP%R8Ks}+Yχƪ~ haXĭҵAv@3[&i<ګۮx17_}x6+RtmB1r(@CC\ܗ}`wXI(bӅ*W*m恑^o%1DnwnT~KܪθBFdxBG)Sl#K$øCГ.ڐtjMr=,:K1$tWczCaL77te V5[ǔ#q;I塲1A+D{Fd6?NtqGB}=2uv}#- bD PNtJQHgs`Cо#Oܿp,TQ?`RBCjc6y]) Y/ H1O )gtܧlOx: @|c JjԚ:۳YXg*MզDKg1U_)MDuJ1a|ʶ7<ڜlMi #o޳ZVPG4IX5оӃІNEh#ȁH<0~H_TR哤6UFa>VH5 >stream HVyTSWeÀ@&MZ/aCDeM.SGG1JF`zhsLOPEt#=XV6Mk)U*MAbEqd}07o_w֝=QEDCPauA*e)Y{J0%eG,DY,G<7Bd0ɇ@ 8Wuh϶-ln;:O5FgN6 >]+D7%,_nZUk ?:w.5pl˞f^U00 {^]!Jr'Toۻf<]=~Ì[]?T/N*ub~}Bz)/bŚy#yvHcfeLjסya'\@z&[t|yuy5ZEcn-\Rz4W~׈{EU˫tgF|g\ Ov.{ 8^x&+ĸ8ARTKczq(^!81ѿR6HE \oz-i<ӱa_TegO,~R-!wrG٪u3ǑpgӚ'^=y\ڵiM[4 pHT+{0<ȴ;YBÓ{ĩԪ1HX fAC /yȐ;V$y|1q; 'BX]@GXlE."U6۫~w}].~>.kx~zdi6yz]Yc" 8SH`/]6n(al[ a# D!M}3Ider#|FX֚H4qB$Et4C9(!W1УFϕE;\vYD Xb9z%9K(ao2"5sZ1aAa&,QJ3(IJNajZW)x,|{y6X!.( P ILBk {PhEQe*uAlGZ:#Wh:nԥד |_M޻sRehB)s"+ euXUʵarTDZ4rN1FDp2SYT9erUk2\ơ)uhe V(]JیԶG6sj ղB'(eP(_hw$cm* &)-a.eRQjXuFrI& V C8UARjqQh\F\'\XJÆJ#c88eJ)ii Cf l1tmk"HM21lԷ{>9fF;ku}Lo8cz5gZi% R'۾'g}f$B% a;V—8y(l#`ʳu(GҞҞΐzIXO ?la:`_O'J6G6ܦxy]:l-ϫUZ'*rr}3K2<ҨS q%ԋjZJ?!tiZ]s6 {OZIj\\hKU]"f*`誯1eb)*T="2?Q.uw]UΆy|յ,F'P !ػ_s a4[[/ԕtxjoI:bvE[9J彻=i%SK  ,(O R]&|KFXlaO*6]ǂpHi;Y`J4K3 t.ؖy-x{լ^G] P#%#Uٸ.ⲃ[?il%N>YM&6~S;.{<-^(~#>=7㕿pvszF -C'z~ɍEqtySl%ow$,=((qj Edu陘J)˘Ԇ W0yѮb夔41&RS0kn~w]wifbY#˾p`s5K<˃&/| x~7N*Φx[}7͉UK 4h_Т[9sH܊慁^l<2d߹KsiPPDkO8aJ͘SW><-c[|ʱʼnxs۷'>n]q>)iyRuzr>=mݰ晥6숸9玿u8ͳO:)a>t)Q CQ @:"F -L9ٺ#T^}de * _#P' dS`%B| #B2 a+Wx3CԒDK/`F 9A$@! [C`;:pP@pN԰2) j) /7 `"!#h\pMz DDJ~a)h2X 8C܈BOevoZzj^&l0%#w&Ymxdf#:'rSu`#o C@ʆŰKjē@9PT25*nM^oD7-x`ܝ6Bn'Cp& ѓ## jU#haj| ء7Ѓc'%o,\𔸒`2,&KI!YC֒*^K_ W06l~,G܌D 9TmW3/F4$\RDJ%*JTM^=^"p Ly" h,NsƘ#bfg\{țĝ (z4yI'<%r)(j^oe>:J,!626>0{f\k>o1v{ `7 RI9% ZW*`R ^p +'<7V}BNƦ/Y%fKJh??dl3دX;;.+wy|x +UŏcX1X(Q#'Ⓒ&6-iG*J륫ԩV^.%^YW()cرabإ>@l"Q !?^agx0kĽR60>nfX*q35_snS] l/1ys):F m :Ē̝ Mc-_.BM'#Y@S|j`*DSlJ)2dhoSs{FU4ݦ_"I #1 |tP:&&t.|^!=i봞6s;l3քod&$zvuQ<X5I;rsG pu%l]?$l:*y"$@$>1হ]tYE+UI_xYĶ!^lϢ%OQ8h?e<uM*$m}RݧtdRc?-eoW4?>3y zVFd Q5amX}g=5sFA~O~mỈgxҵ'긱icRSG'9b!9, (;ET##bHZqג*()" U@Cn@O<\LVj hjU7jta^F-a1]o ˮu~>PSգQ@z8c?$RySm+-!`H|ɵQP5L-2\pv_Xq0t ^R^qlE8vtHS^55եGg+6EH [56,uvCy3[a U|i-I$*a@zwڦԣ>&* [2u^(ֹl>^[]rWK9_w|6x/ke/+EJ mUfm-["s2oC7 <|u @sA/n >ttjn9yr!ȧ1h6ɋSjbFEkq VȟJ!@,?LEؙrKl!(K<:ET*=yʹ7';05?u?鏈cMA.] +sŎ(#hEX R#)b,T-U=iy^|e);h;| 063C"_/-n[m,uhJ7-Hcq=umL^ Ni5Ak[hA#X#lQl }4 y&:0 7Ib<-^-UTg?{voBȚ D{&db2wHs/mD)*ieAcG[ AG#*S`F^ %HUAZTݛNՙw'{74|D{\ c_z}g7cs#~j,#@}^gy[3Y|cу{<*`}Qξ58w?ęf^Cϲa~I4>ai^ӲŮaS=%Zoz4@Ab|5􀱒N-[aQ3$砹5 sHXV< c)OȶefV)zG֐R݃Rb 2}`P;Y6*|t [ 5Z#(o _͇&1 l&Z,pF1-g}~xO򥀳:_fgͲ>{Հ/9=N1 XU=!o?OS6G̱c ƿ㯇M~8H9yf9{h~\|Y@iN<4. 4[t:1ﵖc9/ b*`=W_=zjP-Q^UwqP~`F|P'}"9%XVbtoMWn:Ķ|jbϹA)WqXSD.Q2{7)(b; 7a=ɱ_upOˣì_vB%XqI0DTo2#ҩ|31{삖΃$s~7 rsS߭@Kb]6@\tȷF?5=PdmVKz8vԗuTAv po^/.K3ij|:rGH:ػvߪC.-GA/?f#0>uƧ.4 1^R_Fݰ?Nc9FB5|`O/5; ,~hcO3;@$/7Ϻ5ړ -a`+s}oV!++Q: fgtk3h?e;#߈`<7 (@Sd1b>-`me}c]emc=e=fh5'ͰZzZzf-FIey=Os!}7OWOrҨ,y @/|Ȑ}F/UqeWڟ>=Ȝۘɤjq'p<2-QuW=ϑ$Τ#q Y"ST(} s&A@&DxFҽ"t]etIx%nZ .]i.7q r({z/jJa[4G2<13ÚL۱-OȄ8 NţMvy?ϥgDdW:\"x~y;dNO:.g"yl6qJp"߽D7]5^7mhr`buXᓮjuRG^a>R'I JDjQVV'Ju[x1 :]#K `l,*[9.]:멺4Uu~/&(uGuH"PN;nhR RI~]hFnqQ; +/ka^c8&S`A'+qIK /07I28qb(yD\ )? 8iSINQYkN;qd-z⪿vXK! uo5J+ -c4}v5* pIG+MBKw){_ů՞V5 =>}Qѵ#PpT" bAWbS^owUS&E)[TE4ńvI-gP 2dAAmzyJfYSمdD8iǻ՟:G'  .u5BBУ9֣@gڒGH7hm(GH8M ] \Í]Oz:> r?G4f -hK̹y\Qn$v Pq#֊H_޸VJ,}pFr(w}o*Ν_@jd%gWW1!J)׀eX߹&3{w$[wtto–lKٲ11 !Jhi;)MJHGB dp)& 5CkH0 eI3Gg:m$3u'%2Lj;t*ywu{wyyvgL\yi0d~ʜf_Fsg4l%SPL3xszϛ^%YCbQyHxe+u_|dExi+]KX7nRU̧*I=".^=PphdZY2ruEr=G: %KKq/1XgkmvD?u:'wl^֮V}6۲pOk`>{j Y1:3%k}mn8 zKۙh*$XdDrܝ؇L{ܡ @C>ͅU C}Hm3)oAiad/%XLn&f'֍yXqïϪYckϷڬR?GHHKH^EVzͭ)cP]>`a~!< 衫WW¸`epF(:^ % `i ]wEgC4jlq1GV -zę"r`k{6l(4*mo!4v?o^#7xxCsXyzw'ww׆jXWWSAS=xgԙnkP:R&+kgww|Szm%ՙ`Qx)t̪U.Ž=ž2x^)ڋAVdW44G.&^]hS)M犁b[쿡[AHcd%C;] aó LIL> x# I4&9s7,gQV*ܼ_B# š`ē2]y(r"PΎF`#a !jw%qIǢL3i;issj>ۼ'_ǡG'7dkգo`hg==ڿmE]&[S4{rcd/ '9uG?lG۷7Wt'˱:'3& O d׀5 {2cV-i X1oHʀ|":-?/i KQ7DJDY֋SM+/"AvGDqvu!g,k ^>@[VO_tE|K:_%" 0USMBP9-dKb!L:b @Uˡl\;떬3oFTq9e8ĸkh&Eͥē\W`u(67Yq[qk}@kJzuFdsR{4^gZ+Xs]-laiA3;674ad,ź=V2,@@=Y '}w# D 7q#֑PUA;|[Z^N/L<'?dk='a-76m3($=EV1z#p,}?:x<1A1'ʯ(>'Ҡ~*P0sp@6CPs< iq#]P(z6q]%y,ŲhYVEa܂)*he :PoU:_TV-? Z z6OCd-whp@I)BxсŢ|ِ$+[]MrX{F%++j|7.4h2Yѣ?}ZK}}gX'p8 >O_p+rU]3-!M` >7AbS@5{^D5lm0vB#UyQOڣSk.3YJfN(s-a/| `vC6fەy͋z_r1H+;u9"ڜ:ƚ)er3b^.Z7<c@l#[Dž mGR=m~WSfcx t,3xVKn>#>w!VW}*|Pǯ /_~}vܖ/Mnf?~iQVD_zL/U{~=fr;c)6*,%>|az9a21̇=~liXM{S;6GYߏ}}>9b&}Y' ;=ii; O×}/U ݡTz/|G22XU E+j!DVEW @PY^UZ Q iqQM,n S8-E7<2igWm{;˚|~,~aCTbLay e 5nMsy )BՇZ@^Yut/'O`Я8]jGQ kq}a_czG#W:2ZL υ@5y死ZdVꊅ? :++nFLyjB%!NTU ̰9^eH%).3׍բjnY'ON -fd%Jbt12W,2l<%?J 2_[ɬ^K+ccSl^>o6f2\!9bzK}3=1_y-44 endstream endobj 13 0 obj<> endobj 14 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 6>> endobj 15 0 obj<>stream HW[o8~ϯ`F I8`dYۢ >6mk+K(=YID}wo%5#%|sK\^\N02]^LhL9MtNN$=djx-a<,aJ$%9-b)tsqn%M-) QmS5x2/Ji>rAzAF^ĄazE&oy]*s`I؅UWCfY/ RoIw6{P(TY\+̳֌]/~7{Hopx긮Ckfgt^O/.hdw숻!-VB+Kd吵Q[rMm0gT*PY,c E"1sVlBmn+dQ./;x4K5).NwYn4ɰ"ӈljd]\8$.N]5$]^k\hGH,[MH7jĢ |# gR(Rt}l}+KHF Hʇ/n+[4Q Rr D)"ѽ'5솸 K찤@)qϼc9cWO>g|)tCxnVxaśz=k*yD@jp>E\4 @nm (10ۘ"k (sՃ1WYU0 DDnFV rPr ѳ^8BS4]Qؑ*p9.k((3^vq{Xx-b'Ypg8߻僲>o~b~wPi.-JoOo!w{[1H":7mYA[Z<2Z<9Ӳ<.8Mrg{rCIі'藓:u,)-\7zap'p endstream endobj 16 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 7>> endobj 17 0 obj<>stream HW˪lW0`_ ?0B|f!qm=0SR$x{ziURIz?~[-޿}eۻpo?ckB?c:B1.x){B n>/?ϟ8x_[KGqkeK?J,ڑ2ɵpó2^T/A͔qyX)")#{!F&yCUʋ-j#o.SQ= g`Tm(K9^|ӉK~9#YpS;zp j%ۢ*WqqlZ?w=vqGSeJGu8s}eXeFTf!8\8iRl5y+i]|o:`3{0/Iq(EB堐a`SrbU:68b(.m%F|U~2ՀCPfg`wqOi t x+ <*ը 1K0T!c ohM980V;Qq؂ىk4宎ߣ}WhtH[!΋b%VPV[s Hs.3ceN=j8yu_W\6iCLc63IfJYh}u LB}`9g2g3fnRUE ղՠZq:ǯEr c)U^ ho =iKtNN~i:ÃN˄h"F,Qw fS宎nR R%clP :BŤ y91QM 83եjwCۖ@i^f(˧W]&/4/Syw۽Zɼ/Ԯ&4qZ-[ QQլoQh[煕Cuhd mIs,^R/[ºb?xxv |.C<(c5!#kKBmY:-וLtiXO򄉭gTKƑ r ԙ5!~HTf]ՙҢ矇2{I)z cƋCrbVBSTŠcߡ gT8^#ϕf*g1 PE’S\`<Ό8\J NۗB> <79dV eY*$h0?QR:yK '=|:LKR ZKVz,3[5k4L\@HP5X%msDKq_,E}1 [axK'Px񮨔}! HYwjch1"#qp|871jƀU3 #P!UKbI8GTK11edX9GZNyg(!@ Cc3"TYh5OǃjE*f3L2rbM7ڸCbӛC;O}`I8I% YL_֪LȪrlKOWo ڨS'To!c8fZE)V wc{SZW T}8+[%ZPf2-Ck[ 43[eؽJ891tthYWA4ͺuΔi]) P%6j#L宎=+\W+P^@6BM=`^#Y@¿ٯb4Qg1Ld,*mMALa܌MY!M] 9^C  ,YMLM~h8H" 3! iI 'SvSQ`s+n+!Bf5LP#Xo$?}ƀU!6Tf L}SOA{,Lqޚ G+v7 2u`Mqj- MvvbF\2(!KѲftzK>@TO;AS63*W2G2# 3_*L^{w+:-1#:n?_3VEs٦p'c}6MMs1 t\u+v xdlvDofeGj@Z#il L-WFS?k1!eH E12өZ%O<h*$~$ Ms0@}ZE>t5| aaŤŝl'չcH! /@"k z~rLhO%=) G6mx+Q4^s3:^c=-G jRF`FJ/>Hh2yY+|JeF vep9.e <'9sP`dɚO]~;p6X_y||qq:VN$ב̲Y2٥>XAQQ U(kvc#!MGOm4I.\zcN:G!tu@q>%AhJ00GCwF׊(K'Ⱥan]0&h-?(ebGQ)n= .in6 9&O&Y`2.m$gH=t.N]zSZv+&{UHfRziZrw;ձ݁} d IEGXurIfB V/|dx3NP>^(JÝŗ\* 062޼դ?dr,ʠXj%71;;FlP0ò c`=vj?bDd(24SYaP^IbՃ:e{申v,mǒn,#0s9ZA !Ī`~s00Xj8q'P<х'PZG(`XI\3Ub !%Gdar@sݧ}Yzqy] P_dd0+dKN@ toM!P is qT٬z'28"h es`+[%[ ~ہ׼CZ;\e4)&8#SYF(su>O@^ۉS Vf.d%Ns +\}{:O@kEios LKYW: EqmoOk<+vhA@Ll #M$lh rz2zh;pr5TH0>4'|Fm>%) ^,lX*=^9gA-s.Ks.&RM'%]3,075 (lgAkO(}$ ɘ Dh}mIuL < 蓁S:2>v[բU7-'PWN{'e2ۉV46$w(N OfBMКGf >ʟPFܑɕrG!l rOɡE ȁ-\Dz)rY0$P_YSUN&Eԁ[ct2ۉW#ymL?yZUgg|XcL A? * ) :'"ʰ*rZU#^u@X %0H63 a)>[ѩN;(3`¥W|l8:mWA{kF;aT$SϹ8m1/:\ߨ#HW񎵎UŴN/a6)q9`u"ަfg3fxp2{6nwX0;&q4{e:Btl1fdۃHtPpd@#cjf 9!jё8Ѓ8v>2q@JĵzC <}kXG-&uW6v16SEf (lxk(!dxXaZs\8z^Es9^I0@YEFk/fڄs;`/ ޸! m HI7肑P]-.NVVc`CtI1ؓ\ea;G׎0JU$TsIڭK?}tBO? h`Y4ֆt]|gu̎Ut }A81_qCBa[ *6> j}cR1GKc%q\(N0DY(&,HNuHRN29l}gBwg@ǶhT3AsQ2w}-YrUC3' /Él2V&xn/{}iò1z)|܏M JZlNԾi'kP#y8"5 Ba /Վs+VDZ 'ʨh 5arO2`x k⸸.>/xƟ+oC6J ="4 .u8 s1+\3Rھ(xGDc69dl\qk~34&z1z!1YXYAK(TeYTChBM˽&uRn% =L!l ! ,P,$7ug>/(l\6Mw&y뻠յݑ1} khlY5tحfߚ9ʰԍP[\ҘZ+RiTҺj%9PWBq.6W"or7(17|^)d %/tN^PM cZa9Ʊ\pi13fo{B" }.}^9lytOHUx;DVM,}մV-8qZ#KE1_W&,<|lz\g6]]o.qw:gT8m}W]9Ժ|pw }ۿZ‡IپU\.@ P9$č;P\Uyy(^YإS0^5 fS7{^5,دj9(G!"! Wwy|j4j'ڊ|-|.OrJa_(RRן,\h6UYm]P0)v}qMO&tx]1#8BeN-H{BLLԘV9{7:_;FA}kX.xխZb݁ʕraՁؓ1LjD(USoXc͑ty$&~"1 ͡vnN<0REp)Eq8l$!uSD4k߼dIab+: mnxC[=^ӱ0$\1/]~]֭fxFV}=u"4}m/Dp²&Ux` ,:劎wfC~)2_zg*3Tuc~~!g,2j"<܏<ߜnI^*/@@\(; Øa3e<4Ja|pȡY, :SͿ>:d%)zhşړ^;&.uepwΉoKɘ͓޴7[-˃10q[2jLGraRqSL\AތFsz4&lpСeو3brveY/͐U/3*A}5d%5)V+f{pm{H,=ª|$r4LJ}߹`u@\Œ Y^]+ge ^w&q$y`B#r# 24nZ\[|;}4nƐi5l#3 Ǻ5* {y2S'C'7C'UyFp[f/)%h(8PavJMԓn@ĝ}SY)F~I;}@thaeSa8n8ꖄ5_۠9 zt<|rTr׮R뷣s؅.N/w͡hN /;?\@k}QoXCd2JO@}v7rᰗ,9[V" `u|bE/Qwi>zVaߔ Qщ\Ј,"z4>M9M~|aౚVZI 8n;Sn3m,3ޗ!1;dP2W4M%oby1f̒1WHSDɞMxȂk$Q JSp>_8PX#CHIH_[W+6NKѸgwff1n>)֝;"9cu+X%d(E6(f'2h*25'٘94dhS)&+G+>eŇiYqX@ry4s&_'WS?)],*&:bYV `贑0M; 3#rۑuvn[.og@J =+]֬c` FC&o^sING{/FZbvO^c)G<'krwQYmDOu.ۄ;' 'PgHkl~*3V.Twx>u*KF?,Nޏ;&3Z7MkRؠ:Qݧo}!YV3޿Ax@7*3G4bT`l 0n=̦L Uvr|#wBqʞEm}_a7x@F εseCo {⍨*:mzF"ro8u=3>S2s!Ƶ+sUaMHAwަbmf *~,hQԶd|^)d I`[%y\ߔ_h&)|?_ .jܿ6ڤh` 'Un6k~ƀ+D̠T&z7W}yQ Z>ɼbs̀WXjJ,4A+Z+nUp7T;*r-+6wbLt +mv!w֊vP k(3ΣqA`y( |1id,ETEoߗLjUrHڭ0V̖Y}ʬUVT,βb!&7P-}x^i5p-IT Yo6GBJ8HW7߁ae mmR/ij-l9kGTN@4szCBEc7?ρrj2v)  ?.>E!#6KTtX~r芵eO&z̈́^96C ٴ(Y#r/]tCAETb :ncAwWBMLe^H1U!*Db\,(M:1n:)IU֙,&tKDiΥܟ)ր`Cˡޖ# sV@V̮unv,j)K˯,S hA vqډ?I4PGR2l(bfE2ֹ hVGb gf":Aq.sJbGFcCxZ%i.Fad}, TMIʲoa̋|DTj<:֓r_]鯺=kv 0*`YnmX Bԁ:/\Z R#+vm%uYlitW9AmZρ:gUln?ed`jB~!F GC/S? >ss,bD5Zg96@k|tjp4>U;MIaǀ`WU \ {& ]p؇̴,CJITg~G4iinZofҕ' X@Ǫxjhb|_xJ΄7<spJ$Ԟ0 eQMZp]%"s\*6Z!dohaХ=nY~Km&3RG>O߆}_1EuUlqRI>0qKgF:L ѨKQĒM+͝k.3Ȃ+P_8K~H?aڦ62!S ʫO b4bB6S)<kχ@Lv ]Vp8VH6-ҫYko0*QT.9 (E< S jSF(Z;lb@f e jpO/m4^g94 /ziZnciN?r~U; GvrU-5`WS=Kz/]e\k/^ƸNqP(ц9`P4UY*8pӴP@ *XlOn'T>{UjɊ}[eo9 *4c}r˿S=,`U˧  um4r ԰&ﳠn+Hl%^dӂ!dši8fZ%U8gbSW"̟K#\aJO@-T!X |? >$wQ:3-fTo/sȵi״Q 7 `+ B3/Q0}Betx%:bhlPi\71\۬CV;d\& hh~30珵b:CBHsy/J;]5Y mM0TȊcU`I%Z0i2/̀yDy9RyҬ]bFӥʉҒՁdjuWTыd,eO:̱mMD.6yOIEtoHFl+*}Y+=:-[rc wEZ8;f!b|+d\VAw-FwUe %ӊ_87e2 e&j-r4z%lj(D|YiU0߄uML DXi' {!L6)փw6VPlS_\Կ w5VUoC?%OƝPsꠍ"ʯX!_mr#s3% MHC5Tnѯ2BY/fkr`LCr\\覌),3p%z* o]9 e ~9hv4B93ڒ{[Ûm1G^S`"3\ ՚fgݏ1w& w'JԠb _o;(>ܫjԴ 9٩y0H,GiiPv2Pm |mQ׋-( 爵2_~j U]?YJ, #fna&[Ph=px>]9vnl19:W7+J%/ѽ!U1b_IJ3VHTGg|/ľ3w玘`yDr:b]PnC"[N"[^/Ʒb$ܬ`n>c]0DWDi]\i6'.fdnwOEYȕYOu vy}(d̊>ccl ^DqbȆ3q (BGOZ_sF>;)Z6P ̤N,;=9zRLiBPlt?Pm_ؐ%i@ǜ#Atc .yu\}\ZzkEFGU/RT&@ ½HY> hrȦ/c:@]?[鎈 xR%1+6|$͵wq^qP8cN6`Hl ] WTi)q,(T^ztv[[>it6wŇ4;$COp3)X]%NhO79z :}`e3&ǺQO 1vW FQeCnAf1q{7CR]ux2.%HeE5\Mb 6BsAk>c`Oėf~r=$7]mTKitwAgJ(dYV:K̓mr9%!7gLi!-.t?O :90:mRY9,^E J%\}1cEz\klظ ݷm֑kD!|8R1ќiD;g8. J@ $6c5ԹpqS:'ίuydEUIsV*$<]}xKɸ]Km Q7cP²~'#~!si):34~~i:v}srڏeDy -Mqŝ)K(> ,D`$n& _"ĝ!nB<:B߷ {M[$0My%Fa'K:mX 4/]ƤzE6y;OQ<"6$ql\5L)S( `,2AVNbX}l=O݌>#B&6YlJ$ ,\Z\tPazUR`\ qZ\%S&?D#n^4Xpzk5 vUi 3i 64d_NQ=fC*=P GbKOwEqƐ O7㥲"he9jY(c,fJ\%=,8vpURFЁSi,o!;: YfB~XQ;13.[kh/? ӽ@2Z{ 9l'% O4p@Zl \g~"4KPι9Cw6 Bƥ%}=st+\_ ̼"LN֊4TC+wBC * W4֩W{w$)'fBBkӟ)րSWpe-$Z-U1ך \} b7tSzr; kqCIUa & Vň*6˶j@v}#oqج\sH < 1YhDePK?OM@VQ%'2@hp6'l_B^M@eLnZ@G}L:Ok<1BAME "|j&p@a3'+ {sjxO>D*:Fk_w lᓢN6?v_ c|t':8W>"A\9i|h̥mZ#%I'%xu9GaMDԬ H ($H@ h$_2iUnj 6^AlEdEkT0Wf0חD;WB"fXo}o@ۑZj]6մY=9,~ b nnHεQI)|~BYzÃq:}@.:=`~ARd΂@;vXGA2>\zU=#&etDE t MM0Uzˤ ϟb a[y/O6.m0?N<,ל eFڃ.cZ_}AA[I%>vnѩ q1[oJֲS'Y2`:7?%߄]WaSʉjCa>//юZ|{$+{^Ph@2r#U4Pz{YwB$Paa\ӷc<|&eqʧ2܏86hoQ'ѱ^立RByxtYKPDM%2lPëA7]b[=vEa%bDpBb)_3?,(+^OD>Y$7]| /nmるK92g3 _9v^ ҃wA խJ J DMVB\!¨u(MehfMeþe~Ԟ$9-.#.v/J\r]s(e,\eu}J~lz\e݀#B#%rhՉQ yRua^gC\9h*8Q2UaKӂ4:?\iRQԵED& 2%;[6;Zp 67|ؽog@t4nVgĶԋM2ʓl,?G1 \o qK? &hGhV+_E5`z2`{Q$lRB^@TRR<)FU:Bfӏ,.)49=g+PpPNkR<-m akP}%#.&-P& "jװBDɕ?0Dž%pRrUoz"KOE?#]ډM\m =n9쨂Q>`'dqص=o.h"ԷC@G6p`h0Ў\{I<&U'_Xc.Зǘ;"tyT`]J\U$; p`Cp)ZUo@F&Stb=px ŀdBLHsJhOCe[-zMZɢ4FIJ¯?B&%pF"#5g?񑅛ޗǶ&`|esoum6&;r19&qnëїKf-"w.% ifM$,sHL2Kzx.Oɐ$Gpw?}XrtzVC0ϱu>U9Mfe:(!9deaoEܩ߀t0UQB yb%pj񈱇ljRV%R?.BFYFfnQ/C]&V&ކe?[(fGw9b Uc:L4[v-~wz]-10{ȡ?% t^_36 Q5yRfR ׮stT\i3 `*hN9e+EwѸ4[ z0'% d}Η3Dۮ9nj x L3HI<6@ _Ġ.{,?&°ZCi/j6+bk>*~wB`tLt>6 ?+HPi,>΀~ A8U49 ℥>0x/rŘC( }/K?][]yZVuړc<R%ϷU=wK122x/(HE:)dXX{"Qm^9%>wAƖyF+YYC~^QS&1,~e体6?)Ic o0Pdi{e\Τ;/l=Ɩ 2*do}yӫ^'o<=#NeO;̴KЂfF0e`RZ'.9tj;Qqx~Eal toR?*㚕6_z%J]HNR8F 8`̀߇!ƴ6nA;-e}8U(::JArć0 +pwI03]“^n¯YOHvm 0jl;TJEJly {\jeƎ R')әuVw۪e2kq[-Mg4qYp`FlEǘT!:IJ }&@x\ۨu O m:0mPwl޵ث#TAIkrjwsz<166vd' r] `L ^&DTP (%02r)9zr< rtQSRB* pLD-s5S}B+.Xj])+PjnF׉ޔRB+.c ! [Kc x +/c^1\l)y \YAv q *zϓ`~55k] o#@q%Q$/c^vf;K2,;e,uxK0.@_R+SN L\8Ҟ)D.o"nmC(:)d!ƅ'b7̬Oo/6^RSrZif{w4_3wKD;PKOyH)=`2dLXeDM+:gR< &)~όӏ/wʠ%nO"b=]&Đ̖)Q-G2@1)}v~^'[;m`zB˜y@O4zy )cRu;+@xj: S6s1`iljŷgUOlj>/^}2ָg8/gܖ~E=9LlBtye):vu(3$o2p~aaS 6n`9KiyA!rpŨis@ҽp>`:5edڔ ^(4DZo[RM'5S`f3Wh ڗYЍD+O֔a!|-q@|dKk='dR:&N 1W}Dk"2̵'m+25PL8:nѹ6٤p8ѡߗ3maβ:?v>%,!iGe`zπßHLl*8 *bLźА)6)OZG8aÐֲr`K1 M=GvM\1B7PY:?SSYDB{Эw5BѐsJdAmAUE:"~a 廢ceA (23:׊qM*v$ 'u634H$jo sN8 h͏~2>F9} 'N*ϰkU%pf6~ Ha;/wOu~E}Pme{@g%S))''b :BGCDg|,էDoV?{f,=ZTmHt_"fc3z1|dɊɔ2`F o8@eA1m-2YO\D>I$XBp-(z4^0Kql#`30n^Ji/g5ΓЎU;Tl7Y|'&:m/K Ymjր]K}X_F/p-Fcq?Lk2*yf-wtZۮL"J9 yGD7HÂ(F@8 p]H Q~#Qo'ZײDc}"3bZ/kl>c%E]qʓL)POIX 1<)0σ+(:>u ("Wc6 2֪VzOGsˆՌe}? 8QWrc\>=-㳠Tc$0;u]} 8(BfU_T t hėf??,O^6\bOFa u !}$ahMcs5 $:٣աeYXvquӻBM*Q3=+c^LGm M!cBoԡK?۟z.*0 tjs9V>56 Y9\~Ix Z Z}B9wMKq-&`9 *E=X$ɮȕ%`C'r^@!( EhJc1 tkvݰZ~<0sE$B:ڭ>6A:'?UjĠapϐv`ݠ̐f 6ni߹l 1ǯ@ @'@$ՕȁPeDr>,(kPj5jϵrRsFÊrTKڟus o b"@=!I:/\qSERtBY\ש94pE5&f. }}\W]8͵WvSԳS{SfRnmX1bJ&^ĕ1[NhW`Ղ P\oVB/onR\siL0;q]`gT8Q9YX&]?D.ugڞޫɃH=%YU~}mMBX˾|4d'2" X}YnjIk:S$w8hA_9t}qM,hG-$7T&8&I[_dԞ5pU~]S.bY(Lt=e~a3볡sʚ^XQ#F)4VL]6$eW]{4bG M֧׭6r;md c̭@ΕudEuYe\h4]90(gYrV4M3D$! Mm Ѧ?T,%;ɕgQ*G1tA|mV_xa[Ta^^Cig{Nj1,>>CbΙ(2k[7RRl_^? kꁓ(o@ cd&.$"W:rLKWT; Ǝl_dY=fpe bFN7+ǃ .=Z= 7Y@0e*=J%{f8(<_pM2].pXe4VޖNj1cҺDl ˎ}?9İR)LP:2аrgj)um@4 ~1HS /t"CMQSZzA1!ikZiv n8@ ~y!iѿ#Ҡxk_,vgAx:u[Y2;sCs=U .Y̞}?Jez+U4Ug1w̿nY1 ƌc]D% {2)LRܝ 9u8<`_Ic6S_`Q=&KM $C|"bڳfÍc8dJfb tAޭ6Bq;L),н%zzHd߁A^eaJMSM+u; }MMy 4o켭D]P}% P8]VM\DL @dl1Zu!8vz [d'J1&Uݕ}a)7iW}oe!͔`>8s7tFªyr16έڅs 242":RUh26(1[Ft*4܆ bi~* yBСY bDYG_*z@}TxIqNR<`~Ο2 Yy17۠iC6{yq|i:/$߇-,2>Ğ$AuX1*%_RJr,"'Ɛ_Z3GB/+x4$0` #+Wg6I&rZ# ݞK ==\0,ru(2eDyB ÝK`)"nZ#c#Bް]0h(f-vbkKP`D7~moB Q+gfA 3)dǻk=Wp45;r,}a=}!JNuzfM2GLNY^y)bQɡ\0K|^SE)}׮3na7iI@լ<Ý[QFp rҒESk{u40Qa<ˊIN@1mNbhl9]+.{t,RAr=" 2 ݮkD$֑} ykW ̇LLQws>4Ȱbܴz~/LI[ @f O1|Ark`ˑH Rl `z s*$o lr^o#5=<y !YDOup?~z '=9<,V[u;"*rP̽n>. Xeyޜ{xDpi UnO4ͤY9 SYodVu"_kDQВd禀,$5Ah?wAw*<ŻwKfLϭJ7yE-8Qdq2- >8Ҁe{IjúiḂ!PDHNڸ+jm7b$O :3KVHƁ8Pa zR2(PD 5)ĕؙcAYa՜\<,7`9xJ xZ;vO@8qҦm4u?0t ̓{xqnS 8мڇqh6#=6)D7Y{FyqU\c'U0FHDVMWL~*8 "ɖ'gCK3Vҿ$P0ͳeȧXB У \HagbJ0P|JP3I$Ef3t')q9@%!/WD5 QXlv\7}ﺯx-I!m[ #ٻp Ѥ* j^I^|OdA>P4ֶm̰aß4+:ۋxцV9r`a`'@tsZ!h9j[ҬT|yS/`g :^aB 8(L?w6Bt3d$=V{gqꝂ1WO\gPW7Mк˝|G0 <1۾D/QE5@fZ's.f3'}^RQr=UF >FJuΈ% d vd(uEtz^<|P=Fvo1?6o`QHL?dv`6\rʉkKGf->Wi:N蹛Rn--iv\OHC٬LJx=M&"nuqicsaUg  ae ew-wBd::Ғ,*q_(*JB65hnD0*`V/rF¯x(jU>FTJp *o*-1W?\WL^t֎wm:G@#NKń2'1v_0uN$uGݨP1],f:ln #flyq4nAe$ N`w=RF!̙(073`_#Ia!HJ1 ..![Ђ:`Zǯ/+#4ur Œ_":Tߚ/C:u4s6 ^bJƖ6WJMUDH,s[3ؓ/tX߀8+|6x&ͦΖE 9sC>BQ÷#tkU>xtyO̊ӷ90#ΣdM[Y@'a=< SxrhG,(/ɼhY=FpiAǰAm^ȋs4_60) TC?3'p+(p_ y֙7[`yAJ;ɽ+B׀k4yc5j{pRo_ݫG h\ L׼oQA dQrѧleQdY36kc$sCr[<>/a ^mue?ϿGǫpϷL$r )yZ]YVcrŅC=&ʷmKJ`+0\? Տ7gQ avn7-1SOl8P͐q>d8E{\JV[it|6*TJ DD8r{氱$. t]B趾27uCdtOU $OS0{Q*ۡGǕ6 _v U;v,6JKPսXd "-h^Oy3kҎz-k ~]1zߗ)=CB=͹&dJb /E;D6"tKdq tZ$Ut['vWn.edLyS? 0itjRu&0ғg~mp.-NJzk$7iְSڀedL,ac!f1A cPc;ёfQ< җt(,S?E1͇pÊj_ ̡'nXǔ & ^DK`!ZהI jzL}bPU}Ԁ.o*u!@\WGM1 $ i!k3 )9^Y67L?<4S޶VB(lt;1PTPs= Hn(_xWYzm+؇R覰lE7Xұ RX/DO<.\o;S*zw$PںᨛiLم^qbM-T,E.߭=|6ndJR}AIuYل;jPbߏQ(n, [ZP\- L"Nr˵k!X$lӶ .g)[pEoMa"QGcv02YMؤxJnv׸`{-@`9lՓ\w+̲ۖE74 6 ^mp plۢo&Pka=I']agc$vl܉Ha.pw%$_J60We]U S)paggEPa= ?,++XɻA5RtIqV%z$bi\N)eSDoi}ı~~e(IC-;| yNSL[RH\o~XV z8X숃OhB  fif`j1Wr-8CV#p]bRx1|zM z3 .(t\(E'FdM!qS{{eͷFqmt*;xFc>nb"J1ˉk2aqEĞAvkW|+%sLL546(,}"" e}qG|{BZCjK,ClvH S ;ޛh눮uDuJG-NsH50#~SGAkgH%#Bcgp686ncbAy LcyEwA\v8:4E _Y7C7 Q{w MnDP0 7,톔ł)Y+Cz;VF;Ÿ^WJdJ!%X,(k+CzWFc߅QXxeFy[bAWJFyjthЧU5V/ b!,f $Iɘž㺸':]+KG-W?6tDQXC~u&ѡ3 (xxJ={کmG(ieο Z*C3?a8( pNO-ŵ%v7EװJvMazWc< E" /4~1w_6,nvŻ b5ۏ鼄)"-0S<ٟai\[_67Cq{ CY4ޕ[Kt Ԓ "8eY\E{L {B@;m|Gt,`OʪP]\gı8,i!'9 [["e𬖎(pۂ  AZtį%(xyV YkF:tx?(kCpY7?h6##Q 5[mi>c;)A" 5g&"Kx1>| ɄF=̔=`AF5ۖ߭¶~L\ 3PEBDz$J~ѽ ADӪĖ`yj+F.7@ ˑKYE{{>ç_=ۺw'c z@ћсFjIVp=w۵/#*w<"-DHDWM=Y&̫8Aقa{Ɏ(&'Y:Fi/M|e#~Tzq0KS Zv0]7')%^%3f|A/ 4vFcxD{N e+e[\*]Z~?(EUM^~0$W\M'%HV(o*J SB\Eb|͕G=Rkw[agM@Tj C.VhڭT|?%޾C,?4>~خlUcMk4]+&FxI!lʂ)-Ua ל`/X|U*K|(*O A5?2;x)ޯ~ :ڏF5O*:MaXri|A,+ͥ E^~xai} ]ZD.S@IZnI=&:JWe6KCg7$PA٘hDAFe;UHh.+jibh<#g+LH>/FƼRa#:gľ8E^/ƇcXC{B8ELUqQJ~[xct=Ta!0y?|e9f6Ӏ_5钫:l^8+/'!ɸ?}6l[tTFG8hn锖=Vcտ1Oϕ*).!cМF6bj;%_s] .]Ր3KF5N뷠rafN;m GK mj݁NYH_F;нc1mn::Z'#/C΍Tʅ{"^NȤĢ+i%&v +҈s=@U7`u.1Pȅ"]tgI\"Njl%W-t98g'W6z.nΰ wز4e~/ aʓ1W>f2O{ ^}YI $ݕE2,'i,Dj^VL71TJaMoSr.:EԔae=ءT9ҧ3 ;>ga5dI+'42,Lp,/i-(^m(ի?m|U&^ؤz;"{RcHn_CbEb[b&Eiܟ1p67,'X]{.lK pZ')ɨ['|v<>}ւ׺hs11y%etoDZ-v rϖ{VrRC0S#xb5Z$`k$eIN#VUf-+EԙH !D6@&WHiSAtwٮ/^cUtٿo6}R9&f\bāl I[?!!ˮMxHjj%Aݠ7G,@2z& 3`Uo !^Ӷ`./8q)mBί+bl/>@ t&9 eQXOp/\j񚖐7N/혧m0QX׫0lf@c^Y)Ú2̅'\kY` ЩK2E+WN}=d:&9EX2~ A@>̦̏~M7&[7ǒ}^KH$Hco+@Qqz-!!$% SkuEPIE.,h>o%f;">g PpXJ$ 72d(^ xG;``ӷ32fuJt|%vXbFбQ?ot[4R Zlד0$3:dJ& @j}ˬٗwT}E聣#,kz%j"&EXɂk:|Y ckpΏեcێ%UboFjt +,?,#]q=1;vY =`L󴯰e3&td2ŘeفʓdLg,‰m^?$:erV^tEkF@Ktgl\E{;b3ïJ05ʉ M|3Qp/QdcV?*8@}6^t{4jX1[>$%#Qp5(XuA&pXǤ$zn{1cduH'cXNcmEٙ'Fqa$dY6υ傢JN~mͫ!b2 _ 8.D x Vy?"=l߂MXsTg`>Xyg,70kغNuqƾP7^şY?U[AfQhgn%}2vq2`5e O0",?>(PMW>=\X>7!D]Z&F!%'VHYWAh+X3j"S` KgY-ڗ"t3`.] bBK R꼀lK3y,#Cz ߇/?]z}wYd'|FN$MQAa zDc*+-w~e*9;Zm.>[`)J2Y!;cB%tSh/`P)>fE25s%PO7pmrc{kEUpLh/B(qʇHLa7m/z̕D8pC[kē@fB% +ih#c*1$*r\&`Vq`8Yb|+F2M^hL1Vq2vl:09Zp9e KːlP^)F,IU`yCCu"\K{&H}?d_toghdH<=`ؔyɬOג8O%'\L\PEBxN%oQ{eYdɵ~aBڼdus;z BA1eUUtAa%K ##K}}K>iP/(ݬF>@0 5|pIp%BYZn /JE-`$^CF':,= reݢ2ԟ &x)f) 8Jo})0>+|rIODf\o;ͳ>: ;Pq<DmG.o#* Y,o}!x 'cG`iL [^Q11%xc`8dؓQd[ςa+q+*`ۂ}ef L7cGFkG"e{,bpRʁCHcNfM ~Mt Fopdw链か2LO튗0 d\ KT *1pdiɢ[e$0!? `KRv,|4$ 6j>,KO6AzpV4]uEVÔzRJ/9,X+aãmKؾ**PTMbgUh >m,9?i`Ff< P&Ԇ0֐K`czk gt;&(JGEX0(f5s1haNG. .-SAҽF(aTFN#0Z-~c`Sj=:x(ɒ5;Rupaq$I딌s mjL0nW|?Y.p-BDȔqL8(%|A{2+3KKi drhE0 Q [0-p{g%FP @vP(naCbBJrQ 6q.ws1ggbY.6ynh&$eZ|V1(U-#VC GcX{Q I3hլ)]q=UPyI``!ؤfA+x8䷓XXH/)BeÐa> f_匼넃 LM+LCu\QbamvwEw7U.8(&&UqşpIjRl\MNM>W AXd' H,TxY'kl(s2C/ 3YjnژŜJ1㚬07P~1-Nf5I0=x Z]1 j!+;NVxVIӕ{jqE 2PcYPkp{uP c)F/K~ҽFqfXc-$5@꜠Ou~:rBev' eɻF@;RDnLb@8^ 7b!E3b*7`>dݐJy]VԃJ2*ْ)vh1ǚ4$5;MړOGν*^\խRc@CM=qh^nvJ(ic,3]WaKlP(0x,DKH:yxrd(+3h2 G3Em|\{ &#$"1'ņX9O$S'd}XK%F\; ,$ hV352t8; , "1N^ɂ>} 7`x+諌 .SsSgK>Vۉd:6F9eǾ_PQ o7/ BٍyZSy6QkJ`5"FPGGs.§tkG)"AW Oe<}\/}ؐɥ=wL% ؽ-A=1ܓHpul mASsm6Ȓ"ra9Ck̃  3)Xݛ2OBLm7> '.:,`9FU~"0K-J* ;YPj ]0qDw,L@lBDwc`o$O8d0ɸ~dI}O/:~[ 3nTFsQPq(J%D{/ .;k,aa;tܙS.ƪ IBЂ6D?%Cc,9dIĕ+vKIm~0Wb$2$~b~:up̍W=ĩg.|DoC1 ~AS [;xXČdw`\Jd:5Py􎬊yojL=6xٲHy1&6;Q#qnELb%f{[Jc; f6lThc,rKsOH{fa7&˅C)*u,Xs&]ؕqLoE@Pa܍xrM$& ,v= N(Ts#mDx7@,ǿ]Ѝtoo-:}\K|2!J c \݋{u֮Z yf bj~yo=+!n 3޶ / 3f8M3ҐQRaa&OaXY;#^ *]c{l #[G{z/0C,phϮԉ4(ɐ <ͦ:q{97f)Pʢː>1r CƧveR*"EIjՏrYP?୎o~{E0\zD{JԋcDG\l5%0K q&5,(Kwi KS1AAudÙ7)ţt`7cavcp҇Qc΢H-{vO1ʌ1(hx@~u-fWQTS;Y6*b4iМ )l1fm*kJ aq&pn[LM?ϳ@v`6f;rE`uK@R${5":n9qd:ph,ۮYP?8i^ {嚰VteT&J9'dy@ Opn%Kڄ:hpZ5HT-^LƢ.s"S`?ƜvFqZ1 0 Amt b58}^B^C-ha,\pyEQ Q;vL| z $efwmڣqX3֯2Ώwڞ:^ Wb~B/e9m|EؖHlGkfzVeV.?R- jݳsۭ#ƾY߆hUt vd`m_&Du7nАb JS,}yOyͯrvˍT!Qs:p\h*OhG.X @, ĵ *>P/!IwvN1'-q1>}εw<9<_ɢDorJ,'}bhL\ H:It.+J| ߫gkQ 5l bv~p ^+FG>?R0SSYDB{ЭhÐlx^%ۻ) HY&U0f)"5eXvY8.ZAe-Hnsv(:WH\6ɡ:~XYF fsϞT쭚ۍ=V Fbk9m3{IX*':|a)<] M.kFɵP]6ֳ3E'9=XlP0'=4,M̔ѩ_y:4M;vĎqJB3v;Fg,Mi;//޶?gRaldwmtV݈J9^<)0TC= NMړm/,-wŘ{\st'\(aHj Ҩ7o:`ߏcemX?8+%\&/H>It Z"偪H\ a i&"5BiY5'윾?$'TAқBP?-)r;28x_RI`PIi@q=-fX|BDn˒[q&C>2Qs & KLcڻA&Ħ<2:^s `@VdKGMoA60\2rz&ӺbƼ,+gb*ʠ/V %o9M:ľm  Ч$kZa?G=ԑ ~Zi@j{!M$b(͚-;*ɘ"Rٕ9r.t_}*:ePFpFlvk'?ZSTnfQ ~SNhr!hh*,඄>ٌ 3FH;Yb"I/%-& hȲ$k8kWƨgd@Y\oU߶o+VO]B֮ 5aFD5UX:85PLeBP7}U;LnF/;`z~ŢcPnDVf~T,J62uxOsq Pg^ϰ9S$n|A;**="0H*ɱ^}@WU4mQe%7W6;#v(?".l}?^:Rko.+rwmG=Ŵ+Wî%ݣV1EaFb@xP€U,EKV6]f@Gt554R=NA+ }k1N LV|e@VdKU!L>),: 12(Rv8ʴ$5n6ɐtZ\Mtn$Lfm 9@EJ6gTf)\ rO-2,xڿ hн ApA;m(@lH/-"T|,/u2N> yb&(LB efwX"t&U.sY40F&ڏKlWۧncJqޔLW[wl Qhl^,+oNrsœ >e}ܲ/CG; 9B{%քFT`ͅ'l"byhJ+H"6T]|{=ɲT"hP(o*;UC_\.5*Ͷsb:cfMV*?3#?.\Y.н" fS4 )W+ H$iqlcy =&KQI]$i|4+Ap[U/c4hǂ /X 0.؟t&{YIԣ^U"+RtJ~\f߰=ĺTM% 6g,bb狋ڢ\ou߂vWblhB\>1/) _2*E ?'c*ŠYqBtX$)CE_KtX].YwDVf{q=+LGwB{TYeKU8O&I2=.I&Q$e" 4c,zzika_\ A)0`9xKzS/t{Hb1F<͙zBErWP⿌b 7X$/ulE^xNLRxIm8ڈ)K*՞e0PMLJޏ>--َ 3! 0]ixZʆ׆3YA غiw]@ ed)"ƬpC:_ #%6?'xK0z` )cW4nK{C{ Why« +[] 'n.^a6{Jw'0eAV=')όӝ[%ajV?۠_܎JNZߖ>&$+/Y6\pX$-"(;f}nYrN/1d_<2[O.ܕo0GMF ,+{ L'%cJ+6zG!FCL>]GuTtѤy]zB>'D4R,1>2<1#c%4PnP?"YcP/mbT}9OM6YS-JU8t9'#ɊF:9v+xpBk5RMYeGƵtt݊Sd zVw^z^r,u:.|q/bXMPO65$+B~нL-*lQf5T,8^k<9ƠL":s'O Yi E[rQ)ԣM)NVqHԕI ^ 齇4|?IJ SFrtNү8DYg׽tK_TD/-EkrO*Ô.NI܅Ql].;Ch @ sze4Njj|P)]גɱ' Z"ĵr̴ͩ34>SqM+S-\ٗѽ2\Ve'nKZ aBʮjvׂqsU*Uj}V*seo6u.|a!DoSWɓ)m-6YץLFKr@<.;ADX9$Y) ڃkgom=J{4!R4F}49x*\vHg"]fv\qW 0.@dzyk 3W4~M)~\BxP-p?Os tRM(W{Evgnp/zO=[x:jN[vڣ#qȅxBΞ9ko",+gPZ\,$*cAT˴vV@@JtdNl%{cbhW/zv.=9!8h]3/Ǿ՞t<_gC?<ֻLVօ(g;b챔X@1$P, auI0ןN}.9eSǡZm´014JSD`3$AND34rm.}lc7g 2E-eiD hl_=q6I m_"bS95 "ɼIdwʓ;1&aWg~Rj ſ^iiː(Nnd4~rzWmU~[@bPt&-Ub\84l%5g@m2Ar.D\z0p2,ae`t At[WxanǸ6WD{ mEucJoZ/HJ'U 8^,RF;Hպ$ɂϭ7 YEew:d+*E+mճuh¿وQl-Z)%9Auɓ9q `Q~&x^ eo՜O']Σ~8O@yPƴ0F`4m'F&pD9 Fo"|$A9ƌ*qaEB'ZK`}IeM .fդ0`T'z֡zf ƅvT"š/1 GNiˀuZKtyNl>㬾k{6bԚY:b'N]iϪptEXVnTofؾyZBɘY[7mo)#1V-DhsN+:uV?wp:-hkX S\`aAe' D#wڱWen-bqSÚFp('DlXG3ʚ5@\>Uc]9dH퇰 z{4WK/(i]V;VUdqS)]EdK;Bե;.{E1d^kIt0h+ȔW({4.tBH}C6que46"SL\Z9aزYXfMmA p⧔ޠº2e +P樓2f,B{p]b!ϴ衟 /cw}?<>P_77L,`FFt Jbs.\KJ@e&xWGn|"50t}4& ҷq̠>+6|E UȲwm* 8&q(t dr1,'Z;P E} M~Q~vKh+6"c '.zn?$'KA@ 37=}I'سi H8 ag&E`3c46abk. ١2"M0}ےoٓ!. 4B#Ǯi:n_r!KI]>&jdդD'*/Ū!^=Tkk2K9ZmAHɋ )Zju&Ic8)4ҭ,*l)b˖+'TH2yr+y(|*rӨ"b ГDQ^!9r܅mkbzA6pmvJUzevQqk*"݋pmq.*峠ͮ<ưozFDhD <;x&n36Lsʈۗq OpghSf"U-TfX^>C2!%0%8 @rPlvUmm\tIkW6L/[@Y)qDgF9 b:EM }en1]P#4I`Io9̌Rftd6yP葋_/E74|h {2HèB1QȀο}KLg_WRcDr"ʞ3~7TO cVʵv1+rOcq4.0XHߜŝtXL -8>uQ/ 4Q>†|RsUFVmDT]v5/Иre,yAXͣ{0zwCO \|7W7"}y%ڒc,j]#bR3 u>uUGH{t-Gөavh#Wa(PALa!=~/`F&!sj יɦ P~'ͳ?c^<7-U2ygb!Q4Դt&:lHMM7ODf2N:=eKl_b.Ȥ ²/L|^P̕e4˟4 SÀIG7 %d$Ei崛y1A99~Sv10`!a41]$㯝G\A+9^u-5cfrPQˀh&PE\.tD1MN(jRnj, L˿4 ) [NB9 o)& K!HA@CCtڀ,=ߟkS$#wJ@`cE+#PH%~#F t"> n0>`EBM%>Mr'xc9@ "Oe@k>AKy5)җNj аٽ$U&`6S˝0Nߥ) qbK>Oɀ:anD3w|쒰Ӟ=SgH2װ1vdlj:mYϭOUމ=u\Ѕ+`}Ex (ڙװD9%0~a.QIOW5o@HJmL@ /kŀ+:]@zc8[:x[yg@K7<(XHs̽d7n\f+C}jVb&f*+Bz0my )c,چ}<͏bZ f4u#;71˘& =dH먠`yXQ0)ӟԚMrM}vCv;HFdJC-#h}oҘNߐee"RdЊY0 Ac>tgG؁)"q4P+ ً)a, Ӣ7fỡ6&?HËn29Rn ҧVE-x$Ƃ~%1 ^ 4ִqML@d"N1\BaE 5-BJ ܘz44-P-cFzTb.!Z*cՊUƳwVqpE0~ߊDu 3|JPa.YX6O~3t> W` oQE]f|}7ye)fbh3>~R-J)7Rt]bJPW .|za=.M!Qt'pt1|6/f^$ǎBߧ `8K3 k&N@l@c+W؊AqnJ1@ѓ*FRmE}t "C?][>/a6^INy|[5 a= KXYЃ )\&y1A=8J!,Ռ)m?8/'cn|hD?JD^`w0E!wAmyzվ|_ U0Ah3#';[`˫3ZOZcJ j7>aU&斞*ʵ`U L5\W_\zl#f]E@/!Nm'VV U(of+r}^P\{ztZZ?\¯8̵8d0מ.QQ}!@;r"FXu0`v$; F[IS M#flʼ4CI+xHJVɯv,u* ~&d  J}+U K*)QrB^dֱa@<P$2P!10 B -si[Et9D|i @֊46S iO0dNWǽf$ rWKHOr`#bSq-1q-YEa-x)R-e] <&`3@77%h1K]2U랞Jmmf} &=Q Ƅ^[ X[kD5So.Te<@ L#ofŕribrF.g>Df\#&%aվ Y0B LCbd91c n'49D|lvZ=C[Wm\꥽W>165$6rL!t1Eq;9=HDK;f|#GQ崔wn\?gb)b,m=kZiޖF9uVꚑ%&qh"bED4*#/bJ3|*F;FVpeO'Xc@0vL\(;ZVe t_Ff \oHFaKHrFP7j3s+lՒxM$ˡ=-@7e4f)H>vFIYcqw0 ‡R8]\_[f gK1܈Y6Yѐr4jP1}>jk%@*LÇFW"V'b3DDoq-C_%mcjn2( Ƅk' ߈k H긘\oDQ GsMcb l&9#Y&u_L?;Z̹1vY-%K[\oR] w _i(hly&In>馌&-=^zuŬ^/z_FP$&*DꋎX6Tg pML#rB%X\okS[_ヮN1 Xhdƪ@VIٺ'!ьrVUf~x,$+ݦϽniȌuiJPJuX }A) hy\)^d9q&1UoNHftoH=|Ѻ5 CPX(S G<[lOB'q EtFqk@-J_^V5 ЏfĹHb#U\Iu`R+[_HZ78Cg]\~Yw7?C8ɵ3rQn >ݏR=SF~1ybm`pA2;;z̈5%e,7)*3{K$ӾT_QF]6qnNd|{e N"rg)lASR9LcטѸRY|t`{3rDΧnq94 (tBx闝~"4/tWz>{@* N3%kQDt1j-Xz6"zD*:8 OzPUNUw$ Ak 1s&ur ,E8[kaQzW\WSKʩigX%:p5Ά=8 ɨ/~54޸^[\oʥ76 kHl'TX ׹9[ѸAƛoĕ:c1梆"ltp@Bi .ii&Z+R,,ok<_ DÀ + <=+ɒXd!oyɥ0ʜy40Aq۶ uD_$CفJ\ P-D7PudyGdi/H[QmPA] f)0 E]Ͳ;$TL:t,DC+r0܂@DV\XR&fxBCAF%W 1,7őuk}? G0 E {Yӻ\XSĺ(\sO.Vrѝ i-I8'UltM/`4U'%Wt z=FrC߆ʃ[ 87*B5Fl/N$f E2 a-`ydrVʘ`\*I`aU_TD%S~wMRȡAM o@jP~~hvhLdĕDuI->tGf \o+wۻzX@n6;%#jׁ"G +8EV Wi2?QD9/EP.LӛYٹ?:2V'g)B"z(yNb$,+Ѡ6x-PV,(SY(+oȔi}:T;^8f_W:Řڍ\D/P[p=o?!VI׍0EmS|#$6f) ͘54Kw0&VC?Vc^*ȵBKH4Gb6Odc&fKFCTfpUȘ1j2 9e,=]|Z8솑&-TA,[ؐl\QA.mMG6Yc“(lNkUugҮ2 S Hj:]\H/8d/ O$?C}_pcVx1E9.Z8BU}(u4==U2Ԇ٣9[C0V4 (/'EIgD$ ;gI; 1ޥs.&U[xA;Op=%eHxp4NcQ&.!x^S4=?CS @<.ry*L<|߳}-o)riȒ`-Ye' _ΣZ QG3٨ vC.OU|߀^*P U=Ӑ\>?(L<|ky6j ¬jJtCt9I'dY>FF'tĿkO/ѴI@m9p*cDu3!U *ƨHXHJFv/]3WK[`ʸkMt|/pjݱXpmd=t 'N'_'Fߪ=3XsS !T T)cCߍb3v&5IЋ\E:~w:jaÍY@:ԅ2(f:hvCO〦CRjM_k~%1z/v\o*Az{~ U:x> )AezuicD<z|\Sa=.mh gY;vI^; \cMFvr}Oo& ͙mq% ߜMKqK?MmѽLhkT-#&`,a6TT!9^vi3 π"TٷS,8 13 t iШIX;(O40RUsI*7EUJ 6wfr *Ii ӹ{8__JF6~4\ڏ-k^!lF˓\DMmWX0zgK!k=Jc\57J/pO %\;,R~r=\~Khp9=eFYȚD>L: $BZ9vBVz:;n(-nUdfj *l,Yve@HE׌,8Qe٨t<bX.<ٕhʰ-n nJD.Z,)0m1ܸݡa_4}K em`qm ryZŘ#yI!H *2%Yy6vw'v@ _0 ό)ϖ:ghcs tkv]"/ٰ@@NR:SS\F{tIl݊pԆWU9 (;Zg@XL@w?HG+c'e90Ű>bsU? m^INgX}^XItScl*]Њ>!<.uޙ|-Y?ۚW m: |^S<EţeEh2Ơ@:QEEcLtä.jegsAKOe3<~]n~iHt@LHm_e6F`>CLEc6,(nBkEO ?MI"}/d p%l& 53MY(>t Ih'fXnB]p^/c`8|<&1' XkƔfurݔAޣїTOm=0 EBҬ"B"t/DC+J ܉BGi.w%T2Hzh LCx+ti[u9M،5o!5 !ɠ5Uw0Y v,t `^m+Ё.Lt;9Ri:őMyac}JVf9(j$c"^ jUk;Lq|^Ppk*h\w:ޏ{㜘FU+>}c9;qEat,^ug 's`:1 i(ÒfJȫoA9ǡMwǖAԊ4׀RD_P 9qtr4m&b,=;2HtV $zDN!5ۗ/N]H'Q]̘eυ_M%h vŠNPBM#N,ؾ,3Pp͓cB4LgbJ3:nWV[ T;v YYƟTO??e9v19~R1V ͔t^|#!c>{2v}qYz6SiY<+oY|l'#4sa9sdiVPbqҫE34u{CkI$b5őet7~!M֢Tl_ߙ Yĉbgn@32 p694 .;&]i(zϮVNEh*Oy6&yyEPaQP]и6tZYo:;^hA%~[oPS0;`WDf=Յ]hdҘ+ĂPv?oe]l+І&Xr ,$S+PַːE,]ժ#$YZ"舀Nn8#MPyD>gtv[6+IBWxw;$4ЖHΎZw[o:B@ukEt녂iʵ*sVb5]m޳+1ә>/_9~P4sS{jg!<)sJgoJ[vˬj`-*mC&q1-<^UCZǛW>/XnZA|FM[bzcfҶFVg#:ixM’D/r#Z/E~nw/_T]oZR(z\"ao?m>g9b'n*ުNsY,]Orو̆?9.U1\35,9}SparAGr+Od#c>dtyM!WۚhMVITK=zčQN{%fUȲaDaIv Ҍi8m7}|yCu<ذFrbN@fc+qPu.Yk̙ǔfxr-\nyo?W,Wi"V`9E* Jb@M2 9r,L2Cn}~ECө \ϽbZPtkwKN3ߖM9HkyL)NTdՎuA769O @PsAf۬S" 6h[!mHh׊ڐ{Cs$YoO=63Ix3f2j~&ȕah.q@ن/Wē6!B9K8&TgJ[0i\{!3Y~͍C~[ˆ3W6!D7Mu( NqRR7" U0hT|D"j<VT 1ϋCd˱=#GZc8%H>L9}g 4$2%3{\I@ 0 js$-f҈,m"pąGKKYϳ3>,Y2>{znS$}ڸaopcaXÇ.&Ua]@kOXvlāvZGID a-!1>pa LO>x$ati_W9ļ 9<["ܿ 7_Ra(P3D餄n`YɀݟTal\oĺчlhBQXoL|sM6]N<Ӷ8RoB[,RIà3v]j׍QoAqKsU/DG0}gIZT\B$gIVܹSIVN +M3Zcw^\WtoY+YN7=. }x-~"fċ--kLsar`N}Xc~4@XI.t|yEP15t>`sFuBcGdf7`?<ـ Oˣ ,C ,T@tAq9P1=h}՟(OޗW\՟ isrb3-q?C.h3션<1F*∕#{gRdXYPhTg™0E M ;Fٴ\9t.:TmA@ `@xe1mtR_lo(Nz{meBqcSGOs51#YH;ip׾ؒDcR⽶7UkaLKxOyqkXzY;Ġc ,EvbQ{]n-@ra_v D/"7 Rl kD#dIřI,rTai\gXdr[`QmnjxQT;r>5N:gIAoY iTIH(Uɦk7)ՃnrtV) E\@;^)!"لqfNb~ VJnprXMa%&;G)4&7++*݁ŮoģH__Ҹj"HM1زUy JV#p=\_D[:궴j6`̓<[t ɵYA pg[ogizϓdNqB["Ql}`lu3c1ڱyNh)]Smշ%&[Fq5uܦDհ))IrhiAj HG/},.\cǡٮ 01U*XUBOB)PValj}gKu׼gԯ,z/Z| En[XuU0,CE&+hMOROsńrgX@>Жv]| 5/}ox f t]\A~$Q/C(,זEۢ'=XEi v␕(q癌x*1@u]sOYoC[Xe1=r_TvY햼+ [ZĕG E}J' MNtW[-ǐ:Cl,qSb ,94> "uf j(Sz@<:I}ض" [fQt2ّO7Tab7rp2 s!1ձạ E#<[\%'IqEv8L=Pۢ;dL4UclAL RrJGe[=ZPVF].Q\zuD-We`ERTknW/hJ LfC_e1Odjvz/618sgg5?R W E V{hT }@{?TlUDYkpF=^?.{vɠ\ƺAضE /\9:dE kbZvS,C{;w_7˥GBa7Q${/^ՙF"" e}ܶغ9>*#&J۩^b!8g89Ei ?,cJ|LnZ.ߺ r\430Mp + QFg݄c cE\v{s=^!$(bJu}<.Eq oBM_ |TX CVhAM c_z{E5(7 WBS[T^#Y}j(Xѡd6IHv8b4Jehw +\U3c"k0P\lk{LGzXL뛯#pe^ Sk!?ROtUK r̉Sa!8߮Q{AhLj϶]WWpQ%{`I3FBQ K"un9דL_qeJ,||x^(H/\?Կw@&>7߄5~9#s9bŭ Yr4;m񰻃*rZ&8߄:8-GQzFΈ+c<<([aM˝oqɸkwݭ/2SrKLvrƻݞ 06iuD-a4-UA} W+T@ytER-R>cqEW#͡SϹŵe M eZ|uӊ}d2}[ȳgTeiO u΍_iG@M6oj%W<پlGz^[0ɻG ce,Fs;umF'HoOO)+wݘ74B' ;cf+D29d57Tk$|sڜcX!:N+ݚt-mz6(|w(H|6_!mZ9uL9mWQc2KƤ@1)OY@H͙;Dw.ҭ3ևgY)m,y |2dc)<)XLv͙;DwCQo tk2Q:TN_ Os'ɚ,& !=w9ر|n4q3Xđ8ba,.M|^H# ,4E8H<*zdC};5QM. |כDp3ͼV7ƥDeT@ 9滂Mqme0DY rH342z>YxPlnee~%7Dpp.+yfqiu!4)0+"$f v[S~''cN-F;#H1+WHjsJ`' to Պ.JXkزM҃nYjmUpQà_7)!."/m^} :g͟[2t~0јwkIVl!C.hC49b=uS1ָ+nb R"%&q9ƇK'ْ9\S 38Pwm*h[0j0[*Dv >W}R螡,;#T~7,qUuMEVH7`EX)|7(ܴ7HuڡN(ġdW;4t%0өZq)뤡%룾| rmh(M^sHC[7/{1/BҦVc2RKj;4J3 @aY]+FqDJ"",[C5 PC7nV¸&Fmd<g$*iժCBQnܥewC„ q5 12ܸ)ZN\Ӭ:; \!|\YWK_ CwAo~sp 9lN\)&.uF˾j@J(?2>7/"}Vȡ)[ByKWгUxPŞ?aD@@u-3c2s{>.16<}|.t˚sH0 C{2G"yNȉlTom*}WI|_uV iJ]*#E||YH,-W: BLpdGITj}7T I`f1B7VJ\hJ$P"2I)"Cq-ΡJ||2 aCU\.? SG~ud߄.]t$LU ɗ8 8=~Uq1q\݊wdC)I{䘼|'Ma쇩jm3[,1ʒ{ѡa:o[b=C2 :ZBCJm 8/I夙|;|X 7Qܓǘ4bK[b 37EBqE+ܛP6;".y0oWe\œz<,W?\o@ M.de+B C9KEC1 07bDR7|4 #`%,h Qc%qUMcx-.^.W?1 kh0\ٙmZ:@I @N:Oy85ǽՕɤ[Ovbcwx>.(bLreOnsW ^k߀o.Ma2^D 5d"\7^bX较VNdWXDy9ӫ\VVuH,I43/iMJ\,n/-0 @z3\4)SUƺV% XeH?MhȂk%ZؔWb4n/ʠ4MϬ _zSҞ>2 핺9>Wa={@x3|ZrXl96RjzMnj蛐A{3~B^IB7/Xs2;P-r[xm>m'NL2U$[oyJ&I~3yx\p9pfwKH(:Z,yf @LiɊ'N y:Vy[bSfgGNo(XMM=4a|m PGGWG؇]48f& 69~NXݟ xyurlW%nz Uln̂dCW̙mЁɁXncO>=pT\^| w?՜%C|g!@E;`v82+CtͻwAy5_2ns PbSpu )s.g? "dxnMնy߄  EƝ @B󿘕ˁ )tXB4V)}(2!#wx*2s82](ViHK 辌)"jp=;n>&tOAO$8%8ip.ն*~` %ėf)"Z!Њ QTkV~i-11 Ex+Qjs p<]vEV\ mH~kDq 9[qK;T66 bmTT Z Q!nFr2DjeCY W4s^<2;1Khv*puGG '[xzղ=bhTlKVPQV$ meМ+1xZy 5 .,XZq&ː5+{3kv4 u,l[I毼]mfπCa ]l~^Qڼei۽h=6(tL9JVN0yKt[YF@ޝn_g]Ș ~ ԜD֍w9cԽ}co` [u!aPY!+UAt#=M }Bw}cX sd1;Ɔ%3U[tuAzpFI VhD|=-Ϩ4Nǀy@b-2u$[1ч]=3IX I4X9ŋ8~b ;2؝KoѨb!\܁`g͘E'E&@< Đ_ X}*IEf5Q:$j';NX!t|ОD;T$Xj4;d'!H !H/œf'y=.q8jzkg1m$8vkF|<: /IsXoBuNhcD R*Gt<A+>URp4 !z(E(ZdPv,iS\ D:dporZ# g/sW/-+ga h ( xJ(Bz6@]І3$al)-S3]bKϚӌՁ8TNF^*G51XbCDϜ:н{2DӼ˨Rt'nٴ E`%j*5_f +N8WR4q&C)}6i c3ODw6D\-Rؙ %2. /sE(܎b~7JŻ,+?[b:E?`GJ߉dU P pEtgbXf)BVa=⑌@zCI⒌Sد9˹=uiqeqpe˹rza*HC;p1&Q9Ս〺V0@ǩOyyvoX6F>&&/@̀a/"`#=g=p/&+[%p(!ߌV*"UJX!~9vKxt d$ܩ. (6K[F٩T匁*tլ\3v+Vp+\Q6'2Op{;&8l6Cd0^T4]?{Y(jH0_d#Y 蒮/<"+KdAqbs"vJY4)?%;Rv42cZQWgIxQA3(ނ\wf ֜Kvݒ0(͉"#-4ؿY(\t*}oFUyt0{tUPH%]\oىKs4]QI^7m/R$֡'K3`ݙ0>p0 QɌcJM|A& 5x .'/Z= ]n@}J F 8=AflMYY ?]'St{|^\8K%nǘqJʤ# Ē1N/y[)po)/>H;J}@v%DLBh(VYN~IYOtR,l"zt÷Z*6fmcwJBMȑ2.yixfSZXryZKaMDoS\Krۖu;Ls@].2ZR. 's2Kd(D'$BCWc X3Iq>+RAYu⩕\:vo)d [9n;Bk:3U2Yd+.Of1.){&kj4|O?X>Pn\I|XENR؎GYQ ju#STkYc 3:\Pr.uݦB=s5֫q.׿P۽bӵV4ӷkhRْ( 3Ʌ4 /=~Lg4ifh ffpoSظ=A1@h[f]L`ZK1% ɲ+R:ѝӚurؽ!lZ= ]J01$1V2WMK<9>΀'Qr(ao\35~P͐^~q [NU1DL@x6ŕuy{aY\> hCcr=w+u/ݮݴtvWgtZݘH^7BApz7 )d.t8\kIYlDw  |.7 &<Ai’BfHgZ)}Tfv_](r,4`. (B\;5YO_mq8 (R\b_w!ؗ)Y󡯡&Snbq t*t$E-rbБ<4N"{NJ8j]HVܭb{;{;fo}yH 뱩MJQUCƲ({o)%Q"O5 E󗝝hKtdF#>5elx-9S? R ]?mMȾʾ z5;"Nc 1(KXFHJvH1L* &r2kixcy}  {IrfSx 18F{ˡ\HV5.2YhFÄClKB"kå. MQaMDo/{$T'ݞNO%''K`B\x\e aePu&,?~"ՃC߂(;Ց8.q B>7{ Q;Whr_#Z6/TNH餛aƻW-SO( rf3Ie<{˱E,oeݬ]T; Y]L Թ;;.t@z/ , ɍ-ZV;䴷>Ea) shnHXv,t ݉aw3`ʖ\Ef JCa %#8"OfŮl ^uiT|yvoX6FOx4B>p i{I-Ϭ?" }~)8'Zo1- j}HH6yτ(O=5xf{pUz:zXI ql@]-]`pq ƊJ|71̲:н{2./&5) ja(F!TdǎxTst?OX.o_{+F2./*S#+e:a{OՎ,;^]A-c?}$dd&P ( /$`0[ח lz)߇5qXg;:{H2,/;Qki^سJ`.>݆[oyB_/н צO9hv 'f'H0oa9n]qn4e|d]*H7?=,*}B~J5bdzVN)E ,t ĉt|сsL)<$." .}jݏ;ANU0M̏Ċ V]&]bWǁ=>HרAڞ{; UDi?f̲\@@t:mzOdEjonCwFŤp3dcv+\zⷠS]h0K(2{tjǬ{=XKV:&e"iЦ6?JT.I)Y`L5QX O?ς;1!0*.oּEW(,+\!-Mk[y֥&n ^\oQ Q!Xj_> R:3KbgKt`J"`X`{~Hj)>F6t~L:&ifWrx@ *u$/A.@Ev4eO)~yÙ_G T{=Ja9h(M;[β]s/(A`;Z)3D]8KJ Ymiu M5%'eRK@Zyd'* Z;\1%r!=G]`V':0WV&> ckXOy=ti}5/h}&`mR0 š6_W\\rxϏdd]j0W\g4SԾ\Vݎ(KȎ6_wG _XSxu%z8㻟va ŴQOD JɑhsgOz5*J&q@p 0ox:mhscbSDuWe<[/jN@ ]FYKN@/#ގGw@} lǑ1e뀢lavj)8jQ-/ j}U(Ǹo>Mh?"]x$˂%rRpmzQ2~PM,oaH:z;fw @& aDkp`I&ĘX+0w* z'oN:З5O񀔚 G_t؏11A}G:DUL9v4dzS*ɊhO p^x @oz cuqqD3ICVYͨ]8܄eŗKeþ2xp #MiqhTI;FmbLn(妒ʌd`|:CH@@/::uE :EY8bmr) J.M'vK^'5\ظ3gKRCfQH( p)Wy/[R0(:u#9:bd٠&7)s +;{:.٩$?,_^AVu14Zڐ)@e7cv,Ë)Zo%J:B&UJ{r93xi-U Q8謹"QLW氯߇DdR٩QA?wI'(2*6ڼDka+8Knm㈗,;>ȵَkПuHk*2``yXu?OЦ u; E$ >lJt?e CV[ɠ+ L c_z{28d *iAg>/%Q~!ھek0g2,'ej=Cxbre:&;c&c{q#-y . I22M$k&$ H~ :F ;[:Q|eNMő % specsڰ}`hC~Z#\t_֐icO|?>4y%5chF,)N)=H큹/xFnI=;hu)(#n:nقHͬELZ1'"+*goi+q]7U.x LVB 8q>fETfKAYIL( =>|.]#2^\o(@|t-t#4d5m| L\2aPX *4K/pt)J 0O޴aΝ֪j:j?|(ߥ/"ĐL2t|͇X[ay8N40 O߭{+ !YNA^mpy;S&vڰ41A6\DJY!"*ç9 Gbbj3~ݼ1Gy(R=l8h7O) }HYƌ'_F _|>B jcD_"g*+OHg©6 >+~G#QЦC~2&b6h _@͑gA}RW,C)KN=.Ƌɢ1;A'cg|l^1W9&VtiV[7 ;,I'kԠOg6¸KHpOL&Dΰ] ?FhVr@.p=[OgѴޟ oз I.C$u7u7 "퓆8Q Dօk)MU9ޔrgd]HSMtlx=x1c1pQ+ص>%X*F^7bO%Y|``dxi_1, >x}y:>m|g.fe >ˆζ)4r #>yL#ip޵ qfw~bmϹ>\"26\wGlJc )@;r(g`lK>Uぢ@b:=G2G#;ՂT-$]1Q_&tEZSd\'-}qpi"50q*7[qb8wfzs!̥sHdd.Mq)ԟ鏡A|OLdvb$8sߗӈ|_bv&ѥKO!,,UdDvΊ}2)PD7،s b1źxA/ O]lTXaHHlHĞ4BR"7bJ3<e!x(b=;LhTG |ׇ0#f6̲yg/)DPfm2=^XŲ}8*fgv'ƛwlv l\Oi}ewC.OҺq:'Yŗ"Q{W.KtOTK0Li"l+$("x@$BM?Ic cf5l*]K~D*Qq):T_ Q<7]+3iWlBNZ".+ߥ4k%kE惫.[Lg\X.Z# s'S{/Ό:y_mH.6,|.Ͼك.|"Veg9<ʼr򥏹y\/82s.ADwA݆ [bD6ʼnB1OHq?ήE֒R] 3ly18!ƞ&,99tZ٠sos: @< Up7 $6}پk[ !Ih ҫ`rԛ`n(^'0pǖ~ 12fmw4[ 3}}Qx0>uGJ4Kj\{ *c`LUA5&&6Ԟ[Nᖐ-V<_/CZë=K@ɕ嚂\ѿŀ??87T'井'-Zzr17.#)1vYe*HHC%c˵L&v]~P@f.5XWo@̒ΘO.Vr ߂,֡mČ(e,D"KYlaMǗ_`ӢK+҉9^=tv?qsZʜ2@Yf1`l_pW?NaYƞ\OH@-PI0}l )\HO!8$PGc=ҙRr5YQoJ҄}nI+/w<u/9na=$x.*Zu\ f^UEs\k`#P@\Oq~{=z9>|`)ЀY{F~|0Wbj[U% ݔa*w<ק]g&@GX0m0Ifc1;1g]b=wPufسSliOJeQKdaY◤eJlXGisΪDՂլnVZzufu|lѽ㺋nqLYtus.mC^"*y6L:Kʧz?Y#n<63)ugXuRFz/5  HٽBz,,FƢ`6o`G&q\P?Ђ.mHcޱ\ dQ0~2z]d%dԓєy=p/-F0cn;':j-Q%P/Ck)kڵqz;E8Nh*r/i[?/V.vWєt?ʫ2}з(-[B;:oAԆv`E^hm̄ "Ɗːr׼IeDNcIvmd'Bj^Ls +35[߄|g۳%Yv M1R>m[\5ZTψd|<,~Oda5 bOa3F}z4ѵ[(,ڹCbOvSSp3=Z$Fgd)9p^&;F@Ƶs.EbiLb:mFcF@≼Jw*njܯaJr%^К>"Gz 5Sx=o?@)Y8\#O贓I3RH !ȞFIJC!-A aF'`z7;Y'~ @`gq",^vp9A.*nxm`n41sIPHL"`USfR,nȥv֥˻ɴuq 1g"\/Mo|әh-TY{G,P?c"W89F@6O*1@ 0٫/eVs^E=ATs) <ݨ2C;ʬe@so ̂%{\tȔ.C bnV,޼ׄ\"|ܣ+$w(Dz\X4Il}1qLJbu.ܡ<}UZB\Dy'\ޮɎIAx >~ `5ESRWjb!K?S MAsmMj;yF:xE*>l-Wfot$q/n,0TfI%Yu22}$q,{%bOgkv{ 8L[r D&ò2 f@5 ϧ.֨ݗYP{ٶ e -=6pF6{b@Eh| V{mkvt +3Wqi}#2F>^a=AgBV]HlYq~*;=ƚʿXNN iLy^Kğ&>~BPнzan/Cty@djD++U):"zmqNEknYH%xLE,]Y'ԫѝr^6 Xzצn#2+h(lbBilnG?YLX 7CcTx56D{i}&b({[#O}?,#/|-}7L鲣| `ޱ[ v`"HږEX4V=(e>edpX ^@B譯Arjoew-Gyp[22M$558*}B%בWs`j V%ݙeU=SxR- Oqo'ԻJzO Fq{d,DEH+"c@@$!*o:O~4>vnX -Jm <nuQ11?̶Pɯ/T&h.s"k`vENcQ1:W Df)7enx b_0+}J2{/5 f-|35[]#/|MbL lFs'ެ>9W;+;̽YO^c?} (@&Q-Eeb~ܼJeK3Ϡ$Fv3y"oRr3Z⠛qY#zk!IZ֙껝ۦFfEiRā  ˬ6AL ~4p7TIeH$:ah]'^7ٖDONMښeT֘J +9v=5Ntm IWش5(RcMn7Rm@qc*Ǻ̛J<>:%P95Ti f?Tj(ncmWmCoaS,jpL#V/\J_{SLpYi1m Cf,A&^ֈH5M9svFQD/&;ˡɴ6QAIZ!ƿ3vٹ9j8L4x9MAvm?>ͳ?~DکVEGxv%:ֲh]FNеdk`+iIN 7X#q*xLySCv hq`@>@Y&fRLt*(: B6w8-eʓkڐ5szڻ+54 Xt7C!M(pn&LMAz]٭mRgbǡU:5|׹Zw\%z_LɵoKg^!1g0 Д7lSELֈrDpnE,VKCB~fa  Bc@.U:Zz߻KW͢.p=ZnZxPe%N8i͆tYg1`ThvD3o`94E}5oDivpG@¬\QmhY"ͧWX BdnR_Z4} ņ=6.Ҵ&o@7V^yYdj;So )n#G;c% qmm$x4At BdVUkuR<ٱLcjzt,B|EMԩ&N 7=vۑk_]ާOtb#&ndjP"l^bYHM&7i#]׽ w=erKF@Iש"`)&F\8~y~7&$ _$ҏ;O׎ #\,7 rDdsR&:HZkX k K[V T 3kw`TVS_X/DV$m+8R/4oWZ!epTPiFv @Medi8p1F\2(Wktzj(|J{*MVmº/ofHإ=l V]yZ@t3łF[#台 +YDG`ItkvF\k5Bx|J-c]6qhn[VƲEgui3,ѱ Es<>1Q`9TB%sU |SA^."c^(۪r9otعTV,Fydn+סtk۪ @edqYA':=˼ZRBa1X b`rt:SMc=EdT Pa!, 0InYzp9viwHS\h3v}^,YPZby+x %8ݎui+>@QMIml8E2!&-R}6]K&='%7i2g\L2Mv^Jc: &Kgn(ntKY)Tn-p". BpDC 3@?4-zY s,c\(NW`S+Ґ-X_*!kWSt_Q᎖T.eYm QS.ܡ `(7˜t各 %< Ԑer'ZD12Ոj>C'10±iRlEcOe[&Q.tE^\֨CQOeM[ CuBj .cG F ˄ #<ٳ-Q Ŗ,}Z2{(ڭ &bQXYo\H;Ǻ& g{y4pLn_!64MCqbDE{dn;]4So4P.eϦ^3i qIr˹is&@Il$J?K`W ,NaqЄOتi%/ [4q44i,'..{h?%w>/,;S%~Λ~% g H&/}$7]A%@')5|jHQ~OX5d:ctyvVl"|zU6thAQ߯qbRv^7~EGxjؿFۼ0~[J|E_'vA F2^,t MөD"1,IG08QgK[;7C:{HMYD2OɡmX~ 9CLiQ'CY(a'MdZlsmNKsl!jhk}N%Y@ŕ^MCy0%\M6k6mv ]|!0ڢ1 Sa ?HSۙ"U {[i$r" /KWbk_[+p(qaAcȥ 6Lb:eл;&5bd|nWn033ʴL5֍î`qP@5d˳-eyKͧLG[3 Q{KT:Tk8@[ X?Cz@5X>34 9z}m?A Y!Q jӬ,\ d(:Q姰 S_n1% >\s&@yw|f}b,G.\ ;['@<4E /Fk砉W}9%c1.h o*ǢL(<cF=msv ض5U  ̀ev+F$AuRM8\ a?y`,X$z&^j ~R%j \Wۚ\ .c12P*ov?PA-R֎:5ٶ1džQԃk~.}?YqztZCmH ؛E/AY@^ȲcL9@O0X}o`CLԑtoő8 VPGԊ}g[[%҄$9f .-YZ# |2)UH-ybsn}js2E%̕{7!B^o ȁ('@e;qvo6YmP{,Q(,Vd)5ꯒ$5*B\) ڡ}Tfi\5qlE yiP4cL20\9t]/VVw+&+ˎdN qbVV.v;@,ତh)BXYL#+Dpb␿th @#8S3AIX:NG(4P9,rţ-:怇bb[EEz(aQo^I1 DM;S6S'apl[D)wEH_T$UA1V‚¿D8U*0+3g\ڰ"Ee$-j0Z~v{7 Zu70h5!-, j+䃯& }޺ [͐A|l?)I$$O| \꾀TBi6PddO>>6>8Z(wןmJLf IgŘoZf &_~",6\>>OR?WzL;׳χA/C2kE\G5n%WOD6UFNԽmn^Yy{]c5rgopOe%YƞtoJQo`^D;sWB\eջ 5oWp;vpScLh,$衉0z`;2kMY@zcMW/.-SsFdm͐L1KƯC;6>1"q>A:XYZ񒖩9"۹b4bX%sXp#{1EV<3@G>v9c%WtLey12V0z D#geZd|뎔/)X}ͩuN6b2`VtK,(a?Tq&Z ɢ![sg辱D`a5.qbfxs ZnaaJ}+^\eA%Ķh+Z:v;NE-9(Nh))Q }x`KmMJ/mZ\}?McCk%4b4+NX A.1ES,D?}*U$;:EC<${?ƋxH!6V=AR,+Dbdl/~,I'Z_1 YJsߧ3 di?-vSuW*AņOo@bjͻ=ɻ4Gm8irȺG;drOf6^:B_.$bg(6uR+Z>#ElV| b.E]UJY*HUkOl1}Bs+@Kn}h(.M+D2'c` 9Wq(i ?l28IzF ]4'E{iZAݲOzcLF-|k22̖m<\9j5Ҍ U"k?u Z-,& i4dsfz;|llRR+zvB8xqE3BVƂ Td/\3:̓*=a?VwB8e$+VWeT")(W%-~)`&Ŕfur|ne8E71-r[2fOL1';kiVZ-(uMZT"NCü kN1e%^ro`{ftb$ƻHƄ:Fಂv'& * U̬؎LApk&,$ת5 5F B@1O3l:> ]{>YqZUFNLJqІ.ߔM`FD&Tx*5ǁVڰ $=Qzt$-=J5VIRMD/ւ[t#G ^1Y؉΁+(A601Ya! t/@C|[[e>/Eƺ: TF;rjbZx:q@iv$1pcGi _-{bݪ -V\M|e1f++6UUm_eଘ.}3@hܛ0( Kbg-Kp- p@nZ eaIaI&kFccU"b kry+HP_x]Դ@ȱCT0ω,1t+%dt_Q#KKY\hn1deNkT(+lYƜ#05 }~-%@Q+2p皔|Jhǵeϧ:4 Kb= 6~?r7ZXV}!bsڄ]->kӞ~ieԕ+&db<#ނhb7x>D *(x05+8ͻbZOoDiլj?rF(i** ~Kwʏ`}|1OY0:YlDXl 1t-0?[/7_~R1fN k8s յPJ# -Bhm@wsbt L9GO'Kq>s%Prw%R_:,x|iƺ@jEzʱݫ\B>~YxZJD 66g̟6Ybټ->Ŕf>͖I R>d}K.% i`XO%" V&<FD5k PijM,2rBH$YEz3$9>NEm~ORLݤ=,=I[fd&A'`j`riy=5k_I'@; >2KεjE)yAiwBoe U '+ -ֈt7Ҍj3z2|1hgDCaK ˜!b9\?`χ#KK=^Գ4VjAu_`&>o\ tB#\p rI)%BV h ?b{,K^M_#{tyh`@>Q9J[W.b%Dppl9^toW|&Ily='hXa'7Ɠw9Ȭ 8,K_P?;Y)%X^\Ij4dEO\=222pRg `4p 8A}&Կ%FG5 )¹Z# j,7? *5H4=" fZ"ux 4{d&re Ʒ^OE3P1)敉ƺ6Cف*rZQ‚ O"́c{kE3L^G U@u$ِf[J ^mk6]Մ & X(C$^~5)ϒP}k}3G37)/O |?d$KZ\FM Sh#fvr`:}mYh8LeLiBrw 6 TP1NfA1H W俕+L9_>`zbݙZ+7!+v<x|?k>2MouK1/i4w,+bd|D$1/tk,eҽG2/3pT )?X#^g< [̶=NN-*x%KTto2F= 8q]+cq뚃s_l2zD9z:<&\ q׽\̫?^UHB j&lqpi"5r!!V.[1tݓ+V`1KGU#tkF;B| 4x34YSmZ]m08E4!<]"ؑnlPi0#MmSx?Po<5#)i(e&WV651E, S{tSYROAoACjoi`xm/. TZra2,2z M1G dJ0}kPoeor`MX03)4c9{HbܑĀ;ڣclG&1IP/*dY%bKHmb\G%+to Ix/i }rPFc/_%/ѽC ǒ\~"26^\oO~e}}@k {?UEkYQŶ+y?c;,/KBfxr2OFx3} f2a4fEXmX*Z;C%kݪ4 _JZ ݆ڽQ`;0iMJ#͏h, ی ZټtޢTeцɫ'brK{|ڞ$„胢uOƒVpRjIzHvhcI8LJLHJޱ}ɵcq/u&,+xqaL(W< 춏Iimޯi.6Rq'N*ZV-nXp/hGZoBrT+Oo?1x}'ZDjV--Nj2p~P3G1#3ˊYX-vey1&y]Q?'(ŶuiPBzX_8NG+MvŃ ధl^)LΠp3n8 G;O|ѳ6zGD0r &qbwZcb=j%ZL[l 1-Y`yk9N:7CTV:3;(@iHcl*"VQOÛpPZYjB>+cH,o #Dim_/+TnOK&&b=!y3P,HhWMmC'+5Ft4:[Ŭ\ Kgp ]~8d]{k4ȱO#͐);YO7*hc1%*iy4};BGB5[n vAO38c5SO"qnl!>p9E G2cP'K[Ju̵tjh +q.-g=-v=48(v]կ͐OXhԢ*j}Las}Ў yA=WOx_u#po;n{\oҕQ+ Yz}YDU%o;v?Ą rw?P+ۊy}_*i$,~bd,hua}~8J/Ʒn4;3,l q4Yfq1{tcemX?+zoC 7iwIu1H2 %mzkEKeoh3 !:WxZ^tbvڬ0[CU ~/"{+$ڊ3rjFn{w،ԊKtjd{p`aڟ:W}Npt34n;3x sp:C (RĒц_-# K=gOm~zZCW^;6$6Uc>z$u7[40ϥ4ތ M]BEQzѻfr^\W=/z^G582c]zk48Ƽ#:2jznc3afL/Fj!aAQqB KƇbą`(2s54,.V{\X="#pH6hɖ2R8fCjo| v cFTh%3ٽ74cֳlrE fŇyQ+(s7yZ# +^OD:FA*OfVNGZ{r췲l .ԫJ1T>EF'@}zuApd i>ۻdbߔ 9&jUw]LzpoK= %U[X+09MepƿLe\ۑje>e>ȼiz?m*.\,8mp3D ] 2XM+vUU:6"0PpǮA}${b/' 1lt?!KN@m9"#46O[a@VL'cgUGHE2މƙ`} BWбO6tL[֩C{;Foz1]mCm!9"[0#x2/y.G^@./-#y ˴&62AIˁ@jVEP/,:Ј\9҆1_0 J 錮+4KnZDo)9=stg`\#,N@Dr51_? -F\+Ddsf`Cʪ9g-D(^4aj^}|ˬG9JyKi Vsdai#k,lbPqݥk] 2(z}87vWyޭ]]:Wk V8lF[wwRFtsb }<&7^oqНRZk71,륥fSP{/Kə(]}_OuhFY^;3&?dYQ10^#T1fHCQ%k[dXS(( Kx-%vM򲿩>)a4RB#%ha)9&qy3tzH g%h#fv.p@3f"z(ٓA~gU]]kDZgIYΓ s[M*:xxa[) YfR.-ڵw,i*˓@6KM%X6LMsW1ұaYn\oQke.X- +j?٦lL|}عl(jGV kC0l$q9 s֣2nkVkzqzwv@k8L 3`M"3@;.+1v p `&׿دvdq)S"%~t羂GA|lp_6 ! רsLS&N){B po+b49 ^ wAuv| #Lg1JrlB\p!w)S%F>\JPbMDJO@Rx'ԲXDa ||S`&ظn?O+HұeDJO]   hRyA\ؒR(KuSaDJK@ɟ.U9c LI~̧1ir"!uASgM&@mw9,,5[Թ&ה72.:) z`#be ,\R&]D !ƅ{ұE*.;+}QQ *68"= )2ƁȹY=} Bm Ve?]#P~(:Nh\uv_4?x}5Bk!):ѨͤQvq&;N:zy6A% j\H PzDZej0]Kf r`F|P#̕l][ ̼@Ƥ((vg݊'2:gzNjJ(1BUE,!XN쌁b 3vGEhZbj$/וvDL)tg,pghy5_hǞ@lF[u_Po~Y\4IotTtGg4ZiEQ|pIC֠g.wëAc_tFvv:QiF(ԴX1݆vTɯvyA`jqm)H_GO:eӳ\ ɀf +% 9#qVѨ `jq6Y0̱tCT_ V+'bܢ&,D>6bC )5 Zd{!vqjVf. N-0ql!%3]%%*U7f :2mP(,5\QE=Q@n x^ tXԸ̓ФR/7"[_DҫNDꨋH4³.Z_DJ$a3â5bl4"Txhmm/Kgq6)DwRj9π1FD2W:Ļsj[>;񪜶4j6;7ڽ۫0<|dR@vw'{׃,R1 %zt64|r1!<(ZNr#/V~%5lo) w_2xzDEBs3hy;f 2_5S7jW(=i,ՏĄors_E,R50{S [y#ne3``ד: Dr/9n,L EmN0lrG$MkY5g0-oc Ig=KH򀺵X7j(z{F5/k*T~j[=/ Ԙ\>թ|'ֱv`Ttŏ:S:ben\KgL\Դ9bti,EoP!3ƌ)\9n!s%4-ЦӽQ&PݡjqӮğYyg֟{f~"1˃Se,P9;hurTHc圱N@a8)Wr 4[39qfaM,DW_@5⋫$*Z:+?:'6o[# ؅LM]o=yɋ=[.^Y-1U7!6#&ndSa۩D~,qPl,,S\ߟA|pUݓ2V]_0F@hy"ɡlê0P6Á3Þ3*]}b j Ֆ4~ [ꤩYz~FMvwo6#j\i _c>![b4{8GV,mt+W6UKǞJq]J-9yҐK[ZT&BOK;[*] %< ζ*-_ Bب<0I¨N`FDkq(ۊ,-שB}x[l3t?z*ũO2.{FՋgah`GtœRn\$(3ʸ8ewEf~p-*]}*>Oل"vզ}BUPpb~ E0׮м|fm{Ԓ\ e29~~e+7i:tvpl8,DݢGA4Hv7E3IMY"ʄ=4?&T_e*UIf OYt;Pg<eP]4ȴ!K%̎s 1otcICRƁ6Pcfv'G2ZmdO苐Cxn4w(_X.ߣԲ8O)$dWr_]EDRqH3l[|nB'zm Ve?$\{r=T?.iQm @ET r`b~oVˉe`A25eX; W.'^D6>daT3LX:;% 5.@vҚpv|MQ݅D*Vbo3)- \eVmd*")z,L8#%;0;1LVK e` +q+mApnIYݟa \o CP)( b]"]bHl!.>0dQ%6:pDFھ^>vTK*Duf"b,;26ʺe2&'elLv$|/^$笘0=pTW4Qy`dHɀoBC~Y53X*ǿHdstz ߖ 2*l ~ ދZ%nTXFNE2RF'aN LVZ\9Niz@}~3y#Tx+Ő\rhN LI0p ZKE*0ffF\-<o\W^(˰DogPZ>P/i Z.:En1Όwrx؄D;_to،'E>Q$ ;B-2@u\hԈޘ%< jCfL ? Z٤xu2_!dg P1~AϷ 'H' 캑E 1YLC._]ey+߬., u=,!D$|ҏraYxTnm{L?S l/ a.ƒ̀5HIvunM`LgZSc7(p+z;dEǬgYW&=ʁ6뎁"wPbd Fv;"c 7["X1dԆ))*6%6">l> /dgt$`ɠ)B5]y840vl-!{HfJ,}Vsda5)V"Z6+@*7X6EfCacv$reOHT-HAS|KjNVF"Ǔ+;7 B0S)PHBG@8Ỉ|Čdw،#໠WU0 65|PM.ltJ YmiVA'ek 2 c_z{a*]ކaöWb B-Y;6\q6/=DY:) MxJ.4<%c%61Pm(Ll3q6= ]ƌ(.'N^pLmzoPV ά M,lHsN:< ă&\tEz}t?!)j<ˁL,dKN;j7 hdž5نٮ~N.X~>즚 sc34yu\ a(`}pKWJ`'E"߹.~Qu=Jɰ[rw c uȩڬRy%``xcsr@0P7j 6cgÐØh\hߥ|}"G)鰀 +Z/ |,K3xο/.b3Urp# q8Qh=z?߁uH$󵒱4ht"7i¨oCzI򺠮gA~DqfOԿZX8&4yd0Mj<ё\6M7L4qlUaer.lB~(|Gha6@D1:$,.rf6ea5z)^NOe{O (1)3.EDtXJ]С#8aebb5F R1P Aװq.M}I>Ǵ?67 Yځy^3YZ),f# m "m e /60Y}^Pk6YPg6 2q90!Ed[{̣d,4eX; %dc}f%ȇ|5 SW+ 嗛QyAG $ ;&r<]P))xtl(JACa q1j'WEۥ5T(0?.czr=TBY7I0uXK9.h z*Scؿw_/>&$~l68 @e%Q|Վ0l"'?i{ CI:[P K%dBe`d|^ \qݜsY8izRVlpAa&rNf~pWRXUXLNb&x^hHct7n}UQɨ4 i˜~Xi"?!|#]w,(#W{:Š>h&ܚDˁTXu)R`͛15;1yb<*_:Z* @ۆ 0ֲvg a.&BLTCC[duë/Cٗ fcr7&'H3) d(>M6q5(y3:woU:_jC7ًa1OoQfr`q&"]"*\Q+p b"|C4,~6̯έ2UKVUz ae +֟$T+6pۡ\] kڭ3%TJe+\)xЀOC?ڣݾrcݚF˘'>¦9@quMhױ[o;3DMe`Zi%1ˠZR]V`>/w3{MҴ5gֹw#nqQw:ԶSYc;wm3}>F03f9efڤ(5׏̡mQɘ>} \Z̿>Z^ϾGU~!֬6&UʎN )"bp bZэsR;$/CWݹ\UV˲T!%wK_M/ H;oԌ.99D.$krV}v"I Xd[Mw`׮%ER!tk#ȡ+3˰%aJTّGXh&eX+I 4R}:}ʃ.Xe\E84Bq6ӫ/ >Qܴc2FaX|Pw5< kD7OnBY+\ dߗ>rdIt  s$zd?bk 0͍1T*5S:vVYꮂ΅F ׸/2W_ί4X{f}7mC38ƦO)„A*ĉnɗ#Xqwsbt8Qȣ 0"nxБ٬x/||c\K3{L֕=(Ȍ.ڽSmir)setc[gW3@]ہB 5_4=r$v[P[b"L:ݑ;ѩCcσbt͇ӕ*:n_D #w:b22&cG`.VtY6-df3apW_Sޗġ[RLl"-Ə+D 6E0k41]`3:j rb>/ׇa+s=2]& vo]]Cq+U#aN< @t-)@\D)tc ٪wH__"L7cpm! tHJyqORt7wyHC;x8K㽁G3>uԔw*u;NqD~ygOUYڃ Sή6cj+5&c #h3%qHgx}E4{TAw3禇6@yuk푖ZXGbĬ!}ynrkS,On}I5O ,@Q4ڊd;yz<ִAdUgVkYߟ_,/1uj@RGbxvHHb7ǰYM(ݪ~hL25PܑSnBY_x٥>ZJZo!s~2veC\yܮ_80gw}+|D$`$K%;5բT%lY9X+S,k0N\ vIoN>`6%:T`sSI)=@?LaOɀ}a,P,EPNl]_%Bbb~ Rls~Gh[\͇VNbeq&pq|G̎ڣt2`j|ئ0 .vkY5Mt\kʸij]Fzl@Xz !SLy9ABoVd~xRUƤz{ZTu#R<0#,_Fq ,6jbYѳ(0}/e$< {݄ziFoW€+ blCKt0$`|==K&MIp_(ތ%y9ׄ+aYJ\>|dW%i|Pe8jxg^7Yҵ(?,S֩ &3`>͟^q=*bO6PKLӾB//{nz+0' "Z#a5nN+>z<ܷiB@ oq<ĵ~h8m+R?S5',E8戎1Klo'[}sb`4߼F}Kv'$w}%vj9|%1ȧ~dQ` )Jy }LNZz~{ky#L5x~<#+?qхYv}VatgBqu(SAr%Z]X\F z{E5Nk,yvceeiS188jg9hfE23]BVa/qh3`lÛMv\S54[g"}gj~PsJ`%eke@/W$z 6/RݚJL4#&U_eԖ+913݁7]suϑ y_!QPP!`P~LdDCS=<{V߬O]964@%#C*&~`R6`%e X''/lv:7K891%aQ6l|-Fsa#z AH'g2lPQS EΛAG\D}NWn`%$fqc)E#;X|򬧟Ҋy yt lѱ~q#CFHt&;G1~+[{1V7fhw >혊Ys't~v 5o̼\u KsIeuBנ.߅qF2R蛣%|\-׽:tYTGhKE.kގE^|}RF.?_V+Gh:Fr#{>LK'a@%:d|Da!|=(mJ*s<{אge!%0QRm"։ @cT;NQʸedO(BoUyPe8 8m`g@O)lǴC\lWXb,hH\2qþeh"rCۛP"B,Gʧ\2\ۓ LfsFV<}V1 ^ ByN_Ǫ=0V 0Mgb*fyb,AB:%;RrRYz{E6:F\P_Dk62IE+K~˗R>N:QfGef 컐 v%>Z} $eV Pc1{ LDh^osdeX_G?Rs>}#D4dc:0rsd5t9k*YvޔoseO: }l q'p|vqSdOnkWL wa%9<oi gQ pOpp`7 c,1n7 (`8g/7{`m<{g2 ;й*Hj&T3k`ŵMQԋ Z^?lrk9j5] Z^d=G:+50AV@(#G 2&dor96&ě6:k Oy  Ђb4)Oז>×7ʼ@ K m$0a d)MtD3U`Q):~R@m$Tlv<+i8N&I`%Z7_@IFZ'y W0vozԯ6N|ʄ'A`*saJoFu{K(065.X5\s{G^q꓎+s% !uyعtXeI<=b̘ Ca\WLԦhE~e],1`[?[khap@2 o)@(Fg{aS%GayOP?穸>R$H l8M CK(1@Q" +p̹ɢ"=G_ p&SoX!KHѩ8AƑ&$i9@Hƴ-xvE`,}Bwb5͡yR#^CuMbDBiz-Pa)65~o( voDL5vj2@!:Ʋjn'?A9%0ݗ2MLWA)@!dd?h\Bp\R=&P+DtKx-}޵bQ&0,\a0ZCl%`ĄֺOw ktAQg`lu.w6?<9YnmFS8+%r$q$>׳LZB*n rv :329dCE\ZԵ{ SvTd;.1v/0Qpmg'fLe@N(sIxs𢡄oBmOV]p:y5T\3 ~E"ϋeX͖-Kx{\+jCf2 6H]=G6П,dT&y2i}Ru<#Snf6&e]s~tx?HP6rd! BPj#\nvo >(ӐFvHx7AvP#`>H{oH}9W-3b4Ǻly<$\nҰ0٢qOEL#-:&ۭ[3q#cnMXO,'D<7ǨDu@{|}ܔXK{WV{ yP'W#A"2̕_dQE s*m^aUfz",gK:0HqʜBYItxڅh#PP9ۼynMmEW] .hGi+21ԥPp9!7BDUoWh?X_кߎ*|Jyw@i/~hYhaQǖL 2i(Zjx>B+VmnG\Ɓ_a\u/U"{VvyFRWVcX,gN4 *~훣ɐ?(`P$d/Q?ѥdmvQsus8$=uhwε8M^K6%Q90 HHQb|kF2*L/=+SPȯv6:'Dǹ+Wb3KGnps\Sӭ,n. cP&)a F,:Ff>{%H_\ݨ11Xn`81EdXWء#0u:&RHY sa!y9KȟHt:CMkwYP0jpt?ɛ:tvxl /RLDOsW~Pku/ څD>q'HS8e_L`s .( ЍBp9[r'k6^۔h-$k# R8zp=hE.b{ambFq/Ptl*2]@9o%lp%bbHl'oB5_b-U!X0ˁs)A{a'HAS}YK3+'v6L=}rSL/HJykq%]$ v`2}e\=M&C_slu+%0Q#X#˃.nO躿9qf0רAGa#鞎Q 659g'۳osEfZǚ9m 9%0J2}9kԠف>|RS|VCGL}91%2b2ayr^y] > Ȏb kXGB|2>mFNb/C>: Uh{[S*oQ YhW9*&YJYs%qf1_Tth@ǎŽ?nK_t\$^k0eXpp/C~7\DB⸍YsR*cYD8ep}\2ܽ F/~S|ou'+PnC]&϶-Ntd[]YƤzpϦ:iŊ5Z4n`*HGp']bHyhaty./YiaEA4uǭ\Q?Yv]7泊YH"&hJ.?ultcD9)Tl -#Y{40Qp rΎgU7= ;SDL}Bc= % sus/q@SEg V?x|VUbUu%%}\7bLo>veFEXˁL7ZofIC} #bg{IO7`MY::?^r K*pXOpţRDžqXym_a_fӿc+q6?(H +[7?YN.974z#ݔ2ME/9OӾBvksmgLĔ2- +=R}~op S}%jW[TGR4.ڜX{5 5;3ӭ&# `ns8d,6$aQ@DT~1/Q84ɡ:!T"\a))nnOKAWa\| Aa +D䫖 K,Ǽi/V.6)nh#3&:V4Gv8T\|fj|3IYӭ.+nzXxt :>ՎH=1# 縧OӁӾ k̉.1$VԺН)Hv(ƈ2Psיkk]0p1]gM>nGw(˘DO(~|R>.O6Gmj]B?}r8l\YVۚf5W)e`ϔe"_pAm-{MD1AѣHi^dLlFlfy0#_{7JO5)Rm)la*i*>jc 6e1p9eɞedsr= :yO{2=b Z0.0t\!?Mjl98wר'x} w:D_>Q3B{{( )Yj<],L7 VMÌ_C֬HR. k^DJz; "Uzu {%O)yK{x`*}†w_[hU(eVH"L^ -LQC3z4BnFu%1;ښ2MW=zwC 潩K>E׆3V1zס}rvtHEdy:mZfQ/TY,s`Gj8nkQ[z(k%zCoA1.)0P`ݢ1msBZ+P=zpwyoe*2*>=>F~klz 0Tf~ L)'cNtI_; ~Z9+|#Yv5a:]3>Z:bawj$@__Ƽ֒+91z7HX})\XJtKҩS|.o0לF}wq_~lssF~eίOֻ\C[QΕʀ2ODvS}0 3 rҏ!;Cl52DcY@EM{/H03A\7Q7"5+jH9#*蒊KԎ0pœi +R<iZiɘT,XByE ?lDOb5za,wGȬԘWpWțh*%VOv:EE_AWHᘱV¡pK4#>8qamqqV:7^Ra} ٮ(KJ;fc+%q]X/̠a Z҂cDwXN!47cafd{t7d]~V L5c^!c둭 ;6w\fHb80x|6bͮʫ̕k~Q㢘 i`%};DE`|DZF0m׉F{JL4 Ul{1-mZ}dK KItb2[!okL_)t΅(h sbuM@v r^yE`W/\4Zk:Rā+2wPt4ҳ/AH$a/a~8s} rsXaa\a25~3@A]$e$ǒ=vog7ԯ>sq[Nϖjh*Ú_PŘenjKW2)ͣsR \A~=]F )wC$«l}L;}BlnxۂJGF`22') s3R/!mT;Y3l\qǛ @I;r7w P cToAKG;I@u$5\"F(e͹edHƧݨZS 0K(]X㢕:OquT1 M ́"(d&ه߂vCr8e1AhA9-%Kb9A>}}m@PP'YefT K&p}8,aE z4a -BOcu:7'TXmʋ1OCޛ/ߞ*f>*CзX{3Fnp4/⼕h-m@ơ=f$h.O<ɁE<EL; s]u,.Gtz ($3ma?F?t3SZ0A)?|$lOUZ_3cg!IT6: DL07`Ko~*"/ɵ`~ .?]&[=2227:7a($uͅQ_([=6ɱDEbYu-y倕E<[G_'n_;x}6ԍgƛ?.Fs0J9l Zy},cdފ%TP>m,d@$d5*!-=mY~$gRZ Mu<| ;WeU^?었qn(sWuZ|^1uc~?,aUa-r^P9F$BCJ' *ɬ.U%0EtM ? X(TPѫn=YB8N1sg[60](KR~%0^ f$GlD37&ĭ\)m<$z(X!Ψʬ\l$VmژlA|>$(Z#CTfhPzCD,ZK+`(s&$9/G֜%f@l3C&hݷoŰ{7BOM?M!h9ج^n=ۂVkҌuiX x~,o C`xPOՊ6y$5l)EX B"6cE OfNj81qykAA2|z jKd͌ NT{%|뱸8&M,( |~@o M?h40 Emn`KѼ/\l t.r9!4ؓ^C؏ݏǽ/O&]wkC߉H:~_=%#Q=D=V,lR" $}b!9s}~]^5bTL-یy]ȁ6?(ZӑU!HkP fȚ*jZ;f#57`lDŽÖ(d`Y\p8V"3MGyKL{dlW>oKuv\2+hXG:*>r Ddi28 ϽNL`@o{(HB,, jWVgM۰©d~@^u+#Ja1^\m*q#`"ODf~r=T|{ѕU!v ĮOBdy]b559̈K b-ő;LP@*Vɯ™JYy1{^t% p|i:8Qq2E0(xS E8^ycuVeIV h2~ ~EA ܍ϯniB5g1 DDZwz\"d!H*H  n7MGfqRBWMLڽ`8W9$XƬd3 3Wbj[ϮҌ5>煶NhcP?My;$l,D>|(""P-fXO|caߦb#/(?|Hpe~zҌC%^7[εZJ8b,%i_lZ6VgZNd.>YBnz^QnBxP*`,A$ gu!\,JYE6[^cV|JbeG?L9,i& +WpiŧwJK.G6r -[+Ұ9b*{/X+Kc^FY</v/ Հ:19=4c]{h)7? I\q7[O8ŖE1`^mk$ԗ9 0S2|d}$#z}JLVNiˏM (B9"[LSq$c=L4T}2 Ԙr0XS2CbH?爠L%["y*yP.,/2롏t3@;%x6M6ǜĉ8}i КѰA,M:<*tT?@FȂD36)# ]#ǔ 1-Y{+dt[|{a/% îh ĕti5L~F.V,2zq Q'U6ˉ9&p4?XTRA?~#;jDII^]`A޷2Sc`tt|;L(Pa'S1qg:S̝#/fS`<\@6vrL-B KVMgzm)PlgcL#yۈ uH6ӂ_rI#2" 3VJOQF# 1qجN+]`AFMC KVJn 'Bae{w{c`F!UהswRREdL m3Agesnw2>tS%y򲗱<}??@hߧR 8@UR8DfmNy UH=f@i3 1 צ |}J[FJa; tVzv8U]Yr3ܹ~/˯u%ɿ˖z|^@Ykf`-?a?VT-a3X:[0M=-!fv|4Y0Va B Pg.E`D#8ٱrp0Iu۝gg |^l/ 4vAwWEv~!QӁA0ZIE3ͅN\Mck@Rܴ ݅;]^q)kSiqLO9~W:/VM3B4)=Hp2+ʵb@s<1#c3ґ骕2v L#İd)`[YBD ի53}R$X/fpYYi2:X ݦyh^4v9\Bi-Ȭb"*/<|. ☘ Ǟ$"bQP*QX/C:- `֟2.x.Liʫ5gFZWƿ}ݼ0pܾ բYW{ f7m:mFy#bv ,ؿU.}LV~k{2|֓f6nM |ep_(d'xΗq \0# bd%rHj}}XMWfᄉE<"WCo˚mO^G cO>3GbUt Mj^ w9b; I}/_B)+ ^lyg܉?^J*2"c3VJ$@+)8*vP̺}->*KxR~TS) ؤ!d<nDtSMlw-\ p]F΂1Yj&][Et͍!e0>{2wL_6d}7gb:zͺeJͪ6S0@  +@_AؿoP WgQόFU L}[F0>u{JU)/CF*tY&F$򪨛ͱ8+,%ۀ|^&L, ۓ(gg`h&فn(ݏg02I 5I~8yqlWb$C҅3FXP ]NC`h#љbvx? :<jrq@e 9Z) UEy>Լ% 8 +"kKP 0#Wӳg*?Z?%nr^v=ZznY.ty=' 9 @"V\B6MӿQ)ss>c]=rާ4fZ,\ذV뜍 GƖ}a[c|ZM옋tc@4A@р}mQcʼ{ %!7%}i*I3$s9h<֨'Aέ>褍ߋK>/>ѿˎz'2HP1u[C,Ϙɫc/V|=ez.Am\)#eC/pv2>ƾ@nq59h,>/AcS ^ LVLB$lsfc+J#V@1U Ȇ_X8,S b<"ABrIfŸH Kp?d#~ Ō#$W͓P(n';1{cxqM,oYմoǸ>AmgM~.-\_L-Xvlm2bݢ 7'TݘՅFt@`*͡jC5&h4.A1[z|x$&Af+1x#kj?i ,?QoIҊVU~?o:vDf1ߞ?9OOтRd,Z K]6{1s9mT2ktNYpV\yu+H޼t}|YVqvM[WÁ;Nt001y LF4dZ@Rr])V }>t;a! χO<8|"!0_C..ɑˇ "Z6&g[&*6vhC#^G~[vEf׋4."C>}dyVp)FeIs >1WN^\c!GA)Y haYqQ[PzWO{nl+Y'0[A#%[#EWqqb $$k_7zQߐN*t:Pd@ i9l{wAhd>TYA2@ /%L9ujcgx>dIV梋 ΢4­-K+ ( _l#Cd{>bZd\MH͖k [!A闏楤nyW46V A,C1YD EY(>G"vlUjEtGq} q7H$ۈx>yN(EuwA-kDXԄsr, zB:Xa\& cώPby'\}-ʗy|8 J7:@=!IY/GX -`YAYo9k溭!/ucN}e?w .enx>JyN 5 ] ]D*ftSt-Aemc"0m2dy ;~y6:\ʊ`Q%xbAEB޻/ODf>6ެ!D@_|&RpNk/:BI1AGzÌEnJwpO%cCi NE`c`PhT=f zkrr>X1=W4rvu Ct=HHÑEBX]P5uk1@#hn+(0Ozȡ{w,̞<7`-+_q}#uX}j?):6^t}1}W.=.-Yq] {uݨm+ &uc2Q12ty=W=h.ni"nъ;8tkjs Czlxv؋T,r'JK+_v!Ubټ8?`r"KKqE\hpP_^Q$X<㲼]f (vj̲JswE)(vQX&ž,}EEX]Y/t#/CG?J賡[`x i'O|lp5}x>Ryɵ ?Nh@Pk`(j, Ȳ`$>Ete10=!% toŸEVum B۩G ^Mh4IdsF[HĆK=ǐpHblR\PRw3߄f((P֝$鹀6ƗyB@n*@Ȃ\z^>A|uз7ܠsPh2^tY/' ]uC#{9)"qR0zڎ2]a$$}am%c50Y܃KDpi"[+]ý.h?nԠREs^S?_pU,R~qUȢ3/tq^dnCfQ1->\\l[]3[cȿ7܄^ե=Ughc L9oc,v;B/]؈NoS:|zkk1oȿr|t\J~Buac f M-:DHoŸ 4oBۊC vu ͂VMD\김b}AaMh".D[.w:~@]% ]M 4Dm̯D@/!LpPfB@( W<?W1, {RZ:0 @ޙp48"^2AljtS}X71D3>7sji~ۢMdV_z̷1 f.b<=(]B&oC|nՁؒ1fe-ጝv)/ZYe2,8_0DE}/5绱b[ķB5:z;x$3_T7s \4๠64O23Dm\TXgJYSI~R"0NĂes)lqm h 55/+F薮z5k;?GӺ$ z/_yp^o(oG!\IKW\f@*JSeՈaEc1 OɶxG4nH\5o4s-i7讓ڴƈ kNk"%z yi:2ҵ&p}^k1kK9PlfXQ 2Q2hRxF6D zP'_2R_<ņZוE,HߗEm3lZf}>HDaǨ[/U0ӧԸ 0q)R2OŀllD*Ŕ)#DE።ޗ!7KS -,%DK˟/m4Z'*{sJ92,GY5/-VV1%w=w\c>#9ȸ[-ċlPCX..mhγ)R%e䝯@ca'3k̎ãB:3%7|gָmZlʃ+`ᔾLjkl=&7؝+3UQx{:c1( ;M%d7A^ӤzjW0ZiRS^ ̆*  yLdb ʗ X8@HY,$尕RZ))PAdĭb`z 惲/P $_ᖣ)Ga,?"&eTz~·K`W -jiA$t9h?O49U愺J!CbfCGATF~UFAUcX#DjHC9rSP2@ɾ  ,tVgxfmʠO2**̌Pj~*Oh9V_;݂arhefc u8S%çע}? I$,)K! \3Vx t}p !F`|*dPy.sRwr201*W8.Kwnl8Jv"}`/so^MP'7TaM l҃(b#L-j .r-ST_e$B|1q#xADv+F!S<5An%Кroh'"~^1PY~pE̚P+˂s3W\O5%}ZK|u^0*-Ys ywD1v:D٬1qLE(-\5 W_V < s8}:K}ȡx#feq#ѭ Z^+S1qtk| }hzOJp(fȥleBI[|=~ zpI~GFZx{u j^=QSk=ukU0z9Z&}k"c)ou-f+qoṕKpMeZ7Tgν:ߡ~Z)1e3POWPȒx_]lbԓ)tw\#oj@ ӓW>ʒu'l(iV@0#mͭ\R=ZN-lk@ַLhGbO0O@0I|ב#_]+J* /fnDJh(ձq-6;=UZ}Y˿ZnEAJ;eGɗu_F7lif|#y͍\6[>g=lo@ J`:ey 4mh L0Qo8(p!ؔK/TJOzQ0HY݊v_v/VV*fo<%[;/|/DV6X6}+<59N@c Ī"Zɘ"j>AA]ׅ_e%K>] zO}|:=p0 7EfJq}Y+q" 5*=#Bz sjx63XڰM?Yeb3aiC ːlRʀFM5&hOps\>v?P/U9˦g^8D u`|*dܳ~Ap34Ar9qC5,&=b 3|mʠ̳<;6L8&DL W"g|''1S9c K <6q.zXQn=_fOX#rWv{q=jD\JX+6E1ԯ#%qP+q7!`yrwCaB> Gw7z¬2cUvAwl]RzDA9V&16^ܞM{rx28q˳ 9b"z8Ǐ̵as|s`ڱY $DrϋC 396][wA%h`r`8 _#̒ 숖偅 k~~[nhG-Xa؈熻,xĸ`m]ÜOQ 1,Cؓ!;\+7*YkL&E@VS,͟>QE} 3=6}ͷQ]F&RIN{bV.3=d߸hrI80s!be+ eE}AY#4)'a6Xy",AB .X7&>^( jXVeO cx-?`d̋> ٵim3DO dR&9B iŃX)k٣1 K=&aM(S%ЊC:52Z.AcCs;1a\|x,u(^\XK6!Z\˯Y*<%d *"bu.c06qv>!Fg~JnsCfBMy_DmaY\E;U4}^O; =!.[ErG 'S4#~lj4 27tc%.D^I: PtҥzZ[@օf#7ޭYs6q9 "2 g+& r-hC14$Uw4 K)ix(Ŧ5o 9(p!: "x#DX ASvm[bolּ hbŒhge L HUSfrfd9]|?(C.zbA%Hs6˷:9, .94WHfb&M+n>̄7HklSWG)W`#:SKfb1N;+H!\:yQpemZ=ݫm𻡺 %v-֒p1V\ ۴EGbOJ$ UuOPrKPk3 h,b&Ct;}XQ+YOfƹ.,YZځeOY5 lXR`kÒ h½JevZ`>/0,Y6z= ۜ]b#l7 xGa,?e2PΕэ%ϋ K6Z= .4<_wːގؓjm'^!JXPO.Hra& g>/),-ĹLj\ 'cCvlDS1DeEUa]bñc㴇HOŞĩM껡HU_dEb,M)b"ߎb 4x#T*Gkq8 48 ^TGAi9jgB eAQW!ИoV>w9r MDm,5Ps\wҽrVs M:9);6t7]PG"\r"84Ati K0[_T0HMKwbvJcsTׁ\88M9eg+?bG#Feڨ?Ihl_-7] .[)`1B KVƧbKUm>ޫ^?!w:KF<2 .&XAb5Lz 1YTO__dKԗ!Ҹrdn/>nĿqsC'RX/i{py# HnS @|,6A¿ԇsq suPئjIՁ{Oau_"f=+D*;Mde7Ɠ9zj4:MO'QCNda/y-Jsoe?2`juCgF5z æ\;b&*o຤E[J4H0\xe _kr4z=#[KIe N((ur*k_ c\3m[[vud1%ʎA.1s& @/g }@k(9v8eNLՌ/FĚIN'u/Fرρ1rc%mK) )K,峼tP1F gAmn?Hton}\Z?f[bɨJ1o( XMe93(ߦ+&?w:g7@ ='&̅Sm8WYCgm3܇uo |)!಺-:7EС]:D-CU@̽1Iof>P-yi3ܯ^^ט% &=Ӭ:"][S:9PYz{e7XL<ƥy>EBk$7SDOgE5n34{-[zMo#cAW-.V`DLsD6K$vsČD+Bv싱دe ןդ; $a-ɧ ACҔ2g6W cT_2}o>jإ\S/nN`%-|0XDI,hI!18q,-HCeUکjWY5 ȭ 4x*Ur.ƟADppۤr8R@Lrn^)yĜ;IEgcYi$CLj0HiA1vm㩾u;]0DIxIN"3Jֈw 9Y-'=5U|XvL[^]q JjQXL`dX6 iRZx k$ӟs@:NԄNPn,6AhaE@s _ac(}>J`6WVXj9޹8pw_O߀֤-$ңNFΣ^ ,h."L!y8 ӀƐ#աV8V-ID:I6(o89\ITcxxqw]w/7z(\K:Ģ&m(YG:o#kP\!zXGֻxئNf><0F>æ o|5K^KYȊl1#%e^/߼,"A05A^e3ܛ%MKF‘07ձρ2L$]XtK}a D߆^BvtoDZo jªIeb߷y]{bLs@f[V>HpW_q{f6i{qSH*_*}YmOu89+Wڕ ,w .Edj7]ޞٷ'd-7v}' ~+h0Ц%MHM&ƒ,Smo; q(q ukU1ԫA֛K[ӯȗOYF,Ok vBraEUlCap5K)(.#D=F5CVyڊ'FGB, >_aNw{Y]\z{e(qlh;5kmh!gLنGK7\$B#R Ѳ|兮6= x+@ ^)eQSsna4LʹWjHXWe2QSՊ ~4G՟q3NT~3t#Ld= 0!f}R4;DAf+<\^+u C]R&c`jl`^/J̍CoORY~֋7tڞ}.¸`d`^V R/kCLE5+ PC{x5迳xj- 2Vtijlt9n b`#$fsc_Zg+;MG;ݮ3F^ra_^XD۲vÉiIcB,mczQ2t ɻGkցVbiΛ7xTV2Ͻۼ'>Pr=̶;jc$[ rxtibů&Cbx˰4a\o .<"W/ePLy])ѳtZrmZ)ٜMfȭ Y8p1&7zH+:R@{t^^<(6;"<&D~d1EsbzҀ8ɥ֗0Fi0kʱmj:^Hlj|Jq#A/Pf$_u$tR洔D£ ΂[FEkfDH61P,BYn1[ DحԐau1`#Q;K)ğ.  lS$t+Dj7 ~➢h-M ^ z 6泡e^BL"j(3eBjeP||ZӲ1a(e.aHW$ 1Z1EsCkӪI1~1EӉ-ljC" 3 4p%z)m-rEQޞVx',(D9/B⏃hZ-G×XKmb ETZk;iHm3KURw5@'FW,6E*Cq.x6kX:TQg xB,H܁ѱ嘷FHRx;1!eTƗbD>WYCԮ~@IX5.VԦtgk@>t01%7^x_Ea2S0AsQ1ޔJ)٤PKU7k%B=<6&"((UDŽN}LјVZ7M5K3䄌T$S$qhYNSr0gK tAT:YM{QR `,+q-P~f́B+tMT {i2jjP-%K U^f.bXM:]By^M1>tNUlc^6qOO s _6౯>6f7߹"v9@E}XdlD_v6Xφ=) Q2#q3ڹ"YEcUs \_\f$21c1OJϠٝc1\ )u*fZsH4#B h?D(o=ິn?rHB@?}tsk'to?cЀ7leCC:e9KȢ̀1mf5^\e#]rZ_F)0iJi+@qwz6ױJh,۝}y٢'feP).]snOMI@ܶ:ELV(FW .v!2+gP*'V5y:\ YڹXd ,GL?Un^2n!)mQqb8 Dfv02iJa/V0؝t)gt;uiցF0H`cw:Z<[W)chKP H c(pELVw]^݇fZ?a}^ ;ơTLfhx(HͱaB tQ(yiu|"MC\@?H -M)mV.Y0Pd`#W )^"L\>cY@;F)VTh 80E.ǚe 0V\p\},CpnuՎa+C/BF0PB-Z46q <ȘqEEjTOuBIE]R"ZWg~yRHz a*Y۸hICnGO?>ς3a J8JnMԇpRu^յ1)2VLqIXn+Waʖ! “N:jػg3oa^6ٮ)QyFGo.=1XXncZglu\Y8ǖg^AxFmn[(fl$?G!wVїe}q3ciUzuU~Imh#] fM;p>$h,9Oc/m2PpHl6k(, ij2.H]p>,h3K TRO?Z{7/l^c@&٠[>yq}+jS~ oOt|kz ^WPP1-Es pnnccu'oBUra| M wvl]'H(o$Z:M N ,5x r >qd1MmZH(y3qEH;(J+o#efzk4UnkPEKC9}M5;q`vWs"7Fi?.4=wycƄ7=NWU}M+3cZ hpܲj#VG ]p >brt_vӮOtlPׇhB@4I",cu:ǖWWLU6ջ[{iS!Ν웓^4*P lV 'DR܇L,H@\eK9SvA& .oXN}XXfkSmSYgǡ \JW;= dmRG$\[|_ɮ pS,ɲdo -TEXX;]%i(rr1}WZ|kqO!e)`|(L{<>W*,N8iyءMb hDf3hrRdAn]҆*Ԍ%{̰Ns]`?;v?tM"rX(f8m)b6hKɐR+t`уqZ1@:#FNtAl’Foe:RM:bRZr[BVLf'&A eî ]xgiFX=+,(:j{?9hl QhL4씤<ܦ<c͌fܠ qgt"o}QJ$w;oڛv'Zb.V{6(/c=x3Efr-Bh.^klA}iNNیVcs;n9W*qGI.P)VzKșZLJlzm UϊQa o9vrPiz@uNp lq\^ Wv$4+" 3\.ZLOOպլĹt"\]Q{Ղ+޽2 H5&=cNhFtIFpٰ"VcuBJW "M Tv:ׇᛐthsSzcZ]ڼD\龀l֟J*=߼`Gٴq~ogO@t8&&abV\Y^m:pm|2-.qຩͬ*X`O1/M5 @f+`XwTbnpֳ|QLlv.\[Jۜ$E@wYw i ~O~I&`rxrW(^ Bh%D1i>]xM'{\}^gQ&*܁44^e5v~ zY,JSv!%Sq$ۙ* zhMv+)YhuZk0{s'icrS {0oVUAUM]vᶘlC)/>(u8Lk]-'"][#84DwS QqƔ~ʦiW<}*ԙ$ 9J=]{u$|tKj7ȯPi:ϣ $6| Z4W%L'{ ҆MeaԼ6/ŠuVF|PP(DX{HU.'yqdnâԢŸ͟?߄=ϲJ_KX6ƐiMr|YJ+w`|9,׊bz"@|cT2E7O"L稃,cO.O bY[HD 9-ei>Ō hE( XPMڍEcHh./\ `.m+=ŝtgd7KTth4w0/ .][=belӄJd󱧧xIqBbw`wGu nGёtXzI@5!Dr'J@* 79uSpuPU#ɼ5Gb柤LGaEA,w)!ax|LG$Al Ebgv B2 .D}^]P_ּ}g)<)~*Ƭq-7]RǕf|R4B|)[`T$$ǖ m}95*^Khœ*(Axi'S)pDGs+#aB04YXfUC2S#2e0:̫m:mbM8Dd|*F2NO*bq#c㚣Xt.¦K~Ͷ}K_/"?*CatJM9"ކstlL0I|SrG_Kj.W-t vh,Tlkw.j \Q%@Df=UFJnSY4}QQQ\֙7-bX$\O.mslWQ'{`AP&vf;TT1z@M` ֔ F>APD.ǐR ik?\{0q @ʅ8XMC"J,K뮊tTGb`%zdt1*!RvGZ5g. }Eei|w[f{5 1[ c)}]F!T^b#W+=lvGq0qv)@>&o>1%}WT5&kKlPl@aܩ;X.v׵/nxvopWX0Bh,!cwE@҈u:8&>tlYKvGh浥J1 7) Ԋ/q @{z0@"tАf}IUsyK`๽#$/6H2q:&"Ǻv9*8 hu21(KcT`NdgX35҆1 1R K$ՊRS/3r6Wf>ӱ2CI$}m_ʁ&!, t yPWD)vFCEv qFN4ѱXĈx?8!7+ͣ2;Dѣ$: @ULz\xtr^r=Q7y/FIc+ ^Eﭖ)k=,ްrQ@d_v?´Y2 $ PTs̱̐bi6z֥k@DTsYZEj"D+ysb+:3<>ۮ5uLۖX@"]\1*4 q kqkpaz! 7M$H[vXt[A1?F |[Loe?D5[WzohFAۈ{Xպl]V!2k(/ZXAC-XgV15cnaN .KG5%:<#_oIaacm{CnA:?KXP)C"1$Վ&?uYYuâtH( m/ˇk߾i=" !h{d}0Vh^n#r=>؂n[1ܹ']|U$kW|غ6`}KG*% I}Q!"}KY:XNGcc-eƒ;~`BrnO&C-1yg1 e]ő(p7YfsI,эYېU]+EH>3|0uc7$,rciLJΰ[CnSݽ]\<4%W)ɱ69}t0"O9*q),6k2tiRa#A{UlfJrwG..S`X3 y"ErtHLǘl>Y}CCヵG|ܡ dS>"R b s~Um_=h҇ >%0@CWjuSϥ}Y!,7z [+0%q3`K) 1tF"ԁN /rAfF@t83%U6 m0V#'Ìնc,h'm:FFǪ?ZXԄ_#G0>}$4N:ۿ61u.@f33t3wVYޤFѴ94/cݘEQҴ7ݡەa`/|Lwi'爌Xq CTxLT[*k!}W,]<z, j"J|:: ZX1*YYO浯7ij{]h>vk.hv}SrxYWr᎐iJE sY 3/Jbw D(aKLɛ T΂c^1Sc%鏑g}]ݷc+sH#p%l2yyd+jp]RДf6ID@@ $G.Dy +PǣhTf9|L ?>򎐼 _1Ϝ_Z$7g)[Tɠc,C251f,'Vy5*;V<ը= U3"K?lyX1jp3w=Pyh]c^&]V\UX̅}L'y|"=("ű#5݊Q#٥` A'g}⍵mGbY̎J)c\G zz2bxf+ᜮyG2y6aVxJUËyѼ#yKɕU^_GUPO]7s4sG2;:6|鮯 iき0DOg0?Ḛ U~Y}_YN s {6?RqL/^Q5͵ IqI#]Fx ain,%[_)O+fqn)sDz)OBwӁȴSMWYT#ƶ3}Y-USb0"nڰD.VJ1p#O2u}[;, pgՎ^v9hә-ҵw[H bӨ`JG}2o5Z&wȵ % 9S1泓t~&ݝPu,.S Z[]vHKXۥE[]Kko $,ZX(9} 2uز;BkW1*f%Sge 2yYrXߚ)O\; r{.\PQT/9a[s2sq>_O=ELuI,'"2ĵ r#j$$GǮmھ`u<3 t s0Itl;edj?/wp}nہe${tO0}@ca3f.,;WJ`Hrtx28WgA,tG- GΑg]aum-c,?AWƳs L K2\dpwH޷8.)_*B>GD@E ,[دtd@(V7Ҟ۸vεcR.4 oYtIW1S dekOp^/5L]'$h؝Њ./ Q (t6QԠWlMxBhAA{Q|+}ݕS,s%Q%}|tQ065.ͯ^)KNi-q4m*)Dl*hP01]i Av_Q}MIk&G~6_/:r fkdM̲8cc~qvv'ݼ(fGbO*11"ǔ.M}>؋QM"ZLhǵJ+fsY}e|s ۼ3]bHlKto Ldw{;џcrj&0A6[ryp1{eF2Wbd2(COPVЕHÊ^t|Ρk/q;&D8 o32S}y-@UW(crnq\|?)\xr{I $TKM4u6La2"d5>kʰ0ˣ[cLqK+X7m`Fҧ~q%m\ݠnQ0(C-vFe8);v𷥠)&KDᾜsY*B;]Ft ?~p+ zXv߮tf 8 Keǽ!hN\U-o.;^{P)=3-@B%g#P'7# @vŐhe<V'TLX\D 3qw@ 2 czD>(0zc*_I:aL^1tRLws.zΫ&:Q9L).{ǝ)r؀ ?S5_CY0#aO!j(k˩q$|$#{E6Z!Id ~ZoT3RvD(P랈_N aqnuO $ 6TJ1@\M aHV#p-.m59<#&moV̎50crdy1|e" ^^Kȣ0) Ўllczƭb'QJ'@4SXF `/h<\ظH@ץ s®4= a5]S'R۴546lZ@Ju$Sn1'x LDSG' Q͘bqbC&-N 9t~QÖL-w.pJ;wхs\}|6(v&wBfp%4QD)10]2}50ų icT^!(5#FI:ïof<Б)7'$fXH(Ɖ ~*P҆WTFOX#Q6_\Tɑpo%I D(Tꂩ/#W⁐,R|5;,"C->^TS^ٲg(! J`I#&gY8.Xq@Ch%vs{_>,lشʰP Y8nt44Cn3 Ck'c?mb 3 Ε׶~X\Fн 4 !-zl4cv/б~xv"_a=!J,a7iʰP Y8qGO{q>Pl{w~Õ#;GLISF@GntfLSݽGRxɕ"(12}5p GgA(6v|[W sX(4ok;t/r\ݱ eȡp< )V3kpKJ8And*7^Bwc?Z<3ZLxO(9vD똟f>TuO,nls6,51tRЈ1\JS828g8_\o(.#Ji*2bzOe/7֍b9aHj+-cۦ&',`2  ;FH{Tjn3y.VJߍݴ6G&`Qd|5y@JN9.({EB%bz^c>MD_^ټE0ӚTpCPQh2{ ۓ'~dA|1Ʌ\a9_Bqy5<``6 2?w M.7Vݏ7bx>2' CM(}Tτ^yCYSm&ig.dzu.7k7E+P7 ςzu^U_Gq_$ńE#t/Dҕz&0RmD ;_H6S & mjG7Hd"$]罩l0D𡟤|T6eEh-1w;X6 NDHIFI "׼zFqD;+1+:Ǘk,7[ُw[ӈũ!Q VNRz1xQ*xQ㳡ar,GG講Yc~<bs˨|S$P/52mm3̴/>k7mS%lpb6XN52%,.u[a Iߙ[^ƈo9*NgkgpbRؒQɈ'×lj{&虶Q%Q*O}K,{*=&#Lz 84%cG aɥqRb:"*.+؀zVϵȀgQ[p x"QPd*omM=JRP@ChT%3s~HD0nf((ʖQ ]FKV+4ª`Iمe\Pg@Q0O9-=v;$*"\ H:UVxϕlr]xa~DCCZp>])y7 nbt >/`4 l }UHgO}8e/]zdrtQߟ[&}轮 _z!7RD$B%:W)Aheߤ} GSG+˦I5`iݽ^rRЁ[ԩdtb hzfT\ul~1 ͢MvsCqF'gt6l*-ֈ@17t Ł ؈͢zjE;v!RSqI<;{9+6ʖ!'(aEqL7~6+uT9%y [pM_ 0PrNRu`  oZ *1eE+`/#cu2KPuvaiB"jzq}ɬ3g /Xi`ӈeqr̂͌x=z C,y9IQEFOM{n(nAMǠ lCf/ u' u#%׮_AZघȫ$Ar1K!AHtǻ̎}^bZcG( *RwpzaQ̺Vb-fW.z5~<ԧ{j4\^CP|Pi h@k9u.̕Xyg4bf\7(d.Z kِSzϩ*%ϫnvi&@-9@j%0Ge0Z# [F?k܅JfW;5=VϠb'=tN ZZeTI>cw5@+P1|qvcYS!m$j.6?őS+ҰF313{v$ I<٦ qpJvP4n]OhE=P(  pڦ]R]lpf,}V'4ϋ 8讧N}&tiZ+ތY`PL\ H9`SItSŭ v^ۆUKe`ͅ, 1! *r6/} t0RBȲẃrt*ve%{ZrXl5Tl>-+BX䎆ѥ,*5bh1n1b@\#{eL_}^YrZ5BQf ЅCxlh$i@$Yo  3Gm@_Ff9P 9C4i!'MVȭ .՗`RAwJq`fˢNJ(a},&#=~ұL !־Hi(芁,gs1pA1M\7YkHf=$A;ESrp6g9X Z޲gY*ӛ-YȘB9LPi(;`)L |wX=r&ޝVaf! E,)=#7\7Y!|ۭ#d}rvCF,s6s wD Uɋ/Cٴm%WngdPy_S%+HP; oZmijG1o1i@=>icnK򕲢v}eZF0>uSJ5k QuR׎E.W88<t7 @`:'n1OZοZɘM6cQf^tyEwƘj S\_>!(lBM1ZIqKW"'fXN ϋ!Hk $"o@{KdZzXXeJ.j_Ef!\7}{R5z>0kdyr;YgJH~7LD:[Odfor4AkU7TrZYy0 Amvk1PbA@tJ}UvLd&cOʟ ьqJ,]هMҒJftU1Qk45rp+T&QT1 4F1k41ŽGl/XZiH뇽`,gtz @BȇL2%%.|%%k^ wf+ T&*>`0e'C0E a–]y΁CK} Ij.YZбm}%vZ)fڐeƝK: HU2Y,mXr#?2 cfќ%g \3h{_#Ɔ &$S+0݌Mz~A%07p]!Xa~٬{i͡m _<ӭ[ZfIT$CvWOՃ2?)Xkh4_M6;MHrMЎ锈v\i`V!s۟G$Zǫ8| GZhX-¯yx(ΛYy%Ƕ5QK$evr%K+w.gҚMLBIԄ* SCRP AVx- 7%&mΕ&T^WW<7m<7B]=|WߴIbPhOaՖ~~<TfMpL@jdi1ܙ)cJ,c*5gLy/3fW|jfCƣ==4PDn04 NtrG\M@?g ャE)=)BL PŁ6}CfMA.ߎw)-kܲMCoqyǮσ?t>{PAm]w1:FM];CKh\PRfCM+ ;-cb(7r,ԽiliH07a GMebJ+PK^C:0/H@%&w#93yd@ȅJiF\nYx#4E4t|mier6+*HΔ8mi+TuCO,B5tSʯO~S4ʌ.sv aF XIh XR9CSyNrO9)T{Q=mDe b,BvQ w&ڼQ_0-SE2>F*.tF%8-}}`qaXԖO]>DwQ"4Y_n&ܴ?i<{㳚NyFkOS̫վcٴFY+w`\ttou9S+ÊrBrP[#k1Iߋ6zխ!1- oA`DO^S%Ńsa1fQ7.ܥn2 y#2,O}!}6uD©OoCL5L p#P'tAh4U+hf,7Mk|t[KO#59iJKw I(P|sfdii'scP i4߯ɚg1cԇh \xwċ+B %]!Vr j&ں%PPS#2B=Zee! mOHQ8S*CD?Uy!*m38sLiLiZt_AoCipy6Js>,Y cM d#U>E41zJt󐁭 >]MjگAtqK+M.@lbD#l٠AdaW 2lr)!d6oF`Č> ,O?POYнZj_㷡;9!k3Z5h:0^.1w[tt^_Z:{*d+Qo6!WĴdeT_/؏X æN%:XčơiCȽ Y;MKC?n_ˎoC/Iǘ6҉q(S}]DZ}* i4̾x`PlYJkaC=n4KLCiVOC]^hfGl5J锓EK(ky+)viB_3ޤx*sѭY{ &d,%$$w2p6$R;W1"蕷Aǘ&֥1zc6}^"={12} dAe<@׼_#4/a P4TtF|^PF1\O(@9h\emŌz?wry>buDhAW,4aqik$Pg/C@ɗNd 'qG%XK eܾĂ)KP ͓{Wuen=^bD\{yr@:dg -yshsou> Ԓ 9T#} Fƴӝ)1:$FdX 1*QQCkB3Fz&s`8xc zpGvE^P}Y8T tO^ 5Ǵ|7:(쵒\#m^t%&cbt^Qu5(dEX7K*vZ@!:g%9cF0nk1jwgQSaqDK/@Gu2dMTzҾ|`n}: J.(ͅ|4dEi͟q·C}PC]ovKDla=6oڽG?jdqQ`w[]c|kn[ȯB u`H鸼(юHs)hKH@ASbg{sj%A@P{M:Ƙu&/WV:7?lc8Sѵ?>>/Ń;$3o& 0gߦ.oY۠ƽMhC_̆HDlP`hc\˕XqW/>CɊ>X_>_i+)_> u P;6L4]:qE#Y-NʳRWYY]E{:b\"N y㛅 N1$AX1gAGWuM bq&eXP,~stCֽ4YG& 6(3cQcz)LTG~ LX&[zL,ưcI 126ׂX "oˆd'`\ IwAo B@ uL$6/ kqD@ˏSuؠ=#BtE@|Y.?rn|?GIĀ>wn5C{p=]}Ao }\`kرr15'Z 2e!˻Wǎzp0 j;˜_f{8 9Y[YL?\m@CL:t'%KDWps k.gSm߀l9R8lmg&KnMZpdߡ,"MqmxB엿WnXvL6wa;=L r9`o;RĐF#Mkqv/Jn8s*5.5\$5,H,t:F24iOV'wϝX>WQ,?uIg:]Ȣ6콄5A)5E ۂr6~޳"놈j@)0Q uҸ+cRJ`c)0?.Yk[}wpoS w[ O`-?NUq4E.n͸XA ryks Vj=ɰٚ'fT'l)04S`hKzcD%;&Mڕuy= l|?\R}$h">dת$ߟkS$#w&0d4zÁCVyW"\ecڽ *8ׅMk.7 G :\Z.$?]4o.NFPjݖa7S"p*ªfiTjt\a={=e6mv;tj|nvd- ,ffZMCPj'ڝyTl/s¯s0dwݳ Dڀ甀xM塪M8>o^DɊx:1Mcm5[>\tOʀpgD{unUբ.T߸ s߳ګ[GW`HH/54Rp1'{Kr Lfpi i83Ё wC\[a#oGLI3P %ޝ9U!0KI(m'c\QrLmXeNVM͚=V {7WZǂ$ɦ'L@l@c6X <0OI;*u9^\q=]c',XZ# u= 0BJ vΛ0/;O5S," FE13z$䍧-M1 –X!~BYWt&~8ҌOr#_O@3ڱu(:]Fp+`c( O5q `/, qβh >j]i!e<IkE"@ {d`[ o;`EFPXNYCfDZxkq~D%M "r!+TZ(݋y.h~S+7c65?cBA'o!جUHeRtA8_DMMٵM)ZN(W-} +z23_,MEe6,o}!5kk𾛑B(p,fkٸYJ"j,PF(ls,_$QZCPLћm=΋"dE/r\Q?^sҒՁ89K v#1++a9UŘIx |2Epi"/ @\/~2Cu& E;ĊcfY_>> 5'x(x$Lj7Y0Oi@SAq 'Ba(5PY n٠uPgW*GC`6>s%ec"pIa.~(8d]{kEYv잆 Q1m6+oocD &jO0|{7s[J, j.g~&z'~1Y:qB s"18}@8׉D`)2zK {YP?SB%kV8RUI ,+kUu\cQ56 rxت8Y/ &hn2q%όz#T9_.н9 miۥ1L/B&2kO}&5{24 ) ze<;B'%{[-wI㞖є0 O:(jXM=SQNm*"4n<&݆?(yGۗs[`l_T^l4(ʑGuU׬_\lҖPaYEBJR~^Box4"%GlȢNydibHld`n*,֤Մ{.>OBdeW1 콊Q$jdE sR D1V(5"K`8"M1=s-ʠ.P*\ʽE!т_r;g/e=!XB #YZ-Bƥ~'4?>R.ݘӠ~+i$n, S2Sq$'&+6r,ֶmub,MX\ҨҌGAT Ⱦ!TFYu[(*4jOQיDj?<[S1'#t[!1/2dmό`)60 e X$]7 V,M-*P_IIz Qk~=_sn_->mۡ7{g*8),ӓ\/g !IʱdBLd!?MǙD tnMj;4kܦl{%bt?-=N'%Sq$ G &]o, -0T\E7v6s&N>H/G\f 9CivzDS**Yָ Iؘ!gȆ$c`K3E+rwO]ZZ_Fw?a!}_JYdvWbjIQ1+KHÍv0._/TLXO[Y@Βم'$2*x?*os#`RkQkJ+Y3]-ƐPqCLKVƧb$u\ܴk\ 2dyJc< q+Ґ ?5$Mfe @BzJن3?Ŕf Z딦8Bwc<= XOi(x>q9Pb Hb)b_sҌ Ŀի%3ABtoOYle}u6\'[7U\ZDplv\h4~4H{ jod;}sxcq\܀ $$\)t(m2j'z [k/lDdCۉ^41zрNFZ !N:iaq`Ht,MLEk#(fSTy=7AUz1gڧ7b)+őe ws%"gYT,r[dLl]"cD}^eZF0>uGJχ q'mVq.yAeͶcZGw\8Lw4}:ejpB=]]3{@q5Zr9f HEL]Ԋ4\ԟ)dZ {&J>y:8q1IdT,璠e`"K)|%Ee$`~*:Hޣuw3` YǫDly&ԾM+HwhqU\cƬ2\ E:[7V VҔF0\|^zx U>I3I- ڑ: !.C^5{?e/Dy|{m6U ՊrI3?Y#c[&$w8ϋB$KEqdG'2 a=k׼)D9yѵn("#M{w)>Au˵pn1&;Ƣ "8*F[ㅹ)V?6 6B'z~ev9ϋЬȈ~S (qm9r5q cJB[$e[͸k#mX*R"mr$`BeCL'p% lw2aOU$Z=U NGzY:^%q%>_r !`l;" 7xs&$E {n8-lAGJs,?_o{L@- EݹُoUO%|5DPbM߮;[eO,⌙be3h4.Wؚ?\ ro1nPE{ !5l h@)vȞْ103Df;6.Z[j5YHڎSȎhl}1;EWTks% L>spakH]eHveh/Y' ]2e{>[n}TwAU,5\^tB@f@BIXL[ݹW=ǧÌΏG-a]zk5 ^n`rãӀξvg1|[s 4[!XhE9-Rd5 -6 ZMÚbmTllMle0,:ΕQeA# 3VMG2/sJgdM9u7ǥ).AX:>w:lye X"t9G՞~#yF r[!2Br@rr90hS\.9oJZf7kCu`Drz3,zm)\Xd;J&{ .ԫ5ք@'@Y\:|(22s֊4\:mM!W[H.-DDA6ḰC1G M+."mf!HSM8)~'npm^hё8wC$KƷbOFE;Y茾z R;E?76;V."F܃kg.4xpd @o44F9FuL 3i_*:q1>}㒧cM.{>l1WJOpI~,{un PB\EEMfUK@4{Yۘ/~ѭ vu0;s)=ۄ,M3#&2s!be$\`;`͊{Lβ(nU"E ѡ.irLqYr9ֽhOВOBo%6McEOmƒo L|>Wtu.v x|aƺ@i=;u(swH*vP9dԶ?c_>=-XJ- K,@iu-ǩ߅mvfvK, qB*^seT⻡Z%|o LWǿկngL=X| 2xk|OSrCːv@x6U翁I@Z#cD瀺uXJ+|8'צu(/CmD :6z'@#Oo1KDO'=!iph3 ;|80kSV@˼޵K@1;" K=6}^hzMwāPDUEs29\G-؃Atdkg53`Ɣ @"D ':8ʐՂͼ:^QS%sVegx# M|uUY\aڱe m`>+8&p4XB*I7y/ 5TE[e@9:n0$sR0Pz3k_4˱/uq <7 <;[/z FMX]1VrFHJ%LJo2] }^QGx: ;_P2ۆ.EXIٵKYjh&]{Gb`<%z[qñĭ5CP|x/( aQ>~]z=Q{!9P d9ZeRvm\i#)do@Q2BJ`WOǂ3;06*"]=b]*L 1dَ^[1:cuj$:PKGF}%Lour "T.t t:~"IGtVfX7ЙAZ$žc H6e\Y.bVڙĸ7bܹ^mXuiz6TQ3[_R+bUf]| Ul2ĸ|%zvJ#wf`(L9uGq-fB"ǐRl;K|&m LqDn֔}*e >qY។ZO3נC(WKFU?-}s.O:`Lzk,cwQN%t̟Du0SEG PE_0KOoD 6Ui U40@tɁFI&0JDMf40\O>.Uh#:'} x%zƾM`Ɋasڝ|E; ``EC 1_,e2ȁ~(6ʖ[?mRb sdGA_ э hEuMPVѣO%OS_? p/kd[H[x\WT?ƖԎl젯Cxi1Pan/+"&6k"QLǘmj4˝碚8vnt+u`t{;M lO_R+ܒ5Y&o+q9n]cd:#nL*-r󨌿%ҙPRːsRى T.cgx^- Vd[Kf-!#P9޻Ԭd]Zj)[iaQxu91tecqt_beM L@Jot\mT%XJλ]Í[P&+}Fzt4]B3k|Ɛ#tl*C\/a^ "z}u\uAEsۧ.HDLϫsNh~Qʰ7G Ӳ&NUgkbmHAMV4&YD!Lu4ˆ trWe1Ati S P&>>R 6wnFCV}~^Autfߠo R1P1򮽥h{ ƪarlz'a6˞u>/e?:"I բRˎƜ&DuICGH"jR1WQ&4Z?^ jۄ[/쪒mY$aePƸئp;3yEe14j Kv\嵊^Ak{=G }7wIQE($ {Ն@R`CPw{p4T G e6cO76w.Tj:asLz(Ri.sm.MJ8`)es"ks Xnlcwr]z phKuL\͘"3^9uuAvĎ}^з]+ӫbd]R(De8kqV{Ealj=]Z]qy u]F8옪;y\z@/YDwS+N苰ptO^[?fmoF/Ifr`H,_Îp9tAcL!jߓXSI9;1PJ>0,eЁֹԘmqsJ`+06etdM#PBR4=" JK :2fg(7ϋUFf1^dwC14 ']KTZPmf4zwc1J6(YL?ދ'Ktn^J.AxD\PAw@fϋDQ[ӦWFs؇P< (|-aϧ bLS4(q)%9]2ysۢrdL΂4=R :ƴ\4oi(|LX5ibv0i.6g!s(91X 򭦧sڜL粲mq><;Pdҿ*"B ˀ+AyLTfIĂ,]br/,ʤ;ϼPOƹVk'XT0S>.OF6,/ h2h0b\3-n풹lx։e`F RPd^ 6~֜hwl 5P"~srir98 v6Ԝ}˟pUuH mĒ{|>/V=6vgMkoYSȟ´Al,le&[C?p|Cauzφmiu |ldEdWxn4W]aP m4G^WRߛA2?1L|ddyآ}pbo#}gzdmY߃) 5ÐӬ1?p)%˕qؽ=]zmAh˜'X[Z7KXdځ1_[b>/W/\=_F! Tj|@#PKLks9YKv0 )H/p= Ş5:筪 T.M̮Ca>Bh25<ƒi߇9,}ZiILOgGvLcY򃊱mfT2<\W3p:+6^>@yɀ7Ovq:;80QӁڥW7_?*[/ |K-m,D; &Eޝ>"XӸu $YaEp@ YqzyW͍ͥC,ZF.f%X2Qb4(67|_,@;ߺ\fUk 39 l#tys]s\XSXG^ͫ ^ÅN0CѱNDRAFuнguL(Hvc#]Wsءj4rΩs^a5/8KXZ (~:~|^,)JyߜZ`D0%6" Kaind2`&E=Y6 X+;ݒqzFhFJ™!0 `@tc귀|ﶱ|C?\P&0 a/`yl뇐 }7Tyn'^@rX94tPhFT,P#^AtMKn_7|W D+95E)3 Ds?/V_!7=EBp7|2(Wcɛ}fl8g-:~Xc)$mi9laPqpI,HB聑\ǜ8(a# R,ss j'{-~<ٶc(,c;cT-qσR 9'jo*۽nh!Ñ$1M0Upb`ci[\O(Øtb Ze#ڱ$m`ާ)8:pԉ@j=n  "P~g̚iE 3L&f3A ! j==1V++Ge-gҏsP%F*뮉hVXN:2v=n7Vf ,.؊|iz-F0>u[WfE3f_ce췆mE(Lǭ!f{{*dɿ:bFe0d,t g2@;kQrpau@K7~NC80Sn@Mh{X 畃 <!:aoh.W}s)H%OMcUpΒe_M"oRn+ɟcUJV36]IUMrn?MծE6?dfXJfТ8Bѻ8pS(X-I6zpSVshg8VkWOUڤ9WAH8a̢@9cBc/sH lq Ȁh :, t6ȁo<6oj\Do@Th/:LLHNpw~n2Hˠ^dyy k{wCfn\nƬ:aX Mz0f@"`P|_`7o^jG9 q`9Pq]l'; t`eK  ;H6i.KjOz[rH 5t.&djT4NY[e3zxl*='+hх+9ŽϫJdCN}' k#qMR}KPh#Ut(DepģϦJǁ*~NG z pJeqk81Â5N萊m<w ~zi|]|0hZކ8Sryofu%r@X[ X9y!d!(krcn<*4 o=z%b|<*Z*>f֫1"e Ɯ[4S+0k끓:':;aC+Rbs2xCz')0{ZoyoX~MZ9iKU@mXא('`EaêR=C4\:o¬CJWXDhQ/&P'rK&M]%mQ` ŭ j:Y =+'fGƬX-Ea|^ W`ūڊRv.7r+fY=Uz]7E fuJIY*_%cS D Pc(\ml{=ZY R2v}BABWĢҠ-BC+R!U_YlDVDx6]w7/P维WT^x0gTBs"İɨUga#AjQ0(2*' ԍnz9u i7O^$F/u:2v&uW!bP-g΢09G:K-z:*A=줖ѢCZfj=Kд._) {hiާ2L>fdR c 8ZI,a@))U#[spKCD_yjB !pM61,*BU)$ZJ@Vw->tEo3FGh΀}^!^5꥜Jтr[|QE)[ `9s-z6\!+\fYEFT07mEy )v5 /'a-BFl$#@ | 6JYwf ʺ:m,Lndyy7}x- L ^Bk꬐&X["d#GMF `Dn;lmQ,""ԣIf2&Kg!5]0VSP{#B({Yʃ+0xխ8QCN}^V%E?y>wC;OZ^:_r? y)<̘BUl1?ոІUЊEvπ$h4A\@|LW0i&>\O!k| cSgRHfJͨP+T:zEpaf +KtSYy ȆVo3>6Cr"r[A,XsaOR4FB˦ Zoe M.eBav# nd5[*Ÿ|tA'J,5[#As[ϛ Qp+wZra>YV)I:M54B#˖sÛM E׻7'JT2(+c\Ptn(}Y@+'1Q2Br+#8pZrhZ#H,iJRLMSmU> w0f,fe>it2pg&e?:u|6{1|jܫlmԕ€#O@gݍ>xԸ!- ;4dORCCeL(<`TǠh6psY%,^#A(t@f}zHW;:kw}e{0HQ_vKKɩ oɞAD gb-CYư#p]FFZ=Њv <u1-m ۘ+1dβ;WAۥ%FPaJvx.H4E\_*@J(66N4e/+MF!"!AqrrȔ4QT tuĉa to(C./N/?EDty╌EK|rþ)@@$ I߃pze#bBa*xVĘČ)i/JU%R$qTB>"n)_~ "l'ӊMJ,Y>[ Gyx)tkT,oa}}^b `&H^\\TD KEt~{%vX"G0>GLGM@t9)VO,oGFjGiYXC>]h:nr9OhSz)zOOCvi%ƾMߠ [H/Y|+M/}j8qgofH=3 單??_ o_,mp?^ 'n{>{ jM;5mWJ`ede|~6opA159vz+1d?A|>Oky{rಕYJ>>cJ`"F2/p1iEܠ5FHvWnRr.̴*[ar\qa vaa)d*uzevXm uȆ+՗ m8/NVh/ 6l@%ئ޶ L Y/ ε6?x0]熲6{2H&}Z;Qh f':Ʋ|FA'/Wb`eXpWW6ZQҋo̡we'&a7.c F6*qʒ[edp(kl jbT͑2Eb#GBw}GˎMi&#SP'O/ߏcWz_:򿧷~^ؑw\r#g(@!cW^~Qoˉ(1Q=ˑs1]}],:<vHE|б0-Qξ;>6wg(|؀Rv_Hj^d)>s>+Ȱ?!v)@JHtDՕ˖ݱijǽE ݟЕa<~pȈe>PtYX޲fuŘe@m.1լ)ݟPa)߉.QCv5dʪ_v 3!KJ]ӏY'p7yem PE /JߺۿS`R(pɨ͎9z?}WVgߘqi%cxP'4?!"PxuC'^X`&eDՕ'Ŕ7JSܵ+ okz)?dD?g> ܩr0>PKXf*>[i"?V^t5،JOQto^NT8vA.J;ĩ5)Tl8%fZMq%fضu/EP n]B ^=-|.Ex3`Ce$\ÿzzKhBF2&u=U8My 7GXK<* ?WAҀU6,s .r$$CE79mme- =dxhf;-tk?Ts0Lⵒ÷&TNzNcPhdP^ƪ D1)`U@1$0 H'-Kۗh *9Rpiɺ@֊4\*@ch3@[M&+g-w|ZD.lu\V"(%Sedb!]>\lWIcfs,x|ˉjH龌,-[͍kT@kO 6 OA*"3+~ :pHu`"Gb\Z{h>6ǩ˞|k+9 .vXg3sUsrȌ_DoHl(u=Px4\a~Pffe7"b />#zŐ& 2x#.C s>(kk1dA']bpl2cJtǑ. -4r`@P:匉B\l ?aѭ%18ӭ"ܤk5(΀ T! r,y 7ڂb]b%^n߀SHj6 CI ٹBtRFx]ȅ{9fMW@"+di:vȪ.˲ҌFPvTc.bвDWn 8Yķx$tVc#ϴ(vĿn kz3ݽ-'q=n6˟V>,3uA8CFj@Ā}\24V hGl_NoÿjSby7lG |? yI&HhSjkYpaOõb9tcD`ůb>tLd']k&4)^pǒb Lprx_bĖcҗte%z Ŕ sC_}i4 d=-3tcyGĤ>DȖoHNP_7&֟ ]1/Wy,zpijkWb,2)S_.z6 kUSc[JOP2O :PLjw p`aȃT_Ƈ^@h1Бq:Km6#^_GO o5_bOFƖl*ƨ.z;z7B{S άuol]31؎j-^.}?[Ν5 @ }˫b• ʊ/Bf,s%6r|P{]^}?\.p" sK)4 )!k} pFNr|`}ڀ(_-ӵ8d"s u_C⃤wVp1sw*Z.9Y,_{kEfA3@]):QJ]ret 谱;ߠ2p^h80S 3؀} Q'{`% {l\#JUj"q@wsVIa)@).ΎG\VI]b\FSґȺ!-8|+sS 6lfP~8(;IŢ^іp@\OQO Bxs,v*Ʋ F"RFaN'FB9KdoMaXV\뗽Sz7Sa(,+p|-9oAĈ<&hqs`Oӥ?O5Heƾe`MH>oa 7L(RFg`ΰIVe/oRMFؤQ}y,(Ϙ:|V%c3|t8|ݼF _?f#la6 [ ❋SBIt4yd:]=u2h?#1P•bC>IVzL9`t>i_ϵ=~ԨRMΎ{RVz[:ޑ IJy)T&WX>u ։$bqV uֻMݯ/CG?hZo//0q_}~AQƻ wP[mr=cM H bB2=wlCNzB%ʅ\cә3rOϒa9 ; LL旮HAAqvG<jd>~N( p&)cx 1OGt͇b e`gt̜e:Fc̤2g0"ʯ36 W7֡w{w}t]XY ۨkp/èKfl8Hbqþ2]wJJM|(`O+żwͧD~OʑZst4of)(_[ed8\7w5/ P]ǎ[t̙HiVVO*:`$[Gmcz-25~HaT\dfEAT$Ų8ljO?>Z8s_P'8꟢@>Ju\+lA4tE 8;52L(D0,iG^IۧMF}8P lo$ZdZ)tYb[ Q\ u&!XFr){C\ͅj~yOA𻇉%LtrԞDO(@uNeː/oշmڦ @Fa2WM9X0QJRV m69y&2 RjW P}\Ĩ(d]|^."9 14~!X%7sgg[qWM k Y檓,_-<~o(4h}+S:Kh1jZ%K%&;% hM ]vjܥO|^ b6 b ffJ<2e|麐E1\O(8PztA} ^9vρ,A=I9O N(噯4i¹^ '*< : .1Ktpn8,D|ϔ[61=.\c @;,u̧ b (`rH`_HX-myckY˟v )}~P|^e?\yWLr@ץKžEg%<+jĊJI脕b(taat41D;tOQ z([C!xY'® h/Y-SV17n^[g[U)@#Gͪݲ80٢f y90 YVS/NÎ`S {7f:ub;}޵.4 qȮ)tlFOo]b2*L*^#.7ȏ`l$YVL՜ 9<+՗L'g32$1*!S~eT{a?5S| ЍPL,VD}:ےKPa\7p?=/z@4MǦ'Ep>3J3VI h@ ݉ky7pIssnv׿Oy!talh>*sGM"yA.q!s, ǒю.-;+01f{DtEb]hqǎYF4Ќdg7(YJ|9y<qn0.݀Ѳb+;n 25 *' 8w:&"mP 0.Wb3Ke;埻~)v-`~X"˃1CНt\$^S 9+2ktR:~/Kf 8r98;"gD_ (G :Xpf+ǫM5 `+ y[ 'Kbg<\N6ϋy {_Xc[ޏ7Ԗ*4+&.!\ P1liT);u.? fyPS7y4`N9 ՝M-L袀,2K2`Wʰp--[w:gdA`ާx'֟t%iьQA! л/:hzи6J4aqDmxc:|?PNJ$ U2 tlwl?©x!I d+5q:o*GdakQz%H@Ș!]M&rr~eaB/J\@8{g3;3Z!ɃcҿB-"Ҡ5k}=v~87hU*e N;:[ǎ"| Zz2OSFĕ1yfq]}ۑĿq 0^MqƲIdRtۂ8 Ƽ@ģ x*=/!zq"|JK CSbSw/Osp) F Y˓ѯPV^,_(ƖU[?Ei<;b2HbEBy3e9*%3&L@X=I)ʃ~(Dd`# V kILkf2<+ׄE-up:@^}?\ڵzp=*8Ao5,wΘgQhz X}8W( ͞kQ"0%@DQG&ٞ bm|֜PJ_G-Fio,3&/q}$_NZD+K@2֧:,gWN֮:DreY^:5sr٢#0؃kbnB"ءcʽ倗9@R BQU%,"ۅ"TSI.LL 3 y)Xlnf"b,s:΂%kN,EDLnF+/\z2]>މ֦9xA 7XNiӹ6)r /MMDD>.S\.ܩ2 x+Rx8PAtm:;x|lvot_p OW P.=hرHdvotVOfApVZ1$_xQ:)Q|/s*'P{cm$$ߎ":=0ry\u#Y~du#ݥCi3ȬnE\x3tOD"0؃kGo>tsvL}pz`gB…YRйNu9I72E_ܛ\+Sb,PB_ }jesbS"'~X*%PAQ <l),e碳bЊ+#UQ@X&Eh@D}?VXFA 4)EEPkUO%g6 ||uOftE!xm1S|a:nWlȇz&wAu@u;oSLO,L2;pXM#nk6WftV~Or1;1 1,/ؙ̢l)jGyv\pl )(F&`{do@jONr:v,D#׆<'L#mh*l\cSiE^b<c2ɱĭ͎@uZUV(2"c3V] H] '&WBo?!SNϝ'f{p*z>353v#0gY0X`ǂ\zc:j\Kd2A.8tQ[Tz9owA [ zvu=lv\ gȾK9r̅An9Lf1}ȗEct@}%%c(&AβrH9~J`&TAgp/bӪmbJ! K^&1(p)F4f!;/\.5Zr\Jvyyy ~~KwGh}W_$]k}p:=] z(:IkiAܶ-v@u.xϱkݮ1Խ IZ@;6na0[ժ+[.2d#MMi0S4) FhEj_}S+NÊ*08aC t]ր]~8tEZ$2z|B&Fd4\Lzs9X€pB3"W̬\X[Ta8k*zJ3p !.SgRl D2W\"X,FϪAĊr5?Y+ocƽ[-b'>va]2Bn!F@a!n7r-eZu֟B¢z#X"NЅ#б(7֚f2Alt P{a\s<pplyotVUϻYlxݴ$hȃeKtS2 ;ks ,D׮ ;ЏVFl$dMv .'.f瞹Q0E'fup&Q芽^GiOX6G/&?YC.ZK#rA)7jQ"ϾٳJLɼ9DfV W)؀"Hsz#&6{fE+>e 离x#e ̎Ќq\G+ppa ni2_40ji5 [,al4\4ˆhr vԆ9 ~#;ާ )H'H+H&/X`I9I&]R=kB  59?IgX^_2s9~p=U"2j5ڷMS~qK΅|krF K=\kO;-ɬ4I^צ4j>⇳U]wrAtǟGːm`{*66&6K W~.A,p-%!p%ڕƗ]խom3 ¬ ULN^glX$zk樖qr76ۂ)GYAdOp/Y.S 1djjn, ׋N9u`ߛ,zSo[qKUoaB)sŰrzUd'b`rtF@}. @Sۧ7K>/ 6, ,OAH&"k`vO4?@)/6& q1Vkud80jgY}xs]~6j C +U2;4r fY- :CLaf+seШy wRsDyvZpSɠOE,ݚyqdaiݦu^k(UyݮIfRZ~1چLw0rjWC6#[ę5 1,CJ0nfB?۞o'(EK..^{KЭ(ʪnϮV`xژl\a tK2O>/l5WJ$vPڴO8IINT`{& ,3ayɌv)Ę70(2S\~TIzwV00N:6;ljd.JlPAZRfƢ@9ZEC;e<۬@[qBo6KX1mlgXk Pda჎At47Y2 Y:[R)eq>:=TIgN[o+R *\ B.W-0cETz#[*jFerY6/^WX|Z+/bd= 2x˖<7cmf"048E$_90eZb贫x>;lJG9ew-0Nq|kGaԋT*p [d!%+ {^Tg`A-fbtm#0q=Cch|{0 q"C}Pl!+|z,X:) 9X|߄?1Ÿm"}j~^5_e| ;7=~KLLˤꌟٯrpT-rF 1\&ڱs?_PĹѴv-X~\׼>N6fpp h4`" wC|ёvM{u&t_ 4LD>9fU47o*%+Z?@10A~cAʼO1'gK,q? ((ٳΆ?kU-%LaeǛ,M`ܝ!Y{pW}:M3d[ sJ1$g k ۪,1l^E~tXG13Y1 )3߶Q>Ӓ~EX^/ƷHOW칩@{{|vw[Gc@#Sg8)[}]O.P閖LځH 1^Qbpi[-wk{c?V،[e$ತ6\w\C&p`OR8l s>ȁvl8z24 bMr'6SA68vݐf/"bYP9Ft:΀MgSq/E>oz7Շ1=QZ6h@j^@&GVtėf to9XXmUY7R1f͈|+Wpyk &]% .7 2dyKTΘh 4>l H4"_ ؙ̕ۂIV.l]\ gP`HYGF3->XtuB4f} Dpi 5PkqTɐb.:By =~buuݗaH@ì#sՎ"dq毂u~Ef3b s \?\Zzk4v1^[rb:L-qiP@AK'혛yEpi'CbHa%MV8=; 쐉A m=|O!ܘ`םxw, ^f+-PLe֮%0 E2N\u ,W/pu\r!Ҍ2c>T%8<uTՁţnAq#*@Vv"Y6@xsW.V .-SD=F*ؚZS{ 1p 6`b̼U_nLWa^>,m2|'ztT6L}B FW&`J:Oi(r1ʕnu$ڽU=:zDf\P/U@6{,TAmU$#<`%-' *eT-Ț[ujY @ ghi>xsGCI3 *R 묜 x@'nU@܌wLc1AU 7senDx 1 H8f:d9Cbß4[qȬܞ=YnoODfIV/@{r v/\hN.mb$.b!D%ÑY*HVtro2cu&Ý_%1r|pp&X_gf=Aqۼ5}*`dn:mĺ/,-{Z"QbO-l( 8ׁvIfP.e?dϠXE-Kt`z}ݓtfIAuw#cH(vڠ{&g/$=c H#{ 2aEz w6-ʽ%Ԏ` 90rZ SPWC!*9*^_C Xǫ$S&d -7|p#ANZ" )D#4ؓmc*}n<V} u;&%an̲tF}.-zJt X&wFɘ &$[?\1㙉XNt`b,Ӑ(:50JJÂz肕iHLc٨THX1Pdi P#4 V^te&L#z hLw;~>"kT K4T*吽r2t4Ӟ 928:<hWs6ۓ˾:dQLaB<63q'1\_ Mys;S7ɡb7lZ\cBQԄ|]IkR25vЛ;! +b^pvJxYGԗ衉>mSuhh}y$Yþuufq5mr^g`y+轠]ooAأuC/JB7ԛ.(EX۾ЫȌAz҆u5Pt\T F/R;mF,cᜂ}g;?Vef=* ^)[J@pq0Z tߘ[kk4{]PǤ)_/15+]ivu.a~. .-SAҽFU~DK,jPCb}rP$})BJE?rdڪFy:`o!@"(h#GsLج@je>? i Er])`A1k5K[eI\6zY6 ppLlv\,VKxWP\|tkb>,r6Vgǔfe=U\iZ67Q.csL ax$l{tGˀҞLN,&{۟[Q7ocd!,XAz1Dl,l?bS4+^,IJQAn Ҿl mrq3 5B[m# lituxPnaeR> ~,'iJaEq6鱶g*Ug!l1+G.ݙmmXdXdei.sӃ}vР<~nT^6Qd%>/0R&`/4E d?ipZvYT嶙Xե(Syqrr?lxpj>ކ O!)EE+c&2G&.Ap1xw/]Vշ|Zgs-'[’ FvxO ر[.U=H,Lpqhmk'jkC@{7$1tVi)~]*XB?Y_\/c?M ⥔7+o+xMK6$8Nw+ P,of)?4c[| ڡ~06My1DZvSE;X1fLN6At,_b6%v$[b|8s*ta@8i3/rpЯ )׉'qzIzRJϳ?YTz{tKLW (җ=ev@_u1A4~гPq&Ұ3ߢSONGH@/}9'4o2&tO}w)cb]yv~5(*UWU"wUxPtϠjDӆdQf@p箩0R'^ׁڭ҉c&%4;v" D-::•G寕&Tq$C09IKǹ;ŚL )_d(9Eoau'2@2&[k,W1nDRW>ՒN=nP״^fN+EmCuHq:9׋g/uay"Bn}ҿEcƎi[˴{&nJ<'''0?yo@Ώ* gZKfB#F@k8mE j$7Xox(C`Wl[RA:Yb4amRs__f5)X9"^*-EU)G8_[ sM!/p3tn`>+n9*)L g`adNF ԓ[CZ(٤N1QX%ƎAt#"ڈ-zІ#z%a](Yiu\ބ)WKVpc(.J*sz1}ۑԣzm;;hr(?rNUzsu9%EdWCxgcOl&|W*әs ɲ",ۥ Y\:~.9x1f,!PSta1Vss>[ZzhJ sޅu·A2$KRrxٍ:?ZgǫQ~_G T]rd$Lq8Mhmϟj3{+ lxE>|/ BL@Z,~j1u'zEP+:|'Yr zx-q#D+͡;g94K1p/y~+YI]ttA5wP1!ǥSozXPS'Lc>bʢ;qN14%bR${~Hx1(FJ`Ʉk [Qw { O=[LLj6gؔ^S;d3a­xzȖ|ݻmѥ>2)UvOdY7ƧKw}@]6cƮ 2oaEc>@ԗփkN)ݟ,."D=t|wK8|D~:;h1w7W변˼dV[ƾ\0ְ\}DFCbޝQkڨs?YeD;=N:FsVL8CJms:!7d"^)mj[28NQ|]M+4Q&hF휎GM|Kd ;ȧ ҟ8u<_{dE{]n>:3d*]%kUA@G cTKD4X4Ap'JFo7)Iqg1"o[c,:!+²v=,skf&uY]ⵍF$E#s\"ͨ|/N@  UW:`5y$;ӝJP}J#Vfiz}4@R.S̔D|/Po}{2Yݟ,BrP͙ona3zNo@^i`.c 돕"~pj7Q1hJQ&,,YtCnCtYh;Dj_ BӤ%T%Hk`wvkM Ai"S^iͿߎb"&^)lm .êvf9lU&ZE?KǵtH !'xw^xs( h")k0\,G~qM;W˔s 2oe:zV aj1=aŕؑ:~+#2=<W P]~Zd!.R{ҽ]Fn4~| `lCk+3W $'D')x>,+\{r-[Qw|8Fd}n 3]' ;dRf)~4D7XaiĹVgšn._0SJ;>Ñ] 2#}ISѳɢ/Cʦt( ( e[Wk[@t/x 򧖯62, 8e9~BL= sq1fYm 6"qbt z4okP]6fX@ >ga\pGĞ+eJa=:G}Nb8{%Kg뀞IIS{>Q׋{{xwm oV vJ4V):fωd)NSXo2)K(Aró`GTo##WYu)C~]ùD=Зa tW|d  X\[9lkz0:J"lr\K?}Rr MH(ura(87#f\EyUe=2 X܄#M4;5vУK'EblQu.w®Evhql:T,m~u0}M;)cӌB5BS P}m2Mh(Z%*S$Qbd}B]7љ9J,aG z46F/C]=(ivfopS_F6L_oz&r[IǸdY̅e 26؛l>D@w}jDR0pP:`χedc=O+'(OǑvDBCɤ'Z^iRם>1P͹]gf?k 3}As&42W:@ܮ1h]6P6Y8XM Rx1 վZQGfQ',UB1c2#H*˰ \ ܑҮ[־N;LEag|IȪ:G):c+gʼLIxE c0n  ݂mz.ߥr.z;.ߑ a3y?yG&brT]c0sYȼcꐃ귍JԎQj[lR}HLŌch^\YV[ =qSIL2 zD9d2zzIs_k!cGFOrs *!~N%lTw~FLڍ6+X2\  " Yړtۼ2)˨v bkb2M)ܣDФJn֖\8t^m ~iK$vH'6 Ȋ&,A9FkӢ'2lm4jP>/@õ:leMGx ItbXfV8J4T5.5U݅dCv[Q2a$5"76e6˰pI h_sOiz`g']b#MhlPV˰p.^f9bO'xP|zkʘD`b&q|$9 1I8 ǧe: 7a=J9p Sdtlda@]2W>`χew|[t+d.. G#fmFmKivLt‹=*$#Q=ﻠzD S<-l`*ȦZ T@F6[1|BYz` pLs=6S@G^!+cR{r]FnlZY|'qQL 4T9>dTVĐ%= \%eB5HYɦ@6 ,1"'wθ:JyꮳƗ,Ր@Q>⦰2sP/ w=baN snC긊{` =Yz> g $#1#Mtx@&\Jw/CK#9T}2dhD$GUJ.0)0wFITqLk#> Da% ì\{mcn=~ SnyCYZ\{CFLṅ7ZŶS5x11L1RJ`4e$;epncؕ׎oB `~47TЍ1"e'|>OD#1EdreoC ?uȔ&8,S5]"K󅃇X.Nsed:HhD==F;# LwQXG#.Ƣ_6S̳$˖O>Wbir"Hl§A@#T|?ATls2,'u{F"GMt4oYo- 0?\{O vGQDj9dH]Mo?G1,WiYe8hѵkj;S*ʺdz}E6^[N]lͭr^`+ULץ'$_v|E j'j2%@SZQkL6Y #@vbFޙ7gXޙ6.Vi6 Ltaبa5}.~5_Άt^륳~)9-f[I$zB=: >O(%ƐY~:z ,{㉰BHz[~F)8\ FIv/D*g Ͱ2O)q`) uɀw)+#S~=S51QPOK Ay$."Ȇ/&ߥ ;cd^9@ꛣo`ނ9i%>+WWTjpm>|E>065.c1M63`~M~,vN.2KGf)hWdc#ef46A AClo2~`*ht %*[uV%]C5>/#61 b,qbIYWb*c"օGEǔ3$Z?IAN[#%uA`"mڴ$F'd3Pt%S5$:TXx={(NP-iuM^Y8sK8R8"wY7=, (oYeQ@Z "[sn[\e~b*(\%+ 5[ .Ty2 y/6QXˌBt6Ӵ!qƧclFxqNAVZb^ŭ{ c֠A<%oC*p@\O ҨmٮY:~ v~mw:븛Y6-bj(^?B~s= u mDdA!FiKOeǝ܀@Icʭ칸%f7EXQ:%})^|Q@A(r y=r/. 7%&ZoF1-nN}%^39KB簟l7SE߼vd@I L.6**ЗiRe\I04,9L qpqV˦~Z_6w߼A[wfUDi/ÔK;j໿yad ;ceqZ@Dx|5 , ^{źKjׇ\}Tڛ-K@2 L",~k/mzdw&bS=#_$%\BKV>G9"}0j c lyU7a2MH>M"*~L*~6#FcE C>QIw G)'y, /`/|ȕ y7`~I`]s5":p!)呗qXn.ýT1.L%mc)&AX)?A1QV`itODZds{FIh^9,'ۉ87ɸ5>1 \OalJ_ܞ꘍نغ C +o0Q ힳ .2* ֦$Y#@s)̒w@[\jSj"S :d;e蘡*1kbQH60^FtXJnB?uthJ5A2$e"}4F뜿39f٥c+Wbj&RF` 0~&lb]P@vŬJ祐=9lDtxMxzg4֗atODZriꃞO-)muMFn0ձSd3+|u,PY^jNֳ&9caKy[=~haVV6eDAwouXVF)=T4e=ж e]vбr݀k_bOsHލrʜI~zXc}L qVTDž|E}d,4E,ٜAeXe 5c$,3\ER2& 8f5/Cov$ysrVV6 $P Ś2̅;Y8S%GBgh2k[!?,S[ ;7A@ɁP,k|`&HI42z.?w_F_|`LPۦDJ2j"HVhڔ(IA Y(yRbϕUKG1?0 &y KZo8U}7֩5o]vކY^^AlEi"Hu?IP `IzZŎokW XցAo5Z]l`b;SYHdX@Aiv BnOf.ݤѮpAnJ&PXZ[`{-aeu^f"-\OsdGf?f.\/}?["*xK|_MJMsSS1u<*ݡ] /,CG튑~z{@}]KɺrHVs .ĂH|S>b:=,d_srNskr{"w-C(|s>"ʰd`u{JfXz`@ַxi@}̈́twac -@˻~H)0D.3B~Iw(Xyݍlpۍce:BAknDqS!v6zY3T+t䱂kUXZuc5mS\Puv"BAlmZ_zom@`e8m%7,-6V rn؇D8WRŀԣףc`t5m[۵ZXne.iIة P-=/46$71;Գc` t/ۺۭ=QINY\xA͚)gUOziAH^sYذIDRS.2LtX LsLafQK+]@pݨ0Z;6Bi5ȲbXWp*EtFv x|aƺ@kE _(y3:ĀFc:ub"-@g?b%^sPJJOQWBЂ,֤7`adßf]= ,^]9D6,j*=ݫ^vI"35j@\l<J106 l'AB,-)cԺ[ v?z>P PdAn+6:ԜG5.ܲFz}X3 A4NŒK\e2e<x| cy.fRD]P(`+׮%%BoJ 9N0뻂F1IņSjt.<,Xv琼^?|o$ =>a|qoH魍 P&H:Ph4_zt,4 Y/mlIf#wm%r5áb Tgs@acQK2T?iά; 4 1F+햇c`tLQ@%ewr2KgR.[^ &d }$vEuΤ/NibG5Azo\ t+d7I0A2({Zgf+L#csdt qC ː/ȄL,PdE܍{9\, .ŌwJW/R:ȸj ,hIH<ŀ" `{ǣoz5#yւ6_=TQ TO cOxD'-{u91AD,>H{QOї!] R;gF޵ P[bIHHj -޼[@B5) ː5xlCi{_'l6%&r@=4E,' x>Pxȓ Z{c)(ru#ldֽ" (APd 6W={=т OZ_E~$}OPa9u !e,:K9nY\DEt?M0ݔ1e\oP &<0 =YMY؜k=,H$miM|^4 ;Ŏ 7Մ-*Vc`4;3[=vey1&ycԫP2EIoݞcZټAZ^u@H9)/ngl0kƗJH<!Lہ{>މ-0 1 TR!ෳ?g\ }:.6X B:ePLnpP["7{Hdk8jwUM54ZK màFV T4ǀX kᤉ<(d9@OkZ:Jœ؞ Iu$cDv~Ի`]9f?'Y L9Zm/:̱:0E7%Of8q̮'͏簠wK,N &<CڪGf{^q1&.u+C>]E{WY(K ݗm^XM Fu~xmwEÂK(< MPy8G6 fd?&͊!WLN\MMyaDf;Cz3JW)W C9R M&0e=K ": +lΕ!.D\[x\}Z!*`:1 FBf>WSALuވҌu5 C Be#@y0(x(OdvUh[Lt;;ݳShiŪVI8PY'JSr)b63c0:Hݘn==*=TgS7ꊎ?]uLGcUPddvzg7uUB[$ʩޢœc_J# %MLWZ6%aMցey12fm7Uoe28[q$Cqڴ[ЦY!0YCHfs+jOKҌu5ЬxT}`Wخdž*-= ! LR?!hAu8fupBu囕iٿl oڙH j: "az+ ;|d=Pq+c=ŵ 6O}޻u'c5"O✂w"/-1nǐ I\hDåb@ÐGe{PWx2Fb6?,s1DOe|vxss2k!@1;m`L@#7A,d "EEFhr=u۶CD{Խ5kI6ۜI١s8,75t$ѐśDMuC9A ?R/F8զo2;l]vprjM+pĐ~ctD6H*0 Յbt$zV;^ݟRZtu[Іۣzy%hh)ϫY^Y 6h83`'JډBgdm't{JAӵO˗}_ 6Q%6/ XAg"?*~?_ o> Y=P HH4 4  \DTaacҽ^gTADUս K}m .tOv&?-3 To].͠+nvuZv#a7(cg*rBTuHs7a[Pj7 L }H'2M KT+ز|QzNL <%yg:NM7wvޕOrs߼;H=>)d5)9v~T\!,˄hEs$>Q% @@O&)xi!K9~^ޑzN K+nB 8dCGbhTbI$HCNƧHavzySB!Ȏ%lDXeA֪D'sLv)aMVJOp 8jD O/JBXc[P=]K.k"sːct>=-fڐǐAZXuC%uى+c>RC 1ާ%3Do퇂?Y)h-6jʋǯ8y`(qjzeVƷJKRK_tXQ-?u"Y&`'g& @7kXkޜ}X`qX\Kw^c/UJVQS /b3yX֛ @v7Q=l3W[9mdkГXMk4 }$M<@7yOVYҠFfxÀ1 T̻c{y[n]ԫn Tkvvc`'Yߊ=;nZ2xJ 5Rb՜[ 4xρ-7y%}dSn+х.I_jPX^FwNۛ=>$L,TcxhqR|Bo9'&@ń,jKZC(¦/ =M1x/ j;o/;~4s@Mɭb' m;Y\;4kf'^)ZzE |:@]SB:MQ j') 3:\qQ YkN.8\/6tW"@R{f 듣 3HVA=SJ,(25P8z !2Peǔ3gA*nBr\2Kb$V=J*ee=΄]ľMUe 莢ݞ%0jYݹ~Q R|57KhUeo2DP a%[0H=NPA$a⡃5v?$4ɓ^ ]b"Xf dI|@F!f˹ҽ#N) S{iYFb(}G]l6A+; lō,6P*@;*{YVZ&~r^j*e~p:%) 8z\lW!2Nre`uĝ8s.pN[u !1@F{*L] :D|Ƿ<;F! Fs#- +FEAXaCWBW4#1toN]]Ju5cStF@VsPCXK]k:Ia[-`v9};7!'.{8vym=1>吓IɐNƙn\R l@$Ԓ2 098! `2U6 sw $9Ϭ,AfvnY"` MعV9,&Gε 5- 5,=%'a<D8}Hk kP?1f).}򝧀4n2$,P'ή]cB3(D8;ee)_Z_>YQ:02Ol6BhӸ?ib:ێ0JwJLDF c@H!jh4Ȗ]6w^ d^t\%*0L;rX O/~x*hF Kb1ݞ3WO%z +RY<-tow]>3[fMgQ,YcL iрi?YUEN,RfaP}h&;C+nGR"w%nQʗЁJ؀ُNсݏ18L6!ﰄ dݚhk['OmM_4 U6؀r "zz -^ж=˿&f>^cwOل*[2nXHt)VdS,lA*V"aaz>@^'`mZ6$LQ @7'DH祂$Thqfe/m{ػ~]GuK cleReyMt0m_{_\28 {@D|1ܐdIaɲ9>/U1̲x m[__6BݽmҶ s4KK]#sm,jNbdbyR'`{syKhrZ]P;fgc7y=ϫC^}$l 7SD |^aAc,~ wB你hrzY i)1G"ƮdFm];U(@M}}ź X׃ʨ1f*b5Bيu[TBF0~ i=K:P?N.oi8G%@6/2ixacVǵ8&!hG>vu?-6)aP*qqw?  oveFK(#a$#}iGN߾%k`( Njz1ۻ7&SlرMXڱDGctQkSa4a\?2$0 z}҆Rڀi+]7#qt*M?V1L~9EȸQ[{`cCd/<c .zbVFSb$߉ 9D/\6kzLd @֒TJ'=ZcމKt%ljb@ j%,{@ЂI$e4yU']h-wQW\PR1]*z⇳0η]PoMIR6ړb/ vOZ[bAy P0+ڄ>;e\imvtl[f԰ҹ eB)HXV lB~;;v7lqqŭn^OA@hەu. KI& .AqLȅh<͹ᛄ3H]lJޙV! C'E\;; ,؏e{\ᛖ^?T뮌a\;{֯k\зCʏy]Ӑ|&7>+ 凭" a9+)5 JNGs̪P~}8>k+NO2XQAE,#oՎg$y.P-ڤ4FPr [?z>gٻ׼Jk9 . tk,C6JAQ,C9]ǺZ K:b%z2%szD鞎7$ ùVo|GnW,\AIٸ#:\TOO?ힵ Vߖ;v"ưkTĐԦ̮Umуw2< w6T+}{Ć8+u;}t_h2*z0^u2F% |{Z01l:^+1gs}&njk@A/a.0ɏHʢuIF N(IEe_'SK^W^hզ!^*ewA7 ^XG;{thJxN܏O&}Lx,bLx,4Pzu0=neg{YcuK7.1$P5sb|O[Hٲt [<׮!= 4wLWޖUԤ)*9?-'׿M]_WZv '5Mgn]w!R_H+KcF* ;mnlW]d`6>Ql2NDGV :bx+:@:*:V}<8}[d-ka̵8sMWlDt`g0[*|NVf?,CI誜sx,)J|C Ŏs@2 r>=q ;)WthJld/deۡ,"Mq-7Z VoASxnVpLu "L+cUg=yWfSOSL7K_r,oAf8z`Clj2t .9%gse9~q]bڎ^43 Xi[xEm0i{3׎R}uTGpn]Q2T| .Z#Q5c&L6Od%>{aڍ;ɧhPeYt BNw˘7 p18!-(_@m G\s :VW4NzIׅR{6W лt ٵMM #R&8yI]@D1lz&Iaw"Z 80B~B!ށthTG$b}}ĿE,QdL<:W3ٲ AvWk͎x"bMLCQLIH]r sLUj³rXX3P컢*GG+VޯCY2tAdjȊ"ʝ ~%0v{*`!@6sD!S^$IY2~cKD2xjJanD38'.1-y_| _ܪ Fs.7A |x>9&Bi@/;w_ cATJ%Cb(oOp*)/۔ρgF@8sbպ߄6!+P{X)ozVGKh܉ z  Mڍm]W/Czx|' {<ʘ@XxV=q۬uV\bM]D [kX*dٲqF4yr_ YSu''yL3͡a)Wa:KuE;)hi.)-xؓpjcrR Ȝݟ)HV7#tk)s9sZA4l}/9?n!/ gQƎi>MY5ae(M eH ?mҘ"G?B\>_Fu r?e\HTaXc3t1|C=%iQwPX6y9Ч=){6(Ka!?D7e7Zoe6E)(3ͣMnұ,EeO`z%f׉'2L_tuhuL=m[/n [E*M.nS&pk Q,Mq&%bLQnܥZ'e_EJW1D\d$[TM,(7ܛSd^{^SKPK>` ac!J"ĥ${cG/.o͢[^S%utv ,,.'EOdSV=lk#wa(zCy@fఇT A ^;CV%[ۘx:I7h#U skJcco 8ғWS294iLD^պӒ< (GX\1Ao+#ڃ(sRеͭйKQ5=֭ [~0.y2VY+k>Ǟ-)Knt⻗շ^j)PK\:|;erSPߦ/|jWtf}BMvn1 ON1k B-a+iKAKd%zƤ)]A:sTbН _:дYNx$E*H]G:;A-K}ABJ˙VJH,*qج\?ۧP9 H0_χ"3}]Kbo#UFPn&X5mSt'.9|8Ĵd)`\G&NXf^ tZ]z`' vBgg0gmX XB$'A(P&m8Wd[}Kg4g!=r>H'Ai}L3ucL::#4ۮ] PW.†KۗઘOe)ٽr*CPͩvؼ2,`W҉f.9^ÈN:1{k4PS$?u\0\n~ɕ#&`AM1=„mxoc`χCLK8ފ#rm[W23GCt쌌9 cqe, 1-]s-B#8Mn]B:Cjm[m @#З'3Y@x"1rygǔfur-ʠޑU|73˽)6͓`:&W9Rb9:#Ofr"c5[m |6vM/H**YU6P%Pz1^q,gIo صd'rw;AcG4sٰ"pU":C9}2tc{ِr䨘~4hGi&X 1Q<}Vy]?]fv<"9xt,OCnMKw6k ,d=ú9}UU%m>UKj%$$VahPktS'j.NE'B3VBۃC;A6*/Od;㗓-K22ֺoMu<1!eJ82qi5">Q"\uI@%{D\|:XtƔf8XYȽqh?~q㬲kIIŤDm پuL,DK Jwd@n!'" rM'OV}q{a\|s@ 56B x>xA(z: 1ٜE|g!pyM&[qaS`4\8\ ]:>Fu0SPўÆi|JϖŞ+8Mo],qM|8&er/1~'m CGџ04sd)dd&K`#K3g=_S>oD mMԔ3c5ٰ"pUM;8k(fj΄iLHu1^tJT"xLHCėp{+dq3fG[U,̤sHC}ov DdlvDoHd_.wBx-H]o'l `X>Qڒ*1J݄t `bcEV$RJLG*O%΀S;dpʉ>@01M*HVgn ; = S+\h(h00Ebpfo:%01\H$~>'KwBˊЦ' \+;+a5-}Pu|L~ ;^]N$ #0 ZZ-tfMz ƐǑ 2dy `jҟψN p.3{9R7nڢ٠rc5x[ZJZPƭ'B}1 3 6M\Na2n҆5?i!+;ט`y`ۂi\Z.-Z!wB;`: `>f PW.8}6O^k>+/Z# Rf-`m3X fŪ~M B YƟTos%PTփ)ԣQfi&3Y&zб~jǒƍybN0O")J:s_GJ|ͨ, w<4c]zk44L k۳e.Өi@2^b,v Op%'"K3UF SN+M?HZ[A7ss6֊4&LPǗ}Jͱ$7ibz1ɬ]bëc % \Z.-Z# ;ܜ0(h4> :>]HiBkagDoe.z=M\Rq答)f}Ǭ6^=YZ&Վ&ZFWa:\{v_ȖSQק;&Az}N:  qdfoY血la6~"xAh o벙xN7O 6]]df=q1u?Z"WxG{ǞD,gR_-9F&5dt!<'"}P,,*:D'LX.@oLC9Mf}D"re!H Ց~"4c)_B_²iYPVӻWYIf3)ˑA@hI,X\x,2zDdȬ vkl!etM Fr|NQ|W-;A%0K9Mɒޞ+wBZx{U7c BDOQ \psfF(ieQg=L(=C ݐGf}f*pXRMad]@e1gB;QgLdS]$KOd(+~ byK ^?qA+ J 'S;qm"^ōARsON#=yvGܳ>+.Zqo$d#c 6xˉBdk{+dĬ? 566FS]@FSGylL@/ݗ1J=*= r<hQML$1{CS|A;%7%.4k\) ѱ\mȥgqzq| ;υq\x凹X\;p|i:Fhm@OBwf#Wtn@!eF%.ZaYY=)B Zֆ,ZE16II 툷{rm^l^F i@h "غu [ǚ]&s,yJְ"ͣHsb8n} C;#1^n1|&  Ҧ>hQFb!f-/4Xf2䷕%o,r(umѰ]wCk.`*ҷ^T[]ԅh*\)]tDf{p2p#SuD0d35[)/WTPTEd\cSDӀ'-PyNȂ* gBXgDSkliY&c?Vծ~}?![[/R/x)KkmJcIxcQNV2+S`SO2d;䈌X:LA F嚳0K&GkHbx]{+F2Z <cV%&1\db\'يTP ˘Ғc"11( g(vPV˨Xt6({>P4,Ee&d,BBl<}Hl_H<ʿXz бT=yU[K4586>ڏ{]zLAj|S".lBZEZ@c*wLB+qG: )u\VK@ ŋ%1s@C~hGk#g\q!O1> uH#yftQnJ98CH !Zz/9(?lkIi8HEƖg*0 Hj-YP+@~}l4?}@؂Oke]+Qs-(+ OXfu"wɀu'-F;X3HN{ӽ['.JΪ $~Ddir_H S% 2hO<זn+"18sQOIOd(n*@V6N [O(5`/0WC&sIcѐ~8LEʵ{뎽"!k [}QhN]Q0ю\3-nU+ZLǘ-ջt&sżXA%=s1`.\>5;W1ahGto u'{&V1rI^tv{Udy]b=vt}䊉zѽ{23/S}&4ִJhr ' 5c(w2!_#}&ǟ?5EquӲbGt1!d-mcQ̢OT{ =+&cvi01ArMfaJG''LS~"4#E?u .J 궪ᥳ|;vsƐ"Zl*5J ^h yu->f,jU",]7Cc<;ޝ`u$kYn.LɗI,MsY"A5 9sXf`-=tP1YMet! [T@jf~#cK(pA[zάIu-Af. YCfw;sXir{ƬK~ֽqci\`O;}U8> zU{Sn(fg!ǨOdvLfdF7W`ǖ׋ɨe JѴs<~c=ܧ ?:{)((mLԭBL vf+ _,E\l\_*} usekyP0/ +tU ҚI61׸9W֑ zMW\x^sO/*G4-XWv]a!FoE}sູqGcPF:C7L @]dv{$0f|}_bD7CnQ~sDB0Dp#ЖlD3^@vK:q[2/Ҵ+Cf\r( ɒGB9țRN?_ٵ尔 se`gs"eݟN|uC밞üS)P؆^.nV'qtO^o)SzkQH9Otl kLhK/@P1pP-kl9/y^-DbLRǼ$u}2;WK/MÀ`Y(Tw 58\JGF`ߗ 0޿t . T.Ck OG1gI뵠cؾ,l.t9Lw:ZQ@)+E$17R]۝`CG%)*q[J)c 4.a/a \O^j6$ZgA WqqEO0/aW!ۺj=h\,RrL#p\-\ mzśLM&p"ҍf&%٢A@hEp ,NBcY\L7nvo@콯[ἅˁZm}[K J7C8ؙ-z]aP[g٧GaqcƲZ|c7|б?7{r AM 7q t#3 Aӑ'ͺXM%SŐި*@@zzkExy!m3H>D:, \2 qȧpL}l+9(’ѠKku٠p)JICyTK}\Pr*H ƥc>|.m`$g 6zz2ߵxI] i r,w#W1aZ4Akډv Xg",TӜ'fcuCh߫\4Um^ Ac !.|TjgMqp8L4!ƅ" jy ټ3QӺ0n KY~wɚ9N y]#2ͱWnx1t*Z&Qc^}U !eD& j% ޲h!&n^Q\95R)0ER=_zrɯblQ* 1^c?DѽTJBJa|Ymp "5E["($@=X\?j!N'串EƪSHKiM23e)O}ȿӫ`ńQ+㨒?` 3>H?7tf3֫ߡXVYpz([ɠa# Ƽ*âՁq<Xj1\?$B~x݆]qNrK&j/3+6\W3c 3\V-fo'7}tNϙ}`=9,~2tA!fYvyPmբ[u!K1ԣtHkӠ;: d_1rCt6vl,Ơ`LGaHnv(^ׁuKVy$ Udà^K, wJ1 "0))gQJwHl%.YJl 9F| Ⱥ*(2Z? ۴eQW,~{&7z7}fc͕Wɷ{Ǻ5ׁN.}\Xic5v[^qNɬiZ+>9/iL6SAhNf<ܼȿ-myYH?Vre7 .ljUAIД'D7y!ԝ( AVh(kԾj"~sRj=goTT*"0xҭv}Ӆ;[LaB@(}C/5Ɣ+!H_,5MH:W#pĨtgq(Y_N_K9!0HM"K ::Ψuv4򒼶I(L{\63:&k¼.c,7JOOޗHgrqá&@I 7AgȢ`}<0?/%= vsLfq`7=(sOBEކ~h"7˂PV]?mSl)brH1QYKc[fk]/?E.cplg90d6_@ &YG &s")͢ jkśQh:~U<4 RdXQ&qW7#),fq%B}Ӹ䧚 rr<&ѴҸMfUj݆[-0c]zk'T3Oi^3.74[+뜆@>fd% 7ܿ4Ժ "44Va# C$n!^r`gOu[q .;MfE֊4\:ՎÐ] XB_NhJw$b fFWp=~El}t55D5#K`v 91-O7:{=v82lݤEg-b$U @aw܅m6+/& ;wFd]MM^.,]^HqJUPl6cV&39/:R}vp \qSpa"n9gp7r\gV`=5̊=2u&Ɯgbr" Aih^Gs/WPf^=dVqmI?r\.[522VI $ w"vJ9俓PÚGV}[ul%yͰo\tL!ô|&4646 yF\;]'{’Ձؓ#1;tڽU;6 fy2NLtX/uOzk纕Lup %cGr͌q|k=[&.,U'g8ɉ"kP{i:;3aǬJP|c<129 рU(jSriض [WbҏLQ-) W쌀 ]?\X"pD·u3ACfԕVIxò`#N t  "n3:j< *#cC6 ,Yb@]9Йto a;nmׂmp洷&s9^ukvu8&XZ F-'{Z3fhΓYspڴn]SWa3 _~dpYNty,RS toŞ*o6-<T} u2`w=&y)d+0x[ :\vKEFf \okE)O0t9ٜ՚Mءdb7ÐMGoe-rT0e:ԥИ=|7E.Y*vYGY_f""c,N QԪB6ow|G~#M|N+[,&?X4UmeX(+7!3- O /̹l,9l핈6/ %+V5!{iWwKQ20eOl&E#j\Ox="yueD0nq$&+2C'r ҌßDopIZX\t๲$3L*K2IV+.P'͂3+擦f' |[\Adi;[%0 *⽠}$OJ16y~@m4'E^I=K=*#=C `~Xi 0>Yӂ\ЙI谉24 9zk[?͐_T tGa62_-%pFםb \K̸,QޣD WƟdə<mw:R\:4diR&[q$۠===eWtz|%nLQf۱Y̟KԧBp,<;\oo#|j3ƪES&y~8!=D6{rUF:,E:B,+zW-$]{v'~_~SXYROcL 7tƻ咪T@8hlFO\#'!K<`,9Pڸ^Bة eO=Z%󁆠x&QL1JKt,V{4\ #F˧#j%@qҬsX'P6Y? 9CLiQ'CY(5eW@mQL'1nr4s~klnDǘ9ݍI;.B'K,>2 zkE4Qd 3ӷW9Lz8|o} #ꍗYZl f)ފ#-^0m{|)(ωmLcKfF{%Vs XPfVfSҒMH{-nhtt;4y{1υ+J 9PXi'Ctׂx\Z%hsH6SN Xt@BH  X QiuZG 0glX XBi@0~[+,^ΔUyQ1cKQI0qFhom6:U4X W1 UTY2;fOF~|%3 1YCY(ly6t(L ;3x1W.d~D+B"~^Boגа M{'ىiXi,l]1Φ"e'ew:W J91EZc@".Ƣj {u6 5`^EOtAC0L hɵq⚅$J.$6/U8뿧=aCtmWeIms?,.e빻T؁]evv/90_tم!h [ppi"3,fWކ; )'Rv(2WZ5bb Qi$hGǀ ["2d>Vy=}x[6]f~0C}5g%̟nrh O YFDoqKw+͇Px1 H4rpU2;^0{iv*7CCMM{3G/ZkgЧۈ$V.Y/UcȉpģM"RjMw t]TY YBv+wdn|?MAxVAN}#*kI _ȀRYE7j}}qfj]/o+,k @ƺ?̵i,ۼgp3WOzD4}v>= uwzM"(ѤY "nq7h^P8oMm]l~'t_>c^;GXlLR~p'7!}O[|qZ<x0d@PJ%VFq?PCF<]AF2۔cQ=J ߉*:}i#+F^%@дfe0"*AQq4͵<Ԅʨx*彠1VkK1 lc|%1piV";2dQ{ EmV14;חOV hW]~~lE.r\w\Y:DXaBkQrX(N(EP#|c,HydE7cy;2X0=s1QnuM"X"W42;"IxmkHI܍=εn܂20fg`v<3h8^}R6_]i %c'(b>Y$+Jw+懂Pv;(s͎؇Xxlw\ᅤY?#hlpue;p%v0}aG%bHlv@(94c1z W:/>r0z軦lÜvXg+xIf 2fCq. (ޚG~cˎWVp 6OGB*wydM(U|:u8ʸ6ZWU)=_|:/@"zE :!HW' W5)d}8T5AQ̂B2$s<ҠSe?ğ=ؔUV9NyS.v2*l}n0Tx=^M >Wba!Mts egl9$zNf^.Og11/?6'&Yړ8mmeѣ(=O,՟]ػ#G6,%RM¥4 ub?+V-S5T250k lBIF ]3:K CGx*VSM ']bHQ{޼NM}@vL#DzBoP ,%4,$lKL+zB`,.zq8N8P++Mx˰CbօdH%Юnowp`*%&\>B2P5,rOө"}Xaly5%ໆ<`"; 4q1 5S)}?,R~r-.i=3'&a֑~4@E4g!cpqDs>`:bwݪm!,u+z2n&z}?>m"1˪S1\ߋKqhH1,~ݣSa,L>L:sP|:FM,h4u"ZCWFف$iKVW'D`Iq6sx\ drrpHry vcu;ܖ@1=|ݎZ ;!ETu0@礠 kҦ8:% k~8F3?{{E2.L M{&`130#'Wb{n ;>6]qj zRlЋF*Ƴ8'.Bk,8vfdWp񸭇_%ςJ5 X#u˒d,yxwQPIC2^} KuÒ%7&v*7lgb:('.G>:/eEȹ~q  g0 QH9`(F2@[n*ˬͥbۂ1Pd%3ػ8yOəԔti{= KO#ⷐ/L?!)n Ԁ.vDG7d|'"V[;.5:0]fdƵJ}\HI)"6i7eYLzq\t3#mkevj PBzq)ĊM.N7:\akO\61|h'-,b,n9B/FU⫻,HI/f|VGCJi8l{q1f-A'*/2,'qtYPglǺ;Vrt^tWnuXU\6 i7X~qӗvm~>7CU5q :ØGq5)MC9|?,%\,n¤,A[xx:@R`b]UBa^t$/糖;Q )ca4'nɺwR!d`>io ![Oe]#ޭ8[6\)s<vzO˜^}rw[WFjO."f!nafcOq؅놸Iu(d>6ܴ`!tMANM[>q 1v,+-JI4\oQKc*C^@rqQM_uI@b.FJbTm\BFmy_ Luܱ#RQ,MPlb~q>`22U,0ZSPjO J!݄?2$'BweىZ ʅseæ_߫/.C~kp ]\kn\SpC5pqY3_ς^mv畲vo}G% Ϯb,^?|~^袰Glh-D=ؓ>C|xS`1ݚ漸ĐL3j] #{eeX/|JDF>ޗm)RAi,Iө& l#\ #GmPPC[T^XL0Nao8gWïck~ (֫(Va1S/#q̌!NtOf/}Wa'%/.WOدv,q)$R}6_Ei6ص3;f XHT1B.4&䚰3 Y7ŶE'ITV\7i}%Ӽt˽o"1UUdϽZtYVZv](}ƾ@w52#9Gc:_I0 %bkQkI1/󾿉qY[}^cLrMhUc71nت[&v5-T"W+5n}_YRVbgiw}=,3- Mb*Bn3+ &".h`ۂZ<@8q˧DOX>PwB/\b)N`qi 4ҳQXL\ (6ڧd2,Odp~k^G&Loxlft ɦEX-bemf8:bq-uk PJ ;D\lF VTq3AP̥㆖vx'tb 7: :$qVQd>и%9}R>`Wj-b3܃lx5\]5'3|gx:oh7T F_S5gȢONJ|VY#I>ǹ$IqwtZ˯l Hw"2:ޠ?=cbi4iYV2 DQb_nLcgmK ﮀbd0( @et7E fND d>đ . e(ҷFw;  a82$7=? .ū"X| Ea\7ݽth'*ZsV3CtD2; UأOh4g }~rs5qR$/+cre1N#.=b( KwBzyr>@aϫ0$v;t Zd Ldw{:Ű+ 1IH)$%Nʑ1ƋhTLb\7>/VYt7XcӿUWTJlrBU)s ӉjX:$&3uwќ'd<L пaX~>/VVn@)[KwРm3jь$R6Ra[*R<@;Jp!8zp\-x1 {to1[:\PBDփ1F`U Fd]V4H:ʟ;Iz/&.tv"9=$ɢ3bb#%2d/d&% Jq9 =bE-vsVS萧z6IUBEcr )%0*M%`,y\V{@:]W9lSǡ51Urg(98|y|B@?A=Ob:Td"~1Qw7;O5TUg]>3O[p-ؤ6ѓ|^/y5i$=nVR%ؚ(=:)P RT[LlAa,=-^I'^lyAO3ܛt:\|$daRcc_N嘒bn)"u۝D~s|,g .E+i>x\0@tgCKbU<)7D.Eq\, s"O3F$H>pgV[yr2fTXX J ӭ4r5Kȑ׃+qغBM__2-.lF^1x eU,Ŗ-4dDwOyf~Cݫ9Eغ5UEJbmZ3iD7gO:uݖ}Z0hs UTV_Py<Kz<Qڿz\`XΘJqO냱0مbOcrXeEG0>}$G\q=ȘbDM#?"8o?L-oA%f"~Ra"U]PDԱh*$mo[V5х[G7.w$(4B ʳqhdCW$sIM%>/Ǒ׃5aX[)h1N~췘e& A~>e,3mٵAL+7T~oeKvmˉ2*9R\%X-Ny cFtXc~ohLl]bEOMa b,`BU7ѥ9daFt p$L (DONi mD(HXgT;U٪eUK7wp^V\q\վ= d2>/a!7N~,\9!cѰ|Ꭼ[{4D[ZvvbYn_tYEjG)Co掭?dXoZd2\3WX骝d|T!Bxq{Ԏ+ݿ9vEmW [(PSsEY;,|= C" !,BVed;Whz[z(V=r:tȖQ12q] VY$eMyP\ۉ'ȮElQ<?Ii 8$l δUoi,v%ps#̏fnk&} \=Cm*9ϋ5ed P MN.<&Ens AVC ,t2<zGԜ=?V8n *5$\aɹG2$ MW,v*[c@1dN*5zAtD^Os9 4rc)fWI8+6s: HH=1qNB %@0VWA|逾QPmj1W~$+, >bJ@LaOzȑ ֳz"8%Ib=~nCcs[ZZ*=Ft̓1b}Υh"Gc50E%JKD-HDž1a+y!|=U">O1ЁK+@h͊C}b%AȺZImpnlC|đ|^M pdA|? lA K\dZpPJ0?ɶ`O2 m*T$/z#8 }q6 3MӀ{kPZVD[~=Nbr ,E$Mk@:4gYq|h> ^Ds/C]1$㲥 Z V'فKlBJN1[uwL sS'Z=H~aPج}Պ/}|^V(=FN6/ `Z"+ hx́ɌX?ۚ!g1`ysunKQOWLI5]:gB^b~O=䘥x g%^SE) Ňk/PF72҃#jˁ=2O^~ENl 1YhD7eC$w,D3zz}=>q)0 弡i"J6]ZE/ aYD6~Tl <ԽFG E5͋J ^mk6]{yEpiƺi8PMv ԽT}x UfN*Ml:q%쑷B[ps˰Ҍ2ԟ[w Y5t7>3wG[qx|kBێAW=ʎK\9DL)`)F& :C׬/t~aн1 cx2z chr6ϋ үY7u<)P<30朧t1V%w\ÿ8yEdiƊTԊ3Q'\1?bYTc`P-,ĘX[@0G4("!%$MgBWV98Qۏ|W$)HǹXbl3 Pæ>/]>HYk_Rf,`ڱPX0jH gզ} <䤸ɺm9V>snB~@JPԄJ+]M7+l*(W pc&T+ӭPyuE&bB'Ei_16F=͉Kԟ;%0kS}l*O1y*1q\Qf\L1.1ڻ-mѕǞ͛BIːtwM5EnxMr_ OHt/(a]t)mX<T|C@^, ɒ,f0ϡ+2rI $MepXWIN}RQa9(>s0Ņ3Sp2{UՖc%j/="k:c7]&jwWK7=l`KG-\[%ƧXA؄XKJKןWb?gIr7U.X>+;<?eD%Z@k#%G$ÄzsƘjBL*)jw/z-cO5$u}k M"^atb|YuJ ^mk~ȍIsj~ƭA[눢SyI;wh^Pgr1kSKo|YS>Gݽ *.Kݟi)A+*wwfgUN31Z# i7thWlPq4pFݼ剝m2cOHvF=&u5.y*k2$J90.k 4Ȕ格r+dpщ1f|a:Ns22ߓƛȄ6,d6ub͉QL0L{Q >/S+PFP OwA@K JV`:,fʕ\ھDyp9jҒu5pa@zN+~Ky;UrYu#JWR0wwr;fMFx y[m0[zj39e>C_wTxX{B7ޘk1}ms @4)HNP7!֊ZB ?喢$:%M~K7M()k1. rYupkUZ4;%Y(1fd:f:mBXnUs9'J@+g!&'<cն&Z# . yyEplv=Z# hO_F$]Β;z;`}y O ,Dd=yy\չ<y_b+8 V0};ݏd90E:j=+88-ε 3|"|=UFLͮztE@](ksiNxJǁcXZ# '} H,_^x0Xl8ab"fg +-3|'zD' ٌ jK%P1@YL-ftK gQ\e6屸2\)/Z# U&6УmYbsw)?:{ 6 Uv͆=` @ؔzwrOt2+K'c DAXark级Km%Az4ay[2ectI AG <0CFi%wCbfxcӌL bӣϨ\So8[趀f>XLz?=_nB/ꇼe,涖 ̦[0C%m!C¡, VOiB1z/N8.ZkHbU^JO4FDKϰˢBzssiAgVIya1d˾{U1 SrYWYX{#M>1'nЌmY3:0kT]a^[<EIk45O6qd^i%1 .1Z9rclG,L?ϫ4CA,\1 ݁5qߎ}^%XFc|궔sHgV=|_[rZݫ~TaMa; O` 4Ey偄$8DgDS 6*G1e̦MUX#B;]+^9%]VOC|qS1k=O1 n`y-@uӒx[U?x $lB]&NbO3ɋY2 &'-lp7 Ӊ(2`we}cM-Q50?+!}(U`q?HWu1+L\4;V|7퍿A5-snUR0w%.ğ[е\:yˇ)4p%ڔb:]g1}Xh[ق1Jw Fpl!tOŞ^MLɘ[$kKF-oFm1&#B K螊=IwC`"B_eb]?ބ s_$Pq#{VXET2k =78jz[Wޯ4# #3xLiljT%IB%ћ O)uI4.O05Pm3nX 0DC:aM'IDw}k #8$ GI!j>#@yI$h/M˿Jc5.(kH"46n~ChQ!𘻀;kæ5z9cnhݓK+JzDzѣt9/zAUort$r(0޷A q=b}lRP [ߑ,ܺlY-#?X#S?ܴ;|}PqmՄGb.P*ElRWhDM+Ǜ0]7'N(}$Z+}ݶL`f6 ů5c/Y=@rMxuBN>{LP(+ۧU_Ylt5._SY3ӊH/MHt,1Ҍjdf HWݮQxK ydUj;Lm}HzywQG3`.Q.0 lyIE?Hgs :i tV7Pa̬s'C:͑IGIu&Gvce6-ˁ 1Ug_0l"XPrՎ6eRN/Ҋ3}}o>+Mrg ɦ*_I_j`3 <,7+)sT#Q]K]c&A(FtcI@i ^9 S'HXenz]7ctN?A8vAN^ _X{*dΝYt$'^)usЪ;8Z(8`P=Dky[[[iK49tkUVBV;Q?R}#YhA0}jn(S;! X P .ڭˈ#GB yfAԛWثF6q=UȕgO|R i(DKIV! &WLa+SHRM()}M]@$u,.1s8*3 LT 6N3&'0h ~0m$37qݏr0fewHïaFwb{TiF^nkajf.Xm/K`Oq]~|^ڠcy3SJcW/֭8%0y'[@ hb1ʻ>סq)ysѓ{:ƫ]tj3n>/ra=s9 z$eCVi3wkBWl*=c=iI׆rs9h~;qS\Kٷ,P 00ؕ)՟ByE3Ȼ]n<-`2e墋t \Qj?HrYqwWT8 -gPm\55Н1&T[#UƇ5g2:|I(U'5&T.,Qzj4ʨ 0 sK49m5ɬ<jsqea" ?6~]XٳLb")\Ib ̚P'Jj}$" 3e\Op2oBb ege_=ΪZ]`%̄Z &Q}j!|=k2ȳC4L م=SYM˜0*B'M(K>/ѬKd5q\S gK-`󽂃%EdQ(/Qk`c|N`] [M0nsV@ul)l{hMrԔa!\n72uCkdTĤ )JCHs:"/7R(SIHn$ht /MIf 9dY_ K5.EvBKL"C.RE,xr>`8t+[!nFJiItD~?J|2M WT\yy^ kz*࿈"1eܨ@>@2K՝p/&b 9wMc/Zq~)|HǺo%)@[ob)Ti z w8Z7(vf*;"{K~#a"J LtҔrNM^O 4mt7)WG%I%.\<8NO>`2,'Q{N|5Qc 0QSqN),F@KP?>݀ߖS@2aS`\,=ZB*?ujE*Na@6@m 0e!{aM phꄎ I49E2$t,Q߷Na%te#erwHExw̮ºoc @j f."sȇ$*[p/$^wu|4Iw_'}Pjuɐ{vYvq dMJC>I[38p4m ٺļ|eekO}a*x=/TI|;w0EA@4+Bq1=(+g$cR~}S_kpD_ Nu={uB}4.*q`P*۽/˧2O;M}f}P(R1D_s ^ koG M(w +} 11D@lrct0i NQF` gva`9_bb[U{am@7;E# ƉvX P^:'N%F;ȊYWpo2 w`;v^Ϲߣnc+f/S1K4.pOYipm?T_Q+ Q(xQÎTs<ΦB\/]Z̬\ԗ#龎mmrz} Tk԰^[DhD,:¾v/"Cz 'ڭ(ݏ;L1/:m-MT-0="5bl ;q`bX>^.s0oe|MlZus~3JtK7DE-TXD*M JsPo;9飽= NA)H >RХ)cRxr}-½>,+˳UOhH*@W"E l"F28POo)b)^Lşc}9卹wLi7*5L:FG ^B P|tr5},rO6R S@Uoy+fIDۘ)Kt0dFb(ˑak a-wOw|Y+G*^YC0eUR{cDi3 ,?N+h)Luoiqcl4toN ^Bk@nqmz9)[>֎/M~ZmL8b#ȞA9K>>`o/CV:[MuO~DuF'#cq~ ~`;w`B*)2$wś̓ˣ+v* "J"Dk Ś2,U'27g2*3=  c$1n\aH`&0AqB/c˙sO{@ 2f @HhH )sM|Oo"Zf g;@%Cl Mluy9W]B\g3bo%}*yڪr` &BG-rrK7Fo~k$d\tn+;ڽ%s1Vbm0=y,c>EQf놞Z^MgTV1*\<}_DVV%jmDpUSxʱd_{ze^Z!XR\Ao:Woԗa tO ]}%t BFcѬeȡ%IE `~Y!Ɩhjɐ0p:_OSR8CO9Gv;Z( /M|m!eNh(l')2l|a<&n#+-E˹eXvk4 l-vRh= D[ o?yqi>Ul- )bsN XLԵ 1E6?̅݀bv p݂EOm|ρٵvkw=fs&~>ۣU<VnyNr% e22i1wjzy׆/[- vXKaf,\YV Tv2Ԫ@\ue$Y7/ݟ ,kTǵ^ 2$1#3+tDL?|d=>{[>;-u'AV_'DL_Wl (V9W:(Lb8 @*08nkb>YLpw%"GK+O킞M z*nAc.,NMtZΥvK8,;e,\a{&ͻL[C @o1D;NY%Ue{j*ZD +5+\B$ jV8aa¯Y ঠ_BUR=,,z-资m"2$# u ɶ,o)njark&CX"銓. i5&Őc멌#qě~|Jz͂ ,Άk.\PO:|f>a#'e,%2[ЎuO@7Vo )z~eD%cbrWhpdݼ{I0j6G:2z-ML6 r\:X "L_%oOk[:gH'-O"{/(06t5wo sHBE6_uO,]R2MH VH"E/݌H{ͧ7}IʸYۏTIfdKAP :1%juy4VDk z]Pq?mi'\:+m1p5I)e˧딕1)Yc[~9tt>LQ .QZ@0CSƤbdڛ# ͼN+@](˸ȷc)#p=]ȑP)Юw>IFޮ |dc+(UF\b zCB8I{ÉY;_^cjl淠[G}+j)K!o(lB/&s1W ,RXY{~Hww_@ERmdi*%VKFD>!K*@/Daa\7gYAݢxOs)wX=~rd]DM]Dx*7ܻ8 S ݦ Sp`֤7񮤰c^I5ǖǦhX^,HgWv?Tes$e dD7e)BSưp=-iJأDżL%60tPd-xYhoۼ][4,1#{:*?[Q kaq{d&QdOF'>-c,bD{:bԪGDnݥ~DH "Yl#ܵ  \ݔo 2Ҥ'j.<ﳤySG3i1Pg-_k\DS*f9FD2 2,Op+j&Rrse3%@iU}_k} u; l\e@ʺiX`ea\Q_{KqJYڹ P%1EZ0@3W:L7U(1r;*AW yŰƵ()Du' 1h- &ڄXh앲\V~HGXj/*jogLd7B k A%=Υ#Cш,{1iYD2S\ѮV+^ 7Ms``Y0s\,+9i+2>!zPjLd{bkhvXj-d岕M Jֱ,ыEKOA&˲WK2z|\@pCE+Odg fQ*-lDP%:{|Jk 78pE \A mf"z$!SIed,CC tFHhy!`f"ݡrЬZ"[W1hoi2lGJ#90h 6erK,MD;".g l%u58DwҒ)2E6cuAz=73 Juh2UGjK*@CX!$w/лf׃.bK^3pw~yE(S+0%:aC5q=$3ڑ:dmZyո˔_H@R8=LJK@J2}w~xuL8gWI:0 3˦F=m-`CUSIoqt8/2ag:8Hc)ot^X'K.ݡ/]=Mz}ER1!}ZL5A6GagCu@;{;4/'nyK<838N=bRSdG|74l_f>;9UǨ<נFTG<<z܋͈ $`yD,= P`՟ߔjUޓ+vYm^zvr}^Ae!Yl!xBګHB}^10ȝP)[/,jm)0 %]ͨDsTfUjAK`U#s\Od~Z:kII/T&aq P:jwk tԦt-G6TOV,XZ :uO xu!JNCR@ ivcHHA=O4j2MPIúJ/.TVfP86 :R#6u1,7/JK@O!\zΪk*59wlUQ/,@pfb f5exjPʉ(6pC0˕T8Oh0.[3 ~Af+?%B Y-5v;A7]_^%}C3P"ՂI",OIpo\P-Mr)]bprth4P[V T.u4H\#8q9Xڳ3E̚z@^䛸xk蘞 +w%t+P?F$8rfd;Zj"rw:E51pM.@iS'86lv@kLFfQBNֺ߅ Q Ĵ*T6P$6kkmPq5xl>؆w?IIh>[z:NqnU< ߄kìs4;\vo,͍z>h6s6۴4*_2Hf70F,e (a ty8yRu8]j;' BNe A_z>4~SpCCU/ڟ~m]ޕJ:u0'bN;صs)OO k6O}^,p4+B\o^m=S%f^<a56Rpě h,4ә-V /Z7*L]*& uI2\@ ~zȜ(bOtͥ 6 ő~#D!ѓ/B1p5{AGZ[VWT*uK҇|aMhs*2'6wD#FLWi ` %)5yVxjHs`8pVc C6{[}TJqYEFhEe[61K\@޻Ș(&[g|)EТcM t`:RKoGF>eƧnљMZ<Zt"(qn  u2`5X[W=Lf;dfe#*f(#ԢH\CtjC8P7 mV6ƭZމ:eo/OUb;tY4Wgr`xOЬ_[>\ tOHÐBOA46R[˜< +ekƹ >%>`@zO'_&ژ f95ݯv ˴Θ:mfǽd"xt)/HʣU(;xP! _X5Z 5&1 .xA:"K̛C 4΢cM>zk]GdWb "foʀhJuqNk';HВ3UvvQ546 L{p._=cln҉|늲c. EKX7oEXUmvEV/X&mWwUT$%xyUZ`ê.2f{GPXVw0(. WniMmWe۪0;a`+zdMMWP<5AnבNsR "is$= 0)b(c78UP4mX.[UWaS1j̙PϡǏ -MSߩ/qlL(M$R|b@@GTK˽[#0IZƳYt~*ecFuPBJ4)08݁?fxO.*,\I{rS8Մ6 e`rUP1WFl)Z qBjH.}^Y(=zsk24IO)z>,J#cx;KtU8İ4Ƶ EZS<eP Z@QvY@1kX݌q!dq>/.lXZ= dK(9 Hۭ ن`uq[c 6ր]B 3X^ZX*mJ=ݪt zj'#:a& 숹|AIuݳa+6$Ou.~gMimAm(5.9Wu|1̘Ok^K(4( cz? }>sR@c5+,tD0FD\84NtiB1g߀.N٫LpWFڌh  #ght8}apߵT9+z׃Wb*723]مWG6;*@xf`[Ѻf3E ]<26w*=ɞ貂͕MovX7bv`^#3TܻWִذ"=U"7( j֥J9~J'5%t;KMYk;9׿#xJqžHRp@V';*#PF0y2K}besc\'yydaצgyY zT̺=.x% 㱛|1] LUpJit#704Xa/ ;( j~xƎ}^"[Cg*/C"Ʈ|TF4xce)aZ"ifg >ĹKN-AuSg5y"l.tYNX+,p#ڔŪһX%)wy}]DUKv Lu#8VM%ԟ հjg[Q6k%H+ V`L}959јAOe.>nwtlMς؈i}\l4h/<k WG06u<q9NK`+j\+’E)9H|ElːI'>/lbl/29Ub1g\y_EI&nݛe:\l\(8̱Uc"3:\TբIF ^f 2jtpBhc5=rb>A|a"Ӑ1щmVrqܠcLkVLƸBebOF r!,]P /YAd5yĒ煅l EclPl $?\ /%a\Ie3Y:S7 "9􋗱8 H rX=qB/^ljT 1 IQL AGX|A΂ᘒ3tOŞ>ArxYn6`ÁV,!)c:*qPm=Y4-a +\yY;ov;*M@/KG]@$AfU`p;ը 39,WuQvj *ev" Xfcm"`on /"{*$TO$yE]"uE+'!acUk2c4B6*Uʦ= <]5kF_ޝwxmS!0f *@Ƅ( %gb 3 ܈6e!Dyc@&)GIXZy` 5! X6M6!>z^d st?2 ](PC;b 0xH,uk1f-Pf“[+x /!fuBTB} Fh@o"hFc #OڂiXҠz5*=M2!qrw/8E7,U4n9w)t羂GJ| Ծ*k3l6 2A :~cz 0c][Z>|ӫTtU/;q߂ޘWl3a<.@ O44]!k56Q1Y䂂uS+,!O Ǒ6ZטUsK:6B+A=DP* C?p80Py?Q[nLhr`uJIJx&;W`[7mn߬\zA` ocClL*gK=[e1}`?ٰ"U"w;Md]# `s’3FiLh[.2ja 8IXR4 $Tz5f gf-\q6KгVHRB`gǡC5es\WV~{YdaJJM:#utGYaPQf 1Hcpf]?]/J$@f~qloB@5-99mt&찗۸F4,W_n6? :oO>-h<* D3  %ـΒSq{K[wL:qs@C-t*m ժ)c"N@YqL~*?t Wr4M`) 8:z+c idbn%,^#ZA̅8)\=*mbYoS4Kb_¹ ),l+/zNOՓ0T6̉dQԁ@&a"D\KMAA'>yuoȆkQ89gBw?_Iz Á{nÓI\qҁC[/peS@%tfNow/PI懂SR>!_D/;PwBJ=!֦ IzOȀ/c3K2<n(h"OOY=bP\>`;Yi|֋$~·5lhŘ& bLcH.Ͼ#b#xK$v*gBO:&Gˎ,b%Y/ <?ڋ ݞ ЅT.~95Fjz$a6k -*[@V_kMaY1U}\|aFA|4ONf{|jKBK?D$X9p(,2؃kgR?Ͽ5-.sqymN;vh%qv:fr\M>`;i9v<0؃YJ[Ѩ!_Fgc狑0w .zB'7p'NO@ }qُ-~T?a&,4bYX0c"-q^H>7:* (6P@k}a8EgTA$a⡃@<ޒƛFyj{%*i*#m2<u2MD9UK5DN*rԯucwKgz5 0H/! h#d2:jwח,ȃjXANՁ03t *tbv԰*BI볆3Cm8:LX{Ywx *r1 ¢4E;5hˆ>LDҬ;Wŧ@Ha@¢TNU}k?uU160hH/W|p,٦,ÕFI@=T++&J}v ӺN^_DYwԛR`/V/䒉G?-Q8+uc@Ыb{ݒU !J]-yaBqf3;v8Dl/ƷbOF9kN#G3D+. ,sPq`Ʊ ElP2FQue5<+-]s8Y#E`ۼyQʚ^F ߤO։y b:DAQqila ;j͋ܪeֶmVY،嗾+kKn Y)p/}C6Ŧ8v(P͚Lj*"|lӰHr{ @D-;KsR~"oX"lP\uZlJ]m<\k%HhH%nY.WNu(ۑTyQjs, IsE4RFÛnj\$_Ku._D,;AH~_~J H ;0`]zX KSg{7{p<fEksy(G&X`,53~O䗅[haż; ;fiXki@~'u-ˈ 4ҠXԸJ)d~5cT~:pZSN& I3QV1^K3] 2QŹC[)5:N*2mÕ!ۏ܏a2]h5we Ȣ:6 q|Hșa+K($/-`X{EC4u M_Mا >AI~J>#[ts3.}[g\t0%^Lꌪ+Ձ1G{⻵~ibH:ĥm$$VqN&+ݚ+H./+o76PcL<龀:"*?o5 `yhcs@@}OAW{~E`l ڑ;@,#<v8$Hé_~9D/n6ovaٲ=e1&.mC:AK.iKdd >?HN*C2?{aG^g \%\?]/_н6=]?I$bQ!muVK`6^\oH4~m 1pN)#C sfE' `B"mw'.Vry$@ފ98ѲN' _ʋ1lعzhJgpi"9>ZNe gOte쳸\I4}1ŋsWE#5 +m2pgy CJ߄$a&$lh+XmDf]뛱-;C'ID!h%&:ķy 5FxN8o6(sf?YXCnD-Y*g!4+t'$AI\D}nvw:Ǟ,}o .As &vE1E V4XBtcrFh<<ͻgェWF40((DؑnACpYODoe!ZJu_Nf˾ ?XYie_;3 hu "x1ո*l{TOM2G[yQ,fE dY؄nkMp@>H > lVi ZZ)GI;[`e,f+QWԆۡ?\.pF9s\Z /b:,`Ui4_\ ̼ք`q`C+rP9 Ȼ .I޼D6m\0IQmBbk 7aS<Մʊ;tX[#>( L)%>FZZ'!̫PᮐK`cKHƷ3D=P>*P矊Y|50W 69d϶U334 z ?si56Q1+)^â)ah zM.kM;,G㷼Ɠ"0F#>RZsi[-ᒮ]#ǁGfto_4\X2W#jB8=rs,,ydgHc>C i$,L[Yw 1-`/IK6 T,ߝ_xo61i;f=@Bh/51{"..pp84POTAE[PKbeUQ{t+:lP-8*g$?zdIR}~ovܤK̓+k}_rqc< 'D#QEFoM!`Sn_{yh/D@(B@#}rCA(a0x]GgpDquf.) O) G,m'BK[S--JZSXl-jQ 8:b0b`,57POm2uóHf4%X4d?=F&[Y : Qle#UZ52&߶;Qo`dƷnl3(Ywָq`PFCY^+]j[5aL 1-Yߊq̊șdqkjm]΁@mD+RJ,!H7Ŕf!\ez9Wːԣ{W.XYo@Jc}/"Xwf{r=+j'c"hs.\NkaQfKOaYCt_ˇ":7f GڿD}wr -1QY}_IM@fzq1C=pr Ddi֩فьs9]2MdUs5h6}X[ƨfI[cX~%Vbhն38Stl{Qnإ?82-4rp^ث("˜610c *K`'"cP {=1@h^5 XPgGQaEnF2cə}3W[Xފ#gå2?.V mRε{>Ф#+AE.kym1 (7dVѕU`QDb$ZpK`VAiv6a=绡D" BA&^Q$h~$W 2moAM<\&x5]0^T,9'v32!2JY+3ɂh(71.vnW4E܅Z]E8 Xمϗ2e!s5AK`Gf=U"xK@φK;d B!F0#ܸ xEIRpq>/,lrBT >oK[*q_ h\ͩ0PgɠtF;),dc4%O!3᪴*5}%r d1v=!AܬJͪt˦]69dZՌ sSBg%0zf6s=uۚu]WTF2jsiSeI$s5++W0Hu'9 @Ԋ4\'5@tZUY(C|]Al`SY@]9PT˅y!0Aiq'PCh]hZq,11H~͍AkRQ讋 ɦȕ^ַiSHB3l%%۔Q`p[mE?OI).rXf TK4ȚMwʿr줛CAlk(uy!J@b#ɀPe̓"?VvH_12F=1.dڻ x7Z>o;†^.δf?C'3_-lU) 8+f.\2(n^L+jՂn86VHtR|7.ZgL45aF.cX-6@Wdp[[&N?ɸdܿ%Kwd&%4]2aK&Vw2Gxid( ζTkߙ Xx-Ǹ=] 7!lE S%pc2 K4d/2`"u3A͎Dd+xM|,4Ğ1 6(6A.!_: ʚ|BI1԰v2I`g|$U9eB߳<&||팝(8rԀBvȢx& gT6 ?D螇wıҍhd}M~f3n+Wȥ3hCφrp.YEOlwCE _$RΊ,˂? tb:R 1Y~{52cS!;+nkQqY3\PAwɰzyypauy~ph.>[0-0kҚ=FQ%.YI|^9l6Ѧ 'snA8 >+&1?W$7+: |*p`{?h`XCR^3pfc:M$Ќ%ӈ|eY4$<fanto$zzHkAQ&J!_vqLyYELVEhW=\4k44Xʬa pqЦz#Mՙ5-˱[ xx1fMVKÉw^z]xf9VZPx` Ǻ j\ PjLn.1׊J?ժ+?3$$q)D.XzN1'g&}8AfnѪ9 :~ԯˎ`` E@BiG$Q5RWU[΀f%BN /ܥtj[m-Iȣ2OOڗvY h]7ZYVqsyLnf+* rO!P;i-l_BmL XHȒ=b4jch֔~hZ_zj\·]Swa4#4XP-`u3O~Nά&]N7@gGGT5 ǹdKD́c1$= @l'[`to6EnS{ ^ 82L`U(U_#_&r3ڹLzQ%mkB`MXR ٬udT2tlu4 ֈ8[Ct˨wHFΒs` Rv}(K)0 Pq}k!vF?ayufs aK=ЙU1R o%9A f 5)pE,e K:*#xε44ZuP.pv^ɕ :fQVEĬW':shu2.NJ14|/I6O66*(QW P.L a٤HިOl3AW,2am AHhGS`E4s)m Hdcr32eaŧ\]CijZ^?RG@7fFݻ<ct'g<dv\2(6zE9F+-ҁ18jYV|{nEU+$tz z@iH$~XX|ux5hG >κ!&7+>iܿ|9e"_EFreu[@]SWBcm Iæ D/u*!xQr qA!kљ0r.f+` D u,K",7؝+32LZP ecEH~t1q#܁kgxbQ5AQ$;OyFpBGB,Ӣ7*OXELOt.h|,ݢ59FNLT %zSP=)GݶF2 s 1M{^|9ܵ|90}adU7WӜsd(BfjKEWjY$p%4XaUD_e`_ :-TRd!l_׸n?EBC\tp\1+Q R+Brb[$3$C&q Ex*Zk#hX=ǀ,RPԘ$]rTi ]%SyWy֛J!D 7AuLS,jLeiCB}ԽI0$P3qΔ[V)J+xM IOY(]5fILeH:v}^ ur;7k (&A!"5,a .=7<| EQnCkBW'WIB!H@M,ou(4&^GXn+]"z^R=a_(8'kh], d;, hNȂܶԳOޡza92ZjȊ' o) ǭȲ~јҽ} ĝN^`ZkD(+ՄmtիaMcΕRKqk"$$ S"Xp?5 L7uIE\pLx&ݑvf8u1e\0LS{,^zx@Q.iS[g+d\:_tx=a2H~Dfc]Jܴ4[ `j FγJ@Qޛ%G>ʼ0ˆ)EA, ,Qp6ELfZhU_}ThpG$95D+(&Eˇn1Ƶ3n%nBIYA"0%[wKzUE̪\@#2,D7sNwW6?'IXmbocp,[z@^I&_|i2o<o9s'tuί8G2N9cZvƎ~.3@02N0 o[b}%hz/ [Sn(vHddb'oҷqep][ӖŎmG# F2Si$  7%eo02 o(wNΉ9;'rLOe$M=:2e0v Ua:IhPq&??Hxæ_\զnd+G?]/JhAPQtu/'6Sn˺*ѯ+vK9 IHSDWoVCMr~ubk/LH1̘hO0gev*7auh%|76:6Ր-&YBX g!N`)oix)J&#f( Et#L6YD3*e   Cc.;ChR ȣ@^NA, ##vѴ z ,uDXӘ80PPDfóqbVӰ8?G툚A炄,A{ 3 onsiuJD@# %b@%AX(= 2Ua4ݞ@X6Aj&4+ct6QAƬ0]8"Ttc[Wn@)AK -o%*灚[ηY7UWtQmW>i. j\'jU} ;,AÊ }bdʄ50?̉@ܮ/baĐgUP@2{x0:j䠆8>N /_z=/[M˩kMC3މ%6{NU8:3GhW@ˊ/i 9&4V^l(NlZ>>~'ݾl#! dr Cy\tMf/|C^ց2uP5MW(fRGthsݯm#fRqdC&v_V]\+F#emuʏ*eR4^|mG._!~o|(^ L|"\bնKQY2.yd&-n ~rYWY֊^2s穚Ӎ+D34n[-XBg왐4n@ԍ;B7'`E9'$I) k9Ifj_Vʱ:{U]:K `QSGf9lTF<B&+c69!P3iWASCG) ٟvhbQn+ !v]r,d.01fiN\d 땧Y 獧٪764\buiDMKXaeqXv Fj`NҎ9šI< HzC8EҚbҫ`0}6P6+M4C0a!FSܖ{sh>Yqq2.7fc6 )Th8ײUPHd,)hH|c5vۙJZj] pH@4r/}X'_ _v-G&~Q1Z#4@q!-A;3,?Usn\bYhbbnX +9*QaJ^!%%()iH?J Hnd"8tL9 kD%#GA >Xb^VKb$ ;k1ZnK .|f6StqoouTE*Ѷ2h $4,]` %1F2UY:mRkYMk4(&,N/zD+c\{& gR}XW]%J,0\@6(w(N\HJl^KPf`=-fvh #`smpZKh%RАu!@E4,#;Qt^03YkNe\KW^XЦNMQ64#mDFlH1IVYe]1\m fBDkhs|M4@Kg!Ø*1/ #)Д8bGD/8.+bRND#Ӻ,SkhcQ<>(;xy7,BH#ihbՕˋ3SL%G_c{4oi-3=T^m0C,햶V [4.3bqZߏLr"&ة9xE.º=ñAaa 9fY}H^>9L1?ZA9n dfվ3:\r1xF22.>6>Bܹ#S9PZ0H 9J؉ }LvveCi,>bn3ī; sĞnR}?QhDF, CF"sLS@ s:zS LwEkPuqR04r'I~5fgD()"soEU6j4)Ҁ;T-N&h~ǎxqD9{u_=~kC V$ت頙O KMJCrݻKY\$\Kna?,w 54ߎ'EQqv2[ c9œۦ#~8bu'pr:8hW (|uvk&MEǏEN2ekC屮g2)w.w)*-C)MHE禩aExAWR.P2pYaB%syQR&f0R3(ZMy a&OO*5B~+Zrw|OTM9P"M U*7Imj[$ f6O} endstream endobj 18 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>>/StructParents 8>> endobj 19 0 obj<>stream HWێ8}WqHؼ_ bvb}tY=AP"%mJXŪի1^~-[~ 'n7r)d˛Kx\?ly`RO=1Q0/":Ȗ_>ۿu5^ y!KI\'Rq!Ez n6F׸M.oaw/ۯ[v=LrѕIawqs*"UFt"E\<>]d3JOBsҕ|JTBڵ~;<@E}W9x>*rgԕY7\8Xm4V YvJ6jF%HR`6،՗x`OYZ< /+c҄:z- t})+z^ׂԱ-IF+ufmL&g skf7sZrPox޼`?vO{5[5D T$tVج̾`xT ٧]i}'ZQb q>_3eQ*౲ZawO ͸mh7FX7;`gjjww©svBJ-JVWJNs+a*yaej&ESq1)IyvmTj3M+}3tO a§J3C˶| M_: #ޝADgE;>JdB#v/Hyր8ڝlo6Mw#*/+VzG136S+?Mw:xJsK)5NPO piNRϵCIT +@9\g?d;,R6ќ3,$ %@٥z){/ktTTQ\/Uth: &Q;'t#<fT֎4./ڄ3Jr>* >9nnn6 6#WΎ`;3Eas8<3ܤ 2 ګ-N).4 'wٔ*c2}cuk^PmG&BC෧ݭmz.BXccĖ;1tBs/{[EU ]aRW  v? [`Hc@?dPަ$ը, FYiR ]d -KJZc:8XFv!EdQ]ƓD&T(Byt8H ,*CF␋P 2tiFT@A唠 }N"7- $ۉcJJ'"DMi+() %%IUQNv)1$RQVbw8 T^"X7$ eDPflR[eǺ6%RurM! {Ty#L4$6|R [x% )jSdž<&-D jm|J߾ @BsDB[0^/я!v}hvy@9] $/['@- $ v H./ ^*ٿ!C|]V(n3E>a%f1) qt4Ԑ@\ Q^DPhAtclXNN Њd9xowtXϚ8{Ȣ!m+M꛵3DWUUŕLhLj^eXļ"R)+"%Mc0WJrjdG!:ut|FitpuBfEy4En5"#!w<ʠ,HI"id}ةAgwu@rn$wˉ%'ZH)6ދao4-$MqZ!M[N̿N̔ZFd,G{rLtwBt2p5pѝ t'ό>0Vx20lJ_d>=j>=j`?EO^wf?=c? !@BPFԣԣ|]>ūKPF&2ԣ2ԣ>QeD=ʍ<VQVԣVmbQeF=jF=jGEQFԣWOҨ[?-_e٫WWo?c~doR1ɖ78(f g9>YkqE__h#'5DҀgzɥul,/Y~A r-[G+ ukN ffP|F:Zsڣm,\=p uVJkFIщOI 4BJC-h!qr0yh][2'*O?͓N[V!.tZ(_7n6 {B"r/[*_V!&o|_s) vy%\R?tt¨@]ǒ\Dש}M0gaC(6Yșp` O-qj3M* ML.jc&ɟX_D<  jM&H{[7P t'TIÆ(d!x` vfC0aw.戶*GwZ{W[UhZ9D,),t ( ;ض30o(+q6wY+_xhX&P? HTaFO.ZOO=mPgB0QM}q V\>STGAȝ&1dt;A(bk떡ufJ' mH endstream endobj 20 0 obj<>stream HaDPFCĈcDcDĈ#"c1FD1"b#"b1FDDyϯ xXV /&xgx'xE,`0Y- :*1+K.19, /LO1`y7+@x ?pM \Hp0 pg9c8" Gw8gr{f؆6a# '0 +C KcOa!8w?D4Y:QL=1N zI+UM뚮kF7tSt[{=#kAz'zgzZҲVR56wz-}G}ҶvY}7}׾t#~~NW~{ endstream endobj 21 0 obj<>stream endstream endobj 22 0 obj<>stream HѲ0 au GQji={`OI:-$[?H~l A_zA`B JcNѡL} @ )݇@:f2BX s\ 1c:q;tQPFrh5HMײpMCs1BT%D-~"v( *b!@vF@XC0uA6ء R J>stream HsZk @e "ȖE R֦,@BYİd a뷟{S[۟tg=K:uz,9o|O¼[ܟ~xQ;Q~LҥK'?ыi~_,(b"%JY>}^*USRW0J1IصknY^$vdH2j#X%^{xå%FW 'b"J>N^{_wAzhoS嘄:1ȫ ӧo~^wӯhdTG3ԓbe̘9s3332T$qlD A<,:߄X 0fϙ;laAJ1 SEDkE$x\XAŎήmc҅>kA>,,xVD1D ~,LRXBm . â#c|qSNΌ2d,YZ$K U4@ÚiLj B:.F,ZH<,xAm,[R|rQIV$C1i)t]o'^BEC'1бreXyeFO*>Ͳ BTfRÜ E(p` W ChzYrX4x:猕Cu-\ G%kb*++WAE&'2Op7!Y:r^Q@z2 â@)c5@f͡:--_Q׮[/!k׮u&qI9 an Ble"/%#GD\!|X3VRgo 7:<(8BeJ R3 \M1[$[1WG69!iw&̱Z" Qq `2=NUqH 5YX3D^ȸ͢T 5"9:0ȶh|W_lܰy++b&ZR $x_\ ]WڈA2G7wXI~NN5dN#Ёi)*J2 Y!aKf`۶(!ջ(5]ZRN2 I!vXf@z)tLJ ^-fvϞ)jQ ߗIpt\vHRHvXERԱM?~%,D ;wǯK߻W-I,JX)*JRHRV62ֱn_-âC>>f?CEj$t\E |YT;,~yG,tV}'%t<,Hu^C@LbZ-Ix&E!xYxX|ppxX4z|QKZb-FRd'I%BBa@}a][MP  899z, ׂfyOXD'Sâu}aEǑo8.Q+*`|X0 pr s$`nLka nJ8B/~eBJT +s|9AaOXX0F@ЀnkI(\ W TB#!n/ 9aˎgNC" t9&YHp-9Kɯ vDhTHrX8BG C@s"*dx𰎝rsslZ"EJ;+ѵGM. ꥇ%MH];G&|p!RHS%Rx* !ĝ]nwV7Bw.\ b—US 9ِ1ZXd D6om˂ț 'y }u 0ѻ:p\tE҈%ȆgJ_qV[uO e(iw+D'z,DΎA߄]瞫VtjooGZZ[-HƸ}!R썐7˞,RǥaeCE35tܹsn-WKɣԜ1nHAW )Bp Vdz栳yęhǽ{" j8ۜ1BoDԥZ:U+;%i-_?錢& rDgIA1[9 qȑÅ@rЋv$ȭ(A4֨{7o8& Ƿ 8)3[q:H>RT$(*J:;ĠKJ82)TqFt^I]A낭"9 I(tk%(* b8FпHq[> .]XP$H@D1rDrxN|F9vxbYeG"!I_9- c%rqsH- D c(TAX5_BOpp hGǎ(c: I'cer ^{w\T8J`DQ^@ ҿP[o۹QBzXC\m1f!G^.g+wpbx9sTUWqsˤ$w{3Lh8suE{+ rxq0QU]]SS8N!!om8 J=UIo㡵+xC~e9jN>US]Hx 'qyDʇ1[Kg;Hmk 9ޏ9bSkk#b/{xkҗm9B8÷.% ;88h+}<aj@ں:O-ˬzRaSW )bw׿9>毄O-GP1j'$ EWk{5 ي r՝qr ~am1 }j1x5g IsK[+[ڷ "[ 6pc"mCv.vo8*"ƦF!d-ނM)z<膃bN-_ԹwݩZ9L99ulI`˝[dq"0s B94 }Lj1h8EbF}=x 1ZZZ @,ϧql2^x(r_1ww.mEg;qđ\(ThmkeHwn[8%2MrxP:W9 `+[l8Vr$*x&GPƦֶv"9$Hrܹ +dG>D9|)JИţal%kcߏq80"bttvI-@L$x %ߟQ9^Tss9buc[xPDAbwttvE$W87!M y="9ƃ²_T+03<R ctulokA $KUhq3x}1xPQ aQsLCglG wѹy* 60aذaw, `[qȵUruEumejwooh2" as$=@Se֭[8g" Uj+}Wt'&ǘ¯ =ؕ9!GsT՜ohlnUO Fooow;ʹ'I( m@C5k֬ p@B<DZO9%1E_߹`.Ĺ, ~W"HYf$\"gS+u8q[vpȿ܆JoS[f[A<>9b/]$L$1{(' b툦]eCnlVQ9:PšAʻH 3$H18 VtېS:d%Mx|*;.]x8K %M]A!jVtS״*`=p[;)._|iHsgRs AEO+1x[˶g9~.q(:/k`0Yjr(l%1meeSnm5a)'[mm9 5$=Ÿ~y @&MɝW1kL?j+>E=<r3l+A7$=8yT X3.7"{m:ƛtQxb[a#(,:r#¸q㺀87IIʦ#>IRǃNVl+`Aǀ0G"`| y`9n~,0iMmVP@+ZJAijneMLؐ ф m"00 C4ڤ3suyvճyQm|($H:;aO#qm+A]]>J0dJxweO6A{@[UamOݽ88Nyה k!fHhweMEDJ$˪)o*m~DZ|L\ b6 yFf 1~CG {"b<4f[xn\qH[kKlݦC0߳b8W]x㰍8dfamzP$vE#}@ɶJq􍇽Sǔ^ ""˾$^Db?{Pr<4Vǣz7B]lE7f,^yb<+=ig ~٫bxoDwԑaϒ#j^G7Շ>o?B! 3wI8x Z⟺k[>(>d]ꔷqm:Ҡ[ci YK{G FٴI @۝kqtfyXD;N\HuKνp*4+uqѹc@>~4X9iJ! t}R'Q8f1I۪Zzws }fcFbHҸR}~iMOrݠЬq%睫m5p[Վt?<cD{#$2&^R(VWdzkEe߁Hcuˇ $A0p$\6&GhU,ZzMX#Ӂ)Z889BFO֐-;쵄wDNO].U*NG=u[{ ;BhscP$ϵS5֕Ky]fOG7t>q4{K#鑠dRP"GreRV\ǬS>zm Ո8Ć$"HwX(LR425yi+V4eG|@$ u{Xd /_|4‘'I*Y#:+Ct=i.K{I(_RES4rx)ˆ+g2qk7;z$GT>@.]0V2a9c>|[5k7yscI 6"=DcRDE\?_R!-uOU*HcUćD#1a!q crk, dعRZjeЮhxӀx H$S:OPƢI;ۣq툶¾!LI^sGWؼ8SʷZwP=A"Xs+Y<$r4N;{t)e8~;![n-HRd%fl5p$x>ǜs9N)jjy;< ѳnL SHFñt̃iwO:Yʒ/&F& RC\"%p*GA, #X>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>>/StructParents 9>> endobj 25 0 obj<>stream HWێ}W4~ #x9ڥ%7$9= ȐLOUWWWm%}w#dOܟVRRf#7(({bґGFVOau(+גz>exou_q%Z3|$!7#2Ã[NWK*RjIN ߻Z9P:S@Q҆QJQ eA498- Č󔗠Ai gK .rt*=&ĨT96JT.JҔ}H VRjMW2ELrT&Xkq$8T.&X_$ݗ 4{TI6KIxN4/J,jYFt%u)RibT!4KIJ,*D2*RgD~%lnnF (@ &i:@$^.MyOkfe(4&w|Eu&iC@ď{c3C4uN֗R+J#2MQXt)ӓ( 'iIF-ՠ &Ww(JP^5 kF %.i&@?}D7FiK h%PaD 9󧧬݀ \zlWW?~~pigOv]~Yt} c|HZh)v9|PL Z?~/ez8"F7=_~Y%g3OUOSV.I5W5s~B&a^E|5K#9<ܙ#Wί$yˏCJ󁔮2ɕdKO'up4C|z 8vn{zcy 4^߳ 8"./# >RHM_uJuZejБJn:OS /d qSh\ohz!% )TRa1 0Hvao>Iu 7=Vp %,FcStxM~vG/Ëp<4.=[r~rQcݫR9Ci(хޱ̹B%ME ]Bxy9Xul~ΡBR\SqTYQp̐ 9}jO]g}5Έetɦݟiw8ސp&_NAxs>$]IKÑͶݟO_\g" V`@f#8 7ڴǐ|ƱxaThy?yۑ[0rn,iTd@+ 8h' y\΋J̪a{8*X|r< ͛;IB[DvEJ+s 5Ql_*ifF(TBEPae0,:H̼O] <*sL L24dp^#%jhO互֕CD |O cC6(MQRVTt*(ڟJz q xNBj Uɣ7>ٖJy̎+w'Ma>qw*:%+ Y@hO7|%_Q?ͯmp9P$cے_ۻ8Mn<*_Χ>†h?GlGjX!tź[GSmTH+>ƱPava/L!kDT)j%4l]PټmXy6jʨ8]zjP&y[S n/0f*!@|y~/xh,xyPyU{!k?7F<@w QSNdž *>TV0'Uf[$łaX7TTAIh ŪVhHUn.kGl\~6r5䰫*.06j;$xAB5ue!Ϯr"rP8 rU%a6ж?!B9UW"ڵ\T#]#5/v}װZ`ן,VjKƥeX^Ce)N0Ď7%R|K<L6kbDcb67i:u%ȳ2ʑZh 0f5t#^XbճB8LaOlOO;LnGa}?y<"L˙ DtaT][꩒ VB{yl_Em endstream endobj 26 0 obj<>stream H Qd@G1FD#FD#"bDDDD#b1#ƈcD1b#bD1"b_o;` u؀MC-؆.$ )؃4d`p9Cp%(CP:4 Gp -86t.n p=><# `O /0WL` 09|7_0!\ 0F01m8b=Lc1<X2V5cxlcO / xw{>#|1;~3~.p+EtMuM kD-&4)Ӵft_z9kAz%-kEZӺ6Gz-=ѶvT\/RZoz=׾>tO/:W뛾Nt:ӹ~B_Ogx endstream endobj 27 0 obj<>stream H Adc1"bĈ1b1FDĈc1""FD1"F#F#bcDnqЀ:P{B*Ѕ2\<%\@ΡpE) ,< 2p/pi+Ro0=@S v! ;0(D !   :+M - 61DqcK`qL`pSxi<#1`sbϰxxX V7X6ﰅm=v{}|' Gc;Nqso]u ꖆt[ՈhLw5 MkJ4z=jNZS-Ꙗ\/RZZѪFЦꝶѮ>hOO}ѡHt}שC?u_?Х߿:u endstream endobj 28 0 obj<>stream H[cVB 6A(H19$sg#Ћkg/8lٮgj8;egHpf`};Kn(<Ib&ҞT9ϖD1[#̄?>z$3UFyvn9wBwM{Hwci;qțbvVe蹜y$7y6C>@=s!ΉoeAmz3 Z{UjCBgO-i_ gq g˾F-R@kXT::ݻ9l\lnr+؜Zt:Pgg+Hu[֩D#b?c5m(Xh,]+)rfNϗUn [zq9##aC&W%ljMi2j*5^Z@"b}#!WmlŚP 6tei9Ec90>8u\V%j&= Z޿?R7}M)w[27kl-zҳLz)Ip1OyD~ſG֊Ri^'sv b4,)nނ65-b)Fe%?nނ6֭&͠)8(}s)& 0 nsSmZFްX:PsHWC6*>mc `AXA(ҟ 7[~V7p[Tlf-R9C@PQFQqߚ6jU@ޭXnt6MR6;KM <>xj]|0@ ̆ZZj>v.3(jx]&tvz 91eft\MlFH ClgТCSO|)Cނͬ Xi霡UihW !SS\|-2 nrsmjMEiZwFA%iHMG !诿:$H. M-j.@KΤPM2K2SF986&FPUA sЪd3H#h/}S[\ֹ6k!-Auf}\ZXB:8 >F{3g5oVoEc֌Z&ЦvYwL 'AogzjRi]coDAJSh{%]5ݑ>s*?K Qj-SkҵZgM:Zcj }BJ~UC8Mꍹ-mZ֍u.HwI3}_V\ȍ96fJ]x [HVL~WsUntQ%nCb[Բ4٠{oϛFt>s| .pr#mTm `Z:t֘7Dݤ7it?Iv$mp-[Ц+-՚SR+8gkLiHSJs4pkشڠ6A:lsuF~N }񢧮#"6Ƶ64\img K\E];*K۱/ǘL[֬ZKJs9". :tt)PW\lyڠe=DMIJq y;.#K0Csh';{蕕Z,uf&T> +ro(83P#{Z/*\@ga&!0#]* ur0[t={PU:!::G(hy9B .LziRci nԫRu+5V-2x 4U3#:_?KCfB-YWt59r֡ -T Nx-5N:TCOdA]CY2VS:KεRi뜝=z뇧hA~`7 Mm44Ys!lT2e=?~Q_@J:BOBSYzAKߕy>4fuΏub_m4jغZv Cޝ{4-tsրzo>S# u76^xjB)"=bEh~ےFCDZ,tRNru^ʇb)u0^do!-v/H&x;>%AiOtX=9օ:-.d__!D{H&^-vΉ ~Ri\OYLnzO|@ZWzZj0A'?B XjkTRJ@'i:OR`,*=UrjMSC:68p̿Cg]]q @C X#IH\*u:Lmu_3Ve% N Dhb+g=sσ}f~swtPK{`}IgG uXmes赠mZScQ4>^=>KEgkCKHw9?ԇ+\=WPZfiڈCMG);psQIKMcKD~uŹ'nԇ΅ ]1,Mau>;wgW3{qZ{3u.j^,yv:lJq퐽4R/Hң$٬ď]{X>\{j--.1*7Ĺ@Göt3 =N= 5K[|Qcճ_EMnHoK%1ӹ#m˱jü7 u^.@QEnԥs+J s嬠C> sbzuDMoD(4n0ԁtThlpK[%z~L^~z߁^QajWV ' /8W@`i6|i uސJ H>x=Zʚcs%R/40νtTV:hlϻ5<[QKv%~+qo>154XP{zKC:EbqFg^t^)mA×O\c35nD^{?pБ)ԿkPc>zHC^*O%mVa}Y S?0Px{(p%N:rcB It*3sv *ZAKJ@e%4ďxc3ic7ԟPKQgѕWK0+ٜwlYzh6k :by5"Wn\3S BԲe%vHO_Aʊ8@{:Ik-Z]IjHLiq=vbj(ޢϼ"H8WCvЕ!tkuƥ~.+v|'u%7GmC0젵u$%M/9kMMUCE t+qfS'(XPۃ!;/ CmáJViC׭WUXո)XtPZONsLQMs@s}HQoDp2rḺ*g#L]I/+ںPr2 55y(DXO:CsZMFԦA>!ju_}5n :u.֡Z+0l SH>:>J䎏$ME9[wQ)75Zim-sهydEm\*/@OXkjx(R>p%O:>J<} xZ-F *jZr҆83r;%h rkEJ4GRL#uڊTe%aWb悌3w.&ԥi%·Z醱 _) eou$;#Ԕ6i@U#G!Ti%Cij/\¹cjY9Ԧ̓+=q6F[Zc6TX35\Pi+BUHKQB o}|@QO/\d \ckj؉TMQC"H:Q/ƹHFjms9If"hf,MU N\XPҰY܅XrGjoe)RSNt!EMo,'۝w31/VQGZ鸛%JCN؉ǢIxҕ4?0M^8yRn!ڍwK8u] h%1ɡω4-E3C\Whjq69?J}yt"a;co#ŹZ9}7sEyK#ԩg^ M+չkiqjDc9DNTD u_ұx=93ǍsVj'MzRԸ4yE:̵k^:&NPNաN^7>v^KOLxL=.oUKOz냊,=J~zW:;QG^h_Qyhf֓̿˲m$|}`QJ ω4!8RWւ؉ٝȇ:Rr!߇XYO 9xHgk7yGoVvPzjĔuî=};gh{xtgB, \CM1߽4ԗHM^*kډ/_/g0huй;JKZijْoYX;Qkfmwhz+u7@ۖ5y5_&}t4s }7Pu-;qDs 2^Ʈ9reZOҍP4K7@ZEBv>Ncqx)MCù@(ҕ*IPصg/I,p盻MSyc.%Iz+C6i9;hWq*mUEZHnJ߻m;[ޮ=ډ/kJR^=SZZz>K߿޽⭹ogj-Ko;ô=ZYjWDӏs -~Fc:\ }lf\rsvjJszgwn qУzk'C/Ijlڹ_OSu@m9Բ>%Zw$w CODSѡ4v9KF977 vt&ij}}`gΞ>H]iw 5D:G:@zX{3e M$FcPPwzԴ>9җ$ÇcBqoBmCļ_ku^Y(q:tGlV\6BGN 9C>zVe򭦮ݡgOjuGGz1֙ZK[ս&. =塓36YsAxef%Ը>fp)~ZO}ٓZ1αjiR}PMqkI'OOyX]^jԶTQP`F M'`)(Ֆ HKMchn.&" æ #@=]~_ý<90BzEOfG\N֢.H:Acַ2k:~$)|Dx|`< IϤ׭[hWg^>n&j#jZx47@ggK5_|| RL|o2) jZHg{xtsFk<Ԃ:'` Ij^t&B>^zY3 Dz-&ؽ^|֏C;@OWCΜt.IOҴqL W|>LdrGzÆ mU;ߜPuӫf)j!AG΍w}.t D-i)j$;S?\/ DZ?_qeLz5^Vcy|\5մjNIH Z]or.OG mRL| ۀ4?Gz;f"2-^7nڴ)vj#*eT|!RK-t zr7%q.HsԒ\>~p?CAZ=oi$޴q捑jgk2GZP~LNPS 3VCڤq(Բ}`4KKg6!z,N4HoٲhSچ G|i:G-vRC>TzSs΃Y9 &ԹԎt#H/g(-zt'˯eZ"@?x ވ32f~}·I*5~oqNKM|Pラ~ƙ4DGڦ4eHm6Yyfg>ZQOw8IjȇWzZ7QL 顡O!CƙQXj[p&7|ED&uVq6v׫q)G>ARS?jF3聾op¹ 3~ |L|P?Lj{Ը=yG"mvmjlF@ۑ5·!T;ԔjGIvssqzB)jJJ݉0|gQG"=u۶mtddP9O%&5t`5C|$ 4Vt.Wֺ6%ԜM*5C}Ij^NL#;wPأl@_;DMSQ"*i}k<[+K]ڏ[,*~49j?ԯ 3Ԕҟ|kG vHgC6qZ~xԜ$5n_ν :C I yp'L\2#lB]_jJ]'͠xQyr6Ej%KIj}P>iуt k.]FiSjUG>]3:Չt/4a1S>.~$y&b>EE=Ku(kM؀ + iC}CmUFڔ4Z pLg!RPCQHE)ĥ+> һvlϞ&^ϓṄÑ6. G!J!׈B1@vRϰ~Ԓq3q&R>XG<~ւe 5#I1Ղ:x z{S^3ZMvjZp&r>za&X @gJ}-a؀|p<Aǃ.{sagsYATj}8?|Rۢk֏8]<%lDÑV59T5?Jz~Ut(N R߃Rc>vE5zlA)I#GI::xyנMy~U7Сx,z,\/\n$Ҧ4–*ikʇ.I{ԡuRz޼;+ſs8?4U Yjou&zEo՚܎\i"}^*UH |X 'vfwyWj;iZ _HS7tz݆M:͋~6+RFQi>aHut5I>r5o :5 uv pG4}+R|ϖR{C<vkF]&1AA{LŸLZF"c>O.@LL/\GN^jGRS7JDj׏*tvCQnimV|O4ޚ+m8r豣GQ*k@v񸾞K8 t$mTLM)wB]={J6IDR[mJ>TjzmhwTgNHf*ǩӧϜ>d Ń"1id31cm9i͜,um&vJV̙3gNSD4؎5.HOT|ZjG(5H vlw&Ӣg_~F~;Zwi* ώ$u|\1=,ՌZHz؏<u!u$Vb_şg4Jm_x~"{yx={q 5N{H|tFjY@R}HZRA7Q{^jN]:) ϝs cc:'}5͔7ӫ6<%"F?뺎_Y ZpR`jY#m5Lx`,fkԚdVJRH8^P9 _~ yB jOz^sj&vRӛ R?o+MJoڻu+"ѳnꤧ0<|tPֳHNKP;ֆHpk`&5=),OjR[;xKҽ}5e:I0>1{iUS:矇XIaA>k39J5^>G]11IO":HR_~sҵ.{ei^/&\}[ :*bLZaϗzq@]Hm;x:y@75^hMTK e;D遁 :.c>N65m=jG"J}yu u醱4>ĶRv8#f5Bmke5YDRMSHs>̺]<ΪPzwb;~{kRox-J  73넚u'IG| ^EL5MsI|5GApn*3H_IDAKԎzxdxdX'Itgj>&&۱~WR]RZG.Xz{H_7ԛ=h׎zttdXqj8"V֌lS$ԥ%hGڃBIJ"n(tx#AGgLS<^&ޱ^._l|M%y6s/g>.pmJ_|ɥ-qXVM$կQqeHU-1K`]9Hڽ۠.Y/Bϲ\S0Ï7dIi n=k~$R?y19؏< mK{QI׽PJZ0<@3Akc K9ny?lx8?)ǵNQ߉0Ը(b?^+ƴ޾ZZ|L|ڤFSe8udb#iZ8W@ۏWt^iHHk>pR;KƥGeZ~5.!1jzӧB? picP kn-`!RdķI \٥W|,N*uzãF5 "w&Z>(DZ~gjGWH:gmwmgh C6s OZމ Xj|G1jGi!v".]dz&ڣV4J5\EZaBC;VA+qy2b~rH?jǝ+VMLC/H^:87t8;uuB}|8ۡj CY;UQ@B87*H|F褦b^~[=HzZG&uNI!;kO~`a䨍u۵Á%VGZ7 aW] }>VE9<YjZzt7nyew Zj:xĺ.)(5j gL; Qwjǚ`mQFhTZp:uC9OW@b}^(b?w ޙH qZKAjy`5~P#=g JC󑤆|RQܜF!vݻ RkAݜbs?識VxK5jEX3l]gPEiT@>g߬5_||C^~/RQ 2-IM%!r@lԉl=Y l&gfS5̹.R5_p_MG?AD{Ƃ$MjJMV' J=Mvol;t_|zGq?>Q|G׷ 4dzO"Y0J>k>rrfzT+9X;ډ7vJ+hUAYʺtގ@qGA:=_pQ|){۷?ZjmLt(RoRGwyVAkV|$0ށLaBbL%XTE}~MP;~6~L+tOdFР9GоI@žLۿz7 >Ӛ .Cnq i4 )L+M8[WQq|q\kIeä~^F8iTLL'k|jE>ڒVԾt{9ҦXi%MYM9/b ڮcuҖzMjZzxFLLC >FDRͨiX?>Dzs(c'@C Z# J_Cs>@GR҃~ FC2Z@|ۥu.uFc34908 9 A5v\C[zR҃~2:|8Z#.|NR OrRTxa/:z 99'~c|dR~U3Ir u>,M=R ~֚#P7KM9,5Q/) 7>!m9G:]Z8FG7\GLj=cHey[aWLFj=5A~Լ@/t=3WpޅcoJ:V]?ӉPk*T~.z. 4@q|fvf5=gZ o%H[5ZjG&cGaX',u5^EL5DZ̙19眣HS}Ät֎D2;gڕA/wi>j·J]>$( OTjzuT~@Xfcia;21A g~z$t^+i|P)t }?*8AwiMwC&zc?&XPRK?GݕBW)/?2 O[mܨibMi&b?gC4j@CA] .tťv %D#H0-AZ >Hs?9}[03kuCf@!Q.!ͳ$,E@96i5:CPU>WPϼ^aPWؐBͭ(V(j3bm (ev`xhu߉t;>)gX:8dB847oa4>J%I5Vu"Ps/b5c獆:fԼLr @}XnCmÁ: 5k&ig#@oٲu[EQ:QB-`UP3ҋ aʹHLc珅:V2@Lպ?jA uY0*ttS/1q@[mNlJ,QPK)Fk,zB]/=% S5B]AAKs,4@tw݊#.Ťi>Uj.ECT!ȡ "O%ԽPEmSI+0jgm+r.H'wסZ7A8@8^ 5J+>=Գ܋jԽP_CA=0ڊ:*ԉu Z8_ȣu:wPCMF Q$jCCmLję9EE}:PK VAQqAפmY:h -erXK ND]҇ 5IםxHR/23tTC*F}PjgvL+yt"m OP@7(K$C9}ǎ=]oI%TՇzN{u R ) B-%`m7Vw3sm@ܵL4ᡖR,GȝHgz_9ԗP+!+#j"j5H3st$=iC4o09Mx ZQsݻpᄇ4W"aWJUW87wnN{WNu?+]qPCՌfJZ-h!]G&Zp'Źo-.hq.K!{/4DxQ 5"T=XݒέXPCmG^D:ʣ7<$ZB6G48bEz8xo\,Ө"j =lj^zJtԙCMQ' HzxxH7hVN8o7%>FT"x-/AܹwɨPפGPP҄Zb-FZA[!^aP>qL:VրHgFZ4-iq;9 YACINPwC4A\PKJP;iw z!"-Țfy-" w"]sH֜I?p ˃ ܈F"G)OP? c~(kꕫ=6ҁ5i=Y0;-tӐG17 h.AΥ!t = 5#܉;:A0d4X(鈚Y0%f}tq' ]\4=-C'j>f܋X{aj!ԗPW ԅZY lͤUz'> [,]HGuhhl.(.iy3B`á@j|)''kԁbm- :|xN@!G) viqdGl3ZȜ=0/: Ă=@:NN/ :p9MoioIBz :B ХXT-ƚƞ^YՄz~GPl Ǣ:Gzy] V)zHiԬ 5QTG訫X;j ~GiG:n#8Z@j j/ĵyz)`}Iw`zDҿI?NV,_mP Y]TRɗ={=#h^^XwquHЭBqF]h'^膴<"MK+ҠXֳ7H;M8xfb*aT9 jĺ^4bu &[\';ttBeL=;B |!VrU;FZ%Mra7 :]t_%cj 2hge!S$M=㰢RzjC Y/,q,-N.. H#=FX"PQ7Yy=OS^UbAsԊ6Jy1i4BA4mӣ6y|+!I@wI?G&ɨ5֪Uqhb)Eǚ:`ǥQ0/dymxIZ#n Q5XHEFA-i 5V5ZqudTSqC@}Qze}%ڥKMiu'^t!mzLgyitEZCRdp+ұXYSU۩xS(*G%m5@=OPS#h3qG{o )AGe)Ң>iqYm=ۦjzBmnC-YuD \qsKh%= "h:iǽ ^!k:4":Z![A-&vTM=IG}Y돩ZIi &0Z8<4ΑΚ^7iC 'iCȣ"Rd uuPu'F5r5+8⏄zq$s+vҍoʃI{vyK%&y`Og>1äOnX+S?CͤWt /oH_ y\VyԤ-]AsKwMMWSytܡfwx #ͨ+ր]ڦޓ:#P7ϤzV1vIC_rG@&w<`xaIf [T]O?ԝPN= {..0MmɚVM_zKWfwHy(aԉ5ÆDU6܈5iUuAI]yuiM<"uHH?*,Y f6Jpp^kIVm$j\I\25uXM UԶks<}gbvm>w_YYdsHm55a6t JҰPh,l7u~5F.l vySzRnu<@DkD;6xEi?PCzk|dk:CDj|.Eî+^/|}۷n^7)^XԊ"mېb*N߉:}Bz?5>c_:#;D(R7tGoE;@۸#mpW uwԯ!6HA{`|Yn+Qy|k5`;GàZoZ"4Z+$XT"–`W­W57+aUP'!^BZߊ 5,FV!n 6YKHEh>AOe%EME]Ro^ajۊH=MUaD4A,=TjY~Ejً mBVkm%G66?lJJ;֍kWS@=;N [HWa>BԳP/0R BzyܚKM%6|H5y>޸\׎RύSͦJKyH; ҫPCQsYSxB:-w5؂]#A#y%֢gE]A9 Dc~'z?l+ԾA$R!+XnHl(;颮E}Kzb؊J+OQC#-t鶧]CwbW =6Z*DzfE*v /Ҷ/]01vz:;@2OkMat\ڊ:D *-R!R׉5b`S6`@"E,E}POD=3HLε<«-͑ 1=TZw"ZƲhuc=P"؆]kDQG]\ԗ/ԓ#Vl ZYM[y{:J GO}0P[hBu(8@u%E]/;뜚OPuPT|xP<`!> a+ !P!J$kliƮ]/8 KsQ/=jkԓ1mrMsM{ylhn<[F̥>!USkYKWHIZıuE}B=9N~j iya5m QISQI-[bYɃMئ ~!鳧O@=mIꁟ5C-]#P{PU#5 T X";DMW*}rb_]ZCts˥PsPKh=lіy~s|HQZ<^=u:eBXS'[gACAP^<6Bmy[lՆyǥJrCEZHWiuKOO=u(nhvnx7k0x*ޒ,SKIsw"}AjɚˣfC1D ֺ&ĚJ;v6nJ7ŻnufsGQ-'s_x5PgֳF +KaA[ѩe1i,zkp8p4uG9<8үk`=; l-LPVX7OVAlnn!(y5׹|N4A vGi}{vGjř ="HA8T!V؆hK)7x3^C3r/j~a.hzݻz%֝(Kѩ\1``v6h{;n^] KĘÜG+ ʮSzDIZC"Q?޺ v΢-Sp乹9%hQ[gr@UB-RkPBRkю =^{r(j9't36k!^djuQi 55T[`cQ;rkw0x NCSI]g|E[ ͯ:XسqV-mA[Qi/JHۣhw^)"^|!\3t0'x(DB=Pj=bX` vMMܩK= ޙ); ԩ\Z^jkڂv"Zat4AeH)_xVk^R7RACMAUh]Ś;mmޞ ވ#9轺e!}w~ԝu&Q:D74DQb-`;sGފ艺쫳CNпQu \s.K[U:F턻zKp-ް;û>|}{-/iss:[7ؽ|U;*B kQlZQ۹{č7'L}АslOCe+5TB2jk[kcE[qw nFz/6J v gAj#;R3݈HMN{lmFĉtVQ'0gt޶mknکǎ<^cVnH7z7q"Yѽo Jo35t t޺u憺Fjz'j:5ڱ=ڢr'N.ՙw⛿~Z-7ozndΥ=.mnBcqwwΜvqA>ҋ ?|>8$ϵ͛6=Ɣ%D-4%4IPVlbCqY|oFvq(++5cnZ:8U!dJ"PW*$HӊDjbB/w<M ?{7>-PwmOW.ݗZ kÎڎ{pgWݻ l|| ӴgZaeyr7RwNN"LE_G@L6l~< fMزڢ-s'oYp'ɜAٝὼ,}W}W@ h"Bgذe8ؘ߿?;ԉ>Bז;{):z7orhtCv-/sc~LGHVۺ]*`N^˾U?CM` e*57o^LFe>5/v#xG Խ; }}V@ :#]nʯON^|9Sic5.6bv-%x'r3'tR_ X0K-\ ^eS~5+xPڕu|Db۸wWNN +Cl+cĭ(?{)PHb vir'Y:ڛ>C3E`<+?yQ[Ckcc증Ż{q6. CHj"i h>GӴ7Z'k\lv{wpnՙU>ۣKB#TiO3>&cC~p>/z=k/Zbl$ܫ3+>\JRuif<#;.#6jny8{sFuu7y 6d^;|F3vDЕ]CXa#Ls)+'vZL=t;k+7y#8 =e.W:eC x/A;[M۸9+9BI}xg]v!kM ~,P(&&S4kkלf*v1ߥQQn^Ybq;qg+3_pyIf+lANϿ6 0?i endstream endobj 29 0 obj<>stream H @msm۶mۮͶm۶m۶}hP݃Ԑ@P5 =,Atj${dP @56=qAtj{BP@M tOjRPݓT@Ԡ5@tjf{Pݳ@5=/A-jA{!P ݋Z^ ⠖н4eeA-t/jP++Z^Ԫ@jV&At j={}P@&679н-@m j{[PۃN@Πv+н݁=@ tjo{P@u@u}$AX8P':> @)Nu}:33At \P:ԅ@E./u)}A]t_ *jPׂ nou3} [@tNPww}@ G@= t?q POz ~3@"@ tU5Poz~ ۠>A}t Pݟԗ@W-At'gPݿ @7A?̣ endstream endobj 30 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 10>> endobj 31 0 obj<>stream HWI$5/ tB]=믿#<_op8}ߏϿ=<||sxG(YR9zs>ߏǑݡ_@Gs=ڏXˑD #hhGZюv':%xSQ!y;ѡBg#Bbxj] ?.C8ƼQ!~;ѡBġϛr G*[;R*đS;GͣBwCXb="qNbCD2t7 PI-cϣV pnY1"'IF쉽?5">6doJUb l12+/P#"\}0ԈBpK]7j\+Z&9-g6]BȫF(n| ]`:]=_A;B"1X *㛿lXKj6A''0@u0QC [UVp3kR.>IDz_Jm&dRƌE054)oFhYV"60$8 8]~vtr;RuFuX#=K»W565>mEp>|-fy,wfn]YRB9 ߗAR_;fŚt 2< h&D/e@KYVO-o@jT{{Y"fd$ qEܚl9lD)NC:' :uCfEP91qʐ3m.Eι2h;Y<@1n@夔5qFv&Ygԯ"9KqhYWXyJxhy"+D]&aFgL/+g&? Le śT%ӷÙ%erL"{j}3=ƺ^#Ta-N:mO"dǠkhNzb,↺g MJ)U^\Z,P6GCh'A 7)yvelNś5D54!E 䡘])Z-貖e% xoĖ f; ƶ OۘAEr۳v|u~KvK@s@tq`~rb̚6->[1B€u99 b@Yr$&(iR䒊m2n.W0w&mGVtlb;Yc&,DقR_Jv&m7Y|Zw^R;Ֆ]s^IVtzq{zb\@Eo5*#tu6UO(~*tX^Ll@dV1VD`Ӎ!p9fO>J/W7mP WGo5{$3D.'ZZ b$P֘$)K6MFcM3ڐb^G&ˬWh=qW]Ek38q]DPcf^f 9}vu SnXm|[[Hf=c ߒNDE Z){=%N$M4@ OcGL3=򀗔HÆnI#q2@9#Cܳ8&J7JuBz*Ќrmzc2F.&iӧ=[,'&Ftċ#dg5x9 :ǐN|&(b} оeQ*]dX"#q$мjŰc]Է%62ի(D)64ps1rӯ6G1MS8]]5hϸHοOh3@kJ٭`%ތ=!K1,Ph"+}&1ME\dIENE'($*"R;N$hL}TR~rJBWC$P;>%˴6څ)EKЄwzC4aa9,:.*avl*MgmV!9%> /)HZ}ڣ`‹ ]B駳TL՛hMrD9LnCHyejXle۔WQxC,)Dx& .Z(hCKP#ktYl$u'm*ɰeFs櫸#..KP^'&)G5PS #; nN61x)G{ pþmfsE#YECU"P>Pv2&}bd䠇.l-_xRq'WӪ}N><؅ \ޒeBrՉ-4՝{E@~EJݪڥsh)Cљb43Ve}FgצdIh%ߧXj׌S4ǂ VmU-)Xy$D>^H3xo|f\.qyz)%Ց+{NSprF8IJph?^~r_K6q^u̅ D{"V05k" Xn>?ٿW;L^;v/Y;BPDuV~pU(a;Z++'U%;9Ey~PUw0󅢸"ARTOQS ǡ;DՈI23]GsJPe8`VC1kFғ7E Ȃߓ jmvO$ǡ;D&8bkaQkz 1 졚5`49i,bA~$@GՏE3%$!@8SVFf~ipW:&HbZ 䱠䘩(#Jn$܇@9C?DYuKKOAq,c٣`_ǰz'1lRr1ϾU8Ɉ>}ꉣf^22Z0__@*N̙C0qW$XiYca2+/i\gJ %I"FhvE:0QHQ{llXˆ :`$-!TvvQ:& ;ɸ8QC\ɪ}HyRդ;&NJᄤ|845D-+i97.Lm$h;nN5myԄ]þx/kH/; _Mu8lPDX{@m9'Y@+@.' Kgp6 = 7d(Qz:YWijq)lrdb K"C9Cu yNn4KO)٥qXSQ%Fh@%bAtUa!$lih}P긧1LG&} wӡ}YiI^bRP\e>')黡I^Տ5yĠ4IJ_@辪QD# 4~<ChyIiItl'.@O瀗@|A*03W%$쇮 9RX)ۊzBb宫[@m ͋{74O{t87`wQi9_8ɟ&2a"2QǍL!:ɗ3ʺV!zݏfC¹|o gC1U2ΧQU u -4cKkz+$%-E3)G.!X7ik ЯIG˄/ ŭo{et@'ҭ%>g)b̌r^^]:5p|1UTp44L.KD!S*˨.^[ł>b=׷WX՛@wmn||  RgHҐ?JR%I]u 5>0jzKxb SW{$)CQҘ^ f-?3?9Z#FptWݬhؕ婳ڣN0tydks_h_yDxL/'OZ_ón#P & m=:fAO=;3$|ũ&tE$U}F!A2*%:uh)y4$p@a̕\Kzz47+I 4.ԟI{ 'q%W3\@zV}ЬkRNL[? LFN"rbcGrbS-1*WOB=bEOB>aT1=Z 3T( _GLȄ ўu5wg.H]FH!10 ]vUbp|tcE8}W)}R2 !ˍ!rb9[9JP=M82nj#44iT8ZZHP >T0ӕ:ٓ4ҝZD# DZJi#&$cdQ!MS4NJ3,@{̩Hx@%"[[LTWz EeejEVYoZÆwڌ O2+nip^sk턥8 s%%O1ɸ;m|ݠY7[B5֑ծY*.$ l~RѪD`#1/ s}@*fqkKXGvQ{_uR@ګ:?Tԫ^GO%C?Brsʴ&ْgjeC]fB䒏4v8;b%\M_g&0 ,E7he,('ZeG@>Vճ3k=úwWi579E’VX25!pb(. w>E&8bn"ѺBȌPLD@q:r(qFZbGXb#Gu'%"P\r{-H`g92!ID uNbϊ:P3w &6k.6tD Ȕ.%u`XJ veI+%9dn?ѪBr^C:Î! с$ʛk| ImG|21/%~UNi웴ͳJZ!2_is,ٰeZ,)QI厂mƱPPx.u."417i(%H05OѤ ζS1xc.˟TӇq ")А5{ȃdj tNEƲcf'N",v.`])67JWIv=Rl!H\ %-EiH;jm4CxekCJ;6l%v/JXBgs :+ΖX<RGY"=%`1cMZ] jFrʼnRlg@[y,Q@", t5:4빭0Ҧ2&bp7tIMX_ )6YpJ)irIiWC޸w}Y PSۮ !8a [ xHfȇ'")E+^Lv!Œ"bn"Tus7w7oQz R6go6*gfmfA5XrZu<%Szbq٫g3`Rz1/+v:F+yԪNYql7 ]b1`Nu:\SSKDOґOW Am1LP?2V'R87h:snqD-CAYǷj]ұ8p RtVѹ}bר5z2xpp= 4d؞R֘CX3e'E%Ztfwx sl^ٟjSbxM:l>].\\>Z+ؾ }89tPjqHՑ+a;4EKM%>wtq$JؐfR'.j\?>|8xtw$Jx|X_M_z-<[}rM@i5դ^>o~^5לkR)ϫ٪b 6}x}ysپzw~},L#T¨ɛK}}0w Á`Ox>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 11>> endobj 33 0 obj<>stream HVoHbiLveDpr(Z&'q6I89^~8Sheay3>~<ӧ _4z\0d!| LeB2 ,37^9Y. l $/v4ms/8^rIC-:{c[5'~ĉ g+7 Q2Lnfmt.$CS+t+)#S %XIXK sEw XjJ1G'ś}R@ɶO6v0Lpzz!7tsZ4q_JJH7V~uZh43W5ʛJ:,mĸ}𔷴8%lsv;j5!M[iAjT)nb\uy WPM&Uٮ 8F%H<#`svA*|Kqx]q-uxE^F=ܔ.O J%ʼnIɮdܰ*#X&!eX=IEkq~h^ө A0JVL&+Q ζQI9o6`A6CīUFZ6i{qͣnͫ5L(M&8f7 gӠtP }@;7SqB TeJf[yHJδi`iuz*.{'w78HÅH eKuaq /NFY^`0JJB0W&ECY8no43f0qû{/\P1|UހmYS81MT&g`FɈjgxw?>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 12>> endobj 35 0 obj<>stream HW[o[~ׯ[[ I^ &1RHR*E>lɰM}gxKI sn{/63y㻋7o޾GVϗ+N [L8# '߿k:pӊOeH!sJCE1l-5T XIPu,҉SVS1+i(]$S T,Jũ-$B[NQ%M,|=FXKʆkiB,tI%4iԊD b:H%Ե͢mFQ2:i I ZZ(%X?QwT^T QektTJTPS4ShY]fiB * |84K3P)OCiiP8H Dfi*+$ JC2ùYZ|es5Cd twNcff6|"*("ߤH [ރEZxV`fiBOC:iBs$ ʀhȅ"-@@n%[FP҅ Q{&/9$a!\Qadq^ TJSDdHHl3'`p)aEB'"df;ۦ%Up)c7%) VNKfn{KnjNh_ōFQV$EČXC7uK9dJ%u<"ji ;mSՉapR>1R)/4g9ϣ&#J50 ׂ(W6X+0@k^7N)cpm+isg4҅{-V V3pc^!*g΀AUCCcM:qjMl'}K0\-Y4x݄M8ˢ`@ mhPcpWeԡH!iDDg\^9.Xږi4zLX"ljT-w Bp12Š-hst#t%*v1xD~ d3Jp9`p=W$ UP1[ РebPc;D]ij7=~Kqp +x߀aq[6RŔ^!`C{aʺ0qH.Y}82b =| =?cj 3ƖD0Hb<eX!Y+Cr d2t#̤%縟\&1LAvIZq "= 0 x!Ԁ|B jaTwH wW|<͇<: ťޡr,1`u̓}j>zVM!Y;V<Դ/z0`a, -*ADҌ.'S# ෴;#3t1uרpč0G? NӾ""ӏGXh!džͦj= ۹vj c4u)6&E2YmV>'S# ɩh|ENd{f1,0T[&dwYYi8zΤ隸 T%4܉ dz}wh:T8i;gnjw [OT qTOYjIIKfv=(Iis'8~ lZ'jJbU*C'xZYkuL~>-׿^89<%N`<(Sd/_RᘃZEe8+WAw*˗aGC/}>k_kE|ͬ=/3^-@BT=E]AN%~#ʲIc_# y|vOdL"&9Ђ*fP& [cojl?Z 89iձX̚T7asݻv~qs*gLVMp >w#%1 wl9t֨ OH +ZEH4ԝD%)L%%z?u۪'BwVȆ!Z@F oX=,B^JT^z>eW}Įj=o#!)O 90ty#OA/ q;H e_ 8L? :X 0Q3jOH_x w%g%OuOU:iUwn\6#Պ{ytx,#ޖC*(HJ1 ;z6N2a.*B.ORĮĕy݂cA6k>/nSn'dX<@mGo[G^B{/xn,%torT7GW?rT0|mmbY^j4RގkSu+o= 3KF$FiCO+;-l,!R[ʹSyDچjqbL*=Q4Y`*&]caW>Q=]U1~}:'NB[ 1k&+"xc9jHwTPp6G0ZZ8^P{Dz8>-ؙ`Xt~l1J4Wqsө;#Gh,c48r/2 $98ZҼY$PtahU6Opy6~zW`?\U'7`ݍQ?lv6yG1- ;aD X8 endstream endobj 36 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 13>> endobj 37 0 obj<>stream HWrH}+:oR5Jũ2q_փd.FDq_= `KY5HL_N>= { lޣ@oxzC`Fao(#S/8(1SeRk ‡!͠XĐt5M}x <#S#ZTJYՁ"y+ܙn`3(_$v ppOeIjjMO X2d{>uWܻ؇‡;FH`$ExԣB3-I9qMbd _E=1j?Dr M7v%,U^f{DLo/"Z]:^qȧcX j]ն::נgzfjnyTaP}X>b v (?BA>͒5T M1"6bT)R鑀-܁0,fEĔ{ʼI~gc~9 m^ E+e lɳ1@γhxc =Ps6)q;8>GJQ;c2c>N˛3@(^8n]Wbڙǫ8 ;ܔS=ӇZN_DIt@`'jḎpQF|:_c C}_e@Hwt9f(2|tsv1qn @%R#7`\yDIE;آIeO`1N% ũG{`O9 endstream endobj 38 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 14>> endobj 39 0 obj<>stream HW$+&vj@ Ȁ+4ׂ$cG0S'{nv5<}E_Ǘ__O|~ͷ|O/?oDGK:"^Ā|cE%y JoAJiu~ n.|~۫ Q]cDqqSƀގRH)W>ʍRu}{ JMH^?nij7BJMBG~}f؏>8kzm cDl}_Ay gtC7u:q#:#D6wc1䔉7EbpYsԉ^18i4ԉP߉:51A(VͮND=Q'^H8 u4j~^Rv,{$:}u"ٲ4NDtpԉTH r :J!"1 qiy:Ύ&_?3fzԏo֕b\$ZIvB?P$!P9`H%BnF1ȉ'RWM=oo\$A0/ +Vh"ˑe |H 15DTLf,L*9ÒhqҘ2tLd#cZyIN%ӂڏ_ok 'ۥ1 PDgD]84.ay㸏h4w˗Ҏ|;Z_g+rQ=1$/C@nh #-"iT/ EЏfP'Yi^+DR5Dc -Y Au,$^t8 ko4d1dv2ύVeR [Iґ!(hqѫD1xL-F *hg^ZF^Goy0@30Bڄ&"-"qmӈ.v/sBAi2кn䗭>V­CTJ͐@IfȠsɛFN'?MY^dX'5kXǦ{48VH6)E Gb[oⴵݬa DJqqY$W@}&>&;F+H >1|!ґ=Zb$%A$T_dh)Buΐ-^M^e$x=..>Ҋ 8e69=X,Fۭy<vI$u,p0hlJx}05%wU ҈7_+cEޭ՞xY*fp#ύ^BW(T:/Tb@Vh _A=JNSCLՎhmf[7Cϒq:(UDN;Q__dE{ &š&,>ϠG5g=]Q\as9xwUBߨ )/I2i7Sc\k#- Z¤]̘a\Į%>[\6t1HmC.hkhԻjFT&xf,^h|8yh+S6E5 ൡ]3LÓ)qү +6lj*0,lw|>Q*zs(P }O 1V%>(T~.-Yo0}>Q&^[dmhm(@ZAc(^kΝט Zm4SuH |<+M'1zðQ-yxTڠ5˗ 8 H˝g6w~jFY."cY+Ʈ& 9,8׳ǧ %`GP&,\sʄO 0ry4x]ð&l38msKgܧd]=8 c9'L<5@Qk ݎZEщ}銜+:?U8IޫQKxc  #>yJXc.d7bp!2*:EWy'Ǝ x/UP8[Q6X'?5tS6+$4Nq{\-E;tJS%&S9Σ4qMTsȋ" u#*I,'d$ĐWXRճb)-ϸ6BB]*z.sԣ#9A7"9%m> Ps^|㒧kC8,994&{*Y_UKZFIqiwSI&\ A²d(IU)"K.Ҙr 0619{'pju,y~ PacI ZZ4/PQRTJA @:ĭX` @Ƕj~cZʌ Q/[v WvN=;HG*.תa6>c:v!P{+I(TDXW+1tюB\ҁuEŰ|uD>:'R=/STkjOK(d7Wjϸ" 1qU c/ 2\hn^9kXbٙI]Q-A`;e`z4=nφvdI?E>Ob{H$ b1zL~6h\BxfMKƵ}H9 уpd/t}GXGJjzʳ( d c-=cF#ɲXVh?Ҙ%1:FBcɃ G?R?"FښQPx;hvYRxee&vZnLϲ Xԣ@{tP"a3PtBJ\0^oo=MV)%-É\^~bC%,D {>Ď<ɿ;W/]Ƭφ4e!@uWN 5+V1*ҥЏV/T`z4=#IDE#v+[aTv=ޛnXyo-%'4&4-؆7xlVgL'(F^پlQ~bAx|/ *oOPp󐁏+̦fJIwP.)&U2~VvwLv}=}uRزǀLJ+%`IWHc )1&#ZMs+%Cy};I&u5U]$vy>RV˸PqD܌22wNpNW R}wQs} B4">MƵpYB))S `tg\#"DފNv<ӄ>@)?éOz}7PwKsBۓI8 ua!3Rʃ~ 9)~MU]ețS_»V~=PTQ֜ )N3L{Y5GVH j*0+D?OEyYϳF@NTE#ujޝ4݂]G|PmIJ%> P\3 f#y=YЮ0*!BH V9H"wș\sPs6Dp!DdZWEQܩ1 1cu9;;nn8ndt}ǁdkjcye̱}+ Q~id} 1ƕ? Iw&' E|n7~59pg:t_[=\^Ytݤ} g~-F@DdxY BΙLZ`V,)uڨ ؗzWԙ +z(.Qi1h:dL'p {(eC\:x@VUm3mTj#,De5?mdbރM`e䞅g|JJ~ȵRz %z>LkF鹄I r M ҲV[%?WZްВiYeѳpÉYo*:;i$>RIl>a;1˔{ ID;63_Q k=ZO̲UV!{p+Ss%@W{mIA{ %ϭXgZ_y'.W)A{%SFÄ-NY˕Ufr ?]gL>>=vj,#oT`FƝ%3Rh$,lo-xX`N˔hR?*ّ両:T=# A-u`A `45#c,$*3` ` Ug)Xy #E~h=Z8Z pZ;%Qk42TwԐpTS- uǯhP)DcѲh5T蝊)q:^K7AcG ~.敵 eulfK|%*4>d}\jK)ƹ6h=crӈ>x֓RMC1YׇވmYeo}lN.s"DFY m : on,H8@Z'(M8D L]Uѻ#ؑgwJ)VR,:0 o-m}ͥ/^]Ukڞ(ۥkZPd#/悅5X57',6F8oa+ &zdE@(3]'p/^Y.dqT$"#j^{2bg)Fnh¸PilO[0JJ@qbNŗH< +gƨAQ:WLJ2>KaxFX.~K'x-_.zZZ_ʝHyb  !.3RuR'*r!ypi 1kdƑadp XPsLh/]ЃQv/n=F[CH,QCt2;HN!'UemHi^xkQ!}Od8Pk~[G9=`T2fayKIg)X>8#Nh7JѓGJ P׷QEP0C@ZedS1( y9e]@=B򉔃NIKA.4X.atK=Dda5];1eEqYǘUk2fJSryK@ú`IKa&Ƅ`Saf`CaF.iЩ4AFFMI"u54#erRUKnWr< RR?.TY2 u|/(EjޣA4%x7ʎl5'އ4H?TODmԀ7Xx*M78r*YzQD2wIa@j}O* (-ķ1`!:4^;3~MX۰4];Yi%5mUQed]!*Ҙ4fs1 )`}iQ@=4㸣+mTRߦgr*X)eRqH6zHS8 e `5+M!KUt /T7n_R@+._{ f\9KC\nuYKicsXYLf蔧/>Auo 3S+珏T_I??}`*w\z8a5 _񯏿>l]?7ٵp\NYr漞Y] d♅DHx^+o@CAc*K6l%%ROl%* ܄b~B{k^* t!n@0Tխ5܄j0j" _t@4A81̪Ѓ$Z֜AFpK^pU6*ť[[iFvMQ[@Dq;Zrxb.Or}:?<_,jngPfgqcO?^x㩔{ wfû~tx'Wt&:I;`;wo?O*Py0:c9j)ǧ+F֯ F>3xZ8:R *1`5+0F99H76ARnƒ,fanꎾp\gÓ݅Fc7>`i&8,2J>6}nQZ_׽Nw^(Spzygu>a /**[yb􂓉ÕiBRk]n`~?\@15ThHMIcA]۳;0!jBM* 2R}HVS|yh wTEVGM?9'9Tj59||. yLQOcmҜvbTaНà7oiלƘ{޸Oc+5?8gΛd8>4j!W܊J[*"kQלJz=ʽ2OrY+W^+rszEYk)LCfޙܔT\N굜0Rܧ4IS73&>-枤'S 1hE7l40ɮNX7t(N:A杰tM鄹'T'j59is8f937L+n.ŝ5cT4&QK7Lnn{nNuìV;Y?ȧ6GO9/h&:sR Y`7適iݼTLj r짱C3H$q {tW\ꆨa9椢 BJ7 QsP2\JSeǸҡC\n K#ayWy|s>4MܡtDoqjj9f6POS㺔fb{yla W,twVfd6zzIEy(R[{`s؎wf hG| X$B`c ӘrźXR:oq[*f6e5Ab6$+A BaxJIp$4/)]+H̹͒qHĻCW RVm$P˃jPUaCüybkdzp0{@qGшD/`DpTr}MjE%bYt 赳 Kj9xeyt["8ZTaI!]PJˀdUp|m5NgY-r=AV|0zi#[wg^ ъ&Ko\ݶe68"\:J&'1K L{V*y,IBz0=IiH-O]I4%̗u=G0O,5X)XT8 !W ,7NY oˁǥ_*TNq{xhFAt Fޖ(E8%Mxd2@^pPm膞Z*_hUSZ uy`ȒdY;p-KIƅиQ锠|,, _s[a| y3$ 0(-MqA,cn-@Af…xcgaKBxJ:Y# K=c%7̶wOபdue W'*H` GހIZ wZihd qOOh(#$C%,<\V!oBkn-' a:= (MJTx셺Sm!0Q oAiy;cbi#WNLjqk%s,5wA @ͅRO'z>UTc >)ĊMD{X P֋^j2\~}]K%~@rNRᄡrpCZ(OFwVѻvrF9`oҢOs=ga1Zj!Tˀ<.'wâ6+DЂD1W dE {Bir~<&x>Z 3O6{2S_/+ endstream endobj 40 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>>/StructParents 15>> endobj 41 0 obj<>stream HnHui.hj4,+DY&av&y18Jxq廒|0h2o-8 32f9J"W^>ڷr@QšGCs|q׽vg}̗z_NdhF']Iu sp=2 {*RXeMGxvO+15C $[HP"q5<}$m \=WTU d8e9M* 9b{ߞ }As_\R:OۂAkjun9*{/9hm[~c*>na6||;'~yZ#S^6ŀ)Rk~OV)ll༂ft-Ãj^2 ,>nVF.Xx -j4CE2qg1힡H˲\$R@=-Эm']jUZ jguT"20/![q(RzSs9ӧ35G bLh#Ybx^ŗfAf_w%i4BHQƴޅ!2Eݺtvv)Zx8.yg/׺و5_AgJ *eWPtH!^˵ewdgPDrmo\<4})!eMtc*lNAoLKjl3q>y8?b3V!v[C5:tI<Wgqtt1?+_4 t$vYଔw],fc[ endstream endobj 42 0 obj<>stream HVyTG9 xa{t2e 134\tdÌET4шQxQ7#+OLjXWW]0?("5KonA0F+{`!H6b.lc R=4^y5HFC?w .#bb35 $V I- h>VhO]%kVxNB =X :T>+I;}y{=Eao([護4ky D@4|-Qd $ &fY CY #/Xt W@Qð>T0`7O/4 heL*N5uPpWw?7&"sq4fhVi~Ք}@[O;\R߽Ϗ}PQ_^U>`^t'LG Z䵛 t2ԓ#~>^gӶY'r?ΗT~!\Ҿƞ+v\wkf;֐}qr"BեhZt #>90jJl Y%#g%7Y>- ^oЇ 4O6Z &􉛰X ?Jx N|wt/Ks"4e/%GԂzZp\|Q[ݸCT4;e1$Jri1.'i~̪/YUGvN ZhS6'c'4[Xhpd,TvGgzTi ht&VA["T{t$~'C(cx;3ڐ9XgaI(?*դ8'Q( =q5aD k{e{m֝<cQ{$% 6NcaR8-hCX)#bH"Q128D>zi m$\x&Q\JN@Ϋ2й6= :HPpz `;>}JqP|ӠrR"ի'/j)YuY({ݴ1>o%ΚDk<^ &v 5v2I tW #L잏j|IZNi~)zp̞x׳kJ ð"½JvP ' K=H<&HL*m30aYc,OL F9{Y:fiV=`xpq2:Sƹ /xWLBBem' TX)U`S[#{AֺHRp! ]4s=qVπ=ͫ qdQ sui ]j YQpΙ,_ RAAV 88T(B3t$N7uFB7jR4Pk=dRJ{AVQP :P!J2 U"jJ"kZ űt"qm.%͟Ӟ${߿{4x"Sk5ڱ#8>B jN7j q1Ws5zǩU<, jev+UFF>۾`0zGE ЪԴ`VFצA4ۥJwZn:=7Fkc𿒋V"F1R碍hAX$FiutaHAԯF,Z VZper03R*j4U,2c,&& aƥZRaeN6M34'23#!Hj?#J8Hdp &n9NLo@%=ő3e)0R4!MA'[gX-Cxe/% k2x`s&}c%OdVO XWLy*$?!9{C8xu 7io*/D^@b5xvy0p7l{!I@&B"WjGC6DL`5(q(>CCS̛\|HbO Zv'; BL,?U 10|D 렚La1"E9",SH!j1J]&g9 *JQ#&Pc=l!1q lf\Ȃep~RS#! J$gDFQd1)YV pXC(B.(ڔ!=?1Idy RNv0u UmVb) =Dτ@$n~HI4!lW cE7 6 Q(A @VJ ^<K@2rب BgнT1N~S+DL-V uTɐ;|'7Dz!2-@ ə.Td˜<$ۃ-BP (-3wF&l+ZslG詅ċ9ѐ $L!IBLEUK~rԒ.eD;өJ~ZIk5d|f?sucX9NaoK@8ɜO7uoJ% m!\., xLl'#Ɖac|lG(#ۘw2u!s͏ MDpnڀCںJH"8mJi&(E Z5%Rf;+{3̛f݄ [(rUU.R=;888c˹>qF;A(3jSPyQɻm~UH+P$xQuz1\)C^eZdWHDNt[!v(#x\9T2L)US5Wwh;DpF(E2rc8i?#P7K+@T)<)|-ZYiw.O%G@] ߠ*D-]ʶrAUvdǠַ4|۶tpߠ1{CFm[P6EDRN')k$'Iox 5S&~Y9rgr4NoZ$l[<M-3R"nŦ"(7L P紃c0%QicX H]NxI?,޴fy~Ť$2  E0&т8 #kA#bZ=mҍ!Eƶ@$AT ..G qoSKhE6NGj±46VL`eO=gDITTFA&18exeB0b]ΫhT#2o79 u]H<^bУ /Ql܎npp2W!\Ɲbr+Mf3f R졙TJ]Ƚ] D.*DFlKb+P/G@]Ȋ?7&z@}k=U FqP˜i .dKj{SWrKd먀^/ZfAMrVpjC27W#Ewp :GFvud8@2΅s)Y4.iv^'!_OBe2P.c|+"2`K4&*qy^xo*]=q])G:%FYo+Cz =RMB< &XQaV(ooik/7+xWu`~T.䃪m?G #*g`\:E*cSgAU[|"rF!Kðܣ/·С PMU D-z6u]sMb'Ǣ4@q  KB`;Ɉ&@ `&NeZʘV:6U5dBi`2mT4D٪w_>Ĥwνwy{߽/ΕW6̡:Nݠ1ǿ";32)=E=qG%ȇGI/E#l H6dw=y d.jAvޮvSlz'b:i\Ď0JS0cD;F>-ڭ-z\7h$D)k+'5)ܙ>h7G1W4]L"_ӟ5zp#hb~T~>xI|h6촳Q}gQhj(,|/Eş S> \Gv/73;eXU٘wEI_7&#Ƚ%d),!y/$S~A'/`u kO>ԟ Ǯ$M嘋ܑArΥBϹG*ZD#2{k;b5Y.&d|K'Z+Ot{$@ 5wAp7 }xb$1 5ЌC384n o7 =:w)@/bӶl6d2=5Lo:L 6kSj*OkGxx5 ~W~bՕ( 3 [] MlWX&])~F4)ެxݪ[Uv(K^>[ϔ\l1Q+(XрO J>%||r zU߀ۨKY'}޽7 '3!>O>Ij3 iBYjA^AܠubZv-G;`H.ʅ]E&*ZxF 21P/(;pjU{NW UMTZ@-ɠ<|`r͋YZ IT|,  +a Oa<'Sԏ;N}SrNԩ{9HwQB" x[\ lfd<;Fm?|nKprؖ0CLiYRHYf 7D@ l@lr'Zl'8c3T{ rhɏU; Ԧ*g ޸=8|,ZLi)):8S##  g)|wκ'"ws+ r`s0v Pl ǴUJoL"8oCЬYM eGViG jiD]+nx٦m*fe؈m&ٔtGYP9lqymfG6 ٿ;?vjZ&14Һs-m foj>p}׃.\o S)8i=~{/4Rײl^nxYC:k-c >yP6ɱXr:OKe=L5pRh2ŶPM^u*[<6Z7x #SCoyiyۍg]P([ͦlj%¹jČ˕NesLvxhPPcJCBT貢 O犕u۰[H {SrڳW}cBi ; mrbA"W=J$=ש܄ &B,4 cS}=7&$@ Q eV5EwrY%DBl*~1o5 |qHqNԛt@KEwm@%4ڈť$h= x Ez6&vކV#r\F"%"{?]n織H9<; hKxzXJi+ad'7M`~-u|U@37BAy絤W<A1L4f&mF -5"Țȥr(QYĢLfEv+5GnsH(g)+[Ƅpõyby7̓<-r&r;P Kz@SmVG `K/E\;8謄۫QG;X^rfiʭLvy氪z{Jr(85 *TGp2?x$]E@rM)k[`@.eyv6QZEk8~Tc K5Y$54 b&MEԏ &di7<9SN&W&\n=cH$w;Sm$몪~gv\2zk?7 AgIxo9Y,w.Yfp4673ͪd/(k,dG(gmlJWQ`rU{׺Wn@<eR8ŝ2̑M_YkG`xיwIIAa*0#hT -Ԅo {GG'/#xJF|Nx_ׅy ^{/0u&4 U3(7gz5Zeg?%fͲ_no zo_}3 @AU#Bۛ-dYWȋns1ٔlZ(F,\te,Tb-$-lP0YBe)NQ.Q܇F<VPd*&)T{˲iQ!0MN hpSՒLz4/K'qxx$yn { JpKN1Cp ˦S$\ 3={O˱K{ 4?ş/;DzƯ]cS6}J;g_|B%EM -5v o4 V@v!^0,c` B"%H^xbG8(~a[ =$=JNy\%?`lkU&4}4%!;qS 2l0-Cv7q]VwV--L n] 81!C<BHI3@Jq:q$$L2)$Lq3޷f={MVjo/>EPa[T* te4X/ 4^蟭s^.Fg,姗t=p\/ɍ7pKAwrËv/m[7oӐ(HjTW,i鵈ݖMwҧv)y3_i!|% aњ EU FRO8X{=ky J5gvY%/MbV%]*nUWf;9"i3gq7!394FvtȥBybV NoՁ_Ƽ.c1).Lk[`_ֲz , RTk_e[nWg{{)-rڱo]`o&wɾ%8+'N£_hHtN.,=;-p3>]U/D&S A"P8⥪lq=ni6'/eE$ r;('fne_DWWJ \$ZY<$j<w\ҹ2@ Dn*D%b۽iKrZ;;LvXPb6c]$f'1;=`pBR! S40m_WWXg{u;?`GӜZ^ܿcTUk]AsFKG51Tq\̉L k*N}T;jCv' nXW"*I[_;UWы&cEaKňW= hz`9,d.J]Hgc(9)]؅7P WlQ1 *|~Κ&@S9G3@T #.qMF&m&X}(TNh}21"XxB`NWP* N[;E-?iuEOo_PW$XPE\mK|+dj[SۺbtY?gOe,NknE/8^Y 0T:sàA v&g0\'NR$2kp#TSybz#.9Sgȯfg/"r Pitjt8M9dbp!f씨 5&ffy*TRsc6INr9Nb;Ď%A ,JsWց `-`vleJKa`j@G?CC[?i[7ubi\n~jҒ׎d,Aˆg!Us{ 9zG`;s$Nz~֢ÊԮ1(x~ rysc͂B@}8\r} ߭XE4cWOfV~ CP~h20Le/?㭧[ۭ5͵dj3.0Ҧ434<.d#'$ x9s(RrP9%EJrBŌi$1(I"q1ВI/M%Y:bg 1`B7#/4 eAFR;҄B&nap_K7u-#+r¢gMq.={!Į冥CZӲk\Nb-jqDln;k!͆їդ]~Z_ο[é8٬f%t݈nd$O~Tx]RI:X`5w<؝Z@".ҵFMM@MZ .@4}v$e0, 6ԽIf 4aC0%@ kZ}t.9[ʟ:Gذqj_=u+/6y oPߒϟZ}KuM /tr(ণ_Đdt#apoeRS]O~ە}v@- / ;#=Hb-vC_.vu2ڄPO^MƘV@E{|G]1!]EsqIөt:˝H|=9_ƙod!lHk}a;چg "?. B(jm kӛ2j6k(m,YPQ1m{b@XB\;/Xo:jH_Fo)bXڴlVl~jC=[MJ_Q4B=:%m߫qe\+570H^ީЯ.ʼnQ![(9Dx_pM᲌9M1 )2#f3Tؿu|̀5`/f&6N/tieqy =/ӺuP X<}0g1EAPuR(Mcb)ɗ0O/z?AsQYxL=9j mWh|紫+~ڕ % *ihESAo/X]L|> ^JIvBaDOvTdK%3; W H`0uۑ14e0BTdhYwqV{ l ` =gUsace^"qOdjX0%MHiATm<c'w/w/;bΉI;NS)0:>,HOLtN6ҪEjґ}QJ_ Є=;U;[sI< ҄*57c"̢s;ҫl蹾뛏o$G:Xuk/ApiTA [z9[lMA&Kuk~\_95im8"k㸫qW!Ͻ&TX8̟UjEU5Uég a:I[2j2 VPxvuʪȈ Ɋ{`qZ%KEy5϶ b+1 òʚsj,(2ZUmEoVSD[ETCmӢр6yC'bD..z9ܾf##h^ұD)8@".Fs_p]Lyxx`AIAZF)/VfˍgvtiV",n;’~L?#O\I)9 _ 8}GX\5vcjrH0J+i˝]A;HSq*ǟc~#;U*s!F29\ gH"B^/MDh<.@$8$׾J*Yxn2z w8)]tHKR]a:{u>(Xc1ABN2&(VHddB1/$xN߹fMɄϟ.@y;,j"jGM}>I{6>Ovgꄆz@o}pWN`N `f*˕7}pQj $1M _w`KQ}ҨOvגɵdsjvb:CѴR}r22."1PPXg-4-TƦ~m+*EU5X-AƐj뚦$q6 2jJ9#oiUMSriP7Asytl5m.˘[̓E&^C쐪AH) %z[#.*Hi} ~S~AhIXbt?~ى0UB^a5NpYÕdm|FIO-qnXqy:ch΅izuu;`1bfvg9hW] }ՐV bbdDIR-TU*܄\'yn7y!/5v<~P Qc db& +tV.qKb&WfATBkn)'g]@kF:STݝp}p̀kS2H&mpK:"|~΋W+'̆ $w?VuA?áЈnj3N2BHC?& ϻAv/zG8(Ubfwrov{_&حoW$u bi&G'&Ƿ%L/ѾjZ$cfsR R4PSv QM7I0FŧH٤q9W?v&$T+7659=;6QN,۵A ZM]e$UcS>ćV8fAWbj\AUP>搸 X"ڒe[X3[bqO,Zmc bi̎ |u}Ur+𹿇Ͻa{I$e},']yUxEԺٝv70#FSn'.K}SuڂZYkKh%UҮ>a"(k+:զ$/ᇖI %v:M'4ɤ14 Lm <@ӦCC]O`.@gI/S]vjWEߍ<Ʃ x?(bxD$t ȫ[5Oݞ]j&AYf#'L >bz؈! A #4QH|j3*\WnyuPUǪC XFE{D{9rY5_j4vw$x~՜$GB/F!) UH[gE9Ip;ddW#"s9qM:vn= 7.u"ti}g=Ap󡙽:W{秽FW`/2\WBt>933. ^NdВEm 6_zפeˊJ~G~H45bNevfF23d(¨sVm% /K@&(kuqk e#ZQԳq"$wJY-wSRɾ{p}z[FGv/+W=RϗԭʩC^_7mˣ0EFP ;㋅/kKD`iOm}ؐس4ef#ˬz3%.t&z hr'(-!:J|fTo; olz%qL)5sxbc Zj*C8]wg\gxa(u2uB8gh> JY O1a(=#B$ CkCc𧑛zFQ ;(zv KMTMglڂZ2LKKg}V dx}O qz *Sd2*7$1`L3ȰLC .W?Z< sw#J3PCPXgj2Ȓ;'VIS^G7܆=uԅmptMw1Ozf[N"Svɡ34mjuenHp^5emɁEPAt$dz~ 9Odrdsz<4ր Z( nh`ބQLzAuMc"~4`j4*r5%MXn r?Α6_U &ҠJ0?1 $zӾ=9ar:YP'VHnmS &-ຍڵVpR0 3 b!Eϳ_|kzG=QAϢ3׉80QQ>.^r%>ޒOixMkǜ~J*jNuc>:iX.jW9Ý?!a7 8a$ȂbʦPqH1n3J'ەxܣ ʻ|~ %QXZd4-OIOrd2ci.|^-c ?zy'9G4H/A%M׃T6O,J6*r!"4aYd b WȘ(umP +JX~8ǍiaU ^5;i(!̖4Yv ,j&I5bzӑ`zgz$}8}.}%J;*h3l/T6%|Ermxmq.* @-Dq#9 f9Z> ˚0rSTG05T',U1\UUܮopcH Džг/p P+e`̪Q, u `F \:]J}1YhLuU&؅u3l/_X*eޮ剋]K!vkjފg?WE!vAUp+'J'{k݃r5ٽUޚ\>?P~!^cbr6vx'RJD3&UmW|JB'XЁbb;_0PP-/i ?( )YN:H1]ARWH*r;SJ=@nNݲ#jyVjktx]o샜鬮w (*쾩TjpS[3>Qe`rX%YUyoWje]I%d ؁FB2kBF`Bf4M ? CH$0@1+$ fm avLh2NP$VcHs==yv$JX4qC؈ ǑX496c;a97kG|?ȍ紖 ui,`K'H{9|S0Qp<񧃹ҸRG 1)%ք֤,KeK4M[j_(ƄdM q@T uM}BhLߌsYM57)TmNPvx9MцP}< b>( ZaR!WK$I+*"R8 Gf:E-niQiP: o/YUE3>{Bm2~K%,Wvf&Zܖ"q}?[OMs&<*Qd@\F.B@e;7X|yN{=ˮw[rM&G(hp1*IwPi~oiXRJA;s->g %t6Nqz=4n:1MzH)suȄZ!xWPe[Q:DޤJM*Fd ҹbwL;!dE>|Ad~qa&*!axZR[h)s:+q<@$1|S!?/mł9꠮Z8Ԃ1ilP{#[LS{Kp [5e47og:1i[Ʌh:TpNI-uk˵!v]ijg4B출\,ʌ/A' 7Hgqt>ɝOf`5`y)t>&YK_ۨ RmͶ(*eGO"q'W6K%RnOH(h8}L#5YrgЋ+w8`xٻk# &c/|kww[ot;[D#3?zrG !{P 7&ICkdR`Jc6qdhL@٫:,j<9sLI%e1␮\a8/ #$K2M*r`͊pWrR;|5Cld{uǎ s kz@?d74@ 3fg+}7|-qt?#|+jm9pW@&$[ oQ\C#^\5[TFQ [_y_W8H6Rj-_RG Ι{x}?W$-B'?=BGĹ)~l2Jmk'#06,LGTSϸ l!|irH$iPtԚX,v<#e^w덽9O/bv\)Xףsau'2cs AKڤ `! b!o>s~9lَ| [$ġ9%h(mڽ0@"&n[ 2Mx)jǒU I<$8Aԉ; tB %AC:cD?4|QV@r>x ڰ ^84AX0b&zDvĪ2eKftpu*ߔER6o|}'֯8|h -o}N7V2:гM!%@׵o[G]iR+@%D͔4R Byi~) |E3SYAk4iG{{>~ qʏXԻzȓműq@qHYOuFgr/:G6+?޶7Xo}w|K}lTBa=^30>o}n="ee܅9d`HlbYNP2ݐ\Za3)/ڑ9};s,ڝ9rL5: (BI+9,ʰhAWifh"VNP'B~G]L?[ /_d̫3ĪӢ~=ن{836TY_, 4 ^LzS fbI!OK?)BdU&SUCgEEg 7^ٿՉѷrgpů?)_8ծW"/,C^؀P ВG"ay;jkLϦWfq)?So ;=. P LY x`ȓH)t0Om[H?wp"}Q[ȱSShW׼պRya?|ܳu~j*ԥJw6E4e5#)nZ(D%?"5xM.`@ v*^k-xmW(ǚm Iy!ʱD<4mVU Ԇ8Fia!˗=R1 3'CY,qp!cT.< &׭[/=~XD*e0'B:>E7Dhdm0% t&Ω0ƔhL-΍4( :v\ 7n"ζDo)!eHUFUKRcHVAd% bٟOmt5eOUI2Hftj:Quȑ:%V=8㎰aNh)RB(UlVY7 w6šd(AO.`.%2d2 Jr Xr6P~W,˞@A+vC%D5~]5؏5nT۩)J &£pI" z)J#A{VdčP};`Ma /=ly"z v⦝9X}Y )?{/2SI]_?^Dez.ՍF|S8C(CC>*`S>hڵxr Rl8ǡkvq٤Mdg?Kq.vlyx6߁aQ%L`/O nF:"GqMSx6{xP 8#1%qE#EMb`|ɀg!&Tx.W~JVq::yNl2[d'a!,\Bn ɪ`\FҖy?`]suuj"_/3^zl^ns#۽1sм-!/n%c]~l8 C؃jѳV# 1cN3-S ;`Av7' D!cY1c<>z#d;w;Btrʒ%mm>d2,v,p#ʼ_Z&$ecBn5+,Ԙׅe/B ht>0Rcw}šX}mrcga,/n[7A-AuqR8N*\Afs8mM5' w^z#CήЕFz/}f|ae#E>+xC\TO#,qްꪉ\y ﱱHKDmJҢHGdY/b(ӟa)8ѡvr(x7k`C4PVX{ T+ &׍ViP4V!JRH=qd+-7IIK?{/{,]7c '\@Իk= λ>8א7p[)@.ذ5򞢎#%dGGY{qYYIqQ ya/`XB訂20Nv!c)6XdF|K|g@^+( ֹlP&]4V75=Z.0A>!/IIvD"%JNu'~HK+Nu&= *Ξ3i.x FF)OD6T+x>P*T#@Y+(+VpGYFf% p8 C W(G<R+AϮӈvR^T}>&FWfcB;ׇ7c2uZ6~O_S r CCĘ% )֘2-qj(eN4' eIMcL`}J<Ҽ0bѼuc8<|k߭ݨVo$S#ז*Jynñ?gc]_߱N:*:wjG:9;Kv#zi vuJ2MZ]G79us;W~N-v(&5Ot=ѩS){,fIY%\ɲu*TORe~j_sw-k~_VW=/_*kJdk{b-:Mw=A'!{&4ep76n;|ƺ+Kźg6& KDpuߘ/6BXjX'h~71~T 5*Xo xHARg*($Y^A,7i><5l9ƱƉ05SIey?,'iY\S6#;u_ q*۱(Z GX-^ףUvW&Mp>'-O5nܫ,s7 Ve{LzC9qAה˲TVN$k?m{kۮvBr%FQ.bYhx~yJ\@J Sc[1 UqSJ+z绽|>]YU=ϕ} +@8 K6/ ӪJGS}r~BX n/_'|_xx <w Qx$Z*hvD4śgGŁ@*N˘nc^ ס?i̲S MgF6LVL3%BclMBvٙ(ѿ)$ sБJr֜Ϙǡ 3qO#" NSs7 R+3@LMSIvi:#񇕎-+y NU u%N":E"ˊi1dsS(? \k;ʌq.zZ7bT&vؖ+q<レ1v1Qk">g6ߜ9giZ@'H^.o8|0ֹ\Y0/<>w?{j{嚯G K~_J1 ڷ5nx܇FZw| ^7ĿPqg.>?܏v+ ĸYHrSD  a^},rk%Yȱk9Sg)3(Gȗ|r PF.lqvdD2˜sfH89+IPx}&V9\v֖+ 'X~}eFZYMdŔb̘6Mϴنt< BqꔓKKN dӵ"bF휈9ݺ'P8g-Ck؟]퉈YZB׬1a&uKO##ekRͩrXGǏWC쯱HF{̉Lq4\?SbeU:2`SV}Wj~ZXOhRμTxfESUUYU[e endstream endobj 43 0 obj<> endobj 44 0 obj<> endobj 45 0 obj<> endobj 46 0 obj<>stream HV{<`{׭\!w[aĸDɘ13)3GmPlER.kS֦V+ii\Jg-;9gs>}y< 0E @@oO7C(gͭ@ #j<Z(/a\f 3Yt%&0iKP 8J'$E[]iXcKydQֱ(CReH6S uA,|.f(Ei2ʓDQ}$a{H5!ҡDx#Q=y%w5 &^ٯ0Rb0EP 3/JII 0x@HTI7 DBrl|T~.?/]b2*]ڵsM ƉሎQAm.OT]1$"~,a OY% r>(D9 MY9,$P؉1H f.WHY ڦ~4{7}ݟ1mmπ:Klm ߯% p%@m~߿s}7V$w͑حd3s,\eI&级dWN }hj٣M; %TIz3B (ϘE)H>˿jqMM*R~uڑz_m=ݴP\){d~š84.F"rt(xܸ4>;&V(A9BE;җsh!):4gD.\6%Y$´OBWS!jIY YVa\ OiJʪn-9qahu}e9N-i/k[ϏdrJnħGh;#E[IjRm+im r۝h7J;=Sj邐HM:iDS]#RSWOg̞iSp =XGZxФPt$EPt(S)o?~9s q 5;}iVߓA{ɦl'z̗]Iz|)L-3v BddSSa3mvfeӺmGi+:1wF F64X$R50Fi˥Nf9W.#(+vtVq*ӏ#3XVv)U1 Fd>ގ ~``t|Srx& `v(V)MQJ7-9e%c4␐ki<9y$E,C{s F;cGhYM.e{iЭ3X  D.@\R9 b%(!a4Dڣ;bTe3^ ե[=_8cTsRز뢞֝؆AOno_%lfq˽+}7c7NB{Dy=mKfG*Wpxed0.FhΰS֛cj=9eY])U|~U)^\UqU{:XP2]MЗgBm:~ӠLŭYW?ض+2<k7ɓ r10gaK|AC!Ӈg;&_o#7Be5:^m|\N㍶ƲxbdÔ'9fo[;gDj@ V}GnyҐVv~AlKI4]#߃U+6UL(rn'qQeW =f}GNwlKlghWA5M~ n#+S>kHͩkn V{ 7%VyivqEwߐk;D2ء8p!}f? N0i^e6'߼]7f6"1\g SoX:Rגs̮+Vk"䂜r'}o ;RU41Yk ٪A a1|١z|w{ )+/ ѐ0-Cy,*5QXr{|oԤk{azQNèA.UiQlcfy&ucDtrPabNkzbZjrcҘMpyy{= NW,f]6A;e ,e oo'<-y.8]x>~tNp^ldTʚ=:.u%!'=۰~No'$:]vmk Ԇ~ظ}fhdzDͬKq$\r~ޢXkE·e?̥H_5<I?<$}Di@\+VhH-F}e-hs&2g(ct |*`Aߣ 1jّ!>_h.p2ZЭ`!AA'>XjQϖ'z0cGwL~Vvl7Ov:xFh{=N^M҅V'|xVO|W씕 i6"b3ԵV5/8JWἨZ~8=;U*cDy.i?܇7;!m'(qՕSWW7dh-y=o-]UGΌܨ=!-SrtQw3▩\."m".CK`A*& W*-$,ǎ`B @D? Q Յt@Y&F3/GW_? 8;ZYjAXЬto %^)ΕuӔrY_i+^ ! $ "!H`7 TXo/J{=.YM{v(1!.,'bw[+ygƳ8Tm3ŪSIDT߰f}-I]*,@Ŕ]}o'% ]~hKh"+L@G'T@ 6K bOR4TL 52>֌j&q-sPGug>漶ӿa>I{|OTF֬gwY6F/T9wkfۿh^7כx:[m{ 5ysj_zFy3 bKz۳G _APjDFv3xuSX*EU|SO3fc%RJz^ /{\e7W# 7{j-,/pt@IDyro}a'Ba .RI T͢8F΃|8/V Ci..Nnon8?w!PD"Vp7t:HOe$:M^ PN(9tA1Ma Y?v<Y+%jL' [ux(S %~]>񹥐 Z7+&a6>XU*Vc +l8Ϟemc" W+j={S+!a9E SfK`hh \Z܇^«xom*d6MymcOWƣ<ϤzV!Vٯ|;=*foQ^P:C+U'$S7Sǽ 1jg8L1T)8qU%ݾ(U+lX/>4S8ɬlkd_[xg^K\o_;R"Z !yb,.+ _}N]6Βbɲd[ ,XY;?.<;AXE;NR?ObɨSY-bRCP "j1~aCy&\uXS7iI5qr;IЀϏooy0,c"Eqo:^ s[C}<ߤ0R x} װXLupЭPP+6( ^^0Z?(VV3EtJ(a4Ĉ 4*xau)M|iv90g%:g 5[hN2iFu=rP*((Ph;&C' 8 ~I~71hQֈ%spP`'?Dx֌X!b#̽^H‡nC#Rƣ2iJ:HttH:Hb S׌t]kI.צyq͇g>H14sj>ٳ)zqay.vn->[25U07{ex4ٮ6G6Hd=z qtFXeJrYuW;M{ftSRt7c@B[8,/թyƻt1,R+LD8G9 !]: [0R|&6:AeьHЊ4ĥSNI$ +n}n~zn^YIH܂^[?7V畢IY%FC2(P2(jVA5dT* /wLKN{Kѵn{_%2oPĠs "j+O;9'AF˸/}b&>}׊zlF@vI#98/1ئ~ $*/k' ĭ5SҽXE7(,Lr|{ĘV&u\Fn]ν \+tjZ&Oҧ0;[NͲw,h&QUÉNu‚WY_xf69Z<.92T?ET'k 5P \"7Øo1'gsr9Dod92ʼCm|}bDZcvsg;rqǻO'wM=jf<;ΛCu)'ݺ}rf9}~n# fN4rՠx;C}ŴNU3BQJ!`2ωNL76vuaSq!}+E`Ul#ի>a qTB[DK|1dVn*D1s>Pz9)+[onW5Ϧj9P_\1yF%}ԄJB}鞱%F~DXjW$KcL{-#oɗ@Ivz@ oz#Ռ;針}1n!PPZ#J?M[CYt4" sc2`'_F ߖ?DJe͵j43~=k8p\[(3[X9!-N\ /V 6[J5fouSqOژp.\kD@֎;adk]a?rDY6b9 ;XB%qҕv׉ i.1[#D-k.2R^3kpws峈۝vc1G`oCnLK3۟=A;LC5AqǩYN|IHvc.8E I?}JpO?YkA,BD9x  {le8(61';1AsyFVe5"V? Kq~-~5?/ly|rϱ΋^1{L+͵容O`Dt/X%B}E|Gv}r7FP5x{L"<|wpt3u޻r$u?W~\Dt_i$e}H>Cew1YZQ|Q)D1=;QeCn'oKaN?oLoo=0 |Sweޏm8ٱ$($8~86%$XBƯ@-)@H ZsieZա6&5Mj*%Sn TcE;4d)FwPF7L3gqv.ɦ@='=.B?ۇ}G8HBuzE(أRǑw@M|YCyg~/GaD{H6aLysq>Ęu?u C2=WߖgpiҦVSLWD&@ [ A}@L EW?TI½,\b>ܜNosѴ_6탫Ӳڴlɲtƴ_(n}^o$P+$Fa) V~JdrJ7h EgM{|}:=:dS#:/y,&{?x'f[|}gu0 tc\u g73ap LC\O*t>0 &kfMaykfg kbW]eWѵ?ūWE;dk/\('|*P. 04v_&:A70 Q1p h{l * wh&.=r]d#E ¿¿oco2 䣜39׉r X0G~ :@/0aV&[Qy2CANKD!+cnDx@č7VD0Iʯ;#`b1J1J1J,^Q;xVUߠ:jUPU멺^ڨjBCR%W(TYƨꡪTuj%ɜK   }tbDN<ð@Jei<;e :ַ;Q C4i4JFQ :)` [  3ٝcN7UɜJfWzmdUBB"Y`}Q@r(%#e|o|TNҟ=\cbcC5$&ˉM~}qf{Ct6k@]?%q$4.9 ȗm*r$)ܐCHm51!=qwwmMN(Jl!u6y ڶJ u~&>Zo:@gD.$ݮ,20FƯ}EFQ6Ks$dfK`YCLgz~KҨA4~OCAzhdP@? `4N BGt17NdONun]9wйssNO?V MĄ&VW3B X5ZlmBB|!pWR-]-)\~^nmuBP^޷XS8[<[n~suu!'H)u!`4ԲO!ʖ񶚪R\͋x[ռjV$"bD%]ٞ Y6s( FYFOx)^4٦LQ:g N"3-FKC 1|ճxzc,)BZ_7V%S#Ȭ:ݔ܌oƯO'b=$ip+Rچqo(~`zi,[6IDŽ,={3Qfz2>}necGSXrpas18-niC7r[!&_ԾMOjenWѐ+O7CwY3clެڊ0ܸfxz}=Ye%UnsӲ0zg}3N̝]h'@l{=Zf:a <}濓5Kι&ϝy\@-nj83ؽ{?^)n46J`+NNE `J P0M!  Mp(_ląbjS#$MK+\Z |?kjlxngw{Ij ԆN#&T*` _ ՏW\,2a,ћE!cdz*$h%vA 3ifndd6C.MID%ރ)3c3B4E W. .xV͵M+Hf{,,-=Iir_:ld yٶڵVj/++/p[fQ܁:PmA@w w dBYIMYȍS+Q `?ժ+[$*NJE[}zU?h:zy͞:Z[;:6I!j<<ҹο 7~a =ΉNgjeo#;dDӊˎ2U Шl\X%Ja"6S BՋkh+qy#.jE1fk*Ƚ̡olw~8V/t|qKAV/3*չm:(tF{@٨uÈ.,3% BbZ kQYEZ錼kAӡdbKz`j&C+wcYՏm}E -p&ZmgvN>txHSw֝n Dh4l9L('4Kb(lJl Aq23LI#di#<%AهZ: lˍCi zg4(S/64LkJM,fy NjkH`ү~udD<'%K{iV:'9v0Y SXJlWKV"BA8^f@ڻVpK-A-õwk$Kr2uZ(%y/]Z,HrS_PP˦h0+ɤdƓRqOMZnMP+|1S17~…L 7޽?D(zH"7 ǔ߳`2՘Uף#1UXKeӘJD# &R^j)QE9GP@iπ[=^"DL tq[1}x<CL>jS FwSHHi'Dl7s )x/jFRbF.)yє µi PDYWoZ WJ ^MΝܱ|63ؾÿ_'<_8Ӌ{m +@WB܈92e8"B:F(;Ĭ  X*x5xynTS!ɐq+m>gc?[.%Mir:8bL>/J3McTY~ R g?Gf{>37-_[$|^#?[qGo|ɆOi@5P 4kFB_MUQܾkV p#DڌS[Gu@GÄE@ ?' F41DVϽ}&11A}{{{?6`5o)w96;@Yy30W:V&!Tv&.entE1wQ\KNKV>! 41ٰ]g:=`8ȁY墅RiVߴn(5l1E} GGۋvG_|^ꚃwGYFi=h53I xX5@hNNir%,(KRr d<֘&t7Fscnwti0f ^ؤHSa3͑Jܼp&\8n?kowϒֱG>ܱ}W]3ҞO2@7?%v k;ڎcGy!s7?2;BJh.]]"U/H"̶ma vF=u{Z2vEþU.|@d$O&$]y3<>4]2W E8o:Ʈ&nw{v O?yմʾx-Gj{ NM}?DOC-ÐKt|Owo O$/Y85eR,3k'ΐJޞB5/6;g> endobj 48 0 obj<> endobj 49 0 obj[/Indexed/DeviceRGB 254 20 0 R] endobj 50 0 obj[/Indexed/DeviceRGB 6 21 0 R] endobj 51 0 obj[/Indexed/DeviceRGB 252 26 0 R] endobj 52 0 obj[/Indexed/DeviceRGB 251 27 0 R] endobj 53 0 obj<> endobj 54 0 obj<> endobj 55 0 obj<> endobj 56 0 obj<> endobj 57 0 obj<> endobj 58 0 obj<> endobj 59 0 obj<> endobj 60 0 obj<> endobj 61 0 obj<> endobj 62 0 obj<> endobj 63 0 obj<> endobj 64 0 obj<> endobj 65 0 obj<> endobj 66 0 obj<> endobj 67 0 obj<> endobj 68 0 obj<> endobj 69 0 obj<> endobj 70 0 obj<> endobj 71 0 obj<> endobj 72 0 obj<>stream x[Qo7+}͐4  R8M ;}2uq^4ػ:Hw8ט,5#%RarW5UTRuRilNY.xEoTID?ɪrlA!UZСۀ1]yA24>{i0N:taEs+ gFW06`~J Һ"-#G6 q>-+hA }@ -Ze{ 1s/E1藌M2xdlGT.G1#AFefthaBQ)>*E*.+PԢ\3 i1a DHf-M/7v눐1 [Ón_MXK<:Z ,"a-Md,'To т^`!@SvZ+hzHіtZ!} u, -1XbLoaeG,H%Z3v.@lh++  v[NEͼ>YVrOTE*Y}p5yvcl5_=|ռRy_gWUio糏oԗvO/u=j^%ajй!iU ka[h8.4"< .)xUpK+M+^J3Om/r\nf~XYxjv=[r=qz䏙  >~ް {Nnͺ\-of7[x܍看z}}Oԟwn+_.6;_wn׆Eou뷲i[L5a|iv˗~zжiwm$-g>oz3C6=%%n&n w̳QIQ9Q)1kW0щNF{_}D':щ>2iG&:щNRgObNth`|?!ˈG#a#2р#a#g0F<ˆGUmc#k/êdRvX*ژտ3OgS#3خ~ H3$ĺq q miǁƁt$(RPl$RFZ}wo#OJlqz]}䝷*:d_'__nwM%g~4ʰ ;}7+_]tBU/K*o{vݮsvn-U*R⮥=v߇ [r tsssksCss߽?ݳ 73ľ6 = rc^c[ V@q q q q mq 88*W TSD)Fk#j#VHb6nK6pX\)k#MWHb6vخJ-;_\ DmWr@uCRƑ(aq='M=o}Ѥ _mHq@TRܦ6@הnHq endstream endobj 73 0 obj<>stream xOO\7ſn c_HM**!L)MϙL&>K]{wc?к.t*Mp!њ@5b.mqV ms%v`3J\Kz7䂏NS*xՅ`t8oGv ES"10 r AN `)5]@ Jr A. `k[êVuƺ1 NbS5b0KJB0sCfc]1D8IC0;H7S(<`1Wc0P:tș3&.3_ +cU:(qD:b`b.\hU1~`t*JX8r jI\ͥFmb1L8١Y$r`Φ2ee\fB?QkH[#iWK.`s2a(yh|zu|Y''σOG%oxr-n#ࣣt/mO=[{)}kt=R9?-ŭC2f(cq[t\-sλ8~92>No6֤ g r=s~i|rg| e@b)H6IJ2IAɓ8(ieR"Iݎo';)rTmR"9k}j5&,[dl[ۼlk5xM&^ux].^o{2`^6ȚlMYV&+^/ xA ^/gx&gx&gxQ(^/ŋExQ(^/K%xI$^/xY,^/xE"^W33峼kϔϔϔϔϔϔϔvxE"^ݍ_S{T{ܵWO5jFרk]n; jCy}'ϯ]*vwt t t X:=t1/1,-w e7[ LzuY1}ql?˖n钇W>stream xXMo7+^?@v HoF0 }ÕTyA"ww͛ǮB|q&֓wv[Lj6]Gd׉MrF E |1eh=lu בJhNFIbt WII'w w9'1@/ 䜭d r1vEH;Z'#;P<%4< AS 6RrL`"@Ίn* .64l^j1*N0*' ^v0!`Db4u:@Vd Ȫxn @EC$ :QT۠DSAL, t%9tL+ 'g|rX&Ն7qB łf # F:: : (2qD :&C͸،!`0BW Eu-9 ȹ9qTg"wx8Vw/?xw5<|p9Ob߿~gO9NL<9zy?w39IM#:=,a'n@wݤ-S]/˓j+Ք}7Naic\Z}G쀭ŌN1G]ϫٟ&QɇՏ-XtDZ߲ݎH} pH $H=t } ZArH ӫٕ+x̜bTjL U;U)wRNNskTq5>q1} Z} Gn}a5*wu2]*(UI;Q>SDMSs(H+vv>"c7'i ;YFǾۙ')R$@|7Ũoti }"Ei0)x@#Or8ۉ ;u䦈﫧/|vI(PD웹'Nn_ȩ~7uq컷'Ⱦo'Q7_.|8]<]+'( OENeο̗k}j8]>stream xKoFݴskflwS@; 7UҠ*3?BZ.څ4;G]1d#^ Z0hq(FO*TEZ1BG;j19'/ $g-k gKQcTpH%U55`yL-c%h-#=IF~@pLzbl. 1h4cŠJShm N)IXws &p. s++ke΍>V<2*vN^I3Uʈ bUXq@}P&%U8hiCxXQ`+p斸Ùew8b5X 8({p΅>xiL6w55܌Kpn pIy,l 8͞ʊaBݖ'LpB4e}j2j UlxjlMFD^̼F1C(s8pv.Xͽ*Z8 jΕ}-Z(s)sÙz5x;-ƛ t.^>TF5W&K׼6yŤ~ɿwe=(·ݯ|^oSZ%tǙϖ|lcħc3X9%>:%>:')/'>^?~|Χ?b'f>1) >1O#+x%:.y~o7o?K_=7ow;Lz/f@퇻o7vwleOP>ޫIr7[$ 2>stream x̚KoJ$U=a@r0 bӎ4}3"%$Eʏ,wxoMݙ>8}J-bVFbe:/fzi.QE󚥻o;j]*oW+~/^r?J%SY&:׭l\3Z-۬Ҫ㘛j5u;:-w'[m]~e*'7?zsݍ NXaQl d039ܹmLKqUxL'xކN9er-uZÍ>ѻV}r,awp\p/];ϱϩ;t< gC{q4ӕN?~ϯ?Itm\2?!I_/_]|us=i$_/:N?/q2ݚl׷t⧯w+;ZjYnնٙ*75__z|]7`UO%~=DzGBV??+䊷,GG|]]8~zZP=__:cy?`__(|JNũӝU->Z>}q6 Z'(D.΃NdT'6 III&=jԽ&yfD<Ǘ^ϗߝ>~U?,Dq;Qw(`ԙ ?Q2G};vq'gAG C@'!hjA7 8A@&8A}Owm'xΩoA |l(G @8X/¸ ^qU Ck~nȎewx0#L&ޟ ' ٓ}BQ醔m%ӶSn* kvTұC t}yU l]H4$yth{my}47 Τ'r7wB;=ǯK TFXu*Sa\F;*Sa$89i,NS.i.yI'sT9K2 7l$HHQpC(8D! QpCjv(P8(8D! QpC 璉8(Ibnۗ|iO+Ӓ-p,ip,pwv}i6'jh:K$XRzZXj][ZJQ@IN5Oy)F!6!!T+IؐdDeҗ$6š-w1 <$I%Kr.\ҷ)!Jh2,Wҭ$YIP5fIwڼmP]y╇ܑyC{PlrҞ oCB[%_^x%Z5;/|cf~#.onm'u˛FX8qx# -Ha(( FY0ʂQL#ʂQlFq( FY0B,tʂ4JM!*]S΁eS:eS$vBo٥cפcGYƝ) ) $o݋NY)ǐQ4pK6dy)I/]»4wR) ЇD{( P;ډRiНD@':C>v';:) Gb\?*;G>5nSkxtДkϚP5kXA9D <<<<<wrOwYdOL黎iigi\F4 ;r3iL#g9șF4ruM4\nj6i_5qĎiLsԎ;r3iLcM9șF4Śq`GhRșF4r3E8miL#g9șFhșF4ri25 Ŏi&iL#gjjJ4r3#g1rFS>#g1r#g1r#g < < < < <ԋRCK+5ԔRJ&5DRH!5  < <430000TOC7b64< < < < < <,4EuՃ1zE~IFkx]y[֖x>~fOxAI(RP4W>U %EQh*RaTztY5S  C͎ۢ&E;mh|Oħ.RIRhE⧢HZ${J,<%QH!t<@w$R 'oқ&MrTPAQkBj7R[Vhv[6fxǰq憍kJ/J_{ӡmnj Ő(uo}i#ū6 j<}ޜ7SrO]T endstream endobj 77 0 obj<>stream xJ@_e;7P xTZ ٔ@HBC g^of7@Ay !hR H& ұˁ l+@)yP}B"hD Z; Qhbc%8ͺ²?/茴@NJ`wb[c%V]{H*&rjYGf`P=.T{Q+MCt(Yr5Mש}C8K;K5o.76z'?{_S endstream endobj 78 0 obj<>stream HWmo8B_h?lwY@mM⍝z KT#yeߐCYr6 "9< ߼ŲOf㋋Qp^UƦXy0ZU:)7fe#[ۦV)|:+8[yS5I#rE|(? dNvӺAjwIQZRݩuq>8 u_7%u{4;>5سOSX\qfeY5 MV8%8!$ubU4Α;5lai̓ hAU=_Weƾ=M6ww>\3pلAGH.Wy~e8cy]57 nae[>]5rUխAݎG3m.eBI5_neR-V5'^?oغnŋd(2Z:Kuzg9? /үgŦ)V+VO:'.bÚi!q/Sf]O/-La` Q>ҋ2N݀=>YMU2 酲f734:T>kfZ Jz-S&qzMRfeQlڪR~r ^E!m!xs6Nʦ8YF^=~bt`XrݚjnEj ݰMr-%QRRW0YV D` iX 8va-3W%u27)$mڲ]y?Nlώ%}[ٷo;^n >.}*2z=+^} aAy'8T2 7tSQCB+ ) yN[jdCPRJ:nK+}pO0'Y/I]SA!@'Ot=$%K^Z&jg^U?5NuwؒeEڰYjJ$2CqޖĵfmRMگ]&3 ;7fzwÁeӬy|p|Tw5\z mή.b<9L'sێȷ02@>L#eV6}kϰX2_|R>w^s\AŴ=h Lo.+lNA˳ҧH=($EرIʈmrbJY_ʸ6w_>3$ y$e|GGt[ų@$nBr(Z'7bI@eo:^o5KzXTV*U}<PПH[yu ZF6þS ȫ"}Ƃ8DQ8b/Ez@IDɬu?LP&R?2G.8Ij kE^lhL@t0637\Z9_h dX]r-cޞ\SC ޾AqM%fGnzNWuvc>?'U|,Wg'WJۃ+$s_cJ#^*zeO5U@M5^`&!onǗ@%L۳f*·f>GGGIОV{}LԁyY-lna3n'M {cیr4<ߺV C1fۋ]3It#s8"7*8Rwm"9=hOb9fOO_/aK3G![@ljScOp"/?+13W2a!&vGgojb24HM[ToD̓CaO>H9&Kډc|q{. }Fq37zw.R'kKXNTfB_I?\(Ğ?HU~os?dlļ˿1zoOHE}D0CvЋ 9r4YqÈr8ވ }ˑ 3ִ./)#} ?*t1?;W7XK;9ԭF.3m>bV}xqzꝚ!#Yk3A{Odը>D;Q[biGc 04bJ~Ayn/Rs3͘zgWuALHQl-Cߵ=o*g@5`{[ׯ|dl7CcOmIް=Vƨ =<.άQgC)[T}YscLTĜQb|gϝNj"m#Ĝqak!^GAN˺u!kW3O>8`c?RZ r}`gegPZY\ZTX[ecJ-)-S6:ADĂS3R 6)[X@)eɩ\c endstream endobj 79 0 obj<> endobj 80 0 obj<> endobj 81 0 obj<> endobj 82 0 obj<> endobj 83 0 obj<> endobj 84 0 obj<> endobj 85 0 obj<> endobj 86 0 obj<>/Type/Filespec>> endobj 87 0 obj<>stream 17 Using Colormaps and GradientsJoe Chuma endstream endobj 88 0 obj<> endobj xref 0 613 0000000000 65535 f 0000109792 00000 n 0000109998 00000 n 0000110639 00000 n 0000110897 00000 n 0000113568 00000 n 0000125288 00000 n 0000125517 00000 n 0000127032 00000 n 0000127249 00000 n 0000155894 00000 n 0000156136 00000 n 0000158740 00000 n 0000174229 00000 n 0000174508 00000 n 0000174739 00000 n 0000177009 00000 n 0000177251 00000 n 0000451013 00000 n 0000451340 00000 n 0000454992 00000 n 0000455514 00000 n 0000455585 00000 n 0000456801 00000 n 0000466209 00000 n 0000466536 00000 n 0000469300 00000 n 0000469801 00000 n 0000470305 00000 n 0000493383 00000 n 0000494251 00000 n 0000494482 00000 n 0000503181 00000 n 0000503413 00000 n 0000504759 00000 n 0000505002 00000 n 0000509278 00000 n 0000509498 00000 n 0000511253 00000 n 0000511473 00000 n 0000522174 00000 n 0000522406 00000 n 0000523346 00000 n 0000553877 00000 n 0000554133 00000 n 0000554678 00000 n 0000555055 00000 n 0000570394 00000 n 0000570639 00000 n 0000570957 00000 n 0000571004 00000 n 0000571049 00000 n 0000571096 00000 n 0000571143 00000 n 0000571197 00000 n 0000571314 00000 n 0000571491 00000 n 0000571600 00000 n 0000571712 00000 n 0000571844 00000 n 0000571988 00000 n 0000572098 00000 n 0000572262 00000 n 0000572409 00000 n 0000572531 00000 n 0000572653 00000 n 0000572787 00000 n 0000572933 00000 n 0000573056 00000 n 0000573184 00000 n 0000573327 00000 n 0000573452 00000 n 0000573586 00000 n 0000575995 00000 n 0000577386 00000 n 0000578782 00000 n 0000579858 00000 n 0000583093 00000 n 0000583497 00000 n 0000586594 00000 n 0000586629 00000 n 0000586653 00000 n 0000586713 00000 n 0000586840 00000 n 0000586941 00000 n 0000586974 00000 n 0000587167 00000 n 0000587244 00000 n 0000591253 00000 n 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f trailer <> startxref 116 %%EOF extrema-4.4.5/doc/Extrema_Users_Guide.doc0000644012702201742730000243100011274636625017362 0ustar spangspangࡱ>   @ 2DbjbjFF OQ,, V&&&&&&&($$$ D((&f (66NaH $-%/%/%/%/%/%/%$*R,S%&]aS%&&6N%jjj&86&N-%j-%jjbt&&Q" 6 \$ V"%0&s-2-]"((&&&&-&]"<a|jd aaaS%S%((xN(( Data Analysis & Visualization Extrema Users Guide ( TRIUMF 4004 Wesbrook Mall Vancouver, British Columbia V6T 2A3 Phone: 604.222.1047 Fax: 604.222.1074 Table of Contents  TOC \f \h \z \t "Heading 1,3,Heading 2,4,Heading 3,5,Chapter Title,2"  HYPERLINK \l "_Toc24275097" Getting Started  PAGEREF _Toc24275097 \h 2  HYPERLINK \l "_Toc24275098" About This Guide  PAGEREF _Toc24275098 \h 2  HYPERLINK \l "_Toc24275099" Conventions used in this guide  PAGEREF _Toc24275099 \h 2  HYPERLINK \l "_Toc24275100" Installing Extrema  PAGEREF _Toc24275100 \h 2  HYPERLINK \l "_Toc24275101" Running Extrema  PAGEREF _Toc24275101 \h 2  HYPERLINK \l "_Toc24275102" Data Input  PAGEREF _Toc24275102 \h 2  HYPERLINK \l "_Toc24275103" Data Representation  PAGEREF _Toc24275103 \h 2  HYPERLINK \l "_Toc24275104" Addressing parts of arrays  PAGEREF _Toc24275104 \h 2  HYPERLINK \l "_Toc24275105" Constants  PAGEREF _Toc24275105 \h 2  HYPERLINK \l "_Toc24275106" Expressions  PAGEREF _Toc24275106 \h 2  HYPERLINK \l "_Toc24275107" Reading Data From Files  PAGEREF _Toc24275107 \h 2  HYPERLINK \l "_Toc24275108" Text files  PAGEREF _Toc24275108 \h 2  HYPERLINK \l "_Toc24275109" Binary files  PAGEREF _Toc24275109 \h 2  HYPERLINK \l "_Toc24275110" Generating Data  PAGEREF _Toc24275110 \h 2  HYPERLINK \l "_Toc24275111" Sequences  PAGEREF _Toc24275111 \h 2  HYPERLINK \l "_Toc24275112" Functions  PAGEREF _Toc24275112 \h 2  HYPERLINK \l "_Toc24275113" Interpolating Data  PAGEREF _Toc24275113 \h 2  HYPERLINK \l "_Toc24275114" Drawing Graphs  PAGEREF _Toc24275114 \h 2  HYPERLINK \l "_Toc24275115" Graphics sub-windows  PAGEREF _Toc24275115 \h 2  HYPERLINK \l "_Toc24275116" Pre-defined windows  PAGEREF _Toc24275116 \h 2  HYPERLINK \l "_Toc24275117" One-dimensional graphs  PAGEREF _Toc24275117 \h 2  HYPERLINK \l "_Toc24275118" Two-dimensional graphs  PAGEREF _Toc24275118 \h 2  HYPERLINK \l "_Toc24275119" Line graphs  PAGEREF _Toc24275119 \h 2  HYPERLINK \l "_Toc24275120" Scatterplots  PAGEREF _Toc24275120 \h 2  HYPERLINK \l "_Toc24275121" Histograms and bar charts  PAGEREF _Toc24275121 \h 2  HYPERLINK \l "_Toc24275122" Three-dimensional graphs  PAGEREF _Toc24275122 \h 2  HYPERLINK \l "_Toc24275123" Contour Plots  PAGEREF _Toc24275123 \h 2  HYPERLINK \l "_Toc24275124" Density plots  PAGEREF _Toc24275124 \h 2  HYPERLINK \l "_Toc24275125" Surface plots  PAGEREF _Toc24275125 \h 2  HYPERLINK \l "_Toc24275126" Four+ dimensional graphs  PAGEREF _Toc24275126 \h 2  HYPERLINK \l "_Toc24275127" Graphing two 3-D functions on the same drawing  PAGEREF _Toc24275127 \h 2  HYPERLINK \l "_Toc24275128" Multiple plots on the same drawing  PAGEREF _Toc24275128 \h 2  HYPERLINK \l "_Toc24275129" Tile numerous graphs on the same drawing  PAGEREF _Toc24275129 \h 2  HYPERLINK \l "_Toc24275130" Draw two sets of data on the same graph at the same scale  PAGEREF _Toc24275130 \h 2  HYPERLINK \l "_Toc24275131" Draw two sets of data on the same graph, but at different Y-scales  PAGEREF _Toc24275131 \h 2  HYPERLINK \l "_Toc24275132" Customizing Graph Presentation  PAGEREF _Toc24275132 \h 2  HYPERLINK \l "_Toc24275133" Colors  PAGEREF _Toc24275133 \h 2  HYPERLINK \l "_Toc24275134" Default Drawing Color  PAGEREF _Toc24275134 \h 2  HYPERLINK \l "_Toc24275135" Plotting Symbols  PAGEREF _Toc24275135 \h 2  HYPERLINK \l "_Toc24275136" Line type  PAGEREF _Toc24275136 \h 2  HYPERLINK \l "_Toc24275137" Line width  PAGEREF _Toc24275137 \h 2  HYPERLINK \l "_Toc24275138" Text  PAGEREF _Toc24275138 \h 2  HYPERLINK \l "_Toc24275139" Axis Labels  PAGEREF _Toc24275139 \h 2  HYPERLINK \l "_Toc24275140" Graph Legend  PAGEREF _Toc24275140 \h 2  HYPERLINK \l "_Toc24275141" Graph Axes  PAGEREF _Toc24275141 \h 2  HYPERLINK \l "_Toc24275142" Scaling  PAGEREF _Toc24275142 \h 2  HYPERLINK \l "_Toc24275143" Tics  PAGEREF _Toc24275143 \h 2  HYPERLINK \l "_Toc24275144" Logarithmic axes  PAGEREF _Toc24275144 \h 2  HYPERLINK \l "_Toc24275145" Axis placement  PAGEREF _Toc24275145 \h 2  HYPERLINK \l "_Toc24275146" Data Analysis Examples  PAGEREF _Toc24275146 \h 2  HYPERLINK \l "_Toc24275147" Operators  PAGEREF _Toc24275147 \h 2  HYPERLINK \l "_Toc24275148" Functions  PAGEREF _Toc24275148 \h 2  HYPERLINK \l "_Toc24275149" Fitting  PAGEREF _Toc24275149 \h 2  HYPERLINK \l "_Toc24275150" Smoothing  PAGEREF _Toc24275150 \h 2  HYPERLINK \l "_Toc24275151" Fitting to a function  PAGEREF _Toc24275151 \h 2  HYPERLINK \l "_Toc24275152" Fitting different data segments to different functions  PAGEREF _Toc24275152 \h 2  HYPERLINK \l "_Toc24275153" Binning  PAGEREF _Toc24275153 \h 2  HYPERLINK \l "_Toc24275154" Interpolation  PAGEREF _Toc24275154 \h 2  HYPERLINK \l "_Toc24275155" 2-D interpolation  PAGEREF _Toc24275155 \h 2  HYPERLINK \l "_Toc24275156" Integration  PAGEREF _Toc24275156 \h 2  HYPERLINK \l "_Toc24275157" Other functions  PAGEREF _Toc24275157 \h 2  HYPERLINK \l "_Toc24275158" Data Selection  PAGEREF _Toc24275158 \h 2  HYPERLINK \l "_Toc24275159" Output  PAGEREF _Toc24275159 \h 2  HYPERLINK \l "_Toc24275160" Printing graphs  PAGEREF _Toc24275160 \h 2  HYPERLINK \l "_Toc24275161" Exporting graphs for inclusion in other documents  PAGEREF _Toc24275161 \h 2  HYPERLINK \l "_Toc24275162" PostScript & EPS  PAGEREF _Toc24275162 \h 2  HYPERLINK \l "_Toc24275163" PNG  PAGEREF _Toc24275163 \h 2  HYPERLINK \l "_Toc24275164" JPEG  PAGEREF _Toc24275164 \h 2  HYPERLINK \l "_Toc24275165" Saving Data  PAGEREF _Toc24275165 \h 2  HYPERLINK \l "_Toc24275166" Scripting  PAGEREF _Toc24275166 \h 2  HYPERLINK \l "_Toc24275167" Creating and editing scripts  PAGEREF _Toc24275167 \h 2  HYPERLINK \l "_Toc24275168" Comments  PAGEREF _Toc24275168 \h 2  HYPERLINK \l "_Toc24275169" Running scripts  PAGEREF _Toc24275169 \h 2  HYPERLINK \l "_Toc24275170" Interacting with the user  PAGEREF _Toc24275170 \h 2  HYPERLINK \l "_Toc24275171" Initialization script  PAGEREF _Toc24275171 \h 2  HYPERLINK \l "_Toc24275172" Subroutines  PAGEREF _Toc24275172 \h 2  HYPERLINK \l "_Toc24275173" Branching and looping  PAGEREF _Toc24275173 \h 2  HYPERLINK \l "_Toc24275174" DO loops  PAGEREF _Toc24275174 \h 2  Chapter 1 Getting Started An introduction to Extrema About This Guide t his guide is an introduction to using Extrema for data analysis and visualization. It is not a comprehensive manual detailing all Extrema features, but rather a concise guide to accomplishing the types of tasks most commonly performed by researchers. It intended to be useful to new users, and for experienced users who would like a quick introduction to features or methods they have not used before. Chapters Getting started Data input Drawing graphs Customizing graphs Data analysis Output Scripting In most cases, this guide instructs by example. Typical data analysis and visualization tasks are described and then performed, both using the GUI and using the scripting language. The tasks are grouped into categories that are treated in subsequent sections of this guide: The tasks described are generally simple, but practical. Extending them to cases that are more complex is generally straightforward, although you may need to consult the Extrema Command Reference for further details. Documentation that is more comprehensive is available in the following references: Extrema Command Reference: a comprehensive guide to the Extrema command language. Extrema Online Help: detailed online help is available through the program itself. In many of the brief procedures described in this guide, the reader will be referred to commands and functions for more information. These commands and functions may be looked up in the above references. Conventions used in this guide Examples of messages and prompts written by the program, as well as examples of user typed input are displayed in typewriter type style. Curly brackets, {}, enclose parameters that are optional and/or have default values, and indicate that it is not necessary to enter these parameters. Parentheses, (), besides being used in mathematical expressions, also enclose formats. The backslash, \, separates a command from a command qualifier, or a parameter from its qualifier. Literal quote strings can be delimited by the opening quote, `, and the single quote, , or by the single quote at the beginning and the end, or by the double quote, , at the beginning and the end. For example, `ABC, ABC, and ABC are all valid literal quote strings. Parentheses, the back slash and quotes must be included where indicated. Extrema is case-insensitive, so input may be provided in upper or lower case, or with a mix of cases. In the examples in this guide, Extrema keywords are given in UPPER CASE, while variables and user-defined words are given in lower case, but this is simply for clarity; you do not have to follow this convention. Words that you should replace with your own variable names are given in italics. Installing Extrema Extrema is distributed as a self-extracting compressed file. You simply need to execute the extremainstall program to begin the installation process. After agreeing to the licensing agreement, you then select an installation directory (the default is C:\Extrema); and everything else is automatic. The installation program places the Extrema icon on the desktop. Extrema does not modify the registry, so to uninstall Extrema simply delete the files. Running Extrema Double-click on the Extrema icon to launch the program. By default, the program raises the visualization (graphics) window and the analysis (command input) window. Commands may be typed directly into the analysis window, if you are familiar with the Extrema command language. If not, you will probably be more comfortable selecting your actions from the menus and toolbars. A typical Extrema session involves the following steps: load or generate data to work on graph the data, or analyze the data repeat previous two steps until the results are satisfactory customize the presentation of the graph(s) output the graph(s) save data for archival purposes, or for further analysis Once you become familiar with Extrema, or with your particular data analysis and presentation requirements, many of the above steps can be automated. In that case, you can build scripts to automatically perform the routine steps in the above sequence, and possibly the entire sequence itself. Extrema's scripting capabilities include looping and decision-making features, so a fair amount of intelligence can be built into your scripts. The examples in this guide include instructions for performing operations interactively using the GUI, or using the command language. Command language examples can be used interactively in the command window, or in scripts. Chapter 2 Data Input Before you can analyze or visualize your data, you need to get your data into Extrema in a form that can be manipulated. Data Representation Data is stored internally in variables, which have names that you use to reference the data they contain. Except for a few automatically generated variables, these names are chosen by the user. The first character of a variable name must be an alphabetic character, that is, A to Z, and the maximum number of characters in a name is thirty-two (32). Except for these restrictions, variable names can be any combination of: alphabetic characters (ABC XYZ), digits (0123456789), underscore (_), and dollar sign ($). Variable names are case-insensitive, e.g., variable mydata is the same as MyData. Function names are reserved names and cannot be used as variable names. Variables can contain character data or numeric data. Numeric data are always stored as double-precision real values. Character (or string) variables can be one of the following types: string scalar: a simple string of text string array: an array of text strings Numeric variables can be one of the following types: scalar: a number vector: a one-dimensional array of numbers matrix: a two-dimensional array of numbers tensor: a three-dimensional array of numbers (to be implemented) The contents of arrays are indexed sequentially, with a starting index of one (1). Except for physical memory limitations, there is no limit to the number of variables, or to the length of strings, or to the size of arrays. Addressing parts of arrays To refer to an entire array, simply use the variables name. To select an individual element from the array, provide the index of the element in square brackets: x[8] ! 8th element of vector x y[2,6] ! value from 2nd row, 6th column of matrix y In all of the above cases, you are referring to a single value, i.e., a scalar. You can also specify a range of indices using the colon (:) character: x[8:20] ! 8th through 20th elements of vector x y[1:10,1] ! first 10 rows from the first column of y It is also possible to replace any part of an index with a mathematical expression. For example: x[2^3:10*2] ! 8th through 20th elements of vector x y[1:sqrt(100),1] ! first 10 rows from the first column of y Variables can also be used in indices. For example, suppose you have a vector z which holds the values 1, 2,, 10. The following are then valid: x[z[2]^3:z[#]*2] ! 8th through 20th elements of vector x y[z,1] ! first 10 rows from the first column of y Such expressions can result in scalars, arrays, vectors, or matrices, depending on the number of dimensions of the result. Special * - all indexes # - the last index The special characters * and # are also available for use in indices. For example: x[*] ! all values from vector x x[#] ! the last value from vector x x[#-1] ! the next to last value from vector x m[*,*] ! all rows and all columns of matrix m m[*,#] ! all rows and the last column of matrix m m[*,1:#-1] ! all rows and all but last column of matrix m Constants You can type numeric values or constants anywhere a scalar variable or value is expected. Constant arrays are expressed as a list of values inside square brackets. When typing out vector or matrix values, separate successive indexes with a comma, and successive values within an index with a semicolon. 5.03E-8 ! scalar value [1;2;4;8] ! vector with 4 values [1;0;0, 0;1;0, 0;0;1] ! 3 by 3 identity matrix You can also use the [start:stop:step] notation to specify regular sequences of values with which to fill the variable: [0:2*pi:0.1] ! vector from 0 to 2( in steps of 0.1 [10:-10:-2] ! descending sequence from 10 to 10 in steps of 2 Expressions Extrema allows you to use mathematical expressions anywhere it would expect a variable or value, provided the expression evaluates to the expected type. Simple expressions involving dimensioned variables generally return a value of the same dimension. Thus, if x has 10 values, then the expression sin(x)+1 also has 10 values. Other examples: m[x,#-2:#] ! the rows denoted in x, and the last 3 columns of m x*m[n,*] ! x times the nth row of m sin(a+b) ! the sines of the sums of respective values in a and b x^2*sin(x)+1 ! a non-linear function of the values in x There is no limit to the length or complexity of a mathematical expression in Extrema . You can also index the results of an expression, e.g., (sin(x)+1)[4:8] ! selects 4th through 8th values of the expression Reading Data From Files In most cases, your data will be contained in files. You will need to read these files into Extrema variables before you can operate on the data. Extrema is quite flexible in allowing you to read files of different formats, although in more complex cases you will need to know the details of the file's data format. Text files Text files are human-readable, that is, they contain data written in ASCII format, and they can be viewed or edited with a simple text editor such as Notepad (. Many spreadsheets can export their data into such a format. If your text file contains data arranged in rows and columns, with columns delimited by commas or white space, then reading the file is simple. To read each column into its own vector: READ file1.dat x y ! read 2 columns into vectors x and y READ file2.dat a a_err b b_err ! read data and errors into vectors To read all columns into a single matrix, you must also specify the number of rows in the matrix: READ\matrix file3.dat m nrows ! read file into matrix m There are also options to read matrices in other ways, for example, by specifying the number of columns in the matrix. See the READ command for more information. Binary files Binary files are not human readable; if you attempt to view or edit them, you will see a lot of garbage. They contain sequences of numbers or other values in raw machine format. To read this data, you need to know the details of the file format, that is, the sequence and types of data written to the file. Generating Data Commonly, you will need to create data spontaneously. In simple cases, you can type in the data directly. Usually, however, you will be working with data sizes that make this approach too tedious. There are numerous methods you can use for bulk data generation. Sequences Simple sequences can be generated using the [start:stop:step] array notation. pi = acos(-1) ! define scalar pi X = [0:pi:.01] ! make a sequence of values from 0 to ( in increments of 0.01 You can create a regular sequence of values using the GENERATE facility. The generated data can be specified using any of the following methods: minimum value, maximum value, number of values minimum value, maximum value, step size minimum value, step size, number of values You can also request random values instead of a regular step size. Functions By applying an expression to an already-existing variable, you can generate a new variable in which every element of the input variable has been modified by the expression. Capture this data in a new variable by simply setting the new variable to equal the expression: y = 10*SIN(x) ! x is a vector of values If your source data is a monotonically increasing sequence (see above) that serves as the dependent variable, then you will get a fair representation of the function itself over that range. For instance, to produce data representing the function SIN(x) over the range 0 to 2(: pi = acos(-1) x = [0:2*pi:0.01] y = sin(x) Interpolating Data You may have a sparse sampling of data that you wish to fill in by interpolation. These techniques are described later, in Chapter 5: Data Analysis Examples. Chapter 3 Drawing Graphs Extrema can produce a wide variety of graph types, not all of which are described here. This section reviews the types of graphs that are most commonly used, and how to make them. For complete details on the variations that are possible, consult the Extrema Command Reference Manual for the appropriate commands Graphics sub-windows Use the WINDOW command to choose and/or define a graphics sub-window. Graphics sub-windows are an easy way to subdivide the graphics output page into rectangular regions, allowing multiple graphs and/or multiple figures and/or multiple text regions. A window is a subset of the page. A window, other than the default zero level window, has a smaller plotting unit range than the full page. Commensurateness is never lost in a sub-window. Pre-defined windows Some of the initial pre-defined windows in PORTRAIT orientation are displayed below.      One-dimensional graphs One-dimensional graphs are created from a single data vector. If you do not provide an independent variable to graph against, Extrema will use the vector index as the independent variable. GRAPH [-1:1:0.1]  Alternatively, you can bin the values in the vector, to turn it into data pairs (i.e., bins and counts). The resulting vectors can be plotted using any of the two-dimensional graph types below. Binning data is explained in Chapter 5: Data Analysis Examples. Two-dimensional graphs Two-dimensional graphs represent data pairs. Typically, you will have two vectors of the same size, which should be plotted against each other in some way. Line graphs Line graphs connect each subsequent (x,y) data point with a line. This presumes that the points are ordered, so that they are connected in sequence. GRAPH x y ! draw y(x) as a line graph A parametric line graph is also easy to make. If our parametric independent variable is T, then we generate X and Y vectors by passing T through appropriate parametric functions: t = [0:2*pi:.1] x = t*SIN(t) y = t*COS(t) GRAPH x y  If your data is already in polar coordinates, you can graph it directly using the \POLAR option, e.g.: GRAPH\POLAR radius_vector angle_vector Angles are presumed to be in degrees. Note: The plotting symbol (characteristic PLOTSYMBOL) must be set to 0 to get a line graph. This is the default, so no special action needs to be taken unless the plotting symbol has been otherwise set (see Scatterplots). Scatterplots Scatterplots take the corresponding elements of each vector, and plot them as (x,y) data points, using whatever plot symbol has been selected. There is no requirement that the vectors be ordered in any particular way. To plot scattered points that are not joined by a line, select a negative symbol type. SET PLOTSYMBOL -1 GRAPH x y  If we have errors in the data also stored in a matching vector, then we can add that information to the plot by specifying the error vector(s): GRAPH x y yerr  If your data is ordered, and you would like the data points to be joined with a line, then simply use a positive plotting symbol number: SET PLOTSYMBOL 1 GRAPH x y  For a detailed listing of plotting symbols, see Chapter 4: Customizing Graph Presentation. Histograms and bar charts Histograms (bar charts) with tails going to y=0 are drawn by using the \HISTOGRAM qualifier with the GRAPH command. x values are assumed to be bins, and y values are assumed to be counts. X = [1:19] Y = sin(x/(2*pi)) GRAPH\HISTOGRAM x y The other types of histogram are shown below, each with the appropriate value of HISTOGRAMTYPE.  Three-dimensional graphs Three-dimensional graphs represent data triplets. These are typically interpreted as 3-D functions, z(x,y), and plotted accordingly. 3-D data typically comes in three forms: A matrix, whose indices represent the x and y dimensions, and whose values represent the z dimension. Variables of this type are representable as surface functions, and surface plots are usually generated from data of this type. Three vectors, which can represent the x, y, and z dimensions in a rectangular coordinate system. Corresponding indexes in these vectors are your data coordinates, so by analogy with 2-D graphs above, the data can be plotted as a scatter plot or a line (by connecting successive points). If it is reasonable to interpret the data as sampling a function z(x,y), then it is also possible to interpolate a regular matrix from it, using the GRID operation, and then proceed as in the previous case. Certain types of 3-D plots (e.g., contour plots) can be generated directly from the original data vectors, however. Two vectors, which contain a series of (x,y) data pairs. Normally these would be plotted using a two-dimensional graph type, but they can also be binned to form a 2-D histogram, which is represented as a matrix and plotted as in the first case. There are a number of different graph types that can be used to represent a surface function, z(x,y). These are summarized below. Contour Plots In contour plots, the z value is interpreted as an elevation that is indicated using a contour map. CONTOUR m 15 ! m is a matrix  Density plots In density plots, the z value is interpreted as an intensity that is indicated using color (default), tone, dithering, or scaled boxes. DENSITY m ! m is a matrix  Surface plots In surface plots, the z value is interpreted as a 3rd spatial dimension that is drawn in perspective. SURFACE m ! m is a matrix  Four+ dimensional graphs There are limits to how well four- (or more) dimensional data can be represented on a two-dimensional surface, but there are some tricks you can use. Here are a few ideas to help you get started. Assume we have a tensor of data called t, and we wish to graph t(x,y,z). We can slice t at different values of z and graph these slices using the 3-D graphing techniques above. (Section 3.5, below, explains how to tile multiple graphs on the same drawing.) You could also build a script to plot each slice in sequence, automatically clearing and plotting the next slice as it went. This would give you a simple animation as you moved up (or down) through the slices. Graphing two 3-D functions on the same drawing Say we have two matrixes f and g, which represent surface functions f{x,y} and g(x,y) over the same X and Y ranges. We would like to plot them together on the same drawing for easy comparison. This is most effectively done by plotting f using some kind of density plot, and then drawing g as a contour plot over top of it. It may help to draw g in a different color to ensure it is clearly visible.  Multiple plots on the same drawing Researchers commonly need to combine graphs into the same drawing, plot multiple data sets on the same graph, draw different graphs with a common axis, and so on. There are many ways Extrema can be used to get these effects. A few are mentioned here; see also section 4.5.4. Tile numerous graphs on the same drawing Extrema divides the drawing area into windows, which can be selected by their number to confine a graph to a particular section of the drawing. Window number 0 is the default. For example, to tile four graphs on the same drawing, simply select windows 5, 6, 7, and 8 in order, and issue an appropriate GRAPH command for each. window 5 graph x y1 window 6 graph x y2 window 7 graph x y3 window 8 graph x y4  The WINDOW command can also be used to define your own custom set of drawing windows. Draw two sets of data on the same graph at the same scale Method 1: Manually set the axis scales to values that are appropriate for both graphs (see section 4.5.1). Then draw your first graph. Without clearing the graph, draw the second graph without axes. SCALE 0 2*pi -1 1 ! xmin xmax ymin ymax GRAPH x y SET CURVECOLOR RED ! change color for overlayed curve GRAPH\OVERLAY x z  Method 2: Draw the graph that should be used to autoscale the axes first. Then freeze the axes at those values, before drawing the second graph without axes. GRAPH x y SCALE ! freezes the current scale GRAPH\OVERLAY x z Method 3: Graph either of the two data curves first, then overlay the second data curve. Then use the REPLOT command to redraw both curves on a common scale. GRAPH x y GRAPH\OVERLAY x z REPLOT Draw two sets of data on the same graph, but at different Y-scales Method 1: If you only need a labelled y-axis for one data set, the task is easy: GRAPH x y ! y-axis is for this graph GRAPH\OVERLAY x z ! no y-scale shown for this graph Method 2: By default, the y-axis is drawn at the left hand end of the x-axis. The GRAPH\YONRIGHT command draws the y-axis on the right. For example, the following commands produce the figure below. X = [1:100] GRAPH\YONRIGHT X SIN(X/20)  If you need a labelled y-axis for both data sets, just graph the first data curve with the y-axis on the left (the default), and then graph the second data curve with the y-axis on the right. You might want to change the color for the second y-axis and curve to distinguish it from the first. For example: x=[1:20:.5] y1=x^2 y2=EXP(SIN(x/5)) SET XLABEL 'This is the x-axis label' xlabelon 1 %XLABELHEIGHT 5 ylabel 'x<^>2' YLABELON 1 %YLABELHEIGHT 5 GRAPH x y1 SET YAXISCOLOR blue YNUMBERSCOLOR blue CURVECOLOR blue XAXIS 0 YLABELCOLOR blue YLABEL 'e<^>sin(x/5)' GRAPH\YONRIGHT x y2  The GRAPH\XONTOP command draws the x-axis on the top. More information on customizing axes and graph placement is provided in the next chapter. Chapter 4 Customizing Graph Presentation Once you can draw your data, you will want to customize the details of the drawing to improve its presentation. Extrema has a large number of internal parameters used to control the drawing details. By altering these parameters you can vary the appearance of your drawing in a great variety of ways. The most commonly used parameters can be easily set from the GUI, simply by checking off the desired options from those that are presented. The more obscure parameters may not have any convenient checkboxes, however, and will have to be set manually using a typed command. Each drawing parameter has a name. To get the value of a parameter, use the function GET characteristic This returns a value that can be viewed interactively, or stored in a variable. To set the value of a parameter, use SET characteristic value Specific commonly used examples follow. A comprehensive list of parameters is given in the Extrema Command Reference. Many drawing parameters refer to positions on the drawing, which can be expressed in various units, including percentages. To interactively determine which position you would prefer, simply move your mouse over the drawing and the positions will be displayed below in whatever units have been selected. Colors Colors are numbered; these numbers are indexes into a color map. A color map can hold up to 256 colors. Extrema pre-loads a default color map that should be adequate for most cases, but you can also load your own color map (see the SET COLORMAP or the SET COLORMAPFILE command). In the GUI, select a color map color simply by clicking on the grid of colors that are presented. In the command language, you will need to know the color number. The default color map is stored in the file DefaultColorMap.dat, and the color numbers can be looked up there. In addition to the color map, Extrema also predefines a set of colors that are always available, no matter what color map is currently loaded. These are checked off by name in the GUI, or by selecting a color name or a negative color number in the command language.  Default Drawing Color The characteristic COLOR sets the current drawing color. If set, this color is used for everything placed onto the drawing. By changing this parameter in the course of adding things to the drawing, you can easily control the plotting colors. SET COLOR BLUE ! draw the curve in blue GRAPH\OVERLAY x y SET COLOR BLACK ! draw the axes in black GRAPH\AXESONLY x y There are also more specific drawing color parameters used to set the colors of certain graph items, such as labels, axes, and so on. If set, these will override the global default color. If not set, the global color will be used. SET CURVECOLOR BLUE ! draw the curve in blue SET XAXISCOLOR BLACK ! draw the x-axis in black GRAPH x y Plotting Symbols The plotting symbol can be manually selected in the GRAPH window. In the command language, use: SET PLOTSYMBOL n Where n is the symbol number, taken from: If n is positive, successive points are connected by lines. If n is negative, the corresponding positive value is used, but points will not be connected. If n is zero, no plotting symbol is used (but the points are connected; the data is drawn as a simple curve in this case).  In addition to the plotting symbol, you can also specify the size, color, and angle (in degrees). If scalar values are used for these, the value will apply to every data point. If vector values are used, the vectors should be the length as the data vectors. The corresponding values for each point are used to set the plotting style for that point. In the GUI, you can simply enter the size, color, and angle vectors (or scalars, or expressions) in the appropriate fields. In the command language, use: SET PLOTSYMBOL symbol SET %PLOTSYMBOLSIZE size SET PLOTSYMBOLCOLOR color SET PLOTSYMBOLANGLE angle For example, to plot a vector field, we could select an arrow symbol where the arrow is centred at on the data value (#13), and then set the sizes and angles according to two vectors, magnitude and direction: SET PLOTSYMBOL 13 SET %PLOTSYMBOLSIZE magnitude SET PLOTSYMBOLCOLOR black SET PLOTSYMBOLANGLE direction GRAPH x y ! draw vector field  Line type The line type or style used for drawing lines on your graphs can be selected using the SET LINETYPE command:  The line style is used only for graphed lines; it is not used for other lines such as graph axes. Line width SET LINEWIDTH n controls the line width of the axes, the data curve, and the plotting symbols drawn when the GRAPH command is entered. The units of LINEWIDTH are pts, where a pt is 1/72 of an inch. For example, a line width of 36 gives 1/2 inch wide lines. The parameter n must be a scalar. SET LINEWIDTH is a shorthand way to set CURVELINEWIDTH and PLOTSYMBOLLINEWIDTH.  Text Graph titles, axis labels, and other drawn text strings have several characteristics that can be altered, in particular the font, size, color, placement, and angle. These can be specified for specific types of text labels (e.g., x-axis labels), or for text labels in general. These parameters are all easily controlled in the GUI by setting the appropriate fields in the TEXT window (or the FONT sub-window). You can explicitly enter the location on the graph where the label should be placed, or you can manually place it using the mouse. The placement of the label is with respect to a particular point in the box that encloses the text string: In command mode, the various text drawing parameters are controlled using a number of settings: SET XTEXTLOCATION x_position SET YTEXTLOCATION y_position SET %XTEXTLOCATION xp_position ! expressed as a percentage SET %YTEXTLOCATION yp_position ! expressed as a percentage SET FONT font_name Axis Labels Axis labels are a special case of text strings, since they have a standard placement and orientation. The x-axis text label is drawn, centred, below the x-axis. The y-axis text label is drawn, centred, to the left of the y-axis. The axis text labels are drawn only when the axes are drawn. The character string may contain format commands. The SET XLABEL command sets the automatic x-axis text label. Use the SET XLABELON command to toggle off/on drawing the x-axis text label. Change the sizes of the text label with SET XLABELHEIGHT or SET %XLABELHEIGHT. Change the font of the x-axis text label with the SET XLABELFONT command and change the color of the x-axis text label with the SET XLABELCOLOR command. The SET YLABEL command sets the automatic y-axis text label. Use the SET YLABELON command to toggle off/on drawing the y-axis text label. Change the sizes of the text label with SET YLABELHEIGHT or SET %YLABELHEIGHT. Change the font of the y-axis text label with the SET YLABELFONT command and change the color of the y-axis text label with the SET YLABELCOLOR command.  Graph Legend Legends are boxes of descriptive text that describe certain details of the graph. Typically, they are used to label different point types, different line types or colors, contour elevations, fit parameters, and so on. The LEGENDON characteristic is changed with the SET command and the current value is obtained with the GET command. If LEGENDON `" 0, a legend entry is drawn into a legend frame box. A legend entry consists of a short line segment, with optional plotting symbol(s), and a text string. The legend entry is drawn when the GRAPH command is entered. The string portion of the legend entry is expected as the first parameter of the GRAPH command, for example: GRAPH 'legend entry' x y If LEGENDON = 0, a string entered as a first parameter with the GRAPH command is ignored. Following is an example script using a graph legend and the picture that it produces. x=[1:10] set legendON 1 legendtitlecolor -16 legendtitlefont 'impact' legendtitle 'The Legend Title' legendentrylineON 1 %legendframe 20 60 60 90 symbolSizes = [2;2.5;3;2] symbols = [15;16;17;18] colors[1] = 'red' colors[2] = 'blue' colors[3] = 'coral' colors[4] = 'cyan' do i = [1:4] Set plotsymbol symbols[i] plotsymbolcolor colors[i] %plotsymbolsize symbolSizes[i] legendsymbols i curvecolor colors[5-i] curvelinetype i+2 graph 'legend entry<^>'//rchar(i) x i*x^2 enddo replot  Graph Axes To graph only the axes for a particular set of data, use: GRAPH\AXESONLY x y To graph a set of data with no axes, use: GRAPH\OVERLAY x y These options are handy if you make multiple drawing passes over the same graph. In the GUI you can simply select the appropriate checkboxes to get the same behaviour. Scaling Axes can be manually or automatically scaled. Auto-scaling is the default, in which the axis will stretch or shrink to accommodate the full range of the plotted data. This is convenient for well-behaved data sets, but maybe not for data with spikes, infinities, or related problems. Autoscaling is also inconvenient when one is overlaying numerous similar graphs, where one requires that the scale be fixed. Manual axis scaling is done using the SCALES command: SCALES x_min x_max y_min y_max SCALES x_min x_max n_x_tics y_min y_max n_y_tics SCALES The first form simply sets axis ranges. The second form also sets the number of large (numbered) tic marks that should be shown for each axis. The last form freezes the axis scales at whatever is their current value. Tics The parameters controlling x-axis tic marks are: XTICSONcontrols whether or not tic marks, both large and small, are drawn on the x-axis.XTICSBOTHSIDEScontrols whether or not tic marks, both large and small, are drawn on both sides of the x-axis.XTICANGLEcontrols the angle of the tic marks, both large and small, on the x-axis.XNLINCScontrols the number of large, labelled, tic marks to be displayed on the x-axisXNSINCScontrols the number of small, unlabeled, tic marks to be displayed between the large, labelled, tic marks on the x-axis.XLARGETICLENGTHcontrols the length of the large, labelled, tic marks on the x-axis.XSMALLTICLENGTHcontrols the length of the optional small tic marks on the x-axis. These are the unlabeled tic marks between the large, numbered, tic marks.XIMAGTICANGLEcontrols the angle, in degrees, measured counter clockwise, between the x-axis and a line joining the base of each large tic mark on the x-axis to the centre of the number labelling that tic mark.XIMAGTICLENGTHcontrols the distance, measured from the base of each large tic mark on the x-axis, to the centre of the number labelling that tic mark The parameters controlling y-axis tic marks are: YTICSONcontrols whether or not tic marks, both large and small, are drawn on the y-axis.YTICSBOTHSIDEScontrols whether or not tic marks, both large and small, are drawn on both sides of the y-axis.YTICANGLEcontrols the angle of the tic marks, both large and small, on the y-axis.YNLINCScontrols the number of large, labelled, tic marks to be displayed on the y-axisYNSINCScontrols the number of small, unlabeled, tic marks to be displayed between the large, labelled, tic marks on the y -axis.YLARGETICLENGTHcontrols the length of the large, labelled, tic marks on the y -axis.YSMALLTICLENGTHcontrols the length of the optional small tic marks on the y -axis. These are the unlabeled tic marks between the large, numbered, tic marks.YIMAGTICANGLEcontrols the angle, in degrees, measured counter clockwise, between the y -axis and a line joining the base of each large tic mark on the y-axis to the centre of the number labelling that tic mark.YIMAGTICLENGTHcontrols the distance, measured from the base of each large tic mark on the y-axis, to the centre of the number labelling that tic mark Logarithmic axes To get logarithmic scaling on the x-axis, use SET XLOGBASE n, where: n > 1.0the x-axis will have a logarithmic scale. The base will be the integer part of XLOGBASE, except for the special case: 1.05*e > XLOGBASE > 0.95*e, where e is the base of the natural logarithms, e H" 2.718281828, in which case the base will be e.n d" 1.0the x-axis will have a linear scale If XLOGSTYLE = 0, and XLOGBASE > 1.0, then the numbers labelling the large tic marks on the x-axis are displayed in decimal format. If XLOGSTYLE ( 0, and XLOGBASE > 1.0, then the numbers labelling the large tic marks on the x-axis are displayed in exponential format. To get logarithmic scaling on the y-axis, use SET YLOGBASE n, where: n > 1.0the y-axis will have a logarithmic scale. The base will be the integer part of YLOGBASE, except for the special case: 1.05*e > YLOGBASE > 0.95*e, where e is the base of the natural logarithms, e H" 2.718281828, in which case the base will be e.n d" 1.0the y-axis will have a linear scale If YLOGSTYLE = 0, and YLOGBASE > 1.0, then the numbers labelling the large tic marks on the y-axis are displayed in decimal format. If YLOGSTYLE ( 0, and YLOGBASE > 1.0, then the numbers labelling the large tic marks on the y-axis are displayed in exponential format.  Axis placement The placement of the axes can be precisely controlled by manipulating the axis location parameters: %XLOWERAXIS %XUPPERAXIS %YLOWERAXIS %YUPPERAXIS The percentage versions specify positions as percentages of the current drawing window; otherwise the positions are in the drawing coordinates. By careful manipulation of these values, you can place one graph at any point on the drawing with respect to another. For instance, to adjoin two graphs along the x-axis so that there is an upper graph and a lower graph with a common edge: Set %YUPPERAXIS to a reduced value, e.g., 50. Plot the first graph. Set %YLOWERAXIS to the value of %YUPPERAXIS Set %YUPPERAXIS to 85. Turn off drawing of the x-axis labels with SET XAXIS 0. Plot the second graph.  In practice, there are some other parameters you may need to play with to keep the y-axis labelling clean, but the above will suffice in simple cases. Chapter 5 Data Analysis Examples Extrema provides numerous tools for data analysis, including data transformation tools, filtering tools, cutting and selection tools. Elementary data manipulation is done using Extremas built-in expression evaluation capabilities. Any expression involving a variable will return a similar variable, each element of which has been modified by the expression; the return value of the expression can be saved to another variable, or operated on directly. Examples: y = SIN(x)^2 + COS(x)^2 ! save expression results in variable y GRAPH x 3*x^2-6x+2 ! graph expression directly Expressions are built up of constants, variables, operators, and functions, which can be combined in any algebraic syntax, as in the examples above. Operators In addition to the simple arithmetic operators, +, -, *, /, ^ (exponentiation), and ( ) (grouping), there are also special vector and matrix operators: >< - outer product <> - inner product <- - matrix transpose >- - matrix reflect /| - vector union /& - vector intersection and a set of Boolean operators that return true (1) or false (0) values: | - or || - exclusive or & - and \ - not = - equal to ~= - not equal to > - greater than < - less than >= - greater than or equal to <= - less than or equal to Functions Extrema has over 200 built-in functions that can perform a wide range of other operations on your data. Examples include: conventional mathematical functions, such as the trigonometric functions, logarithms, roots and exponentials, and rounding functions. advanced functions, such as Bessel, Clebsch-Gordan, etc. calculus functions, such as integral and derivative. probability functions programmers' functions, such as random number generation, variable tests, looping functions array and matrix functions, such as where, eigenvectors and eigenvalues, etc. string functions, such as case, date/time, etc. In all cases, these functions accept data of a certain type, and return data of a certain type; they may be freely used in any expression, so long as the types they return make sense in the expression context. For further information, see Operators and Functions in the Extrema Command Reference. Fitting Fitting data, that is, describing a set of data points as some sort of function, is one of the most important forms of data analysis. Extrema's data-fitting capabilities are sophisticated and flexible; complete details are provided in the Extrema Command Reference, but some simple examples are given here. Smoothing Smoothing is a simple way of fitting a set of data points to a smooth curve. There are several methods of calculating these smooth curves, notably cubic splines under tension (SMOOTH and SPLSMOOTH functions), and Saviztky-Golay filters (SAVGOL function).  Smoothing functions return a smoothed set of data, that is, they accept your data as input, and output a new set of values that fall on a smooth curve of the appropriate type. They can operate on any shape of data without any prior knowledge of the data's shape. (In some cases, there is a requirement that the data be monotonically increasing.) They will not, however, return an actual algebraic function describing the shape of your data. For this you need to do a proper fit (see below). There are also interpolation functions that will fill in missing data using similar smoothing techniques (INTERP and SPLINTERP functions). Please refer to SMOOTH, SPLSMOOTH, SAVGOL, INTERP, and SPLINTERP functions. Fitting to a function To describe your data as a function, you'll need to know in advance what function you will be fitting to. This function will be expressed with a number of free parameters, whose precise values are unknown. The purpose of the fit is to determine what values of those free parameters best match the data. Note: Fitting is an uncertain process by its very nature. There is no guarantee that an appropriate fit will be found in all cases, and there is no guarantee that there is only one such fit that describes the data. A free parameter is like a scalar variable, except that instead of being set by you (or your data analysis operations), it is set by Extrema in the course of making the fit. This difference in behaviour means that free parameters are declared differently, so that Extrema knows it can vary the parameter, instead of treating it as a fixed constant in the fitting expression. SET PLOTSYMBOLCOLOR RED ! GRAPH X Y ! graph the raw data SCALAR\FIT A B ! declare free parameters FIT Y=A+B*X ! perform the fit SET PLOTSYMBOL 0 ! graph the fit function as a line SET CURVECOLOR BLUE ! GRAPH X A+B*X !  Free parameters should be initialized to an appropriate guess value, from which the fit will begin. In simple cases, the actual value of the guess is not terribly important; Extrema will find the correct value regardless. In more complex cases, the initial guess will affect how the fit progresses, and could affect the final result. In other words, in some cases, different fits can be found depending on where you start, so choosing a reasonable guess to initialize the free parameters can be important. Once the fit is complete, the free parameters will have their fitted values. If Extrema failed to find a good fit, the free parameters will have the last values Extrema tried to fit with; or, optionally, they can be reset to their initial values upon failure. Normally, fitting results in multiple lines of text output describing the fit. The values of the free parameters, and various other values describing the accuracy of the fit, are all contained in this output. Extrema can optionally write some of this information into variables, for access by scripts and expressions later in the analysis process. For more detailed information, please refer to the FIT command in the Extrema Command Reference. Fitting different data segments to different functions In some cases you will want to divide the data into segments or groups, and fit each group separately. For example, suppose you want to fit two line segments to the data such that they join at one end point. Below, on the left, is an example where the two segments are forced to join and, on the right, an example where they are allowed to float. X=[1:19] Y=[1;2;3;4;5;6;7;8;9;10;9;8;7;6;5;4;3;2;1]+5*ran(x) Window 5 Set plotsymbol 1 Graph x y Scalar\fit a b c d X0 = 10 Fit y=(a+b*x)*(x<=x0)+(c+d*x)*(x>=x0)+(a+b*x-c-d*x)*1000*(x=x0) Set plotsymbol 0 I1 = where(x<=x0) I2 = where(x>=x0) Y1 = a+b*x Y2 = c+d*x Set curvecolor red Graph\overlay x[i1] y1[i1] Graph\overlay x[i2] y2[i2] Window 7 Set plotsymbol 1 Graph x y Fit y=( a+b*x)*(x<=x0)+(c+d*x)*(x>=x0) Set plotsymbol 0 Y1 = a+b*x Y2 = c+d*x Set curvecolor red Graph\overlay x[i1] y1[i1] Graph\overlay x[i2] y2[i2] Replot\all  Binning Binning data has already been mentioned a few times as a means of converting one-dimensional data into two-dimensional data (BIN command), or two-dimensional into three-dimensional (BIN2D command). Simply put, binning counts the data points falling into a certain range. This results in a vector (or vectors, in the 2-D case) describing the ranges (the bins), and a second vector (or matrix) describing the counts. Simple binning is straightforward. An input vector of values is taken as input, and two output vectors containing the bins and the counts are returned. BIN x xbin xcount ! bin the values in x GRAPH\HISTOGRAM xbin xcount There are many binning options, among them: various options for defining the bin boundaries the averages of the values in each bin can be returned values can be counted conditionally counts can be weighted lagrange binning Please refer to the BIN command for more information. Interpolation There are many cases where one needs to interpolate data, for instance: estimating missing data values converting an irregular data sample to a monotonically increasing data sample representing a set of data points as a smooth function Interpolation presumes the data can be represented as a smooth function, and that this function passes through all of the data points. Interpolation therefore consists of looking up the y-values of this function for any x that is not represented in the original data. This is normally done by means of the INTERP function, which returns a data vector containing the interpolated values. The INTERP function accepts three arguments: x-vector, a monotonically increasing set of x values. y-vector, the values of y at each of the above x values. x-interpolation points, a set of x-values at which to interpolate new y-values. The method of interpolation is normally interpolating splines, but an optional fourth argument can be used to select an alternate interpolation method: LINEAR simple linear interpolation LAGRANGE general Lagrange interpolation FC Fritsch and Carlson method of monotone piecewise cubic interpolation If one's starting data is not monotonically increasing, then one can use the SPLINTERP(x,y,n) function instead. It accepts an arbitrary set of x and y values, and a number of points to interpolate. The output is a 2-column matrix, the first column of which gives the interpolated points (i.e., x-values), and the second of which gives the interpolated values (i.e., y-values). 2-D interpolation Beginning with a scattered set of 3-D data points in three vectors (say, x, y, and z), you can interpolate a regular matrix using the GRID command. The three vectors are assumed to represent scattered points, where z[i] is the altitude corresponding to the coordinates (x[i],y[i]). The set of scattered data points is used to construct a Thiessen triangulation of the plane and a regular matrix, m, is interpolated. For example, the following script produces the pictures below. X=[1;0;1;0;0.2;0.3;0.5;0.8] Y=[5;5;0;0;1;1.5;2.5;4] Z=[10;10;10;10;-100;10;-100;500] GRID\XYOUT X Y Z M XOUT YOUT SET PLOTSYMBOL 14 GRAPH X Y ! produce the graph on the left SET PLOTSYMBOL 0 DENSITY\DITHER XOUT YOUT M ! produce the density plot  Integration Integration is the summing of areas and volumes under curves and surfaces. Extrema provides you with several tools to accomplish this. The INTEGRAL function is the simplest method; it accepts two vectors representing the x-values (monotonically increasing) and y-values of the function to be integrated. The return value is the integrated function, i.e., the integral at each x-value; there is one additional value appended to the end of this output vector, and that is the integral over the full range of x. For example, to find the area under cos3(x)+sin4(x) for 0 d" x d" (: pi = ACOS(-1) x = [0:pi:.1] yi = INTEGRAL(x,COS(x)^3+SIN(x)^4) value = yi[#]  Other functions Please refer to the DERIV function (derivative of a function); and the AREA function (area within a polygon), and the VOLUME function (volume under a surface). There are also numerous special integration functions, such as elliptic integral, Fresnel integral, exponential integral, sine integral (SININT) and cosine integral (COSINT). Two-dimensional integration is typically done using the VOLUME function, which can operate on a variety of data types: vectors containing scattered (x,y) points vectors containing scattered polar coordinate points (angle, radius) regular matrix Data Selection Filtering, cutting, and other forms of conditional data selection are a big part of many analysis tasks. There are many ways this can be accomplished in Extrema. Many of these techniques involve selecting subsets of vectors, matrices, or tensors, according to some arbitrary condition. A trivial form of data selection simply consists of selecting the desired indexes, for example: good_data = m[#,*] ! only the last column of the matrix is good If the good data is scattered throughout a vector (say data), and you have the indexes of the good values in another vector good, then you can select the good data using the notation: good_data = data[good] Determining which indexes are good and which are bad is the tricky part. The WHERE function is invaluable for this. It accepts a vector as input, and returns the indexes where the input vector was not equal to zero. The input vector is usually some kind of Boolean operation on the actual data vector, such that a vector of true/false (1/0) values is actually passed to the WHERE function. The return vector of indexes is then used to select the values from the original data vectors. The power of this function is best illustrated with a few simple examples: Example 1: select the data points within 1 unit of the origin We have a scattered set of data points in the vectors x and y, but we want only the ones that lie within the unit circle, i.e., the points that satisfy SQRT(x^2+y^2)<=1. i=WHERE(SQRT(x^2+y^2)<=1) ! select data in unit circle ! i is our list of selected indexes GRAPH x[i] y[i] ! graph the selected data Example 2: select only the data points collected within a time window We have an unordered, scattered set of data points in the vectors x and y, and the times of each in a vector t. Say our time window is defined by tmin and tmax. i=WHERE(t>=tmin & t<=tmax) ! select data in time window GRAPH x[i] y[i] ! graph the selected data Example 3: select only the data points whose error is below a threshold We have a set of data points in the vectors x and y, with errors denoted by vectors xerr and yerr. We want to reject any data point with an x-error exceeding xthresh or y-error exceeding ythresh. i=WHERE(xerr<=xthresh|yerr<=ythresh) ! select good data GRAPH x[i] y[i] xerr[i] yerr[i] ! graph the selected data Example 4: eliminate spikes from the data We have a set of data points in the vectors x and y, with occasional anomalous (single-point) spikes where the y-value goes very high. In the simple case, we can simply filter out any data over a certain y-value (say, ymax): i=WHERE(yb) THEN RETURN GOTO start In the above example, the GOTO statement restarts the script from the top; this could repeat indefinitely, if we didn't have the conditional RETURN statement to exit the script at some point. (This is a simple example of a loop.) Here is another way to use GOTO statements to continue executing a block of code until some condition is met: begin: ! loop to execute a block of code until a equals b ... IF (a != b) THEN GOTO begin If you cannot get Extrema to make the key decisions on its own, you could always prompt for a human decision on whether to repeat the loop: begin: ! loop to execute a block of code until user is happy ... INQUIRE Redo (Y/N)? answer IF (EQS(answer),Y) THEN GOTO begin You could use similar conditional branching statements to control the number of times a section of code gets executed: nloop = 0 ! ugly loop to execute a block of code 10 times do_loop: ... nloop = nloop+1 IF (nloop <= 10) THEN  5STU[_or    5 6 󼬼ydy)h5B*CJ OJQJmHnHphu-h0Jq5B*CJ OJQJmHnHphu6jh0Jq5B*CJ OJQJUmHnHphuh5B*CJ OJQJph'jh5B*CJ OJQJUph h@ h@h[S jhhCJ`OJQJ^JhjhU 56789:;<=>?@ABCDEFGHIJKLMp&ZDp&Hp&5 p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.p&.[__Z$a$KDDDMNOPQRS\oh  k  Z K ; p&.p&.p&.p&.p&.p&.p&Rup&.p&.p&.p&|j  hg  ][$a$[6 7 8 ? @ G H I b c d e f g h ŬnVnn?-#h5:CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu/jh5CJ OJQJUmHnHu,jh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu(h0Jq5CJ OJQJaJHmHnHu1h0Jq5B*CJ OJQJaJHmHnHphu6jh0Jq5B*CJ OJQJUmHnHphu;jh5>*B*CJ OJQJUmHnHphuh i j շժp_P_hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu$j h6CJOJQJU!jh6CJOJQJUh6CJOJQJ$jh6CJOJQJUh6CJOJQJ%h0Jq6>*B*CJOJQJph.jh0Jq6>*B*CJOJQJUph          5 6 ͼn\ODOh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu,jhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jh>*B*CJOJQJUmHnHphu6 7 8 J K L e f g h i j k l m ƹՈ{p{WƹD$jh6CJOJQJU0jrh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]$jh6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0j|h6>*B*CJOJQJUph      ʷsaJa2JaJ/jh5CJ OJQJUmHnHu,jh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu(h0Jq5CJ OJQJaJHmHnHu;jhh5>*B*CJ OJQJUmHnHphu h5CJ OJQJmHnHu$h0Jq5CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJU    # $ % & 9 : ; T U V W X Y Z [ \ Ϊۛ}j}}]G6!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]$jh6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0j^h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU#h5:CJ OJQJmHnHu\ w x y z ¬ߛo^Aߛ8jJ h>*B*CJOJQJUmHnHphu!hCJOJQJaJmHnHu,j hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jT h>*B*CJOJQJUmHnHphu!h0JqCJOJQJmHnHuhCJOJQJmHnHu      * + , E F G H I J K ԭ|_Hԭ,j hCJOJQJUmHnHu8j@ h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,j hCJOJQJUmHnHuK L M h i j k }pZI:IhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]$j h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0j6 h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU     5 ͼnͼ_Bͼ8j"h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!hCJOJQJaJmHnHu,j hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8j, h>*B*CJOJQJUmHnHphu5 6 7 8 9 : ; < = X Y Z [ j k l ԭ}r}YJ=,=!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0jh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,jhCJOJQJUmHnHu ܽz]L7L)jhCJOJQJUmHnHu hCJOJQJmHnHu8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJUh6CJOJQJ!jh6CJOJQJU$jh6CJOJQJU  !<=ԭ|_Hԭ|,jhCJOJQJUmHnHu8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,jhCJOJQJUmHnHu rjd dNy\>,vi  hg  j  =>?QRSlmnopqrstͼnWD3D h5CJ OJQJmHnHu$h0Jq5CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu!hCJOJQJaJmHnHu,juhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jh>*B*CJOJQJUmHnHphuʵtbPC8Ch6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU#h5:CJ OJQJmHnHu/jkh5CJ OJQJUmHnHu,jh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu(h0Jq5CJ OJQJaJHmHnHu-jh0Jq5CJ OJQJUmHnHu;jh5>*B*CJ OJQJUmHnHphu3456IƹՈraRa5ra8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]$jah6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0jh6>*B*CJOJQJUphIJKdefghijklڭ}r}YJ=h6CJOJQJh0Jq6CJOJQJaJ 0jh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu,jWhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu~o\F*jh0JqCJOJQJUmHnHu$jCh6CJOJQJUh0Jq6CJOJQJaJ 0jh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJU$jMh6CJOJQJUh6CJOJQJ!jh6CJOJQJU5678CDE^_`abcdef¬o^A8jh>*B*CJOJQJUmHnHphu!hCJOJQJaJmHnHu,j9hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHuԭufuIu8 hCJOJQJmHnHu8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,j/hCJOJQJUmHnHu     ()*+CD꬛|q|XI<h6CJOJQJh0Jq6CJOJQJaJ 0jh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu,j%hCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHuDE^_`abcdefy\K6K)jhCJOJQJUmHnHu hCJOJQJmHnHu8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJU$jh6CJOJQJUh6CJOJQJ!jh6CJOJQJUԭ|_Hԭ|,jhCJOJQJUmHnHu8jh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,jhCJOJQJUmHnHu -./HIJKLMNOPklͼn\ODOh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu,jhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jh>*B*CJOJQJUmHnHphulmnƹՈraRa5ra8jnh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]$jh6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0jxh6>*B*CJOJQJUph3456XYZstuvwxyz{ڭ|_Hڭ|,j hCJOJQJUmHnHu8jd h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu,jhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHuѻ~mWF7FhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu!hCJOJQJaJmHnHu,j!hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jZ!h>*B*CJOJQJUmHnHphu!h0JqCJOJQJmHnHu;<=VWXYZ[\]^yz{|ͼnͼ_Bͼ8jF#h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!hCJOJQJaJmHnHu,j"hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jP"h>*B*CJOJQJUmHnHphuԭrarC.(h0Jq5CJ OJQJaJHmHnHu;j<$h5>*B*CJ OJQJUmHnHphu h5CJ OJQJmHnHu$h0Jq5CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,j#hCJOJQJUmHnHu 89:;<=>?@[\]^de֧vkvRC6h6CJOJQJh0Jq6CJOJQJaJ 0j2%h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU#h5:CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu/j$h5CJ OJQJUmHnHu,jh5CJ OJQJUmHnHu#h5CJ OJQJmHnHuefy\K6K)jhCJOJQJUmHnHu hCJOJQJmHnHu8j(&h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJU$j%h6CJOJQJUh6CJOJQJ!jh6CJOJQJU   &ԭ}r}YJ=,=!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0j'h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,j&hCJOJQJUmHnHu&'()*+,-.IJKLUVWpqrstuvwxܽp]ܽ$j(h6CJOJQJUh0Jq6CJOJQJaJ 0j(h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJUh6CJOJQJ!jh6CJOJQJU$j'h6CJOJQJUƹՈ{p{WƹD$j{*h6CJOJQJU0j*h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]$j)h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0j )h6>*B*CJOJQJUph#$%&123LMNOPQRSTopqr~԰pW0j+h6>*B*CJOJQJUph$jq+h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0j*h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJUR2wnJaI4{=i  g  j  hܽp]ܽG*jh0JqCJOJQJUmHnHu$j]-h6CJOJQJUh0Jq6CJOJQJaJ 0j,h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJUh6CJOJQJ!jh6CJOJQJU$jg,h6CJOJQJU  ,-./01234OPQRVWXq¬o^A8j.h>*B*CJOJQJUmHnHphu!hCJOJQJaJmHnHu,jS.hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8j-h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHuqrstuvwxyԭ|_Hԭ|,j?0hCJOJQJUmHnHu8j/h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,jI/hCJOJQJUmHnHu45ͼnWD3D h5CJ OJQJmHnHu$h0Jq5CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu!hCJOJQJaJmHnHu,j51hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8j0h>*B*CJOJQJUmHnHphu567MNOhijklmnopʵtbPC8Ch6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU#h5:CJ OJQJmHnHu/j+2h5CJ OJQJUmHnHu,jh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu(h0Jq5CJ OJQJaJHmHnHu-jh0Jq5CJ OJQJUmHnHu;j1h5>*B*CJ OJQJUmHnHphuƹՈ{p{WƹD$j4h6CJOJQJU0j3h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]$j!3h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0j2h6>*B*CJOJQJUph !")*+DEFGHIJKLgh԰pZI:IhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu$j 5h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0j4h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJUhijstuͼnͼ_Bͼ8j~6h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!hCJOJQJaJmHnHu,j6hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8j5h>*B*CJOJQJUmHnHphu  @AԭufuIu8 hCJOJQJmHnHu8jt7h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,j6hCJOJQJUmHnHuAB[\]^_`abc~꬛|q|XI<h6CJOJQJh0Jq6CJOJQJaJ 0jj8h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu,j7hCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu~o\F*jh0JqCJOJQJUmHnHu$j9h6CJOJQJUh0Jq6CJOJQJaJ 0j`9h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJU$j8h6CJOJQJUh6CJOJQJ!jh6CJOJQJU()*CDEFGHIJKfg¬o^L?4?h6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu,j:hCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu*jh0JqCJOJQJUmHnHu8jV:h>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHughituvƹՈ{p{WƹD$j<h6CJOJQJU0jB<h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]$j;h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0jL;h6>*B*CJOJQJUph./0123456԰pYF$h0Jq5CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu$j=h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0j8=h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJh6CJOJQJ]"jh0Jq6CJOJQJU6QRSTZ[\uvwxyz{|ܾiQii?-"jh0Jq6CJOJQJU#h5:CJ OJQJmHnHu/j>h5CJ OJQJUmHnHu,jh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu(h0Jq5CJ OJQJaJHmHnHu-jh0Jq5CJ OJQJUmHnHu;j.>h5>*B*CJ OJQJUmHnHphu$h0Jq5CJ OJQJmHnHu h5CJ OJQJmHnHu|}78μ|oVC$j@h6CJOJQJU0j@h6>*B*CJOJQJUphh6CJOJQJ]$j?h6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ "jh0Jq6CJOJQJU0j$?h6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ89:;<=>?Z[\]mno¬o^I^2I^I,jAhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu8jAh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJUh6CJOJQJ!jh6CJOJQJUȹȜȋv_vvȹB8jBh>*B*CJOJQJUmHnHphu,jBhCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHu8jBh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu4567BCڭ}r}YJ=h6CJOJQJh0Jq6CJOJQJaJ 0jCh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu,jwChCJOJQJUmHnHu)jhCJOJQJUmHnHu hCJOJQJmHnHuCD]^_`abcdetVA/#h5CJ OJQJmHnHu(h0Jq5CJ OJQJaJHmHnHu;jDh5>*B*CJ OJQJUmHnHphu h5CJ OJQJmHnHu$h0Jq5CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJU$jmDh6CJOJQJUh6CJOJQJ!jh6CJOJQJUc S S!!!>"@"A"I"K"L"\"w"""$($8$ D & F666 d& #$,D/<WYgj  g  h׿騖wlwSD7h6CJOJQJh0Jq6CJOJQJaJ 0jEh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU#h5:CJ OJQJmHnHu-jh0Jq5CJ OJQJUmHnHu/jcEh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu,jh5CJ OJQJUmHnHu     ' ( ) * 2 3 4 M y\K6K)jhCJOJQJUmHnHu hCJOJQJmHnHu8jFh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJU$jYFh6CJOJQJUh6CJOJQJ!jh6CJOJQJUM N O P Q R S T U p q r s ԭ}r}YJ=,=!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0jGh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,jOGhCJOJQJUmHnHu ܽz]L7L)jhCJOJQJUmHnHu hCJOJQJmHnHu8jHh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu*jh0JqCJOJQJUmHnHuh6CJOJQJ]"jh0Jq6CJOJQJUh6CJOJQJ!jh6CJOJQJU$jEHh6CJOJQJU !!!!2!3!4!M!N!O!P!Q!R!S!ԭ|_Hԭ,j1JhCJOJQJUmHnHu8jIh>*B*CJOJQJUmHnHphuhCJOJQJmHnHu!h0JqCJOJQJmHnHu!hCJOJQJaJmHnHu*jh0JqCJOJQJUmHnHu hCJOJQJmHnHu)jhCJOJQJUmHnHu,j;IhCJOJQJUmHnHuS!T!U!p!q!r!s!~!!!!!!!!!!!!!!!!!!!!}pW0jKh6>*B*CJOJQJUphh6CJOJQJ]$j'Kh6CJOJQJU!jh6CJOJQJUh6CJOJQJh0Jq6CJOJQJaJ 0jJh6>*B*CJOJQJUphh6CJOJQJh0Jq6CJOJQJ"jh0Jq6CJOJQJU!!!!!!!!!""""""""ܽqYF4#h5CJ OJQJmHnHu$h0Jq5CJ OJQJmHnHu/jLh>*CJOJQJUmHnHuhCJOJQJmHnHu*h0JqB*CJOJQJmHnHphu3jh0JqB*CJOJQJUmHnHphuh6CJOJQJ]"jh0Jq6CJOJQJUh6CJOJQJ!jh6CJOJQJU$jLh6CJOJQJU""8"9":";"<"=">"?"w""""""$($%%C&׿騕{rj_WQEh0JCJOJQJ h0Jh0JCJh5B*\phhCJrEHh;CJrEH hCJ(hjh5CJ OJQJU$h5CJ OJQJaJmHnHu-jh0Jq5CJ OJQJUmHnHu/jMh5CJ OJQJUmHnHu#h5CJ OJQJmHnHu,jh5CJ OJQJUmHnHu8$C$R$e$s$z$$%r&&'k'7(V((u))/*A++--$a$N & F. D & F,6 D & F+6 D & F*6 D & F)6D6 D & F'6C&]&&&'+'7(V((((((((()))))))l*m*****+ + ++++h+m+++,,---Źŭŏyynh6B*]phh5B*\phh5B*\phhB*OJQJ^JphhB*phhB*phfhB*OJQJphhB*OJQJphhB*OJQJ^Jphhh0JCJh0JCJOJQJ(h0J5>*B*CJOJQJ\ph+-+-./y0000031^1r111b3C4D4L4N4Y4446?777@WY$a$O & F4-+-2---(.2.|.......////0001122445 5555556666666666666!7'777=7B8O8i8u8888899,929붪˶˶˶˶˶hB*OJQJphhB*OJQJphhB*OJQJ^Jph h5\hB*phhOJQJ^JhB*OJQJ^Jphhh5B*\ph hCJ(>7B8i88889,9m99M:h:: ;*;^;;&<[<<<.===,>>> Ae5]e^5`A29Z9k9 ;;;';(;);*;0;1;[;\;];^;;;;;;#<$<%<&</<0<X<Y<Z<[<<<<<<<<==+=,=-=.=|=}=========>)>*>+>,>>>h0JCJhOJQJ^JhB*OJQJphhCJOJQJhCJOJQJhB*CJOJQJphhB*OJQJ^Jph h6]h<>>>>>>>>>>>??&?-?E?F?G?H?O?k?l?m?n?v??????????????? @7@8@9@:@tAAAAAAAAAAABYBfBzBտտտտտձթթթթhB*CJOJQJphhB*phhB*CJOJQJphhCJOJQJhB*OJQJphhB*OJQJ^JphhB*phhhB*CJOJQJ^Jph:>>>&?H?n????:@D@@tAAAAYBBBB1DrDDDEiED & Fh^h` D & FzB{BBBBBBBBCCCCD DDD1D;D=DSDTDpDqDrDzD|D~DDDDDDDDDDDDDDDDDDDEEE_EfEEEEEEEZFгг̣г̗̗Уг̗У̑ hCJ(hB*OJQJphh;B*OJQJ^JphhB*OJQJ^Jphh5B*\phhhB*OJQJ^JphhB*CJOJQJphhB*ph jphB*ph9iEEEEE=GHG&HHHIaIIIJJKKKLMSMtMMSNN@ee]e^e`UU$a$ZFaFFFGGHHIIIII=IIIIII|JJKK1MBMXM\MaMsMtMMMMMMM?P@PCPXPPQVQlQmQtQxQQQ)R𯵠𔌔 jphhOJQJhB*OJQJph jphB*OJQJph h^JhB*OJQJph h; hCJ(hB*CJOJQJphhB*OJQJ^Jph jhH*hh5B*\ph0NNNO"O0PYPoQ}QQQQLRMRURWRfRSS=UmUUUUU$a$WYUU@@ee]e^e`)RJRfRmRcSSSSSUUUUUUUUUUUUVVVVWWXXSY\YeYiYYYYYYYZZaZbZZwojI|hUh6]^J h6]hB*OJQJphjqhUjjhUjdhUj[hUjxThUjMhUhB*OJQJ^Jph h5\h5>*\h5B*\phhh@B*KHOJQJph+UUV'VVVVWWXXXSYzY-Z=ZJZWZaZcZZZ[[\4]F]@UU$a$U$a$ZZ[[K[[[Q\V\P]Q]]]^^^^:_<_U___s_x__________`S```b`c```SaTaYaZa[aaa:b;b=b>bDbEbvc|ccj-hUjLhU h;CJ hCJh6]^JhB*OJQJphj.hUjhhUjohU h6]hOJQJ h5\hhB*OJQJ^Jph7F]P]R]]]]|^^^^^________`$IfU$IfUU$a$U``b`d`e`~`a-abydoeefdffffg4gU$a$U@Z$a$Ikdʸ$$IfTl0 Q D y4 laTccdddeeffqfsftffffff$g&g'g4g5gZg[gwgyggggggghhhhhhiijjjjjjjkkkkkkkkkll?lѺѩѓ jThB*OJQJUph hH* jxhB*OJQJUph jhB*OJQJUph h^JhB*OJQJph h6]h6]^JhhB*OJQJ^Jph:4g6gDgggggghi}jj?lAldlymmSnnnnooo%o.o9oUU$a$U$a$U$a$?l@lm#mmmmmnnnnnnnoo ooooo%o+o.o3o9o:o?oEoooppppppqqqqqqqqYr_rrsssVsXs󴦴 h6]jhUhB*OJQJ^Jph h^JhB*OJQJphjdhU h;hB*OJQJ^Jph h5\h5B*\phhjashU59o;oooppppqqqqqqrrrrrIsqssltxtttuU$a$tUU$a$XsYsqssssssssssttttlttttttt@uAuuuvv1v7vvvvvwwxŮŘŮ|h'h0JuB*CJOJPJQJ^JphjhU h; h6]jThU+h0Ju@B*CJOJPJQJ^Jph-h6@B*OJPJQJ]^JaJph'h@B*OJPJQJ^JaJph h5\hhB*OJQJphh6B*OJQJ]ph%uuuuuv v0v@vLv\v^vivmv~vvvvvvvvv}w~wwwwWY$a$UUwxxy?zRzzzX{|||~ր=P9hU$a$Ux x={V{|}z}}}}{~~~~$<Og./UVhieȆ%&𮟮jvhUj;hUh6B*OJQJ]phhB*OJQJphhj+j[hj+UhOJQJ^JhB*^JphhB*OJQJ^Jphh5>*\hh5B*\ph5(Rghjʅe{Ȇʇ%'1U$a$@@Uz{1>Yhlop̍#ݎގ"#ďŏߏLٯ٧'h0JuB*CJOJPJQJ^Jph hPJ h6]jhUh0JuB*CJOJQJphhB*OJQJ^JphhB*OJQJphhOJQJ#h0JuB*CJOJQJ^JphhjhU41#r$7C jG`xUU$a$tLP\`qِڐ78RV^đϑӑ'LMgvntvѓԓ+0FGո՚՚՚Մ hPJhj+0JuB*OJQJ^Jphh0JuB*OJQJ^Jphhj+B*OJQJ^JphjhUhB*OJQJ^Jph h6]h'h0JuB*CJOJPJQJ^Jph#h0JuB*CJOJQJ^Jph4Gcik%'*;@PZfz{(*7HWfuØИؘݘ./ԺԺԺ˫h# h# B*OJQJ^JphhB*OJQJ^Jphj.hWU hPJhW;CJPJhWCJPJhj+;CJPJh;CJPJhCJPJhj+0JuB*OJQJ^Jphh0JuB*OJQJ^Jphh3*@Zzėܗ(5;Tq՘֘$a$UgdWUYlQY)Hy[`$IfUU/MN~{|ST\e ٟڟ-.֠נTb %pqy56>E)ghqfg@A#h0JuB*CJOJQJ^Jph h6]h# hW[$Ifnkd_$$Ifl0 Q  064 la[\f$Ifnkdl`$$Ifl0 Q  064 la $Ifnkda$$Ifl0 Q  064 la $Ifnkda$$Ifl0 Q  064 la$Ifnkd+b$$Ifl0 Q  064 la$Ifnkdb$$Ifl0 Q  064 laS$IfnkdUc$$Ifl0 Q  064 laSTc$Ifnkdc$$Ifl0 Q  064 la&x$Ifnkdd$$Ifl0 Q  064 laxy$Ifnkde$$Ifl0 Q  064 la=$Ifnkde$$Ifl0 Q  064 la=>F$Ifnkd>f$$Ifl0 Q  064 la$Ifnkdf$$Ifl0 Q  064 la*p$Ifnkdhg$$Ifl0 Q  064 lapq$Ifnkdg$$Ifl0 Q  064 la$Ifnkdh$$Ifl0 Q  064 la|$Ifnkd'i$$Ifl0 Q  064 la|}~Ԧܦd$Ifnkdi$$Ifl0 Q  064 la˦Ԧզۦ+3RWX[ckltu^`fht~¨Ȩڨ|~ʩԩDEopªê 49:=EϹϹϹ hPJ jhh0JuCJOJQJ^Jh0Ju6CJOJQJ] h6]h0JuCJOJQJ#h0JuB*CJOJQJ^JphhhB*OJQJ^Jph>dfv$IfnkdQj$$Ifl0Q 064 la¨pqd$Ifnkdj$$Ifl0Q 064 laEMNVW^`fht~¬Ȭڬ|~ʭԭDEpqrsNO :;MXqrƱDZ,j}hUjthUjlhU jhhB*OJQJ^Jphh0JuCJOJQJ^J h6]#h0JuB*CJOJQJ^Jphhh0Ju6CJOJQJ]h0JuCJOJQJ5dfv$Ifnkd{k$$Ifl0Q 064 la¬prtuvBGkd.}$$Ifl0 Q ^_64 la$Ifnkdl$$Ifl0Q 064 lav ɰ߰ "Zqs ,>oWY$a$$a$N & F7N & F7UU,4޲<=Sn>?ABDEGHJKbeѵյxyöҶն<CĺV]ػļɼҼ(h0J5>*B*CJOJQJ\phhB*OJQJ^Jph h^JhB*OJQJph h5\hh5B*\phGoѵ/xҶ2<>w¸loƺǺϺ $a$@ Կl.GZ\`U 'UU$a$ .5gmr{ɿy .AFXZ[ 2:(h0J5>*B*CJOJQJ\phjhU h^JhB*OJQJphh5B*\ph h5\hOJQJ^JhB*OJQJ^Jph h6]jhUh: /2o} #(+O]vRU"7GJ ABCDMNef|}nt h6]hB*OJQJphhB*OJQJ^JphhjΥhU h; h;CJ hCJL'/o (O`kvu8$a$U8T "3ijx-dMn6u@@ee]e^e`UtTd/0wx):lmpq"#u )Vqrstýxh5B*\ph hCJj%hCJUaJjkhCJUaJhB*OJQJphhB*OJQJ^JaJph haJ h^JhOJ QJ hOJQJ^JhCJOJQJaJ h6]hB*OJQJ^Jphh/u):qtu.J/Y@$a$@ee]e^e`UU ^_|} ^fhLQW^Q}6Lh# hB*OJQJphh5B*\ph h^JhB*^JphjihU jph hCJh6]^J hH* h6]hB*OJQJ^Jphh<`=~6M'5h7=J ^`UU@$a$Vf7yz#<=$+/0AHpXYCG H h6B*OJQJ]ph h6]hB*OJQJphhB*OJQJ^Jphh h5\NIkFGytCH7wWYU$a$UU Z]{~bjkrstjnu|Nvaf5=9A<DOWĶhB*OJQJphhB*OJQJ^Jph hPJh0JuCJOJQJ^Jh0JuB*OJQJ^Jph#h0JuB*CJOJQJ^JphhOJQJ^Jhh5B*\ph:w3{ "FI#0WY@@ee]e^e`4;;EKSxb h            A L M P Q ]   ^ _ ` h i  ܭh6B*]phhOJQJhB*OJQJph h^JhOJQJ^JhB*OJQJ^Jphh5B*\phh h5\Dt   ' h %   Q o   jUU@  ,46:CJQR\`iop (-2"'w{_c&@\@@@@@@@@sAuAAAAAAB"B#BOBPBUBVBCC(DJDӱӱӱӱ h^Jh6B*OJQJ]phUh5B*\phhB*OJQJph h6] h5\hhB*OJQJ^JphFjk,6R\pxj29=R]D UU @@M@@@@@@@@}AAAAAABWBpBBBBUUGOTO do_loop DO loops The previous example can be written more concisely as: DO x = [1:10] ! better loop to execute a block of code 10 times ... ENDDO The general form of the DO loop is: DO scalar = vector ... ENDDO The scalar is set to each element of the vector in turn, with the loop code being executed once for each such setting. Thus, the following are all legal DO loops: DO i = [-10:10:2] ! loop from -10 to +10 in steps of 2 ... ENDDO DO i = x^2 ! loop over the squares of all values of x ... ENDDO DO x = [1:LEN(a[*,#])] ! matrix c is the difference between ! matrixes a and b DO y = [1:LEN(a[#,*])] c[x,y] = a[x,y] - b[x,y] ENDDO ENDDO This last example is illustrative of the looping mechanism (using nested loops), but otherwise it is a bit artificial. This is how you might handle the operation of subtracting two matrices in a conventional programming language, but loops of this nature are implicit in Extrema 's variable handling and expression evaluation. The same operation can be accomplished more efficiently with: c=a-b ! implicit loop over every element Getting started witn Extrema  PAGE 1 Design Customization PAGE 54 B!DKDhDiDjDuDvDDDDDDDDDDDDDDDD!&`#$!(UJDjDkDqDrDsDtDDDDDDDDDDDhghg0JVmHnHu h0JVjh0JVUh9000 &PP/R / =!"#$%3 0&P/R / =!@ "#$% P:00:&PP/R / =!"#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h6 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h6 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h6 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h6 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% h9 0 00&P/R / =!@ "#$% hDdT  C 0Aexware-logobJb&~fC@DnJb&~fC@PNG  IHDR220PLTEx((x((PTxx|mbKGDH cmPPJCmp0712OmIDAT8An P#^t}'b ETUn[dl2zуң[((ʯ(GQIEɡK㽒tq8$)ڋjTb[ZhlPl7irrtLX @T)&?\bMz&`X8dO.jnS$ې T.Jy쳋ҞBgK]ZTn1ef7:VRe[dfR5G#z;)ە}y:ojTORɖ4r7oSGT=56w,A 5,J%4:iOEuн_{dž-kXN >و=DVϟ7TwgНCXMYZCd7^A*Ui{j,6dZeھs4؉щ>xZ}P!̵'괎vxx-Ȫ6N'.d :/6=?|]^Gu;8v@PSˍVA_~ΞY:rJV/3s6*;BNdCsskQZk){{w:=g4EOtRZ%rx(74:ȚXr3tPԕT2śruoBEjI틯;wwWSENKgsE]pSj{mMJŝaB֥)WnxJmW]0e0cƛz#WSL|j2߭5JCKPmO%>堏۹v.my;]S]ngsq/mz(ߪ߅?>oxz|kuFx-}Ȝ#o*oJ5׆PҐ$w~;\ADd,:F  C "A w2-12=Hjn] :.T`!{=Hjn] :.&IޟnVIxkGYٱ[%ZB!Pl҃IV$q VR-kږC8rpP)aC ,~irH>cO"2q~/ |l:z.M, s|fH"gsO.6rGcg3-Mv _uD춺uN~Ӯ^':tСC:tСC:tСC:tСCN6k0` #Ecwl^t6IN^3Տ Nt3ک{tT5#6-mg=y5S8mLr׎C"~I]ZRsZeuS,:\]Dq8uWE^ qNBܽ,Q? 8utBAJ~Z%z9=h2ٮwf7 K{Δ>jܽ8ٙC&0}kFf#^ Sn3qMpܱ.I5zuDz%СC:tСC:tСC:tЍwoc^tСC:tСC:tСC:tСC-p. @[r|Ǥ.n(@>88 9_>!O|B. |-p 0DP>&2 }'DY@>f 9_> ' Z". @Kh \|]I n$СC:tСC:tСC:to~ S$략=Cw+tES2[ْBXUue_Y1ZZNV n%лyTӚU6U@Ŝn Fk#ZK4AY̩nn"tq1J.SRzAIۚB3SIJPmzc{T N_;D#᪮V*JUݭkPݧE+tz*%5_ s4&1uX$\9`_h0A9÷TdNďX[Kr ߥ㺥(J!QT,u) F, Cg}mGjx|~xH#WT;wFPƣuX6k崻]]s{Ƽ'40Z\-etߖ[1RG͐}mrWy5%(ۚpKU&]f*~e*bʏ-K֖Raz|>2O*X+ZR7"p\Hz*?3I#a~vȱ ޑثbv ϟׇؗjnmBb\wFT6>]6JZZ)9/k{͓'D⻍~s^,ղNځh|^ׯO,q.cIX/Zedl-09?#ND"(Dm?>2Œ]$:oyb:oW BwD-Idz{ؐNDd,:F  C "A w3-12yT v&`ӷ[`!yT v&`ӷ&I7_oVVxkVǯ4ʠV7M su}eV/el%qhwG SbVcI s+Y~e= q|=^Y&BWÁ|~vK ăsaH}v3!{} |:}脑c;B(gFH‘p0:2Kز4r3Kњr!r!r!r!r!r!r!r(gt:hH(}R}p.JcakOd } ڈtm.D3I庠%$kflsoq١ifF&#>r._QR!}ik݌i:#t[B/V`\v4{Qh&h>̤ h.wyQpq٬m,MU44G͓fy0f\q\6聦9J F|sKFd\ ttj<3Ds\- B4ssX0YaIz3m@ $g@<\@sMts8ft3 \nXکFIh.AvAbP9/D3q.!,%u4#¹}Ndni@38qfetz (4gQ/ r!r!r!r!r!r!r>]<@9C9C9C9C9C9C9C 0ht>,'`r|c."g@D>֤ '~oqQ9" x@O|4&|4&˅ p0M('rah62;:J6:ÅpYfB 8:Dswhd>jv# 0)*u# \FG|42'p!" 1t' sAa>C9C9C9C9C9C9iH#z%wŵ\ߪʶ*K?S7vPCUowfyG>f`l[".-ZE-y`@R:[}u91/qwcü\̋bJ\7]y-Y.۲㧹YךջCcQTv{(w2w q:VfS Eu|ցblNì[cV @?'mqczS0!wb{xөA;ʡ*"$DV^Nq1ؐaCgcmsbZv )щ\'`>s;VN8܈x҇u{P9s{Ƽ7mo r]/ۖ:C#7Tuo.zqUeKߐDx|.ҩٻAZkU::e1YsFUZ{2V[vQ]U E荬P)7=,lZJ]I$٪@Uc~Tl=ٝRyx$M3#cmT,JQܓq5oN.,rE5ٳ4cΝ[oc|K1Z70cxj\ R7)fLr:pyǮo݄w㓗|^8`- ΄؅Vps66uj]kT*.UN-o-m\\U'-H"{?g yɿma- KD5q^% g-VVam#rX o-0|o|ߡ.$i=P_Dd,v:F  C "A w4-124J.AwYKd`!4J.AwY~Fޟnx]kV#7cPN/4K)khA [-%XFV_Fg3HīevsttD"i67rKr4IGӓ,¤(vDbr:|k̈́18 &h+]9{E}_U-WJ E;Z{GћQ{ܡߵ4фc#۪cGC#Gi3'\W ^ՏBN!V˽hWqڡ]Wn'nlwFD:;cڍµeUv?Wȵ} jZ4cϵ<9{2QRWMrUwn$BÁkk\MwCz~t0)_* wq3|_U}>l:astûNNN8)O*Sg~9øG=-ꗳuO= {tl;jlQH4{kM[zm%u9ohJ;b-r9]6{za];8888888888888888888888888888888888888888888t{yt|T2ݍjحd7t~(jsV[nܠ0o"]Z䩤kPGe)?00o.Dx:o%-gmSRUdbD~~=?=>.X"vaxjas,s(6^~Ţ@bQR)vI}/>.г{D+XD(\Xu4,xljꎱ]֊;FxSKLטּDenWfR(ݲdlmeN5%C>[ `č]1%us#"3[ԬxULcS )﮼ArX?S0h?xln|[ҟ0ܼ8}M'clake &-ȣZ/*|X֍P^LŅA%גZ2ua-}-K'g\|?\b|kf%П>f1w:r?tNIlݔX*˶$ wb-ؔ@Dd,:F  C "A w5-12tL:7\8@ elj`!ztL:7\8@ el6IޟnVHxoEY'ERKviNUFz@nYw8^kIfU"P qF\RzD. <{8ַ~;ߛ/_2y˰ |L`Xu%(\i#RxfL"4 @>M Bv᜷S|>ڵkrDwn؁;R":-pu8~5k$\wpH]m.jp>;M9'2<仦9AoI]=V_(ػXs.Ι}dŵ98Y^,F٢s;݁h|wڕ|J/R)R2uN]SS0QbjPդjcK3[,1h*#1|mM%Q φ$1k2g DdrR  C .Alinegraph1b \)]!\"Ȋ &rn \)]!\"ȊPNG  IHDR$Ho,tEXtCreation TimeThu 24 Oct 2002 10:23:47 -0800.n+tIME  v$A pHYsodgAMA aIDATxђPVv)BhtRNe0fl_Y__bH bH bH bH bH bH bH bH bH bH bH bu?:?]'6\6qs ܍%Mn MZ"n1C1?= \B,C1C1G=f@|ƺ+;(mmIN'[4/K'ѳ}`=-SgYi^_ѳ} ֖yVyANGbsҼ G{^@ѳ} Q֖54/۠ѳ}`\#-CwYi^0ѳ}`,AK9F0dѳh^пuA@<+_g>Эѳh^С =;~Yi^Бyg>ЏgѼ,H6ȳ:iY(s- UC@8SoԁC>)Ҽ9#OmV ӀCjF<-i^Ә҇yh^LM20)m+aFF4μDO'b.<rǝDOɉni^es҇<ӼHH AEz"}H3@>/ƦmKb`FŨD>GA0#O#=}aF4/z'z2/m+ #OzvZOм苑gV虊ه.h[>3I"虖ه0nסc ,Fsg`ES+C;Fy'!zرϋDi^e#҇<3I=ty}c^g'?<,pQ(9\yQCqSzx#Fм~D8>aжmFpϋ{D}Jۢ,%FӼxMPه3HyJ9Cmf-Fo>yhN S4/f=Έb}mHC,kRpfh[tBC?4bEO~Fu=t>D=ӼrCOBF{6QHTDѼpOFFy O0(36ø4QYatgHFk<E&0<$D}zm隑4~r7l]鮟7h[F>O>]600 ͫ/y^uvMb6y\0fBڐlô #3;L+7arޅኺBۂN In5sT+j3X-رǽi3NiQ聧>i[pBbsQ18u=pUNc[q/C]ҧoм>b&}gOh^o=!ӼHy6g6y:K@Kfi[О1@ҧk&i!z tͫ +}<Џ=ЕYG@o7/ =Чcnen^z6}Dt.aCȖ>FEo=0}<0︋#z`hC6/ =xcUOo})vӳlj^ܐ#Yf'Oa߸a&;=ːiѹ ,liҧ| >??7Kb Fb Fb Fb Fb Fb3g}||\FgGk`@1#=VщiX"Mh67 b܄>))ǷaMh Fb F뀀뀀S0 Fb F뀀뀀S0 Fb cx cx   fIpװ}2:?@ꦑ wxN*:8*@N[hB+tٝsNE߄>L9ᝆF7/( w(ix)y7a)tw)k;\t~d vez:]4h$遧/xu@Y !L#=0=Jz`}~KoLehq4RAGS}{d_:RͰ=5dyyK٘M0a`#\>2&@W}l*gݕ>h |C~>PZd,y@>P |derf@qH}9>l6cxS0@̡_,@3i `&diH}`>=L LFN.oHpװ)-?0S0`VtW\Ē_s2CtwHq `z14db+ 72@Oqxư rdy@j2 b Fr뀀uXĘ1#@@111`@155so֑ysRr3JF럹ԗet:\ܡ: AZrSӃɎ2IήD6eAN7MFh3 "udhXv/^g̒hީc}>5^xʩA2\t㛏;A32`;Uz wf Y]fdWPTAnBvr 0`V#iT]UCB 5/"뀀67k)x V)@Thw ЦA04^UG#LN;hu vAWm(Ka3h im '9ӥfPGKc?8j vIiijmmnKCmhklpßm AA8Ԡopßmu@lC|/O}UsS0%}j|4nx#@@1}|K;fc , @`lQp4 |F{ZtƾP8>j%*`қ#=81DNMLgaCVta5G [ ] T @@c#@@1/&-\ Zڭ\vЫPdS?oF-.˱s.uƷa E=S0++XUXyc_S7A qn@{@(>.$ dX K]i-)UP6;yy~wz޿.r<)+2?7:b|7qoFD_A` Fb lvdIENDB`N DdV   C 2A scatterplot1b P*הx nx P*הxPNG  IHDR$(q,tEXtCreation TimeThu 24 Oct 2002 10:30:50 -0800 q6tIME *G:~Z pHYsodgAMA a IDATx풣8Pjb{k۱[pS9?&f&1Jϟ? @? % F1@@b# F1@@b# F1@@bw\}[7}nCg#=S0 F1-k@ݖ.L`N7D%(BAj@@b)B,mKf WaFX K@@b#b1`@b# F1b# 2<c|څ;^ƤG-p-j@s:{`Ǥ]ـ״I+>`5EkICrLGC)BFʱI+7q@LM'4"ԏ/SN5sRb##S?8T}|* S*m@c b1Q.M c}sKJ@2,x2<c  Fp]:j v hKb,19d 3$K j@*4 <k91}|2Ϟ޽)h(XZՀz|q-G@EZESo^bf #5:^0g5EМBoyz!q@b#TaȊ;`@}@@qN4:z E32<#Xb:^aл^WԀTxUE3 tz+ZPEpo5 ՏMt<PÌyȌVbs:$$j@ֿO3Lq#chوhL"t,0*  F1< UgPs^0 J0Sѐ߉cv  F1ၘ*&Tb̢; :_"-& Nc[L,*鏝jLT%/q{]|fL5M+@b |m.Z7sgq7~OR> H$ΗGܼm ;|aGnׁWjS*_zwMZ^ػ :e:s9);wF,VW3/ĩk`W9mgd}5 @A`[DȒ}@W)bj|j^)c W)<'R4|eU ! 8X#/4 ki,#BG_"|=%xKpůl}@0K^ K蹨 v8;j@!T 6tړ::g^BV}@Vw_O}@@LS0`+# E7@Ɠ.P<5 @Kj]Y @U0 H1*B^a^3Jb16nb5~̰}@{a&\1`Eٛ0. 0.mЖ@-hsw)<(]>'mIF+ebu(Zx'2zљh @ @>0|tjbŽ z4)3"p$\jcX G"&#sI@u)w*M_-,g>;8>8{5^9.LơpӫVP_&"Pi&CnKo!:! &1r|#VFL{7fծxoFt)}@(?fD㔂__jިLd[qi<T'ICQbN㽁%Sf#83y_bLI6pTU؛@qh@qEr5OEeqhu N4oM㼸Ћ$*-6 fS0/`6_R@oM T % @@b{+ƪq1[ v-9݆%-쩏Y :Rg`|зP䳧>~0Lv 3ky*fT !.PXԖķI_LXLnI@f[۰Zw8䯹EvϜ <#?sEν-:eEex8_c VnoFD_ApbS0`Z@@b_>p)ZIENDB`qDdF   C "A  fig1 buq텙gAhnuq텙gAhPNG  IHDR_՜5PLTE   111333///,,,%%%***"""'''888666$$$(((>>>:::<<<444---MMMQQQFFFZZZVVV@@@BBB]]]OOOJJJyyywwwttt|||iiioooqqqdddbbbt IDATx w ]8`yb&l2#Zc굚f=:ԑvW͌F(!0000HHH####0000HHHxq@('_\_?lRP^3 oz)((R۲FAyR<lMe2{']ܦ=#F{GC0z(gYlb=f!on0zͨEڷc,{Fa$`$`F  aFFFaF aFa$`$`F+w`hu" 4_0#aXR^Qa-`p0c0 z=pޟbNyDRk?k.0jT1uy^6{(xZ3&Ty N<rIFվ1Usn}ksfQMk'8w/W$͔tj㱿˯,x3+;> aq{S.1/w6}֝Dƍ[0è 'q#0#0zq'-FqcT3NaFk`gmȸN1Z3M~/0X/l&cZc6 #0X%#-600cJatQi0+0&% f6u6#0˜vK0R#X38cj c}SGV$a|dYG|OpqRB6h6>G F)+XŐdQ#72lF.D#0.ȫŒTM2ò#E~c<`t`m![Řz1QFa$FmFFbm###0˜wQEt8ڒD͌'g-bUF#`F>%-u~a$`Fap׌?gt240@02nûV'f\';)k 7o]Pu&mj?3c;O7lիAa|+7gf#C6^ FW;猣rY;q6madƜahQrpdp FFm ]+#*UIFbFQtWH2TSuR$6HWY/ɹeF SFRg'(e^0N7ccm|6R1f&d6H.feheN+Ƭ8c\cJuit'f)㨻NaTn1+Ҝl1_L c󌑛E0z06B=݉ƹ15atr1}Zv6yNV'DԌӴsc:զ"S>t˜Yu]dսZ5x'+ӌNFB8cLk(2c<F`,8.g#lK!˫SEɌkVr-sK+Rpt4;;8iRH~e, viu`a`A}<+dc0VY'# UW0K+2:*g39%+TWrl)ZO-˥>ɩ0&,;oZc7U%.ϙ:$^nл0X8cJeqEU3)k?&9M)FխX\$ UY 04ԟ:XRŨy`/+ʲ1er]#ܠS0ƬׄYJM#R_(&ȹhbF21vs\iIJ6hQm`$FgH6ေQFFqٔFq's0KT.:ā_tQ=f$ݺ-J^~t1#0N5a crB68ӴIh^0&h0`qGgLvaQ0s,-H#Y 'Wɸ >X ,~ñ&OvKdT~k:clG.vg7SdS{)`L0Zw`6*llshcrFFT%\\,-O}Q{-{?lE+3Ok`|˥gRփ}}bTy\ w.8c#gPjW)5Vn3^p1Hrj-ؘMٳ1F?U~:*2ZoZIt16[KvA`t3SCnR3L f5ZӝgLy"(M(v٘Z1?6̨ՕdfA1~0z]}g gÌW1IyŘ6͌ ZDn3&Z/Ƭ50 #?0sSgvʻFzF hn3Cu g3܅X`Ңh-Em c$2g͹ճE+aT%%h=x!tQ;As&"1`4aLXn yJwJU-/['hQL0֗1Zd8-{ڲyC`,H4^jTTXQ?AUaԼӣ0V¨T~3<F3\oсlp+&ui(bX}yɘ 0qYj=>26\`#0fcE`crp[SGV:ƘZc(Wl$w>d|& w>f?q{gqb>}##Wy/ rqa$\a$Ҳl/'%{mI-L1ꯘ(2UXI ߑGofk_¤I oo+}1)዁MGGv?%MoaҊmU%vbRX(Fǧ;¤Gp.V%vbZU:%:3y VtJ8XA_b/%^??$,֏IZ1&7)a>\Jn_~xӃ7*l+m ߨp0in,0Nu4>t/Cm"oaJu5\.7 ńq<mٌQQ&MKR\Wh/&7\o5`x2:8 ;kU3ZIET>"_i煜q@l S%%=X_nWh/&%2Oxj¨Y ^Y43e[0HHH####06D6IENDB`DdTV   C 2A scatterplot3 bt e:}l*FCcP rnH e:}l*FCcPNG  IHDR}"Õ$,tEXtCreation TimeThu 24 Oct 2002 10:32:23 -08002tIME ! Juy pHYsodgAMA a IDATx۲6PT'SqbcՒzHen>a {Ñ;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D;@4D\2'tY%qMъz1"єɝ?q~^Y+M*++v]'UgD N*#ye   gMMMM8 &whr&whr::ut Z܁/g ;4i2Fm);/ޙ8P&w2kV#Gk7kqA.8ܱOpһ| dNaF7e䦕WI M؅ZW,w :|4+sx2ҐY0;\sQK9̒ȶH |LZ*^wU+Qy>]~7M#exHq`<g ';g)b^gZIthc[9ɝ~,Q&3Ӽw6 Ғ;I}l;$V쐙kwv5)HHN3l7'5w%㬌M BB8;xSTbɝg038ѣW 8Űb,A[rfp)l9{Kȝb%w:h #w.6HAkU߹lNspqj(B"q_k4@)s#sYtPQܙ+Uf]&Y(;-޽uTߙ=WOS@2s@yTK`T*@C;_r+s ^-aТB7W >C[F̝*2Oy䇴Ё|I@u>n[;f!;s[ANЁz19u;*H7yBQ@+gȯܙ6'8_G7洝;BZphT)_j:dhT׳7ck,wt 8 t)uLG͌mI;B:}~UفΝ?ebS,w%ɝUURHQ@r8S:zh Q=63);GFg :}@7 N:E}+9*:eZɾCG2Xe8LHA\?ww*GAR<gA)ڛxP30D B-wd30U{qǵ,')wg-k &[Y CI;PM\G_R:~eZw|9_?w 3ɲ Itw;H%/ \K;3ȝm4L֪~WgOn|遐"w7\r| v2yw=k KɝUR;M;˰WKzMq֬{+e|g-U[Nܙ6˭}rİwf]5wW)/48z:az+xZC̓sG!,NACC쎹nL*ke┫wZ  <G!\}MKGo5n~GH)|ElȮ~o#w&w-$Q33nyYbgJؿ%k{.*sgwtdϝ]\i@8VN¼<hQ㬙ݾZKi>w&'jix%kQλt[ɝ+Ws0l۹SLüfȬܙDze~MϹ34Ccn\|;zA[V0mo=vۿsiI z{MH=РB;Ӛd,ᄫknr~=pCXV5o˜ɼذ2q[Y֥yъDrكb1]2lǪngE+Z#sZ@&V iKYJcBg;[LߏH%-̝w^O{}"Voѭuf~j@P{S7Xɾ͖:V72V5 W{;Y(* ԁ-{\ pg3S0fw %zɝnDwa蛄oGrg%U}tual\}U\%whx"J.-vtf=w:Qd\Vī\uvcBr`'gGgmemwhjYz}|qȥh8O?\OHzH =@@zH =@@zH ^} pϺ,.s8RXpI `+g=yɦhx%NkZu~*&HG/dtIOV'$=si؍-@H =@@zRl)\@@zl޼f56e/_pOLK|{g,;f=7[ Nht&؁Oª8J;\@@zSc5K+f=RuFXp>s~h ?K ?doXpH =@g[  =@@z f\@@z@ڟ)sY3`)؁ =@B `K!βrF%Vgr};Xž֥ܤqY~cY[Gwf9&UpB[gGk\Zzn#K2<@`z so7 ` {}x HT @ H =@@z[ K~&xu/K'1fH `K!ڕ.=pDo5fH =@nf `73,g5#Mϵ)˔|92=qA'<h `ǶO8=3_roGn_`C3wc%4 wo{q_Φ+̑yҳj'>os3Kӛrřݔlof=ɱXpmlGn8ے8Mz6ӳ̆Fy,qfۣo|=3 93pf_|>q  . =@@zs IENDB`a$$If!vh5D 5y#vD #vy:V l5D 5y4TlDdT   C 0A 4histograms b]Vzqn]VzPNG  IHDR?1NIDATxђP|/>ݠ!πco:|>_ b@8p#)FSx<}^KJv~=v9(9wG[R/ ZJn+gK{[}K)ޖqort\~n\v}yo#orawsWF%#eu7B֨rkd65T9ͿhY?Nڤ(Fjw6575յ܅bLrTmMMR2tެQjmq+ŕQ f揩Y_=Q{+^`f1j j{(ԗ A SW^Ko(eQ|+*FKw8 CV ZN1 ێCR2H I#@F@ ňnR֌ )b$֌ )b$ZN@t+Fv624 )b$֌k`:Oh>m^|0MF}W''FR]gQHǓ!fN&CM7M2oJ"DN:=bUl; sqHJ]!)b$֌nhF@v!F!FbpN`?:X֌ )b$֌k`:Oh>m^|vezs?5z EmFus,"CI#UO=Os@[BNS퀄P]fT6@8wzdص!FbpNb`bt".40@R2H40@R2H40Κiɱ)F@&ǥ!F!FT4!cw1r/h#CϮF{w +G4'G;>'7r`+|.Fԑ!f; 5(#Cq; R@tXDgp6Jd(!FbpC50ib4M>2I#I#@8p50۬U[1rh!l )b$֌k}N |.FyyW؎U6CӤ`qŨ4=#\Y A6MkF:栍 Av#!62kQxzI%ȐB؛nʀ+#¹8$%CĮݐ 1#>ޅub!Fb!FplIY3b$݊- 1 1[ENkDsh#s]tO |u;`F;q#9Gh{UylxglޘԨ)0}%"C\] u馋;\ 1[50pM׌I'!m`eeG>c/u}gu]:͚ÊQIjQ]:q#sı^F{]fKhYst]?^L#">F<._E"DhoǽDVWdg:nS2\DY]sis8 -E1z1p"޿2ˡQ]VsϺ3kБ2twEu"hQ؛2W@8pv톤dص!F挮+P`9 ;kF 1kF 1SfHvܜ7s!Fbpܥ|.FյW{4HxeK{!u240N1 \4,6d5<FU (t]Wfpv!FbnHJSNd9e֌ )b$֌ )b$ZN$e͈t+Fv#eg40@R2H=@.!gWCI^#dh#XS]JGsw OsRx9Cfςd>Uy`|k7$%Cyʊ(MI]q@gʑ@8p )b$v톤d ` Ph62~40N$%CD$%C4k`0MH#{TA .AR2HFoPOSu1'_:2ߪQih^#CÈPU5umzrET  ?AO5x<~m=$C[Q,!fo:Hʕ#Q +#kR\N 1vCR2HB֌x`K^40N$%CD$%C4Ic$݊H 1 kF 1kF}׭EM'@=O^Q:~s8Rp^ץyܬ9:uܥs879G{5aug=Gߵ;C(4)CjDA9]h.BԈf};@dyEv6(Jy%ۥ=NJ>3в[si o**+Ce591v)CwWcf͑g@8N1 )iIENDB`$DdN  C *Acontour1 b=$MMޚE-$n$MMޚE-PNG  IHDR#[*,tEXtCreation TimeThu 24 Oct 2002 10:51:36 -0800tIME 4 pHYsodgAMA a#WIDATxmr۷9kJ֔fc>h}2b?>j3A?>@tiAi HS`A A 4A)0 MAi HS`A A 4A)0 MAi HS`A A 4_ɛo۲a?̻ ȫ|=XRf  )?_ *WQ.5Y[Ù`;}6]AcROTjyHz4oɎ۷!܏ջo;m?DNoà ]^ |v<~}mݵ/H?~ [C|{VJC^ݶSCSθǧ4>\Ҟ6IY B_7mٰ00{aUPѸhޝş﷏/g{xBOzt|;{X,͏wZ#Ҽ쁡DEb/ ;tNo7"8 |YTjXBkԳ^β?Vr|8{ޜ=7{cl~̏?̏ P -)BT]~}ߟW~?zO jWܱD(l:$ѐDK࣎t bh=Hdo=}a}dLs+.X}6̏߻}-M(,cYnzt:k\5XxP 0;d3<fPZ,'DyԬAQ/}grn9%C¼9-/(  եoǵgIۙ yYE 2J 1(~aUv 쁡,!/_iJE5W%Y$INz`h.UJ9u~!5?}ve2JO"u~[K^HQ ͳ'T{bEg~YKQ\Q݌G^.5'IJ jeg_@8' S;ϞFuKQ{({𞛑 7h F(T,] qKPIckT[*? 71F(TC-0$)D I8@yQ 7(g#k`p̞eCfi@$/e$#Ir!lb 1ұb(2K!N8ݫޫD꤯^>âBwW_,~.Z=I^û!2"-~= kjHnTL8>,7QjD0z bcO(# 5uY\={K͕j̫Iy}G),:X!C,v9<_LŔ3b0(yY`'bH's:"ѐiPa]4x*mHBs10P!Tj"EU)#.8R Q 8ZߤzS""Q`Nх F(vjZ=Tq$JhD* |tvqbOj{蚺}|5D˪CwzvkŏgkY6u?WccUCذvȷewYh`~YFl_],DVo붾IF؇87bce* XzD5ҨI1Q $B.tu bB}%WQR2PwUqyGSjFӭoPAPh0I!.D^uY`{Ru5G3'F \ΡA KCuoI!Q( ]a q:8e 7 F(4e%PF@^ϼ,<̫/Asc C@TkR sHtNAPZD|UնI/&ʚq6 n_(PSPFT7&s`PAY"#"!J*Kq/qne#0(`([ R:F(?IĂ30(`t j% .ҿ7{Kz$^< ?ta+@۸<>{yZ) O{.Vϭyn%>||Xg _NR:J,&Z(qzXD%A̫h~7kyn 10TO;YqAiu6W_A d#P& ⬚Fc|1)糳"Cq"2#c y=D42o}{>V3"6O:q#:jC, !|D|"q4c "򍚭FB1WGU^) HEӏͿ^m3BOAz8j=ߛWG%yՓ<02/U槉DzdCC)5 0th5 ^=WUk8P$B!:@ْ^K7&İ(Q}#`҈tgd1DHbjFz$|0Y Ab]GS3(A#_X'3AS<' 5{]FY6HϨLwfG_Ohq#cR-c GKT7&fb"iM5E3$q#:&461EKL{0cƵ;\N)*!*v^ ,߱\Ӛ5ܸ Fav " ]@=ID̫ U(.B0Mrȴ?Q3*y5ёaGsDl۲QDCBhHIc"b"Qz}#$P2h1XjQ 0t.#ZE$6 |~P324iRӤ1&d~Ѐz&1Ա3$ RTu,D`dD"u-([dQ H< Z4FV|`kLf+j"3O:3!V^Sb=j A()&M": b" 'h9h$3hu֐6(+D0W3R:O2 8uŚ^g1]W` cgqQE/!zjȵ\ :K(DFU^LD}"C5A AQe.QlX*+t4n{8{TncHA NnڴQd2⠵ "`JoMfZG0AT&R/+5A3)Fsǚ9a$|<'F밶E:kq."DCUdY_J 2SBM+R)ʣ]msLfhPGChf573 A3Qtl2C*ޚR #j*$AK3Q(Dm!B4tU4=#BBZ++!]* F=u8B!B4d(RXשQ|]|t1Yc$WeSFfQ"ŦoGvRFN]&_0d|rn4TFC&N.VA4+D}1DN4 4PaC$s{06 2B!JM*q ]E40h@AC i8Iiטt 1^Jn#=j[D_ QARF,x\l@A4إ&: |WjhID-X>< Sڿg6+5M|F$ACdlr J R1ޙJ%Q!3)jAlYT}oo/<kPhP$iyE `B쁡$ -3WPhX E D@)A%mSFUr@"HE. J BWIJ養!J/2JVfޘ_Ǹ=*.)nPa^V+&A1Jڕ,Ze$zi\c>#ܤ 2BjkbnSRLb !}n2)fDgה~>tVF>2Qh j/h򲒧J1y5e.wˆΩ7?vF˓NAҺ 66$5 ;Gޞn$Y}huA+^'`к[jm5ȐE4?zG5̠h5AԌAoA"F#[)$<0\111qfenFdwd'i)5wיjELDW^o ޞH:ǦتsS0=单Tb`zOu="2$0zs䜺G@$.zxKn}L n9k3vΑfB7P@t"ASOtȏ. `:e4VwӟJѪDW6N;gjz?1%vLdj\ zED0zuI^M*錾 .d0 D HIQtfؠzuOzq:vhX)ĚSq:\D>WFϦ?hzbM=h*s%`e;зHܫmd-aTJ-YpYؼB7_IK!h\U8ŲIcVN t#Mt{u; +bKdjUl\ . -5DB~a}pg՝>A<ߑiwK hC70 MU%Adf -* mb Xᩇ" HSA "KA Z\ MAi HS5 {HAU\ MAi HS`A T#Si鞻 701žyow,ޱ֡c]dp|xP]rrC=A6MC.hL?[$ul;Fc4=t٣t}%UxUV#_M EOk/t| v=9uK^:t]Sz*[<7w3Rla'$+ӯv^&O`kЗ`.DN $_Kw">p=m҆IQ'`0 ? ﴏ2g-ԄH&earo7Bz& 'rØnQEQt,fٻOqWY#[P݉@3a7Ls9H.Px4< n7sww+./:SV~@[I/ԘPLA|‰ʷL0*|nc_>8#xO&Hz:3>?י;OeKfwMoW8$ >g8t%3{MP("FXt}! JUA6}~:y"snLϔ'N`P) S*Q MqVx=Q??!o:yM!o"R+fQD;Jo_DIޣ6_dZ$]n o|={̞gڻg/>z{w}緿}׷/q7k_*|K_Ǎ7Onĵz|ڏ_^i7\?xN󥛾/85m}o[ߺ;w{w?zLuP[W[7ejԆiӧOon2s̝м^`E,]|c=f͚k׮[nݺ7nܼy˶;w_~7zwwٟI J #x6Z?? /9o7mو իWZrK…x7B--MMMj'،1'\8՘1h5khlojjnniimMΛ?H+W\ o8&Ta{|ͷ^{OOӳZY?_wy_~vC6m"0kॉZrrHdhN"8q人IGW= R8ʃTMum-PkhL [gCxBJEi 8I6?߽o/9 Iߨ _Y!EUkooe}{7zW_}CA(Fg%XbB%̡@Mm< V+bfr5ЁS)hCo%j$\8nPԍ Lk$Ml߱s߾9zţ/{ȑC@Ȥ8;":8i& ;EOX|5""9ڹcۦ׮H|XcR"ADC-Moj)@@H +J~Pe0p"RzOLIZϞMu{ Q$L4^M}]=x#z:xXbS(WoꫯG?r}wlߺb4|%%K~,=͞:"T_?$hL N:+a\<x@3yqօQZin8eM$۸uw{ -rםL0Ad:>/D;o߶qՔ"@LGBHTC'$A.`  @BL /J i̓xu }U *$&Bhn;w޵{/,Ӿ}{.@=F lې~or(E Mnڸv--o/jk{@\~8.CO~&x$BR͘ &99VX -@i;vعDKO#Vv?h?^Ƌ8DyB; Ej@(Ea!BcjI~ .z\v٥'A8&~$'L)(YR4$hҖm۶mT*}>S׈O2HAOT2$F|ڶik@Q1X!#F"(ha# ңωSt8&zx9^JIn"F+W"1NڲiM7m۱p nxKص[ -[6!`&>H#=iBDhp w(8IeZ߄4QCh~Ok8¤RJG&P(Im@۴̺'{$)ʏrmW{i ֮Alf?fF"dP‡"dUW$.G *F'I)vFB%01dj%ܼT.[(I 112<$Bl/Bumh!4`t,BjXjɍIhh JqcVyUчdH GBD°qҥ˗,&qh'1rg]++smV D DT4i"@4oV2!!d5չٹS.fyɥBݢ$Y ͷ&xr9B'at.$|6][Pw D!bʨ1uzءqʨcRF Pеg% 1aS!%j.EO)g.YJ ,$X415Qn9"u_0 s^xT2Lшs3B@k+=FP1ab<ґ]|m6(.vv=8N "\vI2]d'ji 6,پ@V}#b|ӛfr#3灖P3CF:F qqSL±Kl8R9[ Iɔ!dflI>'+*t9ڼngJ1{Un ~\Gs B8 R2I ɟπϷ%aJ)I1S:VJ n+loތ@?Ե.A*s G `$B,5\>5l53 Qx(R QR8[n_g:6^Jߤyx:@BW]MT;a73͐zA܈bH}mm;W؊F(BH?̣AXԄP83"<=GR#a[]QeGdly^ʂЄW&RK$L&cQ2T[Vq~Twz֩[[`O+$7+*R4i9 B/Rc"L!,͒"a8?qhWsSR` „;[g?8wCrl"Ku?Unu[;JZJ۠kD_l@U[tS'I[0NHECC>@t׶IPKrH$_}Qw'- d:[si[l% (Uz4c͘Se(3"ޞȘ7~pF#G4rMJB2 0u[Ҡ_v24FeI77zU;;y{8;Z! 0)SXKgs&ft=ymRRyiRd⨇lk-%~ Y4sK'"U0L&fpӽgG5炄R7ai`Dب,gZFlgL!C kPjgtt3)=)#niE(M(A=׎P6tVG?n_#,g#Q]}!1x䳪NE𘙍ps;t4 ђ7v#!ÆKH,!TRr=[O$/   IT Zn6C*鹖'Pͨ;E3w\QoaS^e[`&MfW3g83Oӛpf6zϜO:dd @"S5azaB,6lA#YBFɂ(u }'d$E\K|e!F޼ɸ,>[=+aDhc`T?`ۛf B (yӠ<܄iଡ଼%9mԂQbW@hPvՖň0fwp~I S,+j8G F}88Ʀ_,56Aali:L TE(9X p.j,-"';hgS2.((-'|WvLL +##7](d)SƲq]yiZ $)#b,U)-(i»!.b9b2`!FW\s]"{M<[GDh B6xr?&T}VVPBV X?9 O߈%p\P ]еS5TavbG{f Ej 84Ӝ$ə>[N24TSud ]3NXWokk9Lp1å$1h^"IQamKyX_tͰF +[B$!Wd[?cM4 !SNdޢ5.-!i0BܤTAUbv}D8uF$uHl|vQ1/N<课iMߌP ) (Vf̢G7;r6D}*47*1&gDH!~nEw8v2s /e;ahJacH3$FMip>\Z*:Kh"ӎuK*o1 Aɀ!Uu]BiuzM "ӬeAoԉ#ΰdJUA\ Ո%FVbQThj)zMN_du<QVQ1 ]i*(KѧUuj5]q@ I%3H0=wjP i,EgY(BT[M7ֲO Φ[$FģRf(S񪒊DT 1TpT-9P3?X'LfLՍcj;EX9+0\Aҷ̷H05*0I d%H̱A0Mk1 MR;ED)Ö0͋p-q RP V./@(s'#S KVF(Y %$M PHZ cEc]Ca6ˬ]^Eiq 4xD\G-DU ʠbނe%)sn'ѹ O#6=ATm$5[ͰS(E mSf{yw—~⋤\zdhX HDJ. WN}3 TY{/)o \֯͆MX~<$vbN]gC{'*VO#  T`g@P\ypzS(~ ] V\*ZVŒVFAI JFD9ity];y>Ƿ&"X ITR08 K YKmf.(aA.Q8rC ;e6=J[@rsrUJHYß~Dٺ㳋=l\`*{A³eI,D "^Tpo/CD!ppZ0LSĥT8_$pJ"Pqr : L喸z,uK*Up$4(Dx5\.Nft 0y"gt{%Qgv81g#FXK; ﯺKfX!}~>o .Hч8ajzU b z >elPJ ƭ 4 `QZv@U?b n!auM@- jNQ+/D0D2>rY{黗Oj |EMZ ]=ަL67tYTRCt#9[RQZ| 6l *,vc<,@|@3A]aD|0C?)T,ُe’k;`\ +T4T)2a$b)0R]Ąz:bW ƚџ5Od F vΪe}uL4^":6LZ Ӱdy,LѺ +Qb.@:f$gBM.Fb(XJ#A-gfA^)IN RJSMQ30r !p'0]g>>aN Z; #[irh3$F֊kHYCz`5H\Q94˰a#+liJ2\gAF)te("YR/} yN|0?!61k9.24.s}NNQhΠH"AKMk7эcTըQ]WM ]teW^53e@3sYdٓ@rlɄr7R5G.48ݟl68A9T- Y5-ʍLɸڇr<9t"_G>Q8T\x13_7j8EQ~ci{,Q'9 c6xS0@(6/`I %4@Q6r@ꦷRX4E3n{lOtBH#F(%JgT3Y)0V;\fP1dW5 FŜeybCxzIPԎ2̨CehS.HHQ K_KA{<95S"4O5OAAʀȖHiWԾ6 A8a!,fZ< M1:43 : y}*"A+2[&m;"{SÆ-%x'N/7gYi h/*e/4E;R+%2,E]4n ti<?4guc0ce R`<u$DRq$K6wu7b{FկU /7|cu#"8QR h u8BE݇%V`36L칱mwK'_,&زh5hw~MvĜd 1@ $'ᶪ0Y  *Q6Fġ5H s}}2 ,0gp Š \SQaQJ .C?Dh{~ڊ&jc+'j%acF!RY4lB)$䩨8ΏLh̘n1 1_][z?foޞԏ%J0bp.GEh S.Mw^t!e6E׍qg!vk֯r'x'XafkysZXO &IB.AHDӹ|޳=YMY(Mfp֠6>Uя/e!NP dx]jBRK ;mƬ9,^~'>ulݾu'd~Պe1$pzW\v M muۘ#IEpwLk,0@ vWެ6@$>31F"G56HQ`ag>Ȣ%V>֭Oo`8v܍;9H@=f%̛R_7j(@b <͛Ypn=$E3d9 mҤe(J9]H?~PhZumSf/QW4nBW:Pq~hko>0g}a.MZ,[ %H-` U&P I69paz 9}:z'M- GZ7;F(w:K/jȈƖ9,^|uObRw|C0evJ'oKΛmp*Kt6I|dRXv#'$"Fje A*#GD?=׍lxE1+:!EŪd9GX-iW=eгUk7lO`mvHܿǿ-'HH0rQyFpfl ޖ gTCBU$xLzYwTb1LkJυ3Vc pK"RhvFո.= s`#cw>K۾i#fJRI9Ē EKbVfM2lSlzZGא0U bx4r9]CtѤ*#څy .c5Onھ}n<|1CU=8KØs{vnz -^0q QWR6yf FkID2ۣ֎_ rD_ Fu>9QpkA;}C%dVz8~QPǁ*J1o3R@=#c_M:v G`l]y?' ȷ!,e ў%pC5xEHmј6ȑ 9Vs<ɐ#ӵxH֌Q fhIF$E|iFWHZ.X|۷!@筷-#:Fnc+,?g|}ݘp(`>؝$YW"UOGO~} ݭ 2Zb29R9J;{t=R9BnNAq 4if81@0E"!F[_tŚ =3_|U"[;I0Q8a[׮\hM/ o fe[#dlaf' mxH!GyeFڰ6ۋ::HENj`N=9"G8,FX#& `7Yn='MQy;)J{y}U˗"bd"WJ&cY$uHMA V[ӧ׸gNG\3"FM@M$m؍@Fet\#iVް vc0z}[o#ٹc듫W.]8vsc ]K!G$b͌M HqFѳ}2B_#~nߎO]9as7"Lxu*X=4FYnk n?/rT(A ͱ g!db |?yzz؈1άrOgUW VoS~ޯ~H;0L۹}ӺU/TWE9"EqXmxzd4q$) ˜-XAʧDa&K'ŔٳX̏Y;g[@Q2oT {/8AkkCٿ{0ZdCM㪐G H?Q#CFېu77N=#+09)vRC">?6;f|Я##&H#\1.,:\hيՈw;c4"a9FG% bdϯMi.f46HiA~-!ůXǬA?$o_K Fߏ؟r`DsQe}{9F5 BזFt`'9:%{زm!`u1_rW]HbՍ 𮲌M z#Q_(:~$#Ҡ=B.39lիOrʟQՌ[[2H> F'bޱ1zѥ a2ӵ)ڒ=*`T{CЖLb0;mbhݣ~lk%!푘Zij= {!N6j`4sKV0ʖ5Fpjb${(0zra"HJ9BVfmhSTٱ %eQ͈E97:V|dOK92F#`${$zXUC3iLנk#Pk=_۱uÚGhܖR9l6u !cfm FhOjRp{'9r@Nim3t-(l(H?& 3 W ]7ѲUEv0Yc|$5"]M>sWPׄQ͆Oj$}u(=R ţf\Iɲ,En$:!ױ̈y?hv歛XGV0" Mȃ6΁c[TX8l HeBq^[۵cu& mM쨷qv1a;5v]5"׮k^ -lءg܏(QV/ȗnbfd)3W}W"珺3rF2#K&ߒGk>O~Q 8;_ihC0_#ɘje=K$IrQkG6ҩoƞQoHB>C=5:h۱hf)-6wfcWn=oضƆ Y:n4j] cAbuzC6I (ăXz\- zb gF=Qoa1CG+\~,D=t]IֻDɎ0E{ 59K/chF3Hmn_CGbXYt+ׂBБ%O/;z0v :{ӓԴ>4 (( "'Q~54m4(?hK( S-{Gdo&\.G!U a#Y4qkQT0.H, UcEEv шT9r\66Ak׬\x! {~z=b_Qz~E:k rF]55u-~_:m47g̓Q`d"(Ayʭ^&vč#h_' ]P;^v󀑋#/Ν =ޣ m5l9ځc<<u챐"1Qp.6H_5 ظלz"<!@#>2LQOEJXh=9"9qV?ZFXH#5^$Z^]ЌF$жKУ l(?[7Gǖ/cj'5!i 5rrLlr1;zkTP`Rhz 9B;+5X!0 q}qp(a Y!!hyRYY'|w}Y۽9(VM⍴OKR[}Qjv,"fiX2iyBЎ)E(G0K~m!Hj>IlYxk8DVۜT!$%8ef[2aFYc]ڲ`6:,vZelGCR k5N :m7 Jþ4) G0H~(HˎDUER8à =@0b .RMj,e)Zkũ7wN+]H Db̊(G3uF"OHojb1c '9H+ٟK!"uCK Ѡ5v$bR٢?[#+A :c~ZعώnzpQҢ['d>7sU75AB#C:5":~bb"1'跌?ӟgW>k!: 8QdEUZ'?۶R(C0.6)#@sI,Efژ? #-<^/?8SzE۫Z(m]hήAu%1$;]v9WBJD9ό#AY^՟]5FU9'D@דBNDye!j߷omU 6)I*Ӣ< 7#%-ݏ(/h_(myʤ21IQHh$@D1lu h퓞Қ1e唟&J^*]يLc )ARQ>+FQ.lٌ(@8̬Q)r, S? y>\IX*[_51x;HimZ0rԦ5S3(QfAPgL/()XU֖/N!jղ1B6m^m^v)UbS4̳r܆Ij=풘H MZKy),lLA-I(B8$@,M'F d"G'<=&๩* Yڨ3Ǡo{ ,iuiHTd̑bN~.(l;pಐnzVTdEef#clzے8'0cfRFǸbh爖SP8`Ըm6+ >f`䄮U dG4lI3Ņ)#P!KarHla/o"O̭BaP0 GӡS3R</u֗eݍ Q\}#jpBd8'eW[Ι{ۀF?qfi#׫QGrN, ̨:͓# u tBr O3=]ta&ksȝ٫4u忱??Dܩ4ge$Rj#iXBA"FsZgSۘfFu0ڝ{93:FJƁѬrPLY΀\vWlz``9usF+'E}nRaBMq|ݳ#i?1';*HJ%HԪ.q1%M@=j0 & ׅ`b3H(ҳ<|=Bފ9G~ol}k lm8a{K_bgk2;Chc.8pw2fW7ٷr8LGlFe`4.x (N,^4.V<B 5ouҴwef>, v5RēOTr{`` yF{ yFU2/TO2w4QJfP虻jTYgGlh~?AgϞ3Au0(2䑙~[DraJEwJQ|'#n>,oDk%`?2Ҷy)Ds?VlEܽd=.UrD 扗|__-oas| >,9J$[_tYL;>8{Bak1$L70HC6H6i~ﮞzzosܕ MN|& EH\W"FBfa᮷ Dh4- r/ -e4FLF> (훬s[ݎ=4P{Iligiaq?q<ΪأzzFfU:kDD&_~YVSE׹㻶L[ش }NlmE 6^i"Z[HpKpnvRS%UDFcCv:Fwx L?l56u`:\1R{mf')wh|kP4p,.rS`luwh !$i67RIz{VJIdkSO01AYgID˝3a?jɏ ǧ B{pyD@ɴVn% m}^}`j8ܷΎ::ޫrAjvL{FRC#+0ekb<K,rpj[1>m<+юjt1֑k#을@nA/D1 KM31_# `ŀ?>$a@7=8! ȝ7Lhͱ *i?[anKi1D)5^+!$9ך}Ec6#uFkMi'q9 6ACRX"+Av[#lf]?W)[$($2a/ԟ9k1O0ɭ3g6O_ 8i 3"=ټ;v˗ŒxL)ZDRt<0D&#k豣_E'{#dY(A"O&v3gbRѢ\ɁXRGg8.lz:ydr3 ȶ}1HҊw?+ 0m) u59'I8Ѷ37M)!Mm\Nc*ДخDCdKlzekY>a!)LW^{[f^`lM oږ~"(ڄ#-Qac0'}/:ʗ,A([,/񄺙$l.繡sNUT֢=6XTQnvKX |zՀ'sbE+ `Mn=ĩ@ 5H9zt9M& k!/3:(;9JnnM5Q Is)^".:;jx4^'ef̔1nIZVDJ Ib"2'kD(-LNE X |`AY4Z–^1.MA@<.沐 N {Ot|{3B}|Z٥Qc{e7뮋n m.9I(E f** nibUN27gm- 9y\9/Т頴+FN8"B9KD+r"+~﬊~'sĉ8r.?&HEacҙm6-MNR̰M CIl宒G>>kIˈ+{/5v=s%Khʉ 쑰CBx`%v`ӉR 8$J&n&QTYL>+W'5Q `D~",%4a\{R+1(`!aʕV?Qe?ŲzkN9o~kVsEArM{Oi]FuFh1WȪeG&-)N({ } h +g/= kE{珢wO`տa ׯ]  R$KPYbn::i\ˍxKI\ }?xbM yosrH>5K&Zˡ/׬v8[Ĭ1bvnڴiuKW&qsAI;>d7P,1 2.Rh!Å bR[Blf8222! "kBu6<ӿݻ7li@Yf۶-[6oܸn-$ d6I%B9,(8)5I_K(#nXMSTbLĄBh .? uFyy$A7Rq WgAz|-GG W$7ѓ825WxP鏡sGaAX&F㴟 -iSϬfbáMYv݆07.2rmk@c1`ۖ͛#ܬ(QzM!vq[($SbTr+kU89 Ԝ9f9,hvPH"ZBi˶akYH?oaJ+$i0Z 7Pv'r,pE)K{;DQT5r:[Ur@S?@k o+yE "=Rf FV`rYIDi\rn'Sۦk˨Y#lPw# ';a3#m#n}PXjRcjY{l5zx-njZk v{!k^02vt#s?|㨦I#HrC4 ^T/RTdqe:T)uYA,Eꣂ/U]dcB"Y";/;EH6n;ǐ ;gu'/>ֱK$\RX%U4E͂7dɡ;V>eT]bn2*rrUO SzF;UԴ7ooL{n1Qآ>=%C[ P*H\urEO (&qc#bqbcd\aw 'ƒN92O2Vd IZǵ!E# {giuJc>40?7nDy2 T@$GKsx.baLvp7ce55*$&ы) G&n4I4"+âŤ7Cz),Dh 6F0b>E(G㕯y{ ޼ى %)yGtzp]gq KB%Т? kD8H1z-$ƽΌ{%g]8eE㚶m{z3y~+:r R>A70Nt9 #%Lĉ0qgI&b 3?1>L m-8)p{pl!RD4Qilƍq@\6l]vѾcq "~5 iljI\rn89jVz&QmQ8 *oET:V!+UvhL5CFprZh<>&uiSELwoE]H"N+< Hx8-@[>%O0PMdOR+8GѦeZh`/P'Z{dґV@ XtA:v4CG_~ ֙B^g D DF3΃wf$[ĔDI>q7'HV#cԄT-rFVDpVFR$+z(3_dNf(ef -!XL)R|lQ|0oמ={1/5}е>u Of;p P{q7: Jpx*8ـ⸩I =EEkE(|qKևPح\W7U^%vhdhݱx1hu ",",:x 9rӴ8կVX;A֞j>r!=9LImʕLC'l1m3.KPyV8Css` oF_߯S7Ei1ڔ}lHYÏ(Z # ,\o7&Q,ɇW6}~y}جlk!Q{o㥗q /@7zh8S ״< q3A_hpFwm |I mܫq~!颓jʑkGx 5'q従qcYE;zo3e%YmۂYrf,CuU?/kE=L֓$K~E?J]0GD Dv;y7_.=>#.o-^AeN=֎e4.>S$"WU{^9}GEI޽D{Ux !ȔZr݈h^Q,yfR'Pzz=[wt|%⟖FHs+ \f+Q3ϛmZL I7/}^jM|e娛x[az=(/ SgÀgRIENDB`DDd8k N  C *Asurface1bC( MAN ((~aTnvC( MAN ((PNG  IHDRH?PLTER)ֵ{Rstz%bKGDH cmPPJCmp0712HsIDATx^]H cuDc@'%Ʀ,J%y߆ ߐ77t;"o !00wD@B`ay9A#rsG A :7t;"o !00DDA=0ׯ||فdGŰ|0~N>3p9"l F|P ߿V5=jΓ٢pi-hNgC`TAk")`伆hdcq&$gpԴ&4MP!9?l XTAr: U8-K\-?? [D7HArhH*!'&;9 ‘[tn(JNdbD ͑pcH\t^Iiu(3OkFŷY䴦#ģc jp!%HB5GN Fc`T $ȏO\U$zKoS‘|>[-iJ$g娤G2h;܏HfdP gþ#m{z4^8Gk+5%syH^ vPmZ[@oHu@vzLF@_^vHi e\(1xI.֨o) ͯAX!`.f"yYDl?* !btiomͿ $u3\e~Dfɬd__EI8z}d]!XmMx]n_$2^djPu޵I˻(-v~D~)kyb8:vg $p=D13FYXBOHjft')xVA6<#FS#Chc4+l1 jkߞHjFy,'-LE4J%.L)ifj;Y3s3Wy@LQc-Yㅶ3QƯB4 3Gf ɳdU(%de7!a4PSЭ=ɷH1P@^TF=>8W]q>s䙂b"䌛҆z ٮ@'5/꣰IH\@( iaV ՜'D$wR%x\d1D q"$J^ۇ )8JM +/ƌߍ99$‘0 i u+Iދt/[j. F‘6$jPZH\96ͯ!Ťq\$H G(vQ;GzXLn 57Q#6@ۥw4Z!Iۍ{H }s*\?@nZhn)r'HOszG-^5ucH?>^7~w$ fV䣠`nGNr˃PE!'i@o%!yTDryxA) ̭ euITR_i걶h~5ve}=ϒ\G0.faڝ7SD2E0%BW%RćGK8G3Jۚ۝АdOCr<l!&e2tE[s~HbVgloƐTIrH)zƿV dyigJ2yVTđU;1y}T'ӶVTX݀5ߎĐ=Ȑb X'FRA~%d-`E@8dibC꬝:?3;Hd9q$5/?ڶ!4}@JCVHqu}*ut0#aXP nX8^I{9ܧ@2cģ@,*mˣL}F.$1pLRPlm WD k|"CP<ɷG' 􂁴!Ctf亚\?fqܺ!WfX4="۷Ɂ(mD#Xv, 䴍1-(-\C!٠_E4113M\_ɒ%sM5DA? rN_":T\wm2pg#-Ɍ 1.w 9ĵWlK) #\}66YvmێsM㕵DˆxiΉ6Y^#w]\tրyօt9ɗWk+J6F8+lL-wi5w-v_Il vǂON@ 5{t=/Ls.muRN^EwH֛z$!IGqq!H@G3GW|kM#l.AҐt+ML W>$~?Q|<ǵƉ-0wqtmd H~6i ɽ@RhTI'9 ׇІʊdYH;8DLMj@rMC8*Ri[kMl[W rAyj}d4I`|Fi^6±n,FWpL6%@.7gO)8IçP$;DiL$f 1 HٰÌ(v5gd P`&o,HKI4QJRFe!HkjVth{iFqF1w}n!|J2Jd=4 1_wm!<|tc G0tt²E}ӌꄳiJriorSE*%x$,{2{!4b%)vr--\>m;`tRj`MPH/Z>I'GD԰K4[4eGFΜ$%C +<4M?'4n7-G6G&#z\4I=Jn ȧ ~g-IG²K6Bܚd[$O$lCɝi퍍BIBq^<(1f_N>|ܕf7NG=WW+wq'1(=">#C.Ur/Xn ݌ICL|i[͸P,mPu$ #Mݷq7(Nw~z{ToAؾI N4lO#}:Q4W+72Φ&w|~Gmӑ;Fm,t%RAȆ|P4rJWgr\w@EK0[7f;]HNv moǩmai{+M$uxX*'˵XR\~_ 46f;0D[B>L}w%߄ rryK?!vӴiRR>` GW-hb%b~tgK8ZH3PmReQ}.mVhLS YuB6DԸӣmq#e?[(m&G5.%8qP?+\V%U9ۘ B[`JIl<js\`5fZUioOؒj֦S`\&]v?P =%ݞ"K#/&˱WtbW4UKY&Q/lXkNm#_š@B}̮Di˰7% I4tMح Hu3Tچvqʁ.Ѫ䶀|jar+hI֒mFkunVD2| ԰<, K $=ѱԎ&m uG]h{7oF%AuAH61ƅtJ8׶GY|bV%9m!m^ȽcdPFlI҈ml97Gˬ&pH;6e qHY.C lHJa۲۾ fxƗjXj8.iJ-$YnER 8HJ'N~V;Ɗ:v60 Q7o -)HGlK ^.aw.TnvŴw.V7_r":rtaffە6}9H-/O6ЃpT(IiI$n>,N|6yt²AP*f jl+'bRWLwA=\gQm K5m^g믊Znn .q@jv(ie9,a r}y%mNl>$M%E.phJڒ٦>Q )U2n?iwRha Z TF.vnd& mu8^7-w;qG1ėږê\a|*s~b(+#7o>%HC7A),ben~tG[L (w>'"-*aۜ\Δ"qلo\t1__tWa_&7MRq5Y.qnmW?}JȫFrH.,I\<] :!89"u,. MlY0 GIKsF^qq T' ca ؒ"o"桮2tDv<)@:l,` =ܕ@Z)#atϳ1]f,ȗo{W YFo4r v;_r&V-A>Je€ "69r=ɒ u#rfHH'[B '?SZH 2Hu""F(Fg6 rF 3wd5RnP";q]Ξ7Η|}Y)s&R4ѳ!4a N*8g Zȸ܏@iG̜v ?'٪ݟo>blyx8Fj3؂Сx|?HgI@ Ļ|A} A :7t;"o !00wD@B`ay9A#rsG J9IENDB`LDdcZ  C 6AcontourdensitybUK]ko !\Q1Ksn)K]ko !\QPNG  IHDR~"q.',tEXtCreation TimeThu 24 Oct 2002 10:58:48 -0800 xtIME ;{- pHYsodgAMA aJoIDATx] vUz3jԎS3v;6iѺ\`>Bl/ۍ 2X 2/ʀ!C z r 2d 2gȐ!'Ȁ!C z r 2d 2gȐ!'Ȁ!C z r 2d 2gȐ!'Ȁ!C z r 2d 2gȐ!'Ȁ!C z r 2d 2gȐ!'Ȁ!C z r 2d -7_.9#/2dv\48dȐ!B+C iMW*t!1%>߆a a5U9Rl 3_&m+N?_[l~G i$q*Lp%tJyeB_ѻxgs0 =s)sEsPk%-0ύEEX ݾ._v>[Yb@D|dj>j"-KыAc29 סϔ&2r0 3,I\_RI( unn[` =$V 3p17\d1/W\=]L?笫5$ ;*AKrhO* npA; ѾOGphCB4I,^9WYff3n?~ ?=.ѬUt׀SPJ`9:L6p]j3#8Iz˃nBoH*߿~I[p(4HqpAŏ/1]cw ʘ=ֳ;L6zx8ӿPE΅9Xg-Y%XDxc#ֱpP&t ϸJݠOM,Lfmٟ+E۬gͥb3NFa ),M_ < #r)Ë,?OVr╌C N8;O)zr䖈#{5F͒!6+v8zN0k^2(^t9X7_Du*V62EYW <ӏ/)lE_u(/p,aAzd- M$2?DK$ttSp`2S }긞 re^' C`1,r! q:k"4"=/t#FcQ6ʙ'@ Hlhy֕v#_`9;6A6ck;Y^bɀ!,Z[r?,;\x(W.1.VȰJX5ӮU]R( !'{V.}vJv<g2RrḾ;-'+,r]G;\:览7tYk gVH>x`E`{|@"9:XsfɄhORjŰtzc">& kL7ÅĪW.|+y]֭hxK[,EXO66FW< GRaD`o1yK Rguնuޱ.+̬es8Lt=0׺vڰ:^N< rtBb $byn[& }5y^^sdw P2d9K8x=&, ڟI [ţxkQW>NDޒrf1P>c!{!6mX_O#ۚuuNajX|.S\baWS|3l]ZQ-]SKwsr"6O$1]*yW:`עB?P~ETN+v;d?NMϓ9$_$*lRrN.bU'?h7ίzsh'a(Xtykt[5t[9JK#kkGC{}BΠ.3>byHSJ2 [2:n24kh&'x? ~PNZX_SI%ly 3|Uasί+}?͵d3PF"NU~[AB ;c= Cg >Ӥ'EP-ڿ(ي&p./XZB_Ď,a6J`6W}rnckj fn{# i'-|?&5G~g~m/uNWyhzRt\\u9֩8}rRƐ_ @" O 7+:5%#wͥSigׄ[*FZ!As]BBX]VN20:\Bp꺱wㄵ%/b Prj_tKw6tiڞp~ "śIq w8%wvt֩΢Z?I M'Ž-7aEߏN73J䒙!˕wNas<YL@Wh2v@c&G/I~]u2ђv߾z-vuuۗ*|Mhots]燮H +XEِ̼5C|~YoY|di^B~Y!g݃ Mh}D RnlŨtOm$R/zꍩ*Q`k~VϚYPY s=OܧEѺ:z^ez(8d}]oM'ƗD![)VJ',q9oMcSì.n7։ěbi;sx2l %8C3BmgCTI^S΢ zkbS]^u!xX .9V.6݇z489"˵kkCrfkZcw*tЗ.M%*3s^x-\ds^W7'+ /~sI;e ,eT]2Sn䎔t*)ܓ) fkp -w9P$![7Y imv0@?_RJ? )AЩEPh=nt3Fw!铒">+o ީ+rW5D߲BϚe:|CzX5O4ӶsͰzA&󃵤7Z $8*Δ`b_aKGǔQp6$Ie@ݽG`ڳŒ X'CjYIb]~5GQ c@ Bͳ-˿U\zƢƂsl &r}, xGno[;sba%X &ogX@Ag/*+;s3vW^Y}^ɸ|XQrtkr8QUGvJ|:Ȉ|]>_"bv AnnwUK#G)\/-#}XϲD,^M%' Y$ʰ]W W}yrkX%hX8bak^ãB0A%Xl ҟ_\:Qc=X zE{XdyHB䯏Ё;3z7 1+n(Gx3\JCo {dd(!f,O Jf֛P'Bk,_,Y5lEVȌ]B7οHCEtVyM b [\2.(ௌu=X&9: n6TMc_j$ۚv=YXb1/~G&t2Wh̵8MG 1t2vvBl3 `JvܩixǪh">aI86`Gˮ~l#2dq23@ݥ/(:Rs!9((f`K\.~@bMpb;eqin74>Ԫ=lX-Anxq%A xƱϢaO];k-px`QE249Z2|%j}Di˿ +FAPXZ#к ^ЩҔ?:|8y!v/u ߼ݹW')Uڜ`fGEY>?|ˊ\eW%lKDFSb(bRh<"eسx e>K\ub"x%Nc pbώ>3Z82]\:uvr$J,cNdI?]Mr\ʎ,0P5M2k9%t#ΚL-vg@@6!]iNޓ,jOKkwy.ܹFB2À($b—gzȰf竴}B vUR|2|3H?=6IȶQzIfYH_ФƺH -x󆂕+b&13ؤȮ,s=t +^E6'׏/Rq?!UaO8m +.Z.Df2'}]! cf@4_格H*wK؟Ê-> } #' .ҕ˽E2tɉ۽,HME3 *s CS?Y6C’I%ͻ㺮8"*;&%62x_{f`N EL]+=kqNgu"@GIujiV+Ջ+˅>ۯ=x52_,.1Y@.^,4Glͥ3|7>.,v"zvq?/9bri!-G16"Ū2EKPI[qb%LħO(uo _2op >% >^)/Kcw1< =B?9bYK7 ]U%Ơe5?fa#\:$^*ars]!ciLo6m ޹G焙/xA8&DN?/+梩Qba5MqI| LWJnؐpP3k\|}+X;P1BҟooXJ%;,n VWtSCv:huB`t-,b4-V4Ɔn3/)-&9 BT[9^Yҥt>KnEHG"R1\iȀˢo+$>1q(!º;+-L}TY6s&Z^?;0-dm-Z+3[3ڭPdA>t:UJc*sAY;K>8X+ B(=yc+ˬƹ7bjMSO;빕0}=oipgmG|K(ZT_1aEaBkQkXC,C5â 1Yx V8tfT936kNZܮ$}П'{Յ7:W O-LqW~TE'QةèD%oxjal^Y^#'Ɵ g2z=dž.&>( A)bP3ɢW9/i/r㦙ɜ.Z+֨h*gel%%Uvq0]ܐ2qr$`=X^Z9QD*! {']'|ldhEI ''$xiisupe|+=rI['".f92q˝5CeGg(X_Vt/z6NNUeR]0`Ap0w CGIQb~$>_T`,-[ȶus%z-O;_!B X.wȭnE,'A7/adN"[z?@Fq2~`9u]ϻ OGc?=x.] 'c@d[, w ݽ*@,-EӉ -V2v/ԫ9R*gUsϛ %ba9;`&c{ fP" !y3Kw3 7hQ Xϡ2nPS<2^)UWذ4/p. a>:r7.QodezMk0lK=ήtp1"*ZAAb?SoeS0?s(3)~}=`xL4t __Vrtg CE|_I:R)\E mS8^]Δ@E>[)@g xϼ^W#ԜqjD~Ӷ׼%J8{>7EOa\WH} y:bRä-@CL瑺qf7Om-nf/R!"flz(ϪV"l^8g)NSI >t7z>u.D ?ģGML{SW>VH,^i gq~Y+I)hyg^w{ _c(\Fc )=y?NPنa@$ϵަak{Ѝu .mJqV'pҫ7\]E+u݊XR :Jj-EhtP j޲F hį$?XKV‚уO;\G`{p [957tj zl@_?/WDYD;<>*nqPQ/oB3AҢx,*SL;j.aQ9"B b.mXcz}RezBZs  Y}>`tO}q| h2bPP% ^%!{ rNphM W\> ]۵>C?Nx^}#u~@3L$Ȃa;ps܇c=N 壥UUk@N].7+ 4'’xQ뎻 [#b_V|lj$;(J\n P3dˋ㌃Wڰn8b uBG1䩖*u+m)ї߉A1w1ڙV&-"㴎aV @b=$B@2/ ;ՋurԆ~x蜈|?jf C?I0GPyiaDs(AZJ BdcHA r5UT%\}:؟x sF$>F,TrgM}zfcP_s '6qZ$Č QE;8!%W>Y秸Mb @kf͕I H\p݉]Vwt!RCZƒpuXCB'?*#x޸OFpm7^7Yui!+]2aVᙥZcaif8 c?ӎy2Ŋ+~whS_'A`޹aĞYQggE(K.O03ӯ֨N$jrH_hM{B_P;lО*$ϖ4$-2 znop!L$V*OҍO-vq_6rzw,Ϳ /Ʌ-P/FAemC&;\f/m>,`uNc2n_}cNJ:˃4Jyt -j.)z(yex$4tz|C s2v@2vHJ}.lc+ZתndjO@'0T{BmҌ\iJ*aC0\'ɋDg&}:u4 E0j48lRlh E%A#mxQ4)$[.8t.Y8Eq:MN|Oh[ ~c2qr:7;N؎L{o~MjLIKy/>؆#,pDdnvl9:Iևe@!@h+CP91~'E2zf@ekftB"t>39,COf` 2|`jXf F&_Xv N4SebK|ދP!^ 0lHtVB٪ \j@_DfҡZc`GwkogC0gMVrAISD>ӢdtO+ %_+^XgGG.1A{U@m.T9dXn 0Dcdg֓) C[¾n~Z9|#e}6]ϲΡMxqeOߞmޅh͵*#Sr)wfLZֵ+fB`n}dUeEDVi Y!䤊W uh]2Q*=ezv p 96sBK2Aᣖ'fۛR$>ZeZ[P?.?Io6^t{DHp.p ]^J6` 9'6;xݮ>t87>z]@"bdc\>ZNX 3J^"BrH8et4v-vjhyN&J8$v&(GGU *HٟrAd,r>4[/UO~^*Ffaqfm@cMxx=s"$+rc`]v-/;|kLB{}vG?.c@ dʗćGjp ?ej>078AJnv-2 ?³\__GSӏ]ë炥9x˛7SH6XLBֵ&؈v[g1S`U+x+o4=|_F+<|U8d0 9CMhᰳ.OReSgGDIݮ*^.V<`Qh=o?[:XˀO0ki,c*D8.pYl 3Wi?|eo;}DPE% /fzleie$7["6ȟJIbj9oxsˋYU`[]OZ4 -,d@Ѡ'  !ϋ#ƢO 1FN^{F 'Ym̸%TW~]>Te9[:qscX.|)ߜvS"g[NxcY|+F~Vȸ }yAvʹ Ց7׫H1b ;VYgHt w~m G$DS'yC;:}_}jt{HFe\mLO6Ο~U1 Ky0Qm9\V!Y$3'Hn;P?͎@WY/Ja.GRac`$I#ג_իpu=_6VG B?B`0<ңPlwk^JF˟hC-9 msOd{&@^_c ֤nTޯ@6zĎ#ΣPd<.EHmw=>'Ácp`+̄3E1Wh-od~Qx1$Wkt$3\Fų;\[ }F O+h:l#6mL !}je##²˻Q*OBwoa6V'g>UY.^ø8qBhtGud, #ηdf[77< I>ju6bUlb}l8~R;ke\4Z w8-\x+)^YoQu4-t=W<08eX!@0}BI~\xs=]X~NTćz~],SP#zHz7q Fv<_߫n6fT*=D0QMlFΈ=q|āN]ws0FW9_b ~Hg\l zDG7s: |{_(1 L9 lw =܌C=dOH6s^Q#? R6j'6B%XhٯIs{Ԩd=u*VnQٻ I~Y ,LhlTo~c;^"2Mȇբ ̘#0} =)Ru{CgG'2y6Nf6۹K}=*ĞIџ26>ڜ#$3T.z08Wl-X,b[Z+1L?ʷV|_,ܧc0&s= A:gh4,3#[ڢxÕoS]?Ue.v A0h34 yjsX>Ci ="ӌD-'tݤ?랏l B–J򧡇E.ڂMnE/Y4I".c搐|xWGH\U$WuQ\DSa vyYBR9<Z#a,rϭpTU 󋋴ʙ)y*0e@ۇt{4Gݰd8\-n9cNx/K-:a$ Bf#ljTu2N|?0δ/?p]#kDfq$DΆvBh~DE`y>-0Tr;_]5ȗ,*j`Mstz.:!YGZn:ڸ f~jd8dKic׷F^p gof$cP١tLgͯb>CCPI_dFUWGP0p8b>jOdBjr0%B;[?J} tKpF"ChʹNEė P](9 !=,<,A9(Bi蹔RC{x#z?"YRfU}_lUl>w={^]C֣yMbPJ."4dܺjMGl;-5A/;QŽ4ݹ#$:z:}ǁk;Ԡ5ui:АIlp鋺|*}E ui⊥X$;zQEYʱ\,GX ̠V+;0h.]#E9nDŽPQҐ*ZY9H8Kwqk ž{ܶ-DIp䷷ s$.q{ǹ`\%" ('CBVh徍lk:O6jA/hYכ q (,~) Uj5#ނ Bk@X? =>~݊ OhK} g;\~{*/V] NˡJ4<}o? =f>t.nWGG|(B($АpdތO^>NNu7ְCˡׅpY̸<>oh28-L66"íH3 5n)mNDGB9kJM5_cl溴CגH6^5lf|_YpLSvi"<$>BC"~~r_P›S7ܾ\ӥܟj%:G>v9Z| XYhaBʻ.~_ۧb[:blK业ݳC3$O]Ɲrf] h3rP* g2\Q`Q-#?kJ ||?;}(;"+$Ā|D\0}j/ ͝rj;5?!~11imdCn ][^r,=9|7H !xiVÚ0[[;}iàʜϜYC)C'mIRd>zX,% m1@\:Ն; U' jE( 54g9s6ԻER3͔5=cS/jmS&缾hfZ>ɕs!!: (AE⩝7P$!/Sߪr^7_l s5PINoH!ϬfvKt=926̱K"Mo݂8hԠr'O89}ǣ|{+Z"Fz(z!P[]aL/ǭ,o?'D4ǟdOToIv DQ>uB,/YɰCȦy{,D6L;N >ܚ޾gċw9}=^V(C b&_Vf9PcM!bKdNM+j\ıh&zuXDͣD窨)8`niE ')R|*ĺӮL`zZs{RRs_| ,3iBI[k bUL 3"Bd?Hu⭲ hl|s^!iZI>x%ylSNs=a!5)AH r[8n]˻f.ĊwO (9\KR}g˷ +ᔖq` YDԒ`wV@YnT/ šgya"! R[.A^Wq#\+⧐.Q)j$%[^C6~9=ߪ|.3V,?--mtkja.$ ÄڃPw#Vl#/q'7EsZZ~}gWQqs`4њ٠t!ԄGh9kaG@gr+y8h%&A 2z|*aa\u&. Hs\RNi@+95[jKz4O~4y6m0}&R"H1Euc?IA_B%gL,tfF+}KjXsjR+i[W ߴO1_<Xy&֓':(A`fE<B>4:|d8q'hT.N'Ԝ?B6^qg(OZ !Cs=?Gb$NIlI簞+2dHW]\  em3dȐdu?_zt$m' trJ{BB ۉJ׏oX=U ActҺ3_6T5+=q ހdú>YdhV7Ȁ!JNgOװd@Ϗ׶nN"۰Ӫ>xzuضg<ɖ?ewNW!Cnא!CN=C 9A 23dȐd@ϐ!CN=C 9A^?IENDB`EDdrJ  C &A4plotsbdqIHiun{dqIHiuPNG  IHDR!7,tEXtCreation TimeThu 24 Oct 2002 11:17:18 -0800YJtIME %K@ pHYsodgAMA aIDATx6SoyO24e-Ic*9SF,??(?߿wƅRYy+i'1q w6ǫ? 4Lq[?ΆܧŅI`ѮNt ⾦RGnw C>j9Tny!4ZpĠ){P?u}oIMyD6^*d`ǛU=P'?-`E99mx뜖Gy0w^9> =O*w[s o ԕ> =w[6"ye1z@>Rx]%W5 aT N_a]5ss!9 y&:z{>BE_縅ޛ1&Yc;[@M=JȚ;*?ЏuE|jywD*rˊ:ͯ46?A^W8Gk3kqU!zGKGxYNFO (HRa/: }=#X]}TDŽ]ބ6.O&^Zy9Ӽ(!"}<"HQĪ+ܟA:Odq%h]q5] 4w K_HsKr\:"z.P? MW'S +*:gy;P1W|ʳ"}^ zЏ*Zu~pug_h=*HQAѠ]oH+D:QB|5ZPB9Ȃx)'>)Q7D =DP7A_ :qz;R%c_iC4Lݸ1̚U"zF9jW~zHd%kߐ?] dg|WɁ1Rd`t ˠiN]x2ہ ]?PkZk+etEp w ^}:SSѯLJ|%  6.]V!zd~ڐ)8CCJ{Eݠ%d-gP7ylCݠiRui0ǢV?g$]g<I/Jh w^\Љrwt0UF?QԮ3 ܻD:rM*rCѠU R߇F zDǥCbRL)$)|Fbr Q.2X|d#ŝG'Ӄpѣz^gwq\2ϙQK^}btP) 'ejIٻ5NN =℞6V0OM jQN!HO!zr 7mCAnڞx>?s6/=÷3lt6u,e'ÃnEë-l؝It۴W!~b5AME$5SHL?ԺdiNszI}bR}w?McLK~&|qXGh-٭o? 2~?\?ryMxkWˇg Ѭc`wy1?~.E ;/E>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|˪1C<Ѹ`>*Y E C}` e*~v >}ۅ2 SnFs~J9mՉ?Lmzof.Jʘiho>zԕ>ntAkwd]fjr ȸlޑC޴(*ׄ]bZScjە=oJJĝW-R'žm"} O2.HT UH$ij\IF =IBDqѳ >)'vMyHwOfΓ( rκ:9;O`d b8py?9:IeC4>YчT0Ng}lv[E9O(:!J( U?FZ$}t6P uf:xi[FFM葚sUuz/L鴟y9 9JidzΰrwGdC'Uu+l3>DϱE]DFՎBOlRQu߸V=YQ>Q%8Ij OH9N]1o9N:y]xj^1q 'FeCD$ν8nD4Y7?' M 1=FXG y 43>=_Mp& cu~?C%x4Mܯez X-iNp=/@n]gc5ӆ87PO!z1YwxPKWqy )=WAd:!}TpV+YݟoȖbWWp,G1rru,}δ:֌?}>% &)Y^й`dC=Edۗ_3 #Yc〓>=1>Sq&lWq>ѳ3a4N>- غIӗw _/Q|ھ!l |uE ˀq:WS>LV%ܔ}C Ez?yA4;s  {E3-HtJ+ ]ݧցft=@'-!Ν9(>Q0ő>=8.u~80sg09:Aqu~WJM sq=:]q}8Fqṥ\fÈS']+Nn5ITh'+M֊ցivrKMz^Ok,(|ڇrmya̋T'(\6GEYиlЕ>DzǝQvxéw^&HqӇd;))J!wRy;1I&I;&ŅOr'WG'pיBu^߹'wJp΋Ia$>Lvr\\qA^L-οV*(Q<9݇!~,iX%:_Ջqz"- }+Ӓm߮7qNJ=}EP?x>j A"٭G.x}eEF܇}zvcMszI}d_?ֺŀ_Ana7-LozyɻV&ϖrȭ<hb,t@4ec}d9va:bX?Pks'IENDB`DdER  C .Alinegraph2bl>Dhz;? n l>Dhz;?PNG  IHDR|i,tEXtCreation TimeThu 24 Oct 2002 11:23:06 -0800.tIME  mp pHYsodgAMA a IDATxv8PzV30ȶ.@Ua^N;$߿/gs:@WBJ] +t%tЕ:@WBJ] +t%tЕ:@WBJ] +t%tN/>:r&t%Яy Y~=>_tG/^>C+Lxx7E7/~<@y o/Iwt3bnLE&=ʥhSyq.3Lpߵ|~2x=X-F4x2{8S[h0@){ 4=t6_qc$lytE4pBvu.w;r'*simWRuUBw9EɣD\07-wԜÞL;);IϠ߹7o9s:W_ :p@tfIJQv`4Wb4:jJ!ءc _I971Ah{yC@C@%FOCg5eh*NıPBC(QCgU6t5thJ!_s=ݡt9F9tw3);_Kj=Ϟ ݜC:zf g-FOk3Vy{B:Ǽyli,5zmkx Q%*.5tfXL\8 t8D㨳Wn˥ۤ6ŵs7^vpOg|YmxS(;4%tY9r+,{M 8SCNE^L7sAdYa#˫+)P}f@ЌB2Hn TvxK6%uלE\ę  {͙@`rB6?\$0Wx 6˼Ca ys؝fn,V(qj"t`FCaiͲp['TYN' TB5,j:l%GSp+<;tk"ts¥+Xv8WPS̵#hxž] C,BnVB#5D9፦[`6tEk"t΄]Ya]*~YNoQ;c1(F@ojN)D[Vg9+^ĕmNa?+H} lTb4:aJݜHmb$B6 %VXFs'YYg}|qT6^ǯcv؇Y1}!5'؆|yZ/殏FT=6^4E 5$ ?#xfBNڎoCg9ïqNY_?6/;Fs{:/XYsŹ )FHE՜SF@%FsC,3vsVBOQ8Qv~]sO!>f4 | );,+^;{B'՜EYʲc yG@\j"t[)XGs%tb+i4%k"toβS5qC6N1B' +f+;kN)DC1<٫egSx7g٫HL/%+;J$S\!ej%t&S5w&N:G+;,VBgVyCrT)t+0S՜EW3[,BgR8odMAdM|4'9 .Gpj>xUmjN:QYam;B Ws欄N`=NIZtr|N!3wСee⤝?NlVX;Ν'3s.asQeJ_2Bg"BNC٫ Lɝ3hzjÆN *ę{4ύ' ɝKn,1B'Ǔ=g5X5~ a͵K*C2ʥK5Ѷ&ήѬ8ЉpIu!8SJ/]ԺCǀ6NzO)yB'?8<_{Y<:[ɳ=ʝ[<:M/?CCf7~|7Ou߯kOJ9~j̝vakyr>n>ֿp'ֿrj+7ՄgOz>霌yO]'BGj'5dmM<IN7Ƽy'!|F—BE;{=|}IkhCU xH}E{}bj FyHK7Җ UfЉ)BM'ҍhG  @MA~Z¼Jú:*^<3ʭ9J^( J] +t%tЕ:@WBJ] +t%tHLIENDB`$Dd(#N  C *Ayonrightb#>y C[jցX2V#n#>y C[jցX2VPNG  IHDRX|{bKGD#2 cmPPJCmp0712`#SIDATx^]b:Igw^^/7?Nb nZ,Nt Bu%|v^ِh\ȬGUR (ꐐ l6H6\-V1Up8mC[_b|2W=)fͲ.RR8Vf6#Bqx=u:V4<.ZEkwq?&!|iɨUzOy<_`(ԑ$`輪iaI=__,nejT(ο2&"멮(ƪҪilndTxMGcV¡C`]J,kEHeC}UV/|iXGU/VedH)}U<\|& c; 0`"_Hebt{;O7<"*~av=⁝G8-L}oEEpXt;'9x%V|J![urxmJnG} 74)E VSO3DZX\p^ia<1r׼܉ĹYHk&n %%Ck4|Ժ=%U/@$qJ&߽-miC _! SXoW jҍWnU]Z\\(3ohX&~9y4_kTG/w_B*YWloeQD}Q?>֟ 4H`^iKZK^P3|ħsXȉ9@#+B&4Xijip?R>Ь*B# E:/t~8%YXEH8g]dgӢ2r@J'qkZ-򳒎 lƵw Dznn7]~H9%y>,~;ʜ9ۉ, X5#]I|$GS=EؕpX${,*@ם^^f!sbuy7EyAǀ.mz GAkͪ },%y t>B-T4ѥwKGr.,x_>[`{bxcd>>Uh8`ގPVe71_ޗ%iz7?1'ٛ[ 5piLH(kqBZՏ/=իѬtz5R߈T,T8)i/xpO{@x5^#uDv!}goF쥘,s$uh^~=~s~<igՊC`9>RuC+ܦyj#x@' E]}yiA263hw껙ڗOIT eλE4ß&*ܐ&V@CI9etasl4cUyU^^{7;}e_4z1l 2~Ձ>-NCCbTv=}tKRdsqyCA DCHˈIG׮-n]J{=`G, [G.#*6P3&oAHKe2?6IRȺ .瞕dMj ]LRB*Y$<˽]8}+AB 3E4ѡ& wˏdzcIrf_n̾| Iv\ :6㍿ҤkhCO;Mb&}]C{;:5}ffKtgԫcVfWfÌև[_K_'ڧaT[ĀbM7{eC{ZMVwCfgF`8 " rRfi(N6&QzVxGG0Pk;54h~w=x~?HѮSOCa6i2RQg˯:}\]h=-zU!YifF6_̵~0k5wsQ0v٪GOCڃяeoDfvske|؏*C}wʁ6PjG{{eʞDI V_ ſSf(z=uWYGl0W=e[HЫ13~/퓿Ƀqy518“ vdkUO+wzNq[ԷC,1Zc8>{ɕof8L?X,  B{J 0L֑Ų*cd hzm[Ꞔp!ކjQH)$nO6($Qt-vb GKg Cʷz[$5%s+:rq0o:<r-ݮm2-ib@س>&>/g w %^|Cv#~:ГW$ef)c Ųq#o˼&@}wbq zT}(iZ4o3R n =d$;8'&#W?z(d }[ez;fL. GPXA^GasP(ܵpKηWfLW8>diY0 ~DKW~-)_/tٮUY/Է]ّX^" vc1sl*p[tnUbcC݈[rzĿQMb[ۂ*q]sڍXN_}|~'f%vkȧS_d%N;Tn^V2xYzґ +l):h-_=$xK>_ $H O?/S^L;8hbksn/ z@ <|/!vbM]שύ$v}o -BBI__-kbNmba\$qv{C.2dԘ>H/ZxLSIQJ"j/xZv8;(\4w<(PU,V,}_iSΚ_]꽿{֘-ۇVr( !,⸏2X b%MdAhoLiEZhUrf^KT3.< !ܰTX1ZY;zۮv'0nX)+6JuדvPxk©špnhC4طh1+0,7-V3T Z,G뾊p{-F!3XNhXqkT,A+iu+rQ%cՀtyYu+N H,P~FR *SBDUב I,}BNu=#Z LBPL6X0e0, Uo„] APCP}j\ huo`*'6U:{`\pgr=Gh`j6kQ6@ݝqa&ĂTd ql&ĺ`ggALbY [ WG 1F~MHebeC!PGzPi}Gz4t& Ztýجwy $#_lr(ڥ&(@칢 )`?IbY 坔8BZ՜}HtyA o&kNPg+=6z*S&4cE,?1 oIBbE,l$tVXʽTkt5C-_Y&F^k'bgt(#2!%롧. &}M9J҄ROB=Kgr{T6gt#M1$VG&c[,3ZXH"J53ђ2!GtaP?H~~J]F2gg$y*tLKԟ1ꏋ!:۞+%!(^ZΐPz NŊR\{M~TGź^?$ &`!1Y#+^5Dž șt𪘬[ęzY/Cghu^s26Qr$qSX"`;XCʦ+R׋{bXKՕx  : O֝5Q !M+69yw@M$HGߓݰJ-U-K;AiPGbuK,災]qR0XKN)+e39>(Z6WB.Z,+뱣LdmXKۣõV \X1:.l#6Heb9k1d!I5zw60ʦڦ+:27I8Kn `$!Mu&*2}5i Ċga:Lbape[<>V^LJ@<>֋q";Q<$ְğZ2&_?#1qt=ZMX Y7KXhKeԿ bh,V6JYOIMq+9.K.3q=D;=stܿ%&z)Ȳ CmQ/tkZkxK~ ߲$Xy\P_geI֢jg>˧hX+p/Բy=X Cc7>KHչg0ҿ=~Q<Қ--4f&ӖhEUoE3>B^gw!#EgZG ۯ [q>z>?>>0)-d3yWKɑmIbƞ|ϧY_{ۇU5@|Hri}CvKkI璖+X)<ƄMRq{vF{wSHPWDqs߅J(_ޭvqMZ # +|hO{G.P#yY֮&OtifqAYm_C}ʥA`;Z1m]c&g&c:h7h.R'Qaj߉]x-âUV)+}U1YK>O)[qKXfUn$OWOix΃Fuvlwm4˜km 2§{B7Gk}4ωiZvb(qJ՟4>-a(=K؜c07ONvڍ:w?{ڔ^z$Yi*㪵MegD F,3 Oz :j)PՆ GCeZ5*F3jJ d\HG#0>t豾_gZ.1cˇ_$V8 ?ߥ26zJWѹ At>9Z'3^'-v 'AF> ڏuDv+ͣ*I'X/N#%^͂_XA\0nZ2Xӷ^^k ƸQhm׳r: OSKb0hn ],\{_ jkNC)uo*UY̟%-{@2Tt]8ʨҚDF]^SqCaiz50y™et8 8 [YƷk#WX4"nUN< ^=sqr=Y.cFu?} `'M='QHFC`.E¬[û4N%ԶkXoakkۏ12W]= +2a ,z2" ^l5U"6 ;ǖ=,㏢y[po^Y,yfB|F{!J Hw!oK4s|F]e@/utv)QOȾ)1:?(c0b 3֖R ~GEȻ[V5BM +W]g֣TP{qr5e0 X%>POeG 56/^!WS5,HL} tV "8bmo?0X[ "D"1R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V %ȁHX)"R R`PHAJBI,r +V ?{<U9mIENDB`YDd(#N  C *AyonrightbfXD@HwN[BBX)n:XD@HwN[BPNG  IHDRXnjPLTE!Rs{cks{RZ9JRZcks{JZcks{k9BJRZcks{19BJRZcks{!RZks{JRcks{19BJRZcks{19JRZcks{!c!k!s!{!9!J!R!Z!c!k!s!{bKGDH cmPPJCmp0712HsTIDATx^}u'TKʼnJUlK$fUE'c%WE"qJJ_*8ewڑHR$9mv|>uv.zHw=?,_(p#˜yLYVA d`E!k4+c 251XQȚB (d̓f`e D@VA32P + YXQ(y (B{F76.S`Z/jr2UTN)fgCSUSK p tET῱|@** S36e^~oAMUW>GB`u#Hv$tټNϛ3cg׷p3 n(ҽ % `Y^srİsiBma>) 8Wgٮ]5%D; PEQU!MŠ23!W,ǬWR&t+gCxf,i)f}i`[ Q+\I:dK̠flF&~j͈IȞb 7z;۱^% B%AHi] j"aU{6cI(j2J%py"}*+%뤓-LJFO"$KhLgA_k~z:=%뤓-8 @Φ}wk%rϮ\~/N*I:d.ڪE!23@&?GG׈i}W" Hl-QrnX [RL_\Ueyt+J%yp)PL/|N] [bipuw^E`i}S ib`+E ãR8SZAEV%Z,qr+w,Yi8_XsR^ .1krcRf6Ex~:2Qç=RǫC[G4Og*SRP_Ms/:a5,dbT/F:0>ZʉBn ɔPAmc)PU2`JdʃɱX}7TTS/~iUTTOsG)puYge7JVSПHxFIy*%^ {(w%3*Yz8 W*IJq%( J5Z;WՕ^aMWGJ(ȏͪUbe;ME.))vd9 Л"[SםtCven[QiB9jg"IxʟܫO6Tld5<( SƿZd !-WXsv6|Þ5v壘]Ĩ, 6:p WΎ&S$ Mv{Oe\xV.y6AɖdAժ%_0 |8=~wwҎE+A\Jc&Oaq13JlD9M# Kk%Hr,w R]3b‚i>I/S>cú=VCWJ]IRG/SBѢo%"w.25֟XIVp"er|;ո\ڪ*R 2N| (lcScA/Xgl逕ȥ㶞v1aPp$ݯE$m,  6Y .2T]pɄ@PyVsN0p6Tv"V _$?I5EXz TWa3poU>An`1^_@ D쭷],Lj2/u' %fBzEG SEzU@xVSLf2NKX΃8l*%G݉qr+ #'x1~ꭿ>j7Pd-.XGc{0^PеܕC5@QkT!2\ctFKde\,NWBc#hY#&,]t%\"cRcJ,X7Ac1cۺd6v1"tZVy( )B!pe9L 7!\],)SO41(cEQ .Ɠ¥6s@x qYABǐUqε擔 =ϻX .6k߬r |,"9O=UȢl@Kb:'{U &{rS )h5,cd-yŒ-W`3zv k^+?|P2J)(t!McVm҄½d,qR+js],F2`{FF^|BST"$c }&CER'rLc$$lR=F%ޢ(m=W("cXœt!" #x9YWB)>9V?&; c) 1SH&SDѵ1PՊUop}_/Z$A!Wa<^Cвbh`(9QO*WVi 3}#2x_(M+Np!+8]2ςz"ԠG 3qw>5I+< C~x [-۰lG^O E9}=G>ek\i .}).P0xYrJL;Lvf4 K*tpdBnH>'or1(b/C]QWuGa߃ L~$3(=+ n49_VK4 aO7[7xb eHXmp'} 꼪<, z%@gp6'F69vlg^.O狶%`fB2=֍QX3;ș]nxג׹i$d[ _!ቅ|lc$?QjȘA&pQ7/ÌE>B59ф$*; ۨ.G΄Jmo+'ND!Pi8dcEY ,b4%!tv(u 15twY΀6v7tzzWZ)[PE2 ElEsXK!1М7:AZL I[du~A=TH: fW}ܣY4UJn}m \wŸBE)SJpٵU kP%а_aEt ;p2Ę  ^ՄRn|8 Y4Ms2v<~ BW=cnjL-VtPFT= f״* 8ʚiTq:pM~ɉrlѥ? DZяEi2\_hVu$*вQi\ˣY$Gn-4Ǩ=QtWpq31ŎkW0*$ חõLAj7X7($p$E l33u 4\E͆/7&dx*&2*?~bblߣn(We/3VE釓!2X¤8p9D \tIa3cV e79$WZѢ]oht)nup,RbrVk Ѷ@ƴQF{ lQ4_8^-7Tªv~q|10dVޭfE WQ T.u>Ί\y_ `q T#Öu1EN̕}?`8,2R+ iDJȱ zUG+B !=jca+N=rܩ غ K%[䪑VTV7z͢$ʺ\ak:pA idViD Rn Ȋ*FoIef;c*I2MJkyT@, &"=*4h=ie }`놲l>ξ AJ41}.e-XW_ow',YdجC-ɂ/ hM? 09D:PG-ʦ;8wp(ބa{=p;Mf?AŎ؍u @493 a9p2ч+S> cJ~Jʏc2oalQ{Xk2 "+o}owrz>fTx6g}΀E)/|vYAuk>3n!B-f&eX12\ЈErd sMc#a +U(CQdw3Tr%˼1s46nC%,1fBG ,樉ս6W%O(BVuT(<~9 .B 1=JS8ѪPА5dRPER7K(2|=*,)1 HX|}r,7Vsi _cY8g h0$O+I%mMwglTh-wu'KJfkSvQ%/*"@\8kʚQvDqC Da/,KM#% [9WJ/uZ`Rr4| N[l)FM"S_m4gKtDz^5(N֐Xx@d+GM!05 m/ L?[e4E}EWSO2Hg!ZJ[ð!z#ǼȃXal4{6|kz}ՌPG0:GnYԾ!X}ςsΐc&n` Y!! -TfJ3\fvH|ayk`$llNOnfu,ݴ[(gq_k6œ#/ ;' `K !;ObCJ9ӯaK>L`=,g|"2.Q5]wU-Ŝ+a]46"MXq4־zYvw u;(ŕw1tx2ly;ozDkDų?% $d]SS,Vm?XJ,9 >(zQKvp:61cZjqu>֨S{+A]ϳ"$), ]~q|6kHg䢖+Zkઞb*;k7|{'i\sKߕx ²hrڕ "k*ep{3]XiqI4Y5 )ZX+eVW#:FDQ8IQGZZH\R., 1yQU5ԝ XH){ͧ^?H/ `u.^nJ9yV+7B.lՑ7%Bw aJ ns܊>CL`Wah5#=8K%2TI_}ms<t9SVBCdm_$a.?}akԱAVro6A(@-x 5VjiPyW_"p]tB%;{YB'h{?o+B+?}p&=eb oҕ>ῐDͩB7؄A2E 8J'/}ൃ > $Xa!~Ϳx:j鍮GbRei1, p5N%ör^LUֿ-۟+3hΐk^G>3l20h*><|Ef0*YK:G_- ]8r,~m?Z ~l%)x 딓z:c`MhwO(K4D1B.[6( |qBKʂXTk7OGW_Xp}{#}QK'stЙD4+.f!sEyv`@?-_DY鄾aq,ksa&'3Y=F.Oa()ƎޏrW:FE}Q/X,7?| `uQP緷yO""K8*8a`Lֹʟ|Kl6@#< Y W5'A&C' bH%%^U?}_KgPm!vH,d2VrǶD2>7NYD:^}}޼ #&@K$ ^P'w x7rM7;b)A[CF wɲؤlò+,f_$ae d?8v.y1f6Ylo1kƸSI'U/\ h3&̎ȐA:XU7_lp*7cmP'fѧwquDD/X 5->ԅ|QL? E`v V|~Ha%?pIp]w0'::DrSe3y%D4x{=J*TL+X!<%gV_p4Ӆkx PQp>) bv,X`XUY٘hIK~y%a3 se<#ԨV5)U=BMբYhg,5^j<>3,rϘ,k`υJ,?hUD A>`h`Kd8sF5'R(dSr݀>CFZtAA-ca/1] fyUKdm S&3ULRec\a;BP~ϔV, Y0u^;'fX 8cXړi.( u8& ThG:S_תl7BV{x5bd= 6CToXR( Y%y,_[W2E),*Z"6|kkcRs}eWæxw"x)(#ut0ؙ{m6)X[StsaUNMG|t/h&聫^j8mj z:/3UؗsD \:\[,}Z1!8|Ut+|SaLJhT5->lϦ(0Q4sY%Kw೧Nx@ѯ"Q\~˩=E^+\db㞕zy Vуx Oc;< _y:TK[9%ԕnhK7ieF d5($)z(IOϿŬ~ j2XS;ޕR[#AY2ocCYRwQ|L }Au0c/0v̗ti}H&0œAU#wܥj^3=p NR5QMO7\lN3x\Bm7_aq]/SL|Jf DqBLj7V& ~DDWd_c,r_\Rk:EP7-ml"_Puʾrw T||hjI9j|DeKCa G{onqFYeurVEGc)BCCejc)R7i`ddHIHW?2 \}-b& Qc_1??~҅a}2;;?IF 0OXP@s-wW,NY T%`aVO$#`նYYOc2;x?ߨ&&Ǝ~{sGxs IJܮc9d?)s96*t` - \Fo`$.5UG"T&ZdbEYG)Ŗ#|=nnHH#x~G;ėB1˿UpОF$-{즣\ȰݹwCݛzk~4AE AMf AV&@LI)=s4`៞q,×j_M_wUf*5# Qe}=` A^AT(#!B˻HIuu.1?Sl) [=+v}?+_ӏt(8K5^'&BGk8x_ RXc h%#&!)I5 H3}mu)Mڥ_!=(N#)YrbО /O=j]#Trx2jl1`gOn0dlֻ5 wGUB0)3ҁ\RȲ <`$M]߷V=ZTS~Z[q˩FaںEcDghWT~j05௳\Ŷ+ŏsV[jo,YHCg>iWji.QN2r哱>!ؠޗam}t.v6}<)-}I7ׯP}~VC# K)&ر{0A>'a8Vɳۣkd|(KrwFWӒ &r裂@U,_!Ͱiy*0#(Zw=,ɼQʲ(ˡ,je N&FYE\( iDlu?rKfH D*vڽVO8jyEyKrt(YPޛՑC[ m\js^\Ə)|}>94CA=u\ziM(푹9\Z8ڳp$cs E9WS=M˃dO,nX OgS\Vs665"qٙëx@Vo-uhXH Z@tPĺ䨀Y8U/`9\s)5x538Onk=V21oy1V><{h# ߩK {Iw~7* xJ)mh)<1T0"SXZ[) @W O,̵8KIa@~{w9#2_Zn*\&Xs^"6Ba_a<F'3v-<s6w%Қ*~*LbF\J=ޅ4rzt@6պ nUcyI OY:ްJ˱G:8lVNOmRc6a& 5 kn K@Tx[}0=۪T$(g~sTTre(*F"5'0ԁP{B]]X1x=s֣oy,hY[;*Gֵ΍^/&zըJV>xP|qќ{~VW) M耝uF{^,M mY &wG`}YQ_xx ҕts%8=^"@(Q\l?^(C[hÖx4I&&yVc^s.S)I <*KlsMc<#[<;ȯM̺]㈬hb9T]O8hen6ѫ _\4!(E]_3I4E+-.R aQ__m */15HX}Iyf\k*;ɱ:QHl=q,}e +V2F+.1_ aq[SK|͹h2BdcnƔ%z ev X.xʣ磘oC2ꠣ)Jk ks٨RHq>qPG3`*ԟE%O8#|(B=_\GyN*"}}GZy8\Ahgw]A܈z N:U@Ro"au% =u&U>!pmz}orPEFI˃Y s %K(o2b~#|Mٓ$LacVb65o].03sEm-_jt%IK=0` fgj\yI:CdshL(xXw̳_+\5$~YPo>DByLuU#Ҵ,X𽷌`iawBĚۭ \n ::*|{6FӗQTԢ@$Fs5Vk&=V۱xhsOĔ#K7>:ŴxpvacoxɈ D=c2t+=O7a!6(WZ*ٺD^E)F*zļ3Q]$0K3`M^'k?<}7Ѱ؛rղ%6H;Ǥiy=G] фSOvRk:%l Dd"M:} 0AEk0+5 ջ u%Wq͚g͔ɴ؅ '>mm! t{YhfO7dE_!_!W$O'(Q`WːCZxﰍn DKVgNd%Q)#den ?_ BOvYUp[EejtcY `ۯܫ7ʿ11r*@*ok(+%ʻ)w_m:*Qưbׯp:{Z'GT׫Ȍ*+tiA A2`%lPTPGOw}ts_aeP Ip+}`gW" tS&W?Ι4} 4 Xt#CsBi 3O+| 4s:Bqs[\ sR+]W q:jVx@*N0`-sb "ġl vy9iX;q񡖀!YQ-3dfj=\4)Cd"Ѵ٩<&Yx-ugp(Yд\>.Ѽ4 S C#̐ WϜtNVQg 듈o9gܰbo9yCq0[UkY+oJI'[Co>GI`Lw~j__,-Y]]QYhEyӯp(Q.}.^', t袐¨4e32̻_YT;Jd%!Ta8]钦jVMQZ~LDL/.!:AB|X 0٘a*EL(*Z !7b}x]RuY6+HEɦ]KDS^" RJ4X²QVwʅBp)C)%"_/bW䜅h y{ r|)ZI3Gɂ` G6=?6R2'qT6pU\+^Si YÑB@'g!LvRXqM*T(20-vuKmXK( +9+b}АAe`Z!Ȓ|% =aYw֦WNj_.Bk qZ+MQM sR[aت TX6CIz;sׯ_X-ퟝQʴAZ?@y%fZ!űJ*IԱNbOiz0î |h Uz_#0M& ܭX;1bH} ҮaeN==6HeZnԸ(3ۆ/A5k!$y<nwhKYзx=J9 = bt r5u%i$O85]憖EI 8SJMG  ՘٫qlrqt_v!0OQ)H6 X+H ;6Gz tMtTT(=8V*6ds lQ0yEa0D ,<۴4re^9*kfQ-JEZ~x,#-`HI-;e`9/S7Q @ktz . =F?*Q F-@ fWH=tKo}C)I&^"Jy>WfT?_ybuq{`)N^Zx:`^cH.@صNaT~Z)Q9*"} 0]X,!~[]S˒< O^;o%U{*OpxmJAYoUcxjLΙ"9u~BToXu=WұXgW.)±U@SUϊr?fV}'''Nvø֣H:`QnMĘ->^}M+%5I_BB)GGdG=#ڸUS^~څ5IBZ>,a;7US>a6|'Zu_:EQA+:w/I4ˆL}>{2RX慨3,ԕb,#;abXkB9>1gsp0:,BukV+~Kۧ,\Up\{X@~&.wXH:+v"z Rb?I8 M)~wV!4DA?Jȹ72'Ԧ8',K`S;0 (9p&@VnIQ|qm&s;vѫ@(G=w4:Ia09l0ӓIE`z:)I:e%'@hW}jq! j7ZZ9B9 r#|B*V"/.ѓ2]vqv Y4kU_lw}ĵKnگ1">bbiW|ϋ߅ԧ٢ $1\=7Ztjny02m1E.Jo%rDo4~KTNv[.HMnvhz TbMѯ0H{.K0sڤBЗ#ї\w)g.#4dOg3IvVu=3fw-1JnaߍкSMK`yr c}NI|;@ RN>?VWB"owOI2OS5).1ccSaIfR[2j rtdhR9 CcV}+Ug*NhBb-U^9-}K-}`4: \}bΙ,lYeUdumQ$ #,N)#)tPJQM{ݫ6W0P-VCX -:4)ZCofǠ~ob،(`Vu+g37vVeļa ̲.E@nmnYȰjWIN5o"*ir2.<vJjRuAyZ`Mg{O-:rOKa~nN_Jr\Z`-/+4::EsCCS-s pQ\  u8q|rXǪcQ?)` :ݫV]4 MDQ9A#- JZ9_u dtg9`HxB;2>Ђ~x()3S:*S}*J.T0( iLO DIjaB~W.a,$|Όޗ;1%Ẓ1]lo^A[F:±,W^\5GLQ㿀ڗwt)o4ꣲ3WsajOON}>Ga3 (®4{>?2!깴' kNf"适o(ޘAY* 2*cm|Я{+s|}fKͷ!"^=z l꿣37Ps819˳8L,jQ׿kkF^]4Xs悾u֐kKS͹t?{Dء(&:_Nxu]H?Z?긘z'<jBz.HBDOtQ5?WdkxW]ƀWaD_/jSm $Pb/ԦÆt͋ϒ+pY.i Ξx_tD-6ߚoX]qkn&^77a}ɲԸb啿1cH v|ƾaz#rS^0`a/ Qʽ#UnDZ%?.fw%(T"_L$DW>EB`Y4QO DX%6 s:`Vy/=WU%jmUH۲aKH=veT߼.Ȓ+w{&4xR_0<~vo)8VtIY&8S2+a:`|6S kwoמKg`ml2y6xX9ۼ m޽ ^.˚bvZF5.E IKVVZnbm u\BL32Nbk:,`\ Լíqv7ޜ sϺwK rlNZ%a5z4s/:7Fͱrn]]BKKA' A;=`ql%ciEжoʣm s%[fU4ن!$#2kX6Xʒ]*s_n}NԾ=`9emTtQ2ØȲiB.ϒM(KZ~-@>'<n`֦i#NK{*915Q( iXs=iUݰ],OD^i';RJ"[#RI ֵR6>-YņefOyArm]~B5% XFg&XJ[%°dn h 7UT:67!M@$uNN{ˢp_ #(o=YeuvaQ{Sk6WYަ74PTf%z8Yc%5<2^sd5!y)<po#ryANʽOkr}§JV[W[u,B`g7V~֜ ۭRvdvT8?L'6gr*-vgEc0^$(΢$ H-u¡0$>Yw_ Y'Ue+CX{L۴mkg`hbdJg;qgH}x95w5n\׸ĒouϛZ}b~dohp+]M.b:woY`Yuehq., o6 Xt|ˬsԯvUvXL.vTE /iP~jhE;V s56 XuYL~eUw5Z;r)Zښa`Յ.pɢ"ê.joUgTij@;N`@p:ɟL XQ(y (BGQTEEE/vqq9rn;?7;;I࿁0<xCSrxse.c+uXˁ@`lx8u z]Ul;//d$ycbb\\\&O,IɓU*޽{%I:uꔳ$I322$IիWc4"Ꙫ7oƍG cǎeeeBBBz-jzРA VG@ \ @ Qi|Mt mF%=l`1  j`͓)8XJH7IO)/y4߹B2J I:;{Ĥ[XXjVVV ?mUJJJ 욘!QӦTWWWUU_rtĉ}qww TNNNQUUUeeeQQQVxXjIޚpJ3jKk"OW3.`  ak{*ӦTWUU07Ǖ+5u7h8uzBE߈TDt>>>/vss=ztaaaTT(J]>V=z-ϋSRn$&&*ugrLMM]\\̘1c׮]QQQgϞ#oL-pAy@^{7 nܻ\S٭>^݋qpTU@ǎקD{D%8qb=JKKyggg_!ƍ%IJKKsww!QTuu̞=;>>^w_VV 88X$'' Žwϟ,*I8~$H@H{qx$Ů{Y-\cSY6-Z>]ٳKJ=$@>],iX);y4߹?qF]-8qܼ\J=zٳgG٧O:uJHDZNKKsrruҥK 333׭[WPP0|~ ~ĉӦMF93tr  {F|\|~@``T؃kZHRL-INN?W9RQ)Kґ#RnRI5&;1BΥ&NA4/{R -Q hs`aH ڹf;sF;0NկɋJD$ +HV*0T""aXDD°Ra Z*֭[&L߿o޼)wf"z|g@aD^z z@y!dZ*uժU~~~O ;x_|񅳳ADfF]|` [o\rsΖ;ۥK$Ir力[~F<4Hk֙$ P7yR#=M7/qF60)4TZ36}~S?als͝;wZm]?zK/@1𡾾~4i9:"._= r# X(w z V=|VL|v]zU77PT.]4qD pR7L ̡D J .]B~uWB57Jj@kT??%KG /#}fݻ>P,#N`DyV>ᜀhs7nܘ>}zIIs|||۶mk5s[{6A@.ݛk5R^'U/ %n 3♚v`0*SDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°R1E1?aF;60Jq-;B=`Lr`;xȝY((w:<'"JD$ +HV*0T""aXDD°Ra J|{#~VV?$J%we6I͈JD$Tjp7&jch㩻o?fT[YuY>zr>Ǿ?3k>vϞ!8ya(xx`(?8wƌocZ^`)rM<|kNw7ɯ7*GFZ7Å >}/At4o`fFNfƂ#Gp._cUc>9saC1ade!=W=D7eK&&T ?de  \O?=㧟z^ W_/wp}0iS=~_!*iqT#6n?ԮS3;54fh?7ob.cU^۷agHH ,^ ~~+w0-={+@m}c<X{Rɓwo˔W85uЊV{#'_-YlJʠ+\2eJŋ:43suYP i@O?:;+]YA @w"<3%UG~V#aT*iݐ'1S#7V" ]~Z!{01iCZ"#ѺwΟOjT/FFa!0|?.FM ѵ}c TR >&A$h.R)iTV8jfK^`5ZmT(( @@q6V~ytLȿ$KZ=3M5QK]\eÍukJNhO70~P[caaDGC9~>9>>>`a77aHu O]Wكp1gd "S ##?as\'M7+eeu0@ T55.NXr̾aa|\.1> >. (1ϔ3K5Z !JZtcE5mk|MЦawb]ƙ8]^/kRG M M07Ǯ]ܸ!!x]8:"&nΞE۶=+V`8}f<pp=c7np:w7jkGt?ƍxر'""_+4֭oVЭW;t}jffK/=*_Dzѿ_Ⱦg,譮 wo cn>G}ݞhssx($8P(M:8~W=6n&NA}"q@4ԲSP4%HՁcuΡOqd<7umf̙rг8f2K%"JD$ +HV*0T""aXDD°Ra c<8 5@[+L#w"1*+1{6an8-w Q'",+Ci)nݒ5H Jo^3 䔔&y~ۤm,NoR09݂j~=wؿ˖a~QxY6ls*,l۫{sɝHU>ӽ3}r'ҷuD?fml6oXL1>};|/ wԗ/iƦu[R>3풿"wrGUW[h142}Q?%8{IImCr!9Y}f͸7oZ8:q׮M|ŗuڛw]Ƞu[YuX-FYj88 + uѫ3xo#"}u+(YϭTTzi{mKW\S5B捳3~AA %BRRT76w/ʒ=~ڿ@Qb]wzeGZ3fJQsrA&VnLN_{G3G?տyD"#" cXL(N1uWBmsPTM6FwO2uҳot'U[qyZi7,QY͛ ٳDlqVڴAi/w:4"ںΝo/}N;tzҊ|j;licÙտUֻc5&mLwQ*ǃ8vwG=֩5?&"j&T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""a SrG @̀=Uy1r/4!';S4~_`ߟb):iW}@HV*0T""aXDD°Ra J%"JD$W]{rGGrGhva&wofFӣ7գ7!B5aY B b@ 诧WX6Kdn~$T&MFm>J\: Ϣ֎OiVQZ[}aY_p͙|.ﳝѯzq5ڥ1B"O]QrYG 們d}_V~~;lcF4LKEj%*u+`UqN T5ԑ@{T%*w e([KDaYxf rx;ǻɹĔ'O5gzZRźyWˮ?ǥso_P\7-ߞgFvpvM6TV;#rtnC^>r”C/w S%hG(Vln+up od{!cu `ܕlvtncx7qIɵrUmE Lz{wZīWNZ?nJ>CO66hUk7'ܻ^^6շgMQ[ui+E^+5 YVڇ}cy/7`x[8ۊqjl1TMشkFaywVT+=Brzi⻀O8~^{EEoIWˮg\dwƤ|_fJWi4 T*C;903Q4__d3=z/nI=cjgNKY]fֶVJI+0?[hFP۶xaN[&fr 7)_f};sWh(1CpԮB]%w {+xEF eGRN=biF"2k6U0!+ ~ >6Z3o߽pWB[5nCֲ+5~U9q_ n|7יpK0Vtw) f򟯷3oۨ?EU(SkkX?NSU f6kFijaYE\qߒx>{J;祅ZZ-Zhu5)FqWtUB|'K|],j\ % A+7$驴PZm}U{dԀzot2__\3I}]|Q>'ywnݹϸthĿ͟TR%N𴻷MJU܆iKi2^Ъ~Z2aо~}p ؋Zh}+=FK Dd{k.)@v7μ]P8ͮZ.98o`a>s|ͥcrG c/5m,hkR>z՞iImY ډnEoʯsvnq_zՐ\FlMd7k[;>Ŗ+L,rFnF&n~%rٚ8K[܅]{gcњNPsʋ{i-)?{n~O/ `G[ŎRmC[3־6Ĥ){Χ߈A2Y5FlAI^+шP>Mwmk:+L~kF !vc~ Ty;2#cG,\/f{x0w9;1,̊G|:e$].jniJS.wQDhe?Apߗ__>A%!i!D]t0.OƼ:xNlf5t-P;ZT#]LzguiɡuMpr?|΃33緿ޣ5'<89):p芮0n:ˑ˟)n5ruT#qo+/]㻹-X4kwn]J^oa{ 8 y|?/1̬hKw#]N<0HEy݉aYOaܕGIr*mܴCn4kKD\i`Az#c+wj*^(B)-/B)DDFJD$ +HV*0T""aXDD°Ra J%"X$IDATJD$ +HV*0T""aXDD°Ra J%"JD$](EDԂHL?p#4p9rD=F J%"JD$ +HV*0T""aXDD°Ra!ZR1g1y2|ƍ;HzfMb8XdТA-[A;>+Ꜹ.c9v:4+: 1M,-EF߰Aeajꓽ{߹v4!8…6..Scc6>k䓇W޵KZ22򘯯ۓOZor߿ed '$mBRQXo/&..@A÷V=keX++҄ w\.,L=yr[aaB\pqkj)) ._VɘݻvѢE0nܸXjդI jo^UUo޸q^ѣn{oo/n۶L<*,$ᥗ8٩kjTi42ر Ǐ˝TZ^T5t舕+EFF :/Xpx^^;FfM_̊ܯ_Vt6x~Ӧkt_#q#gj̼Gի{ym9rǚ5cLȑU۷g͘`Nyy O<͛eeE?F3 @#/_V57ۿv`A{͛7n.__/ӧwncccǎe˖EDD69s; OxmZ][{F5_~o \0xÇncǚ1c䎩o-~/Uj/;K'N0L]ĉ#Vprw7bf@9qq6lg\/(cdJIIg\W(V+Vpww4;35UN7..'-h˖vʖ; ''n„ qQ*M7yrT۶n,,m+ 8pɒ%ӦMktװa6mڤh>sʺ|;wjkkkBѻwo}]vֶCtbw''K0U6`FbԜށ4FT6\lBں͕uMM- J~nܸnKj޽yAAEY?.B)I5sһv曚TPn>\`oӧO'''c332EP*V}tԴyˉ{Z11V? GgpwQ\ ''n؈VgxzХY;c{3uhѢφ|}}uR?;ne0Kf⋤3g|\\L[OZ^C YYZZVZXVq Nk]"h33疖V).V;uٲ46yyʪbcOW8pa^,ML }pScҖHIY0uj jkx^ S* 8pݺuaaa^{mڵfffVo&9vB;ukkv9wnieeZQQaiK6ŷnɝT hVp34zlww8u cSPHc WW8$wV8 @||n||)Z J%"JD$ +HV*0T""aXDD°RiEo4733/٣mZ|-s&pr̜ 4:zJ~k>-(.w&q;732@XXTӖVV;șin޼g*jƍ$.Z_~rll2u`nbwڼ>+{WtzZ*h;ggݢA_YqۻCtgg;e>%%w7Msz߀xy5ESD=e[zn9xur5U~~oܸ[\vo?\R׳-wS8սLy={]"o}llJe/9Xdd7??cnnRVV5&TlTֵ _/;H׿,Y',^xÆiBxyž520 K&޷_P*ӟ2֯-֟ h)T0.ݞ81]WT.q Fۗ+ڳ䜜Cn̙'?q&Lyf5*, ۷'5~^4ZolFsH'cԭDJZGP8o^In k/uR==qhFz(**ҥˉ'٥K}j:R\쳻ΜY0xj+a̕BBDG?[wJJϗ;0˖N]zTUiV#ж[ySlٲo޼frfšC{^|1bX厣?PJ `lxJуVQs` J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra c@J;`ReHV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0T""aXDD°Ra J%"JD$ +HV*0„s$>IENDB`;2Dd  T  C 0Aplotsymbolsb13Sv`?o1ng13Sv`?PNG  IHDRn!wPLTEB1)B11J))J)1J19J91J99R11R19R91R99R9BRBBZ11Z19Z99Z9BZB9ZBBZJBZJJc)1c)9c11c19c99c9BcB9cBBcBJcJBcJJcJRk))k11k19k1Bk99k9BkB9kBBkBJkJJkRJkRRs)1s)9s11s19s1Bs99s9Bs9JsBBsBJsJBsJJsJR{)1{)9{11{19{1B{99{9B{9J{BB{BJ{BR{JJ{JR{RR191B1J9BBJJJ9BJJBbKGDH cmPPJCmp0712Hs-IDATx^}q&r]*-S|1I\nԝ-Zk%Gw)'Wbtg?h3ZR`P}xK]2fz{ݯ_o̖b6+܎^IizyK4+39butHgf ja=/gF邂]* y~b-fK wy掓zjH5T V %Xȫw 5GHʆ4wXVsP3^^2tI@g7D_>,ټ] ma$ZkƖruV8<ꬤcm( P,+3Un0 U{lǺ(ˍ,l*Uw³{n/M7\sxQ Ki'02ϊqk+Pbbw"+d894\ ^^ PW0Ӄ\݃gyzm=ώ4ywO6YMr=0]f8r.,IwCVq׽2NCV y$ۣOtl}ԥgQ:Q]rДߥϨ7Z%גmcz G9a$[a 4O7GY߾e~9ĨIT:,i^ɫ\f,rUgE1N%yqf¥TN^uX1P" nϒ?1_qfk\+PRdqFX^@_8;-4&+;,}֫sRƫTX$^1 NG|%o|fwI\)n} 3܇rՄ/-t}4{c0f`%SVID?M=(8v:!]6׃ioz`4pxx9,ǤBKo|˽bJ3|vHţ8v\%[S\lDÎ3 n"ֱ Og|lA, M@]oJ0Y!;2-k DJ3^(+,rl\Vpw֑In tEHe5fSdb |XdYΓG`(2 KQ&[zIK}y2||k0J1Bʩkcn0xE>FvC2tʃyνRIlaK9G&Bbm诃1H%7j0G42SѴ ȵboZD`3/):l}զ;O䮓d zZ%Ӱ;=5]8{4TxO~ǰSe5җ(#yۡ1-VB NOvkU~hACO7nOЍ-k$8A)#)Q+!|*txbQùVXDtrF=" d&XaӠ>"֭e8Α]b\4$%4UT4Q_Un>y l8$1IO㣌+Զ ن[x{ i'g\%H eV5xgh+ S$sλz\[ȗv٩aUC@Ő͇Ry}"1) T6`&] 64?9`^Och.eJOݮMPg{\뚧k /28 oF񠟪VsBX$=,5sl[ctOUR2 ,D\Bp*I v :Ws6qT2x1YQ}s @= }u-K(>͸eyZ'Y}xhRTDr=1aIy_$l$b=9aUֱ|^28eGM8ʰ()pw +@Y*T&˃aĭ/,5Ejf~uuV}j,oSbߜ`,-+r)D. ү)K^[;F ][Rrh1b[Az& FJ<ʼn  ^"J)Pb})tdD'2B< [., q#-jre7*iO-N?+(Uc3VA-f#3J; .:,B.;eYs2d9iEFjyHsɵ+z E,JӫX{°n*&QQVr(Ɣd\cIyTJ{(f$ɏM,J Rj$VImBj!a\!/#[wQ\>\sh<ƣLaDq4dOo7Ҵs:o$:RLbGvr>r$PQ1lS)׎ q:NL1Pf,%uy[\xzd䕣]J^\Fó\M  V\2 j9`Пec$rion72Dpt#~8Kri;Ai,}j]+ VAk&ʗЎgԪ؝C~vqUmrד||sDF^OT660!h&WL\ڼ)|ʦ~ePtv0P. Y15٩l}&S18p[8ɧpta~F$9iM(0~1B'{s/X jYGm5IWr%'m[[1WZkEv(ݦAWZkhkԼ;rbiW{ͧo`s{ɕ8i>w,Rs-eɯ%xůqa1rj f9Ȇ}+Bm[J&5ä9I"zfÔ`InGq\xʁK+r*wUjګ]3Kr]$Hu^UT22Rjdf4N2a` 4Walor6sB <,70ƾɊ&kd3ДՏ7(8r65vqbI7aλ]0*(pDRvLem5慣j];aFo5Y%.5"Rr@;a+cmfc*w &hds)Mb" h|b_qhhЮl=sVz̊IѐPaŠRP67w-'սb5N4M)R6}O^C1(l?Ŝ7ʕM%*k;Z0e>/Q*>r)/K,Vk9Z:+#?|D1D~|]GD|D"EtdjWOmjewG?I%&!wabG\'N~4:>';奨iq\nJ=iUoh9H2p(9MQ5%S7_(4}qNKe۟ $:'{t`6 {؅!4IJ@ocU7 .䍭-[$E~U밨9%7|g: RML_Ðh` ˰e7w>ۃ\}#UlZ+c(L8acH ;!'n^:SbNWO 'cE3;7he6|H,&# 'pŲ? >'h Oˇ^J:k)W.Xw} 5τ1u*x{/@Q328dwhlP.pU @=&O2ӌ%7K7Wpmx%ү88}q\ :0r5:VSj.  VKo"XfLxr+MXEcdd/Rnֶ u0DD\xYFex[6 sf^ar\iznejiUQm(&E,cLZfoFԨd5LPT$"V\&KO̻@LEa Y:Par*MPDE27 aNzlsoB8w{xb+ܕ#;'x 9>[tjEoAD(^ym1i deYaLl(Z]TIuG@Z7aȿVaZ>"ùÍe^㠛`n<\̄ 4PmSԓRE=f!lN;H >t #|w44V*K]DPa͐~hpÈsKR1v=nWY=< BpQbeO;غ}bR"vT[2l_1C(ɝߦ O3>1K~6Iwq}rv &rr/XvNgOocotI$QWPqk`"֗7w #Qo82Spk-xآv3-8Y3>dս([17,(%ˈi?c|͓r2k5V)riGܰPtɌF_@XFоWmD\P[Jd69ɖ/26IОBLeg̈l*9iU;yve(E,י lı}^)`+PhgDJN 1,C4 #H r?y؀lc.$pѿh ' ҹ\G:?t3[e/X;g‘! :Z,J %ӓaƏ ٢N@#Sgb 0RMT]@UĄ*|36ne520EI"Wy.,W j6W] 6HeLXvPI kafvNĻ$R_W"ΈɚTߛBIuF3[Vo䟇F*XCw X|ֱr;j$T+{؊Ao~NpFށ%`@0 lҶHe h(nV^%`WwEXz:qGҥNE\6ba.+F6B'ͧ+eXag'3NBlKxY:[e+d[EǵmK|M ?Z/Z 5uQhemnbKZM}^zep'\Z>?GQ9ň)r(c0E Sm秲M05HQjn"\+G~OY2pgւ9&x؜vL8 KGi͝ 0U4G]U%Y{?GpY#I\`'ƈ&\ݤ[zasa%E X5 " +ty`"E1Nĥ6iB#i;V6}_Ku#(?چ5'[9 4lWO) k O5aH>^~H ^؁8j`VzX-vltAh0WJ[^7W_SLPǠiLbmQN@gg_*E(a{8bJ, `NzcWo4˲ahHYNRzNWv9D OTactkV5xDzmo]:=AkzQ4+:tmC ÷S *7gbm FŇf m ۄ:[-7o ;|s;kݢoqIL \Y= Ђ ׼N)uG K[]‡C2WAߕNxF$buj-5=< $ |?(I3~8$L5gNrG&X l]H7wؚ\?ƲڰiZ7V:OhQ*5S$ӯv0*3:{DbQܛ=@*wn>s 䝛.>jbj:!TegmGMk~m"35@)"@9I|vs\܆5&m>aNJci- qS{5Dag`5oKr4:!O NƏ`W(ufԷI1 X峩㾼w" n>M>ل\+N$[o8ȴMo`Iw\ p fwFaDYu;MO2XS&JT&>o_w1Z ~eԙYd[^p4`Mn켾3c=|v?$Vx/%/~ޝoI+ `O%opkI>kEGV.g*LsroxKRS:9 PuKl#x#?mMC rhIM)g[e`͓6*Or:/ֶ^Ua+}!ϸ0 ەWw#A:55ȣ,+0 [Jkb1'?.iioXŁ5X?t1JH)2V:}1r^麶R v98>ș¢KRkEjK^!Zֳ`LMְ!nȇ;IENDB`c DdEV  C 2Avectorfield1b U%Y\s\?Zxuk5 n U%Y\s\?Zxuk5PNG  IHDR| 8_,tEXtCreation TimeThu 24 Oct 2002 11:51:03 -080037tIME 3, pHYsodgAMA a IDATxPϩ+IE)#jۂf֯$F\>ҟ@.:@(:@(:@(:@(:@(:@(:@(:@(:@(:@u{&G-CĹÏ7+ X15ӹm<ϫF#Ot ,Jl$JZn$8 k|J碗W1apx[m|hH _}7m_y wZdQ6jτTcQ@~g: E,tH⤺oRZ)JCN$/IX$'tjTيzNol2JI[sy {9&?yvs<5`d;`sh$M}#.-ZbyUzdA*z,jyN'g{, |,jWu\6-],p*5]|:5;mn*=,5_-qnV[|K6j|o t CfK;'tiZJs~|Tj?7PFÁ%˔8O9D3B<\t&qQ*]^A)8}~G't22l(;.Jdd1uQ!ZG[dTiאVt 3jz*oZj(2=ScaBUths9|:te7 BNӇNndӛMb)Ð`ѡ0Lǣ-Xde`y;tb&M>+1η_5󒽧Xs/f,H S}Ngj&BY^0&}~Ơ ΨRJƜٍ|ջgB  B  Tˍà $kj|(y{Zd#y0j b$>$t^r'* :/{:6Dips0tXiNsqcydӇNٲY[o7CW#jjB'$NBZ+s1)@ *9kzݫtɎ{]@5nq>"t)&l$gMvl pL:^Xf&t2$+J&N:yd* ΪәJ{ę܏7*4U)viW^ל}87zsi: =r畒Rrn۸ c}F=ߘR^,qnC^esg{r7+ z#0H-Cъt4͕b2_d PU+9Cafw)tN'++8S]UJpћB ٱt{aƓYJW{$'%#U+٭pl$4Wm18:\{L־< ۠Cf> LvࢵB&w$,:ȝ09&a"yr'#ȼjFKiE1͹ Lv,T#q6Bg+TէQA^uvKaLBgzN6RMsnVI-qxEeIJN?B]_0͙s:0Ӓ8qN̝;g ˫%\!tײN"S~^h̶Ԛ+m謩KL+CgɶT3ap!e.{}h:6&6ԛŻ} !nz:k'1DMKshÏ&z#1 &tX e%2ѪՄcf.ىwD/ͯ͞N:D瞤e>ɁsxLLLs(-s [$ubj"A$od䜙O qOcy:@I>L s:@(+ B  B  B9rNey:JS0+V+N4>h?Z^ہXz]iY]1/ԫ[[^}\^啔N\{8K#hOe~ך 8 5]_َel噥l{ S,ƢC'7BVc3K".±<5fy )e] rEJ+s]]5WW1 $2Tu0'e+3 fwŗL'ǂn+('5漣$Nښ=,~{VWyzWnO@7}o@ ]sݗ0O /[LXWO T,PB%tPB%tPB%tPCV(MIENDB`Dd=> P  C ,Alinetypesby2Y-,\UnM2Y-,\PNG  IHDR'.v,tEXtCreation TimeThu 24 Oct 2002 11:59:02 -0800VwtIME ;t pHYsodgAMA aIDATxao0Q:R ZicƋ%y{?ßG< aD 0@" #gǰY0|}o+R&y{\ ${ 8VYWs5Շlw^[>MR5j" ad˷I#ЬAeD 0@" adt `0) ȖΗǸ^w۹9tWM_@z&f~63LF4А-=AĊeD 0@" aD VǀXLd˂S?x˽}vj{u^3/@4=D @CeD 0@" ad[f1aR&XƖ2ɕ=,IpRP-lyA4Q}h!a*33@&JGY>LD 0@" aXbA2 bAS,(R&iX3*g $0Hk})$,Ƈ=h0@" aD ȖVϰVðgB& M :,j,Q&A" a813@" aD 0@" a>wIENDB`Dd6R  C .Alinewidth1b_L DS E5:n_L DS E5PNG  IHDR{,tEXtCreation TimeThu 24 Oct 2002 12:05:13 -0800}_tIME ;)v pHYsodgAMA a IDATxn6@qh C%S8k=QF?>Q8@Gq:t(Q8@Gq:t(y;:NGFS/i:5pIeXJn`VZőXnj8tU=q}x}/9>2}Uִ|8&Vq` e4ZKh_ZJ`MS89WBf +nnRV,g;p_qW1(Q8@Gq:t(Q8@Gq:t(Q8@Gq'oF"EW%4pyYXJnXЌ=qNG"fL:pUUn`Wz+^U<ߌ.aG;/Oq>1 14Z܌V.Xnj8T/'сLZ_2C߫( hm:t(Q8@Gq:t(Q8@Gq:t(Q8@GqO ^ XkS0Tmy1;_UpUXn؀+/fS5wqw1+ &⸞ors=Go3ǷEjcU&:U:t(Q8@Gq:t(Q8@Gq:t(Q8@Gq:tq:]ӯ6:0ӫF( 5p7;CWU 's772q>?]Cp18ʸ.;>c-s #g=7ebpGt_s&r# 9:t(Q8@Gq:t(Q8@Gq:t(Q8@Gq:t輍t~y?{9p1Zm\.l+sۣSFjOɁ[Pq^g(Y8pQE3vxغ3zq΃g&>pUQ8@Gq:t(Q8@Gq:t(Q8@Gq:t(Q8@mAOW*Ύ&&``P8g1b3}p188c_ ^qű <2wƱlM1wAc8@Gq:t(Q8@Gq:t(Q8@GqYő֔xMpה poۗ3h41.+qw(Q8@GqG(Q8@Gq:t(Q8@Gq:t(Q8@Gq:,vIENDB`UDd(#^  C :A"axislabelexampleRT F&= JX`a<TFT F&= JX`a<JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?>3:/, CiVןm֥$%G?{iݿO}+E|?>3>;K񎡢j~Fimo"hvc|5UtdZ76z&L@ЬRq vWோYt2Bn T%C*% X0ր ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *%ZmAu,.]NE$NyX# ![?4|YW ,K-$ oyw|`O+.-Fڲ 31VCX#Xy['y.vNײrbh­hѷ7S>k>Ov%֑o~/щ$Fg nڻCd+0|JnNVvѦ^i'up+1Q@Q@Q@Q@x>)xO!w$vWz+_>o-qkxMMw@)πze,|A ފWOwKupf-dm{Dk?:&xK*Z7* G5#/,ޯ. .$mui2_MYIO 5սO R$dB 1D$Jp-EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^/q"|7þ-ӆ<u|KsyRRi{3 [D`+ `ji;__L|H((((((((+ʼG'Ov^^fWx!<%F[%ԡh١qېۊUM&;t(;{I!Eh!P{lQKd.fM((((((((((((((((((((((((((((((((((((+ʼG'Ov^^g:i/g5\'I+_hYI4/40c"tK AZ*e6YZ\_jBI}v,h' @Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWؙ_.Ыk¾,=įKᾙ *b.c"%Hw1{SIlt *L,6bBhUUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEqM:Ķn}iq}oo xgݍk\0H'qw%w-_liEQEQEQEQEQEQEQEQE7x\Ҵ/5=u]O-Z;YolQA# E_:BjRO|TFuOx-)VRrC , m _1xE߉tI?oῆ>g۴}CLXtmNO*.cK]t!]O2ἵg~_ ?G/Im/)FFPX9ۜIjo8֠xowcP緼.LʴKibZtoi g`_1<3Ŀ]PA்%jUE Dm&H* FBtvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uKIoۻX/gg;Ub Hː2dWϏOB6x^d?m`W3XTuZ*p׆]fG('K_--Z}W;^,֠-޳qk ]JI,(UR5¨v(Q՜Jn$K$C++QY((((((c?ѡ |7\-ڼ?{Y ˱i#UOj|4-5oO Y|HZYT.5h8'Vttt!Z˛}o>k>O\t jwă׆M^x$  P~4]O]-UdmP| qq$ӥVU5kOT^hw]+ >&|+I|7<'x%HD9Sy!7w&T -R2GוxN% =+IQҬ,.4Idhkfe7t,v\#ۢ(((((((((((((((((((((((((((((((((+ļ'eo^=-Tt:?5,9 8~/پ?o|~h´ڿ->䧙nss3:'@kaLk'LIL3id_xI~r`S7ӿwmF'JRVZ]AEWx!^fVy é*v`y6 e_!bԢnLY('3v% *yp,{3|TGoeKXS(gZA&݇.9Pl^G:BKŠʶpҠtxU!>**pe7$[_/MQj-j޶Z[5(+¾,xo5CԇH\kzD-4<;rqCy6=ּt?L/hTZLwVQwBuqinC,FHܢ ]͌tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W/㶇[];mDlrQƥq+H>V܋jĮC [1rNN#vߒ_.J;EW1AEPEPEPEPEPEPEPEPEP^7keWesXmu-ӐpCPA5uxwFP{cV&MQ͞7>+]m,"[i <*cd,vGfaК8Fw[[5vg&խ%o)KyZG쉯7xH4y{kId[dD9.ve` o ZxK__ln?S7|g99y.xZm5}Cq/kMg$bɲFa$׺hW5ΡcMo>p޼>H88e$ִ]$(WY|Q^?'7 ux'нαj:wEjsɧۋY#UMӼI|7;b/ x_Dt @2KX8$eAy\5M3z~ۿ#֞v0}md|[\E̞oC@G'Ov@Un[B̗32呙l]سI$պ((((((((((((((((((((((( gzviy ]FEZ_<1hZd" [+pvI9,Iff%I'v+jTiʥI7&նml$QEŠ((((((((+_|-3QNDŽ:j77QĪ䝱lpe!΢|6IiE]^mz|K cO7ˡ+"- 9B9(T6?G t{dհ>Wg8+ [GN' ,6=lU_oxRxj('È!Kѯt]~V6-.1FW7 J6 GKu毉ƙ_ j?w-.L[M30Kpd+yMtk|Y{__}3U/\gEy J/45X 7c8b;Z?+o?t|%Kh5yM02Q Oc@ூ~+K Dѭx+ƊJD;s=vSIլu*S/m6exC$Hee "EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^%'OnjøB'I iW6iծ8FYI'+n>o_+soך9>hz.dV&&m)jQ]ǚ^#ybgBU mG¿{3znjn^$tIl572wqm@ra#${SIQҬ,.4Idhkfe7t,v\#۠(((((((((((((((((((((((((((((((((x.jv믋Z#x^lݣHoz_|`uEb5oBYlTȅKT36b}.KiwIvվO8jEG>ϳ>mwyDư/OضN{~]qqbx׿h{=kW3WZ׈P DGTn+޼K:Laaoj42FV3!.PX3aRoijҺtc"EGӎ&6+ʼG'Ov^^fVy߉ohLJksH_)qXm V+);VU=MӴH,48R5("E UVrsߖ_{tЯmB(QEQEQEQEQEQEQEQEQEQEQEY|Kxu+kmK}>]*+ymo*o$ڳ ($VU)53zU}mu%o?#3{վx[:E;i5$S1P2pNl);C}5FO i:?g,4K[w"B$FA"1V?& ˰Weoygqեk,3eYXpAG\O7~7Ӽ;m-\3_2e] T24`1I <)/>omh{1$Q;ʬ6nebpTqUBnۗ+08jRRI+-/S(*1?{Yg}`|}?ѷ}n>Wh?[:Ffi{ NRD$?SSJjR&i[ :泳qӺ5(9t?L/hU_~WW%LtixKė1v^B D$V=֊6:eiVve [ZDCHR4E*V((((((((((((((((ŤiwӤAk "Zq+*b(՞FQK$ S^Ӯd5.B]`%*Qn텾i `Ij?]|o⏊מ&x=ÓFK8´G *ԢݵsηV9eozZj%~.k6^c>?tM=΋.-'եs"8V*JC E|UG9:iD]. (aEPEPEPEPEPEPEPEPEPEPEPEPEPEP^%[o|"L<1[;aEP( _26WP@,AĪVw]')OI𭽯n㿞kĉH*dqZJ;_KZ׹߃M{r޽kk[K]k{}C\-gmD1ItR:P68tL#$hK' 3>o.iYUZ%厍am_i!D@y6/ vqX)JĞ%~]k7юnmW̗(# >8ӼI|75;mb_ xSD/uY 1ZE+OT(8>^U?:&xK*'SZҬ t.U0`򎡔"EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs2Ƈ/o/ y;[;|~^$ Ż3lݜgc5^(gWvS<P*H pk<C?h_U6l|7mv8S[P3V9*<7YEWqxWşj>xW>iU& ]gT;KX4IqR8#y(>4E|/:|}GL|+xk^kh!ⳗU JG;,Sڻ3s=w A֟;mo#{m2 p?`WxN% :x]-ާ+1xLKciQR$p*Nh ( ( ( ( ( ( ( ( ( ( *Ymޣa7wR,qA)gwv *NO?|Q,ӼI|7;b/ x_Dt @2KX8$eA^g~_ ?G/Im/)FFPX9ۜIhڴ2JK{HR7fUP3<˻cI$U4Z_Ҭ=2QoaK[IVXg2HVR`H *QEQEQEQEQEQEQEQEQEQE'V"м9mXx; ᶟo irLh8fXA#E}6GXI$;}ZWf5h­t.Dm4: >cB"(U@0U(mɶ6 (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWؙ_.Ыk¾,N%Py|%KuMDf o46i?9P{SIִ-B.#.#Ki-Ue "ŏ/&^2ݿۺ_hٷ۽3r種Wt?L/hUSڜ:%mB.#7#Ki-UkuxUxu A~x_/:x>'?hm"9u8gLek0 }AEyW#?5BMW#xKK64:.kV"N̈X *) 2^㏄|iďojV2yLc%KA#?5U馣}witdt+Sh*s?A& L$xky=GUf-0kT$p NIg׈>4$n<+>%נ73]_%&&F#Ew~7/GƥiT/o<[Idf, g9tRVûћjWGӠOt{_|o;\? 7^/5?M˝*[O,4N[X`+ gsZ+ʿEwύP}˚Z+¼3ujv<%lju4ooU !|H 's9s?A=V|&L>$xx5=;UV-ⱖȔd@*X?EwUύP}˚4[3OyU[ٯ%PWXhŒd(PI9$kռk}a¾+sYeo9ebTRJs?A߄oxO_iPDZ+m%ldk(@ W9 s\/~%xľ$x 7_.tm< x$S;!ma`H$dW9 sG#?4Wxg7 ^,>$xKi,+emf05BvNsA(z^8M-|H<6jzvm[c-7)-n2T9 s@EyW#?57h:f#[ϩ:5ρo^J%ÅPrHxG|!VM|?rks݀oe,$L?(s 0F|<5-+LҠ| yWRK#0`Q >A h*s?A_ 0J|!H<n\WRxfHvB\H#8=(h*s?AG>7C.hh o>ּY|H<%UY xV9V,`k#8$8 ύP}˚Z+¼q[m3PxmUZ[;o"R[X#i d`8#s?A=VG>7C.k?o>nt?G淟SuVk3 o/fA]` K 1A$u+VƏ B8ΛWgM5SJXI*#ύP}˚~|a>$xjZV}AhFa A|@^U(s|aCSx4LҮ-̑OD셵 FqzP^U(|o;\^ោ|+xSy.>f^y*Dc!BI \V[q[7U++y-Λjv U0F<#?4x_᧎?i~2?eEWGv߰ ~NU((((((cWfeo鷰՝K,3Ut`C+) H5n |?߰'wlLڹ+7Kb4n-Wq"8߲Ϙ#?A4#U飈[$KaXL-־u9o%ix^w97<7Ҧs(Ub-v;v~i'ˍ$TQEQEQEQEWKQg%1wKRSp7wiБoryDDWi%VC~L:;6ʹtlCyۗ PUռ}¾/[q^fo9emPR$ & 7v[ixjnGEⷶr#䕰 _|e+k־#⧊5~ WbҋJe{EO4_Y :q&;c((((47Kb4n-Wq"8߲Ϙ#?A43?K"ӟGC_gټ}?(((((f֫>?_n p4lR_>uYPlF-x6~0Ю {K+>m`dG*r;XddA]{n?_6 tSF:wG|Xn,s$ws;FJ7R àQ:~5O5i[%e"Xb D1Ɨ$vk= iڜjWz%3;*61 p&EPEPEPEP^U++E\ +R_/N.hL5HXw.Lk|3g HP۾M/R 6Oo$r*3FA$*_}CBWƺK۞5 bAl+w.GjtGP;D7LW0$6n&IB+jrɩ]zt _^dX$*(/k@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@đ^ůbFо`@w$'0:%?i?͛q?pW wojҚ΂lyJqc9 ޭxKu6~Z<@L>sT$I\7g9+$[vtm}X+qJ{rmG+έm/O[մb9XI|牢Mᑸr1Ckou̲#9ْy%jrFS3ir;wk\Yc ׳6{e{Ey|B4pK.e4%dVNW(A'vXc db>X;ՌeIu5]Ӟ>uw]ͩ=u+}++Z\ C⏈gioK;G,U& `|1=o% H"Y6 941*#*J &nUJ?ӨڌRO⊖[E__k>7nu^8ڭz=R=f[y5RKj'dHx9s??G%z.xN4%tں]=֨ЅLu*擶^=oEr2.⌛'X(Eˈ?-n; <]_{.kR''0/%pB qrq #*Աj?jW5c,: gc|P=9 xŽs^:ۧCkou̲#9ْy6z>$OiWmI-A)X9<8F<ȥsrvܭ蝯vKUʪF K=}k[o: Oo}Pf3f>~N~\Ga+W'U`i֬'{]h<}2=Ehk{nkee=}.MYߣ[:<(kɥmMZּ6LçZa+e3U?i>2|k$> I* S$x+|'Uܔ^dwt䞗٥|x{>UpV{٭<ľρ|CI#Vv4Nxx֣O_ {mNPXpsu'^EvVT+ƮP{5.[IJnNMf\1*Sm~ftrJڦSɼ!DivSx%Ӧ}n 6COY$쎣{#Xڗח7%K>1`ϩQXꔡBi]*JNJ:V8U?wG'-uwYNWu_iyv^O/wcg8ZX&gŢG[cTɺ/IwgA:8Ԍ5I8Ԧ7?-J7jVz;YṢe%v%n . oLV( A჎>43JFYD%vN{_E}9V5yceT<͆"֞HH<أfoQr@xG?tx~][+p:`fQgWVT^1Is?ݧ;iN[E%G3(Rۊhז07m崸meĖ\3X~PTgɨLm!-Ƒax/l|@ܓ@e# +yd*I[ʥͳvnœT%_yS5{[u}5t=*Z,WZfxn5yt2)34L1+g1]5/kZ;]]`ZV*0 6vzg!u#ԜiV/;oOӚdAEokӡ|/z(/}G ?77-m3(2/=!lA`szC69=!lA`szC69=!lA`szC69=!lA`szC69=E> ;wnAg̘ὰ,Џ߼yŋL4iժU=XMM 70{W^y%,Е ;w.%%%&&ox"/ڼyKΟ?#F۶m4755r¬rҏ>6iKdm/1k#HT 2b"*..޾}{iiimm1cg͚%=KaJM`xӧO/Zhqqq?pY+?4ҏ6iKdm/1d j Δ\iKdo u6A`szY:OzX-I!3 Au5_rrU/>U}+_^!#VY9{J,-38VXY9WD>^J 3B myР4)6zCg/ny99 t6F+<}|y}\!C^?,i+WX Ypȷ&g]n'p忋fĈW?8u^Q{׮z}R ,['~n_קKK󊊮ܾ[o}c˖#w߽l}ll'C_m۾T!W[K2e;/lh 'O_W=HĉW} Ksϝ[^>ꪞO>yٳ7ܰoUo7rO~P)OD$Ķ`*_HT9}&yʒ%*gpٲDSM^?d!WkU>Zywri}6j×^AT_+/p]+_BA{bvޫ-Wx6PKn1O=u\bQѕDTWp⏓)/пg΁M55_x+|.0{-=7*5Q׮|6J/_%xW}@Ŷ[ pիuKcb.G/$Μ9/=]}vS]ÆB𣏎훜 'w$&"_gΞm}o=yW\WE9*h! A. sϜ?}e 3W\qϬK/*}8EUiii޽|&7Gbbljj¿]f ⚛Lli? BIkY+o)=^7fCijTӬxzk.˖'.^stDw苔oXoj:U4K7}O>ArD#3#Wx}Y/zl<_C8e _zc"sھ/9x {]oS/mΜ{V]#F3+.y㍢+ޫ,˞d~~/jkHJVg-[/s7Çqlǎc Z ] /.~;3W`WzӼNK/X?KKyU Oim=}& ׮TYe{kkկVT%gcɒ]/-;׆ *~zW_}~Cүїʖ=vϛ{&u|jj§¬R BS<Ⱥ?SxcɓO7PXcza{`+O<))nīVܟc?oz?%Z,_|uԹ^oe/O L'bC8:Ozpl=ܸq|J6m$L*dzzݹsĉ?s"+y睐CҳݻZ$l(XZ]9|811QZСCںvVsnݺk{N] m*Ȥ)<#`LlV6zD1?,n<!#p )!؞`[0]# נgkLJJredd|'򬢢"-B||30 o<3o޼_~]TUUիWx)66ܹsD&&&fϞ=D%/ADuuu ls7AsFW^}пk]t7oܹs7d"JJJHHH `T:8uzw9tutMD"/ xrrrrrrY_ =ݻorjY"*L[]^qʕ+̙=o&D~yC(==]z>,uǹs犊6mڴuVjY" 7 W_}%Oҥ(n[Pҳgϴ4oY(1LTڮ0yonn.((Pǯ{'v׊FK/~͛79?կ~ED۷o/--3fLcc++sŷrˇ~3ϼDo.Zhذa[l)//ᇥg)lp㑄^xᦛn`gĻb}I5 &]_Q ;3Bnܴrz<Q333 zjQM؎;,EQ\vmFF( Z~_xD$=񤧧K333r]p(XZL/d{oB*Rڮ0IwKMMꫥMMMǏ.OoNOMMMދ577O>`РA}}\sM]]]޽O>tyd׮]wꪫC 3gNllijjjBn#۽ ,A] 7px'g,V0;_z%QKm/gn{Y죏>ic^r(O?M8+9z|sA;{8sL8vn</vֆju7ۂ 7'Zht-))US#Ǹ̸haaza{`d[0>DGiEckf A=R`2ۤ)cz0הA6w] ;Zb#J^YgϞpǎ9rd߾}hʕ޷oںwj*"Z|k[:|Җlݺu֭n(kr-Qj#_H;LA_琔'G)0*\l-dz6z wH]<䘔큑m |\/ZhDޜV @KÜ )Y'=hN PWNNyBJI%~'Sw AnƐ=Ke'R^:._^ODTg\@t===DO+Ou>BZ|R5t昞:`{N.`U.NeYuyŵX\/`AmpIs CʇAV, )>=H  SYApJVNe =(┬b%zSr*  Nʩ,փ@8%+XXCGA~8+X: =xA: m AD3=0JyN#tmas=̇L̄7xnACMϝ;711Q5pFyVQQ!>>~ƌR⑯]Jy"ڵ+9sH^rС D0 ֩EA2(X7;vYoVbbb>}CDYYY򬌌 "SBH D_kG? R t`.z f` 4hܵdēλZ jBw)o8=vHy30 Ķ@PFE%Pϼb\hĨ7fhxW <- A!,ys  Kz!TAzu "6 pX4.R>B"EtA6;6ZhbAAt=@ LykD<W+az ="CJ5`AzJyD< AQulkM7{gN*Onoo/** :Ayy~)i_ 5N2sԩiӦyOܳgeeeS222NaV+68S$E<5HJZimm%$yJBB) 6ƿ:׆EͥGLD---)ǓfiXP0ȃWyZ}^^߿_r!"JOOWa5|){ ֺVhay Dm+VSjkk5 ՑmmQiE׸jMi<BqqKKKkkknj8k֬tOoE 0仵߹(WTTS(n"+//^Xa N.wPtU]DO0. Lztٵ%55{ѧUi[ hͮ2B*70!=؂C܈p3DJc-z8#$9@Ѓ9"(nUbv]CЃ5ֵс%A.ftz }.">-@x :tAd<"^Q >W3i<x cx(@>$R^`y/a*2[Atv4f\{ kW#MF(@҇jG #J3#ՐvC(tkdmpq- C'A sA_ӭl M770wn`%c/<ŀۖj`c]a)_Y{#A;L?l?;ε*wPeV9>+cB9~'!w[o Hb|1S 8[taF_Z`1HSl4_~#CćbßnVCI_xM~#;/!$MsQ%*>f#t)6P PqJMwi1CtNhw6M4&e=R=̯' L#Ds)tEZ n{L[6u/ ޕ,nDNw*b\h̽oS6S|PDܳɑ99U9OςD'T?AsLhQMCr;Z6Ǧ26PڏfH=._6Ko*D"'{ɮ">jS)V6,Qqc:& C6e?G b$TNE .\0qxK_Ŋ+T<zGt돨sPS!ȿ@rڰ þ屮N$z26I!mPeْ vw(箭VoЩ} S`(tDwC%W[?Z@LBdmkr>|ztS6S]Ya\I./B1Peګ5ZIo"cza{`@Uh F]1)6z;RuT糬"/mܷCz-1==0r~Z=sE:?p .~B-W6%~?(cc\h #w/ ,P{y]Z|dxwp0Z,~B^Qćy8;~lmp ‹Hot*_mע$WBAB/N +4 .#!cp z-)N_@oVޕ媢}C2N66P7q%3Avh/ka U\ 7DAb;dةxސ_ک@ozd\e6&uu ǴEmS .* )iόgr !I~bq}"f"ѫ-TCVvZ`mpF7G ~m0sX1!D2+$lq&;m{9C }jCL#nPkAl!ĺ@CH,de0SզwSGu3O:MvMZ,//$/]θ߳geeeS222_~ dIS,3z%mӶ-ゾ) D濰?maLD---) ^ <"ڿ<СCDnXs111yyy۶m\z @艨xcƌill vhń+c׭[w)S̙3Wp @+6݄TTTvA1cܹsAp\lll4DyAعs1¬YAҥ˘1c.{rAp\s.^֬Y#Bmm=&&&99rbɒ%.jjj)Qw%77W~jbyt뽋D`nv.!Aؽ{waM,ޤ[UUfg&]{D}7?PG n?u]D裏Ԍ=8Bɓ(//o e rF{W>@~3vX >}\>G%ѣG](H{ܽs1 zQ n7ŕ]y(>Rc?~]KK˵^+]Iӟ'E nlK=A`szC69=!lA`szC69=!lA`szC;7qIENDB`$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh5 5#v #v:V l065 54$$If!vh55#v#v:V l06554$$If!vh55#v#v:V l06554$$If!vh55#v#v:V l06554$$If!vh55#v#v:V l065547Dd R  C .Alogstyles1b~mb.vI!\mlne~mb.vI!\PNG  IHDR"ho,tEXtCreation TimeThu 24 Oct 2002 13:04:24 -0800ޓtIME $Z, pHYsodgAMA aIDATxr8QggaJ ^}+8T;ׯ •Sfhf2d6p231l|޲ ?$e6fy֜_B-m5 -#{TnAbDBҨJnyЎE2oudFgv]5UJf4GQm=PKՏec@cE#E 9YHfAߜS )̸OZɌX #3~`zNfV^27P2)h LZl քulXքـ [#X6Nf}3quAf)uYUz'FYDfͱ2"Qɬ>^ÓYvR.3uP̶شJ/'l̮3{xܾX7g[2K+-yloȧdխ_{dlW8!7/qO7A&1>"dv-*6ͦv]wcYnIo_Jjw|{l8#*[fVvDخúuS>l_m,j0պ@qq04hFfǚZ%vl|w\\vrƒفe]7ny% w?=7IfߴPh;/]ߛKf 0ݾPGz,#$-7;aH7F6F=&hP/'y3LU"%͸o1 .3Q\i*&Lc2Kf)2uƨn4F FLc4b4F;؍ŝu|U鹮F5`fc7<ݮɹ6qlǝ>?fEg'H~*[E\s]\74A^%hv:<6y>7^llS鯻~4KȒhYEU;loIY46N/'#2!e+2G=Dc/âV.tLe4FG>=їl۽`ߢTFw Yf2zYf#A2bS=e&3S&3 \Y1ҵ>2 u# 3 \Y123 53tf0A8Aҙ] 3Q43eNE33;1FͬITTJ_]`>,!~~01 e,?-Oh-yQc-ρeۇ8?:p@v-02 F9@ \GO>x~8鯮2!‹P} w-t#Zv鯮2!‹P} N ´w Z<|#3fҨxYx̛Ym}\bT{^ƤGM?9mihcmӵqiyFx{ UIENDB`RDd R  C .Alogstyles2b'r{B٦&< un'r{B٦&??? 31h Ec-l`[4آ1h Ec-l糾{9]xy 0s3hSF-ovC(='J7K0A?hE;AR;&4"!6Zpdi꒾5qo ӊ1M]7Zq!K&yw5so 9Y7Z1&xJEWa,7Z3&yCWm@S46)&nhl:.F<7SnKAohlx,1e ÎphlZ7Ʊs9ottXFo 9И 5hbw 4f ɓ&6Bvc1"רdCԅ{4AYp^c%u<.Ԡ[WfiftL_Exـ~8Dfԅp-} /1cqV9܅X+А~A>}cN0}~1~(ܾC$ CЙ< $A`P1P Z#0;H`@ߘQ'Y 01+^1|`߽KlO~Wq~{nXxENiw_{ۆ.גGX#j~K<:뫨;Myl-%k#5z93#Nck].,u.gŐ^gJ}NJVONi~SGΏnk GR3?7F[{ ۵K5۵- rpkƘ0ƯksF_+>8H`Ƣo Mح"ofzLb1g15!aBq:/Rq;:y1T_V?e[錱V\RU9|M1<`q^[@yIvӯ/PlTbD?P+/K\Qۻ#B Z0:1X("׍-MAĦo;coc@ 4آ1CN 1X("xL]NJ7BX("kE ry`oHLH%kGV$*Ħo MVDlƀVDl8p`KcM`M??%4DEc-l`K1'"6}c@l4آ1h 1Xh /LЯ1 _v-'7ޚ1<5c=6C6M"?|NDxl`[`y }t{ג;Mדi:o]K޵ ǐ6k:]\@E :19y<5hh GyIENDB``$$If!vh5v5G#vv#vG:V l65^5_4!DdEL  C (A2yaxes2bg@=.=a]}nUg@=.=aPNG  IHDR |[,tEXtCreation TimeThu 24 Oct 2002 14:51:22 -0800WNtIME 4ү pHYsodgAMA a IDATxv8P2g{{`lY%{! q>J.lׯ_7 _7f&`H A @  0$`H A @  0$`H A @  0$`H A @???v}šB*K>+(`_3ZŲJ*;_{Nx)*dX7Zo+Xw]""Nt"E*]^XTPz!`,́6j~~ ^>hɠC+Of~#$`" !\RvT$K;MƖ6ZwƐF9n0{qPnD/;RlGF.E4#K  =MVRl 7{K֋cENf@+GNoW)ğe]ky=f~ޮ]dOIdMF-\4 GghrU&qjyx!+]YZu)"oV-FuM b: S]D/sKՀ.D^g73›dd19K%ZcD+3>Pq {DSFeZ8h $EиRO XR5H}>KGfUN-f y?,&boɋ)/Z}PW]揻?skqOchKI_D&RL R}mFx%Z `s9M•Y!c9#t\\CyNpqעM^>M!N~6Ǡ.+p'9!_ X Rl.q)6x.NI!R@Q(#`_(\\!`ץX.9!UX,]WEE/E])hiAp$E:v.BHq5.692Fh 0`Q.,s@hi—=#"b ]W9`e^1tKqH!6,"ũRA.h[RT'JIX0Hy'ES!]d3O& tS&.tV]t$SDi)_$7pF t1M]Db)v("Jc)`pF  g)_(EkQTH^n,v"VmWPT=O^49 |1`ruAU]Eo*ۯJhzAN9/.',vtwbq--ZO)_$du%Y\Eb2@*L&QO| sHQ/̈́0R)_L)K`JI0bVH A @_;,rvu]DfUXvP)X]e^;Oi]}`?|%N/kڛ"E杻U8UMa )&N$QT0VVɱh\ey}0!m4YṈۍ{^mG3Cl[mlhP7/qOuE$/*,!4QLT⍰|)RL'ۧp=">wAM)6kn]D8 ")*a#vס4éR_in[8xSp-ZYF. AM ,\F Cy>JLFRi0Qܶ:-L w.})t}"` Ǵ :E8,L"&p+nKLp{s1MOJ*tES*`(\չcZE59R@ՊPg􋯍׵; R~=U!]q: Lh@pqziuL\-ix䩼꡼ӵWNVd_m]W0'Dz䘜ia_63;wte"eZG V6)F lx WfcRT0]CH0,k㑮`dZ8h J`N8E!]C#EUHvxE׹5.Uظo1њFy]$]3¥qPi|ruVdްfUa XN{mEv̀HZAqrt-"Ec)ތr}pyypHU\L=?k5'+9kM!=N;7ZՀ}7ӝ9ܓ#t´fi8J$]jSii]"Zr|"`õ.JFqH`C0-pQFP0`_γ}eކhm(p1]ě~\7v[:b(O.&eS0$`r2]E591E+e9ir@ @=8{]f_rޞfKmBtoU v̈_r>s lC"t:X|]flH xyn_/=U}*ؕ2/[`lNhB_ZU 59#é-Batۣ\.m6B?s վd(_s;}N^Tc҂"uD5#~[pxWrTcIҤ cnjࡿKð'_?Au5AcPcִ*sEB`XDu V4eXtX`Ec\Бq5Vќ…?sE Ƹ11w V4F h i>A4Ѭ11T V44?F(A4sEZS V44F+K bEcMcA4E+}/12ssUS`EcMcuNکV<8|A8A L¡2I~n˘tP[σ?<+BWYà~OˋXib1^<>9FXY[X+dq9 <* V444FJY&EcMcKcKchgh 7ro$5Q,McKcKcdngh i bi bi42A4CAh i biNs[ s[ "K=Q,hXXjwƊ ƨWŢ1111*XDsn rn 2WFA4Q11 V44vU701*Dh iJAhJ&9-RTvYXǓGu'Xjx!oOcWk꟔3u;q؀0fFbH[/s?DF[ 5m7o|NVeX˒4VXp܌XĎ^пvP14Z4֦]ļ7 JhfɖdX}ev ګ˪hgC1>uneu^86̃[+." Fhy[ki0( e|vLB9삕~(|)ţeG1 V>j̆+4ᚁM<q%@s+ߗ l`e~>Uc u3d_9Z|ZV*:"<&6]N Q=_klrF44ŗRrߖLSpeA, A,%5e1l)c)[=Ku3%q'8ɿ~IcKc[[4bKe̒X&HcciĒr2W 0QLMcKcKcKc3 ƪfgXmXmX+~6\18U赸}ns;F+.]Nk40c'n4|dEƧziWiIˍ orK'3Fnc)uffؘf&G84؛hb{lWPmXmylIa+%Bmc 5f(65s2Z1Tc]Se0Mؗ V;nrNc;2]dGW鉎G:6.1NnxA`k#/mW`KW͛Yɴ ·O{o p{aƸ9GKI?z] h'7>[y[j^bknÿ;#ξ|_>v8̙+nѤbL`dmnًjHN8 u#\v0.mHW,J?f?DR6h bi bi bk̂k rĊz?-xN A,AL#LAFXXi3FRi4r4fH^9bHj!sEI h&dh?߳jcɑ+G,zwln9uq|| w8`Јw犲mCjnR֜l5QI(#g`McԐ61 XKXCX"15J`ͽ@5Fb8cp51kc4 iiFi 4FZ5k#25PȦX`McR/1(X$֬m!5sEX}ifi^& i. iMX'-14a`Mcf8Ǵ5qk#5A4k[dkֶG`W抄؍8i 8il8h셨H!׌c'k}Bcyxdߊv3~|%K"ݏ"jӪj~lV ;{`&_'?'4[|Ҋ)^U#ÿMgcyúu]+؁4#Kc1X:x<^͸x!/@`qV\ \}l2B-kPI<}Z8 J4`uۧrO`q^Q6|/^qF`KcU '1}y,n$ccf+(TЅkfqd`,a>Ʀ`yB>uu8V\+\qUfh@ce , $<4VR:rߖj b٘+"4VrXKKcY{2s8Ӻ3 beY."FVA<|50ǟ'" l Ʊ8F,46 JccظfXvbj+@cy %%24*X:+Fc%"4X +Lc 6u&4֓fn6 k[%0^GƏ4>$06;vM`좱}^A`Ac[ hl6L`|+}k_+0>=^X\^-oX>u+0bq  ci?4xō#zO!;Xʛq2s=,7f >,8};08v{L31sp-w&Zg f+YMј~c *7&02(ۘHfc# T5&0)՘HNc#" *4&021F~Cu(0F1dcc 5&02Xcc8#5&0F4LccPc4&05@cchKݘ( oc 226&0*IE`km'\Q`F)C>֍(q>d!`pV[| ٘)"38\Z y21Cy\p<__ǝ{392nj`&ZE[9v'#0J81c:cmY1ع 1AkL`p ф15*^-y@IXdZ~ggI11˝獻?Oηojg޳ߋ7qLBc/x߱Ɏineqb8{WaH;.>$?#T;sۥ;ǒdg/GK]T;sۍ޻ǒdg/XsJΏŷ]l;aP r=%zIcSř ٓ$cn3V֬p}n{}OLcP[1KcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcvˋvIENDB` Dd P " C ,A"fit2parts!b ۚX((Qx7 n ۚX((Qx7 PNG  IHDR]BL,tEXtCreation TimeThu 24 Oct 2002 15:38:45 -0800tIME '`_| pHYsodgAMA a IDATxz*Q<[IZlf_ڞ |>' B( B( B( B( B( B( B΋X#y 9S#U! M*cg{<"0(jE18DBaZQf gXa=w>i"/syZQYZaJG ZO{P Z'&yG^H0 +NGyBp 1Ieeoq_CbɍVV>i.=å¥\SSy֍ (Gs]5<{ ?fhn1J1_%5T %h$DWYP1xԴn2Q ]os]nɼ`[C)q;+)p$TmDa]85AM;gFU |YC _P\Y W,pS~1JIahw\m4|1eÚ &)?f. rK4YڹhyR;Mܟ*7y2%"W2Qc\z252!w28ʐcʑ<&,1mLy:|;] nkӉEox18 ׬c\sNysV?wMv?ȏ1ywm{{rwQr|pA5B)q]#&I AvOhr6٧gڇavPTdiLoО\lbwy|'rlӒY1k'M]ƔX?9F/Պ18.6L[ gG( 79"yycE[|W#.縺Qley6 h2p/;9BPͳQQ&NXE26NvU]sy yf K?9x\u-G y^+< nb9]?/I.ʹO:=^毨ȡy޾J.ܣ/!S폒8&lw%ӣ$ѐ[(]5{1TsR@Ʊyq4֏Y#LE.ՅE[r =\.g$Z`8.硛<T+<†.y_ΐٱS~uk T|LgZc@ yFǺ,:|11ïA12gz[(O񍺼El1e|p<#} ,=s>^9-#YRJߟ\Gy<L<X>7񘷒Z2R K;ϡ^|Z!ZI7*KJShyUy_A+y"^+*t(Ph%W(\)} T7wQvˆB[i=|$">:G2 \=RGeJL( B( B( B( B( B( BcIENDB`7Dd(#H # C $A# grid1"R7kf?<cZR5/6F6kf?<cZR5/JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+_]o.]cZ0YMyZKs4mF8iUX V)=VĞ2dώ7#ľ0o{EH4}SG]-n!d-# ga`e(??|@¢E|wc]x^bC\^kޝI Be@5f`YYR0< QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW~z6Wۍ;Rskyi+E4#YXA}~7dEN s?oĚΡ jGt7mnQwaUTd(((((O^wZgT$o6y'm숊pҰQO'*%U][\4)QFD.B@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsc+%-n\WR24NYX AA_Õ>6?_@ই;|'оnPt?$ $NV 8PEPEPEPEPEPEP^U?:&xK*Z6^* gG!/4ޑ. E(#܆P@ ui1CYG[jI -ťA #gr[$)w  62mEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^U?:&xK*Z>|UI|7m[FKeTiZ;[+H]RyvX_ψW%QkZΗqk[=NBH'ʦ㓱8?+o?t|%Kh5yM02Q Oc]WYKGE|Gqk˟j]X縍u#qY d!jN% :|ou+UL/J(M̖z&my2DTR7b3݌e+((((((((((((((((((((((:|K&u-kGΧXk'q /ڿgOuԳq;sp=V ( ( ( ( ( ( ( ( ( ( ( ( >&|+I|7<'x%HD9Sy!7w&T -R2GוxN% =+IQҬ,.4Idhkfe7t,v\#ۢ((((((((((((((((((((((((((((((((((((+¾,o'4m\ԏH[zl+4<;k[pA`w }ּt?L/hTZLiVRjvzuoipFI Q  tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xWś/__ zKoHRfsnCn(wo FӐGוxN% =+I*=NRHQn--e(;R!KYn((((((((((((((((((((((((((((((((((((>!x\ݞ; ^;2$S41mXD‡ܠ]xWş?αkoIpkwTŅ憠m%p,T2@c;gIѼCLiZ^ykovO"nh <3Ŀ]Pi:d:.e۽Ėows%̪Aydfyv,$I5n((((((((((((((((((((((((((((((((((((+#GxVD=X{>Kyh[bh '.QOkEyWh(_:Y_k_yv%^e7WavSD" J/Ώ6/ x;=n+RQy$0Wq׺ׅ|Y_}O&+/[Gyg o46*v8R{|uUS|/]JXM&mg3YX^4RT!ۜeA+NcVZ{o鷰ͭ夫,3$GRC+)0$An ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( <3Ŀ]Wׅ|Y6_Kޙ=c7/D:$Q 6`9l‘=֊ͨVWw]Xݴm52csRpJ;.AmEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^U?:&xK*Z7* G5#/,ޯ. .$mui2_MYIO 5սO R$dB 1D$Jp-EPEPEPEPEPEPEPEPEPEPEPEPEP~?k?Ljk+gWY޷kXO?: P"nBrFT3k\~_LMK1?_ӥ}U\߅-M3 ?7dD~d+98 (((((((((((((((((((((*?*i,<p$}Ee$(yi,Bʌ0hMveiqq\A E%Ƴ\G f#$"*(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|BoK'K5WW4}/ey"6o<"" ]q_$¿ɬcMiWҹy i%UR$nk+z^E~II,/$9(VU|G'OvV.ugWX5}M5g]^x" hox7,Y};}?S-m.MnJ-;.FTW௄:5Yu 2Wm5j!K+"  pր ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( <3Ŀ]Wׅ|Y{__}3U/\gEy J/45X 7c8b;Z*UY[m)mkgi "H [((((((((((((((((((((((((((((((((((((+ώ4~_ NX^$T4KV`C`LVJS 9`וxN% =+Iִ-B.#.#Ki-Ue " Q}hSjp\c[&xZF]=u]9,UU<h((((((((((((((((((((((((((( mG¿{3znjn^$tIl572wqm@ra#${yWؙ_.ШҴٵ*KKfPLncwBN Ge8b0M((((((((~%xľ布M˝*[FU"& +\H#8=+r~ (|go j.}RD䝷")JaGu<@(((((((((((((((((((((((((((jڵ^zB7WrP)g݈ Ā$7* G5#/,ޯ. .$m_tWF&uXP?: PIpr3<3Ŀ]Pi2_MYIO 5սO R$dB 1D$Jp-EQEQEQEQEVO|UI|77C.hh o>ּY|H<%UY xV9V,`k#8$8 ύP}˚Z+¼q[m3PxmUZ[;o"R[X#i d`8#s?A=VG>7C.k?o>nt?G淟SuVk3 o/fA]` K 1A$u+VƏ B8ΛWgM5SJXI*#ύP}˚~|a>$xjZV}AhFa A|@^U(s|aCSx4LҮ-̑OD셵 FqzP^U(|o;\^ោ|+xSy.>f^y*Dc!BI \V[q[7U++y-Λjv U0F<#?5&|H8Դ2J%-]Ki,c%YD  uύP}˚!|&+%#is]Ki[ř"& k rA uύP}˚?EwU+? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.hh o>?mCG᷃SӵUko+laIm`Kt 1 ύP}˚Z+ʿEw 0E4}OQY| x%Uu6.(B@=ָ[Ʒ<+:n_UVV[[6(N+{)`A$`yG>7C.kM7qiZeK[%YK)AEyW#?5BMW4xWntW<,:lQ VRIT |o;\?{ o#RҴ*KEu-3팖 eR3=֊G>7C.kįxďeΕu-odx'd-0 3Ҁ=֊G>7C.hs?A=V &]kŚďq]M5[ścl_.3Is?EwU+ 0E5 ONU xe%%6-0J:G>7C.hh*s?A& L$xky=GUf-0kT$p NI[V4OSӴ(^U"E,;UTXKYmO%/nEouHmOu m&ؾb\]ʐzfߊj~:=暞՚wM,B]6@b l`>Ix[Śt+]ozΟ w..mdJYNH+ZU\ɉ2.(((((+'>s]h$Ѵh[~ѧjso6pUʬ28*QZPxIļhƋ躾5kk ֑Mj,!Oږbvࣙw&}ǩZjztHgDhƲ5FY ]n?T|xBG5-'Lti4oQN⼖c8FE0*v~p}jY}qpq .>64 |<&?- ~Ѧjqp\ml{1ҵß8`InoᏗcO縼<.Lʹ{hz]lhcxo1~((((4c>}KV5fMW[ӥaH岄-㸷;Ѽ7 !+Mo5oiz5+$3cqd31dks ?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip)x^?dV6}?>H4K{bś!;8J>=Lj|w%ןj⋫Ҭ tKBgWP ( ( ( (xCO.OֵM_U1]8K/]4pn<!ށ" WߎwMi<\&ww}jbp_nh&,ys\$!CK D@<'x|:k~ Dῴ\[ɚ$}fVsw, <5 1ìiǓmZK3m}o /QEQEQEQE_'5Oαx[Ot-k,eVCKXyH E&4g3;K>7*WxCL K_Zv̰I3V!C8$N3zWU{%\-1[ǚhb܇B0%vJp~\<5jL~'ӟAFuq[M /`J~E'|?oῆ>_u?SXt2?6K]tfmϱ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?DDd(#H $ C $A$ grid2#Rn }D]iF|n }D]JFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+_]o.]cZ0YMyZKs4mF8iUX V)=VOέfS  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??G4 Lj=Vio# G7!Z+ʿ᥼#@n  -|@qAU[??ZO<7` ֤P]ƧDG+v+kA Ib ( ( ( ( ( ( >!x_\%7E浥Kw2]ۤmTJe]|* t^]oVOjsjidPJU!R/[Amav%?m~>VDo,md/C ofX2^_:к?hxMuzҡmΊ^LwI2,FEjvf64xr9ᙃ[#I4Dk]74{*iym}[ϳ]g[vÿjZۧ>w%rk{!kEy[ $B.Vi /ggO,# !DڌO[kwVn.㲶M|'8K|t˱Co)5=>m2oo&@_z#&_gh/oݾwyZVFu]em$&OpB*b R$,i|:?b?b1,AHQ651vb.>mKo<϶E6q!V$ri6b7_ص>G9\r}ȭs#S5=OOG>?3f?ŜNyx&eIEjۿ>wq{!?dFx -8>J|H6WfO7?|?>g3[w[<֭պxNmorY\W=ҾiK"e Oiym}[ϳ]g[vÿjZۧ>w%rk{!kEy[ $B.Vi /ggO,# !DڌO[kwVn.㲶M|'8K|t˱Co)>X]:u[¾Nk 3ZJVUhePҵ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H7W o5̇Kԯl('6qm[t+wfy(DUhBEqOo,MhfZ/7 #7VvK9"w;umkn*nD=ܖVɭ})o7|u>&@+gk]W⇕ak~oyR_]@o[gWGU^8}>e^gkbBXApVwsq9hˀzVi /ggO,# !DڌOS4E/!>ۧg<ć#E[oDϚ럳g+X53F4zdwuy!-fXiv>i Wa c|T7X?˿Z:ey~xO3ɸ̾w=/9oÍWIyii ;BK4 6 *E.Ta{#G%H_>gߴwngf o Mj j[}GD?-4$*Y?4GrUI1Aў i ψq\ [?dFx 6~h7Tz]Քvy~Gl{y7ygc$ ~e/u]~߲[&yMe|ZH[jV'A֤NzDW7Ip.V0ehXE`:'xVS}jW0m=pM,QlڹeFRNwIA.j_O3ɸ̾w/v/mth-jȖ)_!(n&&TG B stq#f2A#;̖m5]SSRi4ǼR mC+,Δ %$*8zy/?hR%߭YKlw,Hl?(ʱ i'_l^a ƥ }Kg}_h7ߍgϝUC)s쿿CʶM<~"H|`~e/|yVɷ|gq|tN:ƧԮa{ŹXi8rʍ4T#5-|qYY薖-4=PE'4 (1!1v^ʴ ^;|!ZA{g.,V&E夾P6e8l|v2j(^&h˶HGt)̛ռ7^8ԯlKX%LVꘗ0Ƒ"@[w&m9?g>m ^5χ E#FFWhb,М7G?7|>{Ig|:i  \{?.r)dҼG%>ˉŝ3[(P^r3f[3 z᳨xE֭%tM}&{ij[DѲ)r_:жZƏGk6x.%/):/\ RaTR=I/ov2 pd4~Z,{ee2bTs;v~G/6g7m?wmUt(k2qaou) o繏{Č_aew)FG#0}k?jO7ngj#onjAp fyKI#GUQVŋ*z:qi]ͷV(,[s3`79Fg਍oUح3c[qo|Mei ? 7~ǜ~~V[y{}θz[|pʊ[DʕBL6U,c[rI|5[x㷷m5k$cC+)R}?dc߼/qn[1/mmZ?cN\^_>vϗ;|>Ӯgo/{_eF7sV;gͿq|u[䷷]5a[3<bM?G?`D~o;Nիm?Jo}~^+w+jZ~ya|L(us%v-;.r|f.b̈́U~K+LO ٿw?<3.O#$f|w<ُo3oCχ~ iC3ִxN8g-J1UAKڍf% O*/߈7#-t8|qy$SKju) -+l3kpR[W̻PK 6tMc)؞+I0;6lS̨mYMzV z᳨xE֭%tM}&{ij[DѲ)rO3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w=')s*6n?s/wIA.j_O3ɸ̾w︯!A.(n,;tJO;Ww;Q@ӴQIEVe8KZ:?oHo`<&2߾;J&kZmk}uy.[V{vQJ1\oKiW*E42)I%Ţ%%C抚wA4xe/qoc$chms}2}<o_> X[jE}vdpi?}eif:;lE\,~7#!7cU?0j84{qݧtHl,Gki ڽEtcacuIVH7O[7j dIPO*i_'xὕafV@F`7\2DX l)t3fbxZ"W %e.GkotP7&eo.Y7)g~)>Y?AxsGO'eg,gڛ3gʾ|)] [ [.5+X4tżBe226"3Rߴw NԬ@%ߎ, Rz SW)w޹\zō{MHtTkVv$EibkwF73G$sIw,[?c_/3Ɵ6-m|{{}Ÿ.7Bjs_d/?!7_ٖ?ev??X_|~X |haRyy q",G}||hq-j>7xH_ w_j^1ծeg"#Q $N"%\N_g>Z"W2Kˆ>\,~7#!7c}:4Ykk[,qdWܿgk,~43öD_*DzᏗ#ߺ}MXH<,ڞéKkLҵ I՞'oDKLkI&w@?kW/yWX_|~͚u9vh\x̖= |X>oFBoǖDd&y`u 3~|xmZV }Ÿ.7jjs_GcC^oڿOW<\u6-m|}K&>\ou,~/76َu:4xi|A5ώXdgx+EEL&U7$Ҵ3fbxZ"W %e.GkotP7&eo.Y7)g~)>Y?iαwشO7<3 3e7f>ճ~^>Ѩ~6N}=Ǜ}~w?{GcC^oڿOVVlӬWCD_*dcmms}2}<_|Ww|=T :ץ$J MwA$h7p9 |z-G1ho"ڶ~{]CLߧ_/#0uUht^ K[OhQG%dc p  @O|M:`ʸc$cMX>oFBoǖ C ueo"9dpˍdWܿgk, u -G7}l<ݘVxsF u -o?7}~<ݙ.ygq@ IC?7g5;g}=发?x? ue/q"Icpˑ|}hu,{WM#_/ٿټxG;VV u -G7}l<ݘVxs@?sί f↣h%LֶOk "0U2ffi,W mOdP$b"o?=_g_/wIU?#ξ0ŭ_g|ϴ/<'?e/?l+W&?}w}]#OqSA|Xx=SQ{HњٜFmwZGca}D~ho>O7f>ճ~^>ѨG}a}[h_y{O7f~˿~^~P&_4McQou4խ5O'@KU!HD9Y>x-gğ- n/uƵo&l,sNNKn˷" X~u .@RkvVmp V5I&Gu ?ϚbG8h[Fv,+pMϗ,\=[[4掀: ~|7"odҴ__F $j·tHvrVW<'Cxu?dU<4[Gii hQ3Cb ##C7n#}3XݜOt ڍ踞IЙmEDc2𧉦WG qcycO %x|_5fܢO0((((((+sߴc.-'7Vݧ)M慱5t.JB@ 2#+_>7 2Q, =m6Uj0nV] mtՆUݭux PQB6>ͮgl3_eF+~ng[vj]yf& Q)mkn*nD=ܖVɭ})o7|u>&@Zfã&( -?ȳbT$j3[?`f"5ndzQ⻛wT;T/`ghrS#[;ź =[-&UD.2l!OLm ІnYHg@mLpqG:6:O]eszOy*R9R# }\gWg?|y{sVjIqnkCn&ICI;IVSUJ9,N3Os'k>E3CoMݻ-wVoFBoǖ CLߧ_/#0uUG23fbxZ"W %e.GkotP7&eo.Y7)g~)>Y43fbxZ"W %e.Gkot?/]jn|AK-qm폈ow];Xye2F"U~ yjEv?O{#y?\Wa_^55#^/ Vy@I'Umnbw]15a_ 6i|KSΗ%cK<^n9֖Y,|2㋻/ ^xW֥\4eK׏pe_.#;쵻cj7^.j>sm֙]e62ήgkq3Ld[fx%cX9麏xJM# K֞۝s5ӣ)Hk@f4(_u}_NE]]4;</`UXQefW1,mu"w+]&O۴;o'?d7g,~_f|(´:\cv6g'贗ҳIJmG&.4W^yllVӖc[$yjK"K-ZflElLVͽWٯi!7cWu"oO/\n6yqM6y?uܟ÷w:v?n6r~9};mN?Z<]3NViD.G!Ve-E5đ|yshQ\?I[|ͽ[8Q佈FGm{0>Εo|B>p-KDRJZ8eugUK`jWE9io h*Ew'7Ak'xͣAŴy>T݈5!iisM ^[)V?4.p.YY:Gj:n7?I5%*k+yZWq1Jmn!Q˱]>>Z^¶~<__cv~&mWd5ƫ wBP sj k;Aby |A.l~1{amۻR6yqg;{{oQ񆵢d_xr)R iMmq V_]KfPHNw[<Z[xK_@E&. 5"#[.'yVL6]ߌ~8/?G{nOՎosq7A>W;WL Mxt>-YFk#h[0mTM #v֣j0k]JK+ƶ閯q2bChc}s/Ox\GD$kj7:D ͨM4,RHm%~fWu]b}7ϟ#i>.7>wcy ú.>4 ݏ?V;<hW|au|1'_3,վٛ|~|g4 .|?Ŗݿ3ϕ}^oϟi9gtX4!ҢLΜUٮ4$ZyYỶ,,m٨|]qd xzO3w#.h-PU>0?/Zv>V~qy>>xsW U)]5"?mJm>әR[fUi|M'M|@71Ok5;gĎD $о!EO&X֮R{@%[晣hWҵowi~"jWz5 hznG{lkHH.r |S:/m|ItM3ğlU#VEK}߾Gi$a4nHmM#z9xtۓ|IHGet'ֳ׉4 2P𾭦Og/ B] Le$*4@+N'?6uZIVgO,ҫDVFKڋ4;UHHxWJͥlawI+]U RZg;CҴ[_4w"D{sCtB\ZMk4Y#qUw:GPn@VMm |-4SC#GZ9P>Z0HPQEQEQEQEQEQEQEW|O[oH~Iz 镢XEd~`FE{]|:O#'MnٵhbKEU \[vw%̑kExm+$&QቌW 7?>_~/[o;V?iVaK&#o'_C +gvyq>Ӯgo/{_eF7sV;gͿUۮ쭤D "3h_4y]2P DOOGLxB/Zf#͜9H>VFA|u[䷷]5a[3<bMK[qFӴWi-90D3TFZãY|m Cϳb'ۨycY痌mF['Qθz#\i|WsmՊ+t " Q*#b\K=m>[weE-]J!& ]ś1sun*ӭ[=ܖW2Go}q|șF>&2_z#&_gh/oݾwy]_ V8Mhei(hXe,ԩD_y)S:v?m_m|'>oyl~-ZhI4M#<.6GU.پ@H[մ >5?mZm/V_uy9aEģ%$l9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ ʼmמ O/u n gSڤֿg\Mqve%KFh =')s*6n?s/?L?=X~h s}$L.yW!2XNAH,ۘ xJGĭ S!|r$Dl{C$ySng=*wIA.j_N֕%ݫ h PJ"")ZKZ:?oHo`<&2߾/,lğ֬Ϋ_O3ɸ̾wWն|Nkk>3ZM޽e&0ѴOw[>ih,"E2K2{U]Քvy~Gl{y7++VZ4W\)n,[[&ԒKg$ͤ<:GcC^oڿOVVlӬWCD_*dcmms}2}<k G|DѼA}B[RNlp6ΨmM2Gⲵ 3~|xmZV }Ÿ.7jjs_GcC^oڿOP|hmoßFk\C>ss,fv@Yn$#hA߁v_ P;}ӵeigXyb<ߴcyg~fϓُlߗ4gi}O&E.<3gv|mǗ#HӣtM+GDM3V;hbfKem9mPAG}a}[h_y{O7f~˿~^~VM#_/ٿټxG;Wt.hx${:z*Jٕdl4/ͨCT?4çyw"o^vy>O@k5_Yӵ[tFq-2g1&.BͿd"MƼ_hxg7'MzVAeӭ" n2MM< 𖁭BI<;*E՝ńXۻ.'O$6lWzF4="M+G' nfm&JӅѻVٺS(qb+Yƕ;8s4ψ>+y}yZ6eY]cI-qpmoZ&Il[;?h_>nᲳ濏O^K!˓JC1f[BO jw@!?ų.G#Ryo_ge߻w??jh?~9Upfѥ4oM{,)3M?'WT3ncwG5ow?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hhxZw?+LP\kDzvmJ]RxKh7ay >Nj~A/>'xzͿ'~=uQo`3^x9#c-*eYf,q;8֖? f^ZO}GIK|9ӿ|oe/|+3s\}i~>ӿ|oe/|+3s\}o?A@~>ӿ|oe/|+3s\}i~>ӿ|oe/|+3s\}o?A@sjFm[cuK▛i4QDN?In:(v}_|;4O[X[LZA#2ƯVRT܉ sGdUPLXC-u*h䵿6l"M-%ϏeFsoKR@ʬJϧxwvm?wݺͤZi iRU]6ɢgLn3ğ^ěO,Oj {uG̲H^Iyc2K>#zdm⵽X<9x qseDyhu>.G#Ryo_ge߻w??j|? "֧TҦ4!*&SFxr1<; H>fH-/>MyUkuxY|Z}2kw#QÍ ͬ^H RHVIs紸պ>"z~ϙ'|??AofG9vo~ˮ8q$1,nd4cee1PTϼkm%-;e.r3f({MVNK +S ٿy_?</c_2n~ VCb򼿴}Ǜ/g;w][kgw6ewKOܨ_=ωSF$wU;uVV{vc3Z?-M*C)F,]dCs(sfmG_ifZcQ[yg>~ϙ'|>ͮgl3_eF+~ngyŻ_?lؿ巙ejkg-ƣwYbtKܰo! 8aE.dzQ⻛wT;T/`ghrS#?cN\^_>vϗ;|G#0}k?jO7ngj$Gqnj*nfyKGɼUQ(e(ŋ zf?hoow~7~3^m?Jo}~^+wG$foڿ|oߟo/wZOXROA0)ԝmS#+<2Hv 1Br ~/tI+ oWVzlC|f/'V+:tG?H>/hyUbfys?Joϕ~^<7o<{+eK-Z~B&|LƇ(ʜ25#:[ʳ۵RnoUTJJ1bC&uo| wm-/RR.{``g<~S5[=C棦GfN.<][tMhYgN[pd|{{Wٵ:y`+hy~v|߳߷痷5n8q$1,nd4cee1PTϼ,lğ֬Ϋ_O3ɸ̾w=')s*6n?s/?O4+֟p}[[FG{F&I;@5$IqZIm4jZӤ4MJ鬯"'\B/UEZ^b93uW{?O wVRU/IUm'~_;U3>^j:'ӡ+NfUE->(, b,qFdygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|q^g~$xgS嗊5x,Bbiw@$\ٓQ כ__lǷ</|E{}}s/[M-|Y ^ޢ*bX ,iD0V& ?M"E }jڥ]^(R~\{-BJ& vw?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh}<7/f3L2k5<#7'ey]Mw}[&|]F<3w#0˿w?T3ncwG5ow?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGM~u풯υ|yCao]kmi`&d{VŨί扞vYf`-~_?i |NP+okR-4TL-%%QqWw5o7ĭ?|mF]Ve7M∥l#`-2ut<$M࣠;U_kM]c+[xʫH(a9#5d[+]~/?>-di*噘rXnH̃ [R? £T?0U#2*?nH̃ [R? ¯&~z ռAqiqdk&-'m(! 2-aQ sGdU5,?xǎ>(}/xſaOR{߳ۿ]ؙ3sPW-aQ sGdUWE~?A_ubO#zdm⵽X<9x qseDyhu U#2*~&,^!O4rZ[ &ْDzA9% teVP|#7'ey]Mw}[&>Z7kt$ B? .auq B˨iz^&e2.ui3r#M$=__g㷁fǃ5_h}|%'Ѿ֍ڮ>(((((((7߽[ |C<{O De[#eI>R7x{/$[ g\nZ!匾dVAdP:ꚮxVRLmZm0H%JtO^"mIg-?4G?/Zf?Ŝ8I &fF2Ej][uwh?dFy\m 8]|HVh /hCyP$y)G܊??9:S4E/!>ۧg<ć#E[oDέͭNmq\Dgh7Tejzie|6~gu>98Ms$] չOiK+#7>֊W>IdLiP ?#od뿴| g7v;y߻[k[tVp'䲶Mod#h9K}wèA26F?gGжնj6;+i$7~ȌqWL?f!` 3L^ φYG1g*Bь3wih6_hCy}O,$y G܊&?88#L!Ũyg<㔌#EkaD z|:?m<1,sQ6-HvNb(VU\6c[ "3^qo4yQP*DaB5siXiFZi>>-xg ddr7V:ݵes$z&G^J,`?8bc+|A[}VMqo[-g3@9+<#xK–յ-sNK\w,ֲKauq!ggBcEbŸ@NkVt7 o{kjr-G"J*UKPOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C(y/Qk6!{xi=bWHTȱ[,1w ͭNmq\Dgh7T3okzPqI l,D'A|͹yÿ ?|ooOI kspuo ,8Iܯi< q<p9"w;umkn*nD=ܖVɭ})o7|u>&@A'>&x>K ÷+.fP>X.y-GAX$ vO-;P/E~ؾk9<#\MK_w6Z7`Jec FQyQǠ5=>m2oo98Ms$] ]gS|1⭕ƒ.;;6&(H"g4(ILRLqI{,!=')s*6n?s/[tVn䲹=|#h{|D0A11_Vs%lbּҺ[rXm im{9w귖{?O wVRU/IUm'~_;ܯ W]Лi$ԡ+淂 o{dkyK,C|/⶗y⫏CFM=]pQ'$_f"_ CixfwH{?O wVRU/IUm'~_;UHc/{כ|Oqu/Aq,}̑\"2wq CLߧ_/#0uU8Q?7]ӼA[_i_o]b=w[ Jö85Z`H4])JL*GU%XhoNbfrL]xO kPZ5=wd:nɅdWv"g,n^\9HLoi&:j;ux ^ά^+.eY+j, 3mU_WӣuW}WGDM3' V;YYUKae~m9xczw]39xS>K4FFхizV&Uc$`%-5C~g6y? MCw&v7v6ڛhM4脽2ٚ"Xb&3[ᅶ[> 4[.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh){?Zg_f^쥕<2)xH[ndto.F{S֕xvAЮ!ż+jvvmwMp'Ҵ}3S-7RN_ J-H8 ?5T?0U#2*5m ^}xKZƫ-F|S}qsq/O_.4ieY&8綑[R?  T?0U#2*?nH̃ [R?  lj#cǍId6vsHYu}Sn!%⠏>__ڽ<+Q_wm$PIsicHw|HOQEQEQEM3m͟> ]&o) 4oŚb3)aTz[R? ¯e_n4}VҦhD^ KN| eXK;Qq-aPn7/ >8cLj%Űݽϛ$G>0'o(7on߿qV_үtOǖ{ ]YexJnVRAR kb#Lz$zETx.qhayd$Ly& P((((((+_^6ռ!Q,4}S]|?m6[4eeJ|K #Ȫ@?>EW|bU_-ŭMY2͜Ahmݕs"ɂRHч*(۝r_쯷}djfyuEaO:#+yl6Gguo+hN|߳ٷߙ|*xJ}~+OpZ՝& 2[l,QVSOjn13NW93#hyv9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ ض%Z>?/|_n|_6>gV#~7_>y˷g?o巗]j\gw쨥tKܩ_=$سa_5$U;{vZZ{a2J?-=2K1u*QWJsG?H>/hyUbfys?Joϕ~^<7o<{oyl~UK{uV c3ZO1=*v,]T (sfmG_ifZcQ[yg>~ϙ'|-nudzN⻛oQ_XgoXrQW:Ymoiû*)o*Wq 0fbv,EW䱍r}ٿj]o?y~~-߾?mAoi}G8}6̠I/ov2 pd4~Z,{ee2bT2_Kρ[*L!kb',Ȅ3FpB2pҮ~ VCb򼿴}Ǜ/g;w^?&7i?3o>+~/y_@VBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wGhV; C˟//-Ȏb{XJ&6YFkQԼ=qh&d,Bj-u ;G׼'q -v2"xbP6 Y$U;{vZZ{a2J?-=2K1u*QWJTN;O|#}|3ϛy[66ǎ<ͬO6ZZilX-4Ovdkyb;Ɩ',~+^ zִcG$\}ݵe ` 4[z_ygc$ ~e/u]~߲[&yMe}W~M3Sޱik՜7WtFmA[Q0~oӯM[_*\oSm]_r0S}|?kW/yWX_|~[w:6(`}-4)WZdPPQ*Vs 7MCWg߈]cT+Պgpjp@ Kȗ'kp@U_uLu_j%Ɲ541jRJ \\_BgYQ_<1Ľ]Ẅ́1xLMwκ"Y+426*Zʯ%gKi`lӬWCD_*dcmms}2}<|I;ῈqY/5N^u_\][#2E.^#*=R=zM#_/ٿټxG;VV u -G7}l<ݘVxs^6 QY_o>4<1Σ7KʳMik;NnH ݼ R6cφ^+'oiJś\[x$pIn~\O6q@~#N2kg&t-{/U4=ZGlA, X0ùoQ~*|/oOsx6SRb.2<(f㘵חduZIVgO,ҫDVFKڋ4;UH>O;: 7)q<ϵgnP6< " ׾|/rCφY\iq@좎٭%X-nB =H%h.w?g_y˅G%-G,uC<73/\+ʾᇉUmVI'}+w^K1|[~Vҧxw@!?ų.G#Ryo_ge߻w??k5o7ŗ B[DtmtU2]oqq湑E̖Y;+>.G#Ryo_ge߻w??k|+io[u+>FI<5:95 }NBIР/4˯Z@GyW-aW~.#ھN'_ao袊((((((+¾,xo5CԇH\kzD-4<;rqCy6=ּt?L/hTWKgᯈRxO.ei~%>Bb֒Y&wghGR̞ms;g/7y^_7w?yU|CԏT 6[YY"sGpS i#]*8O0VOv gDZ]s2,;{;e7V2G|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHxQ]rY[G&WiK; OXifO|6~_ش"99PpMmd]պ[[}GOmR`Pz s2LnHo$w리2ng~[UURXɰ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H0ms;g/7y^_7w?y[;I%Żi K۰% '&YLAT"(9?#od뿴| g7v;y߻[k[tVp'䲶Mod#h9K}wèA2-mijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ3OGLQx'>?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* @: #:[ʳ۵RnoUTJJ1bC&ʿh?oyqo>-L.--"|'!Hdo-r8>S\ۿ>wq{!?dFx -8>J|H6m_E 3=*KٓU[ -Y^Z?&V,l ,ةT+s)([:eި!s\}D[ a0P|3ne,POMHoWrV^en9+;yf7Ae{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/| NJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f%ɪ-Ė,| +F6ÖpTOY^usim0)h)̏c <8FJsOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C( >a~t-A.~m%-%iz[CެWgqg݇.um=ۿ-?r|>&cCeN OH< \Zj]헝3bI}V9^6(Bn᷂uCY5֠i616kttH 7lx`dU7Ğ]?Y^Gi.{kx΅eI˟1&m򬱆[/:[m~&q×BFVG"c 1_&I-sm3:yDK; AOEommUKI)".bb2O Zqe3L[7M+]tN 8-.gT[6i[X o%W̷*gWW+it746YÚvG$wzN&˝g5K p1Fִ?xB]gv 6ye⤕.whfV6~̈?=U]Քvy~Gl{y7F=G:ΓeZ~R77!^fhȚ;-K"I }*?7~ >GS7^i=:=\o,~/7:cߵj;g}=发?x+H4])ULue&YYs*XoQ`aj4j:"i(vy> ^ޢ*bX ,iD0V&?ٻ7[_ xM[WFNOM/< N?1$ W^ע[]xWǾ(]tU_IN)#[Qksj YQ#E$]Bd8U_x+V#*šuq] Dh'vg%kn>$hׄ)[-B./1 ]gT{2{rЫ?52_,lUfKh(S#!IX1"[.m>|UAj:}5[65:w1_[j2ʁU ڨ\5YMowK}:k>":Ez}̂hfktᦼD\3M%A_i查^MWR;Q:'AeѲ#cLuHLksY_Y!_[w"aX8 sGdUWU6//FQMbԮ^V\gdXrd-+| T?07QË@xO{ukCq,1WmX{C|WEPEPEP_U~.Wo?3W0f7}|_j~>9cfk ojY~ OfSn1[n>U#2*_~_RCx3XW}ëyL7mw_?A^ڞ*OH|k0j;u/;o>((((((>!x\ݞ; ^;2$S41mXD‡ܠ]xWş?αkoIpkwTŅ憠m%p,T2@c;gIѼCLiZ^ykovO"nh <3Ŀ]PkhzITRXbr .d M++2"Mn#! \iuմ溲mZh,QU0<(%OMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C(UG9\r}ȭs#S? |e +{ YC)W%OLڍ+-hLZ?Zg5Ɲw6XwKOܱo! ω ް6=>ol϶}sq9(Q$I'1Asun*ӭ[=ܖW2Go}q|șF>&2θz[|pʊ[DʕBL6U,c[rI|5[x㷷m5k$cC+)R}?9mo>wm;mun*m[EvVIo q/<⮙v(~"Buo+hN|߳ٷߙn9/q리14 pgb4{UU`XOOGLxB/Zf#͜9H>VFAКãY|m Cϳb'qh&d,BcF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB;ź =[-&UD.2l!xKS_x[MI[} ;+MnRdq3 ϫrXVzѲ6nd/c*L~n%`+CAER԰<[y+x?>)'C 2Oͷs[h9?|G|u[y#]5agkv3oxEŌ2uXnhCAv$1=hL"v>tꚶuK^Tu%=Y-sA %>vKmphV>fe8k!GD3#eq^-!cxD<B}xq@ {8Vxn)e%'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJ<i_Lof(~5 FH%#sx/~"j.-!wJb2I=GuN&]"PgQׅ.Fۚ"X3 O-Bs)fA2o;{6{}I̗ѭɊ(926b h /hCyP$y)G܊??9:W^>zu}7;xe/΅`΍\G kFEψmMf5 )MIwk8KH\e%-~\ǣ.t ()$!a˺10H2XƠUwu_蚵$Ԧ]VOIZ%6py[K RIu*#6~ m<#qk7 QT˽5-HLf"ٛdjonkC+Op &ICGǰVS)f.J N+_ $i3״׎W{Ye4Y-Y〉fLVwIA.j_{{NQ{KZ$򉶽 %ym$.gZ~ҬO|1+bFnhmllL,ۼ)C#xg5˽"oYړhC%\%Ьi |M0Y&Dſ|Du#E' jvwO$k5_'+[DfH!2"\KZ:?oHo`<&2߾򫿉~ӭa> xḵ:Zƫn{ǾἛhg[i. R$Iv4IxgOQk0RrI; 4wyKfܦ#uo,lğ֬Ϋ_O3ɸ̾w_!NJW]kZ>.=, MqeG,A, 2<WA!7_ڿ_iocy'^+U_4 ψ5+6H}QҜ\n& ze%RoV0$(rOj7֠g#巊Di |[C 4^u L|@ؚ}|Z˨0-g{XE-тY^XL!@2Zt%YkpKӼEfp]B.(^ ]:%𷋴WYBun|Dȅo$U H?ϰl~j66am۹qʇn>Me\n_, |9 K<'Cf<]h ״FHq{\"$Qp,Oqt?kM<1⫿;DZϩϢ4*dp4[3D(֍jw_&˿<[vOaۻwoڷ@9_I0yfF?a~]hh|ltoP|W+}k@K$qq{-! y>"y$DW@|~Z'yfMK}{ͼ DF4 <7y-V5cky?4p]w?`<.h-PnH̃ |YxWYn%,:|$Q7cȎ+A}rጱzo%Ѯڼܛx_;H3koo7y 4-aP]>?A~l.ѫ> ofy$8Mf{1WF$7PEPEP_z~/-O[zk!b,s HGtˎ5m"%Q>č𮓦MjZ}qw2[w1BFTryw`2I_ QoLJ<;om?Hi5Rg#t̂wJŒ-vT?0cUSI cf_'uSo0ݷZߕzwJj{/?!<a]((((((A[`i-捣n%o5.8S E=_߃o< :t? f~k ڼy0\mOw<9?|++ox:?ؼ%K!IE憢@+]g Gs^^g~_ ?G/Im/)FFPX9ۜIh7Ÿ8oFt;x/692p*H'`o@dmKyaWVɅ 8v*U 'Jѯow~wPܶejXLo,賒,{d HmY#:[ʳ۵RnoUTJJ1bC&+\|}k 4Mi$,frdM'I`ޘr7| ƛ;_ZIȒyma#hy y"~GHnO2y;乿ky`i F)#a#yF .}Vf}F֗H@{HV13FӢ*mq)-j6 7?ǜ[V}[y}V*ӷh}W>W{<ݿs?y_:-Wth揦xJHӥb%Bn IG* C5@;ź =[-&UD.2l!993#hyv[oUح3c[qo|Mf?hoow~7~3^ոĒ\[İ[ Pyo!B)RK>??AofG9vo~ˣS ٿy_?</c_2mmijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ Uoخ|/cyq~oueģ>Q}G}ӵtG|u[y#]5agkv3?/|_n|_6>gוY}ᗎ) 7BxFBm_-NYg4eCWGn$ݴֆ%mLvy JrYWχğZ]{O[&YKsɼnd#/0rke{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/|>'cⷱi-aVfҮ?gbnZ+nEDu Hc略4+QZO}l[͵ypţޢ@[ U-{2jaq%++Gхp;*qe%V{5_ลKo x(+tG؅ #nҥYVHo$w리2ng~[UURXɰqj%C2y.bKtԮV&fy/j2X Jrf( ( kxG.<9+HD6aUetKy@I>h4/֊O}«d➙o41Cm%h,Oqs<Me$H`V:Go5ܻz&oh[ ~L,XYñRW>RP=g/5mC\4>񉴩GkUـ=*kKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%Cy2*|M=>f c{9WMcCu ,B2$GЖD&q3vZEōŶO7MDI>q8 9G{2jaq%++Gхp;*qe%W>X>(^iVFb֞XIn&P <K59FVHo$w리2ng~[UURXɰ,K f۴m ^Z1v7$m ȻIRoxg+R_ikdGJ+bC/;>,79\ C+-xgPn>^ܙWS($Bdkar#=uIm 't֓l[md7\>qh&d,Bn+ſ<%K:,IsWK g<2 hz7*vh}Vo{߸soy>_&}ٿj]o?y~~-߾늲G_ \߶;G k/qbekc}c,1FK)?7`SRO YڦlޯYl ,3myP%򢷻&5Y?v|I{Wcx7*"o ’_3OB/k!5 %sZhϋi渰T70YDVIc.9b[<%\h>0*FpczOxqaS7sG|u[y#]5agkv3X(Ј䍡1)ZKZ:?oHo`<&2߾?XJ&oXմCS]AZګ#\A(f}o 4 57:~ ,?.vfpmVfV2Mg4ExcT6:Y[ 6&v s0?Z?&sq > ]n~fH}7 FmR md*{_x7Z^(Qtj退+b%VI%xGDnwIA.j_>0k-5Kq ۬7ͫ?(SC~^jא SF-}le^)f;xK"6%$xW[xHӼMj-:K{Fr-MLu!hS7][6SxD6_N^N;4JX唼jR[)i[Y$*Mʹo|H]U_ x6V0:o m~M(-$M8#ܽDw&Y,|AZM?}SF$hmn;iu&Yg2r%e$}\~ֳx_S4 iP6Wwa" E$/Img*}JG/oJ}.-BW]նS@ӴۤCLMu 1E,6eVeoZm׮/7JxPg5{-FƳGrvR{3~sdI7+<-aW^c̚N G-ψ!״HG+';C-`2?A@~5> V-?S%\+ݖR̠m%, 0~OS :։O nNG5?|OL:vk~U sGdU}OKJ.54K]!F eB|<h((((((+ʼG'Ov^^gڏi/zg?IXG4jo42d& FH'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| Pkv>*k-f.[ՎWm.A1kU27٤`);_kfjj+$g3[w[<֭xQ]rY[G&WiK; OXiym}[ϳ]g[vÿj][uwh?dFy\m 8]|HVi /ggO,# !DڌOS4E/!>ۧg<ć#E[oDɦjz|?eyb<3 lqF"0NF"=>ol϶}sq9(Q$I'1@skn*ӮDEvW1ǭ/owm;mkn*nD=ܖVɭ})o7|u>&@Zfã&( -?ȳbT$j3[?`f"5mZhI4M#<.6GU.پ@H[+L!Ũyg<㔌#EkaDo m.46k\4qr‘jĮXb#yڙ-ޒ?4 #m_[yy<0[;}/>un| 1.]ŝLV#oO)wǗꩬ>a~t-A.~m%-0 ]|.5~dȋab &< m̥$5[{EXeaehrB2e?Kaqecaۻ{-Q-Wndu+}6h?/lQEQEQEQExW>%O?X>x@ӝ[Km# "dudF :(ijeq{Xe>8xX]ؑ_[\2y h#,9er7᷎41u0i=Ė2,iH8b.pZEYvQ@`@=;;Uܕיags ! rXVzѲ6nd/c*L~n%`Vx;U>^[.\ m"iXb kIȑFB%߃5~3Rxb+]CI"YM{{1Fs gn֬hϥ ]B5'<$Ef Z6R͕>$_%oX~¿3mo0HCtW]\-Ś[L"i2JcG#BvFiRY} Z]KZyaG \y~a*xw^cu/mΉwrZ&h佡m(- dmbyV)|#6"~!Xæ]IG'8lexP #>%ɪ-Ė,| +F6ÖpTOY^usim0)h)̏c <8FJxRhڿ\/4Q8:ovO"iJͳMf+ j wso7Ki-i+K$33r>DmlxJojL`Gq>∣Xlt!."2+x@E$3Go"Z4>1EliEsr$(Q1q/oŚ?WU%;8+9Ĩܪ96D槂$xLL1SAdȓ1U٠VK'~P7&eo.Y7)g~)>YռKZ:?oHo`<&2߾ u-g|P}3R> Ԭ5xbYB\h;sY;xfHy5|N ~"Zx .M^u;.ImuhakI$xj$ʷ$j&:j;ux ^ά^+.eY+j, 3mU[Ö:톧cQou7.O'LNn5)0sre0yooPv{/!S[ Ɨ"C!3{mkr<<15q$<:"zcS֐΍iFh sU{,bF\5u'_//Q'+4>m*gqqԱ až(vdGj[Xk2I8EҍR.'e\r6I >"xNd|mkIqvݦ[N\ Eho"vMO~8p4^'MKšb_}2G,Rxu.gfY,)2 k u/`NZ_,4~do-!P>Bhۘib\G<λZ\w?`<.h-PnH̃ [R? ®V~Ӽ / }0lwd:Ym,^f1Iq6饷~5Y_%.K]iw~ShkkG*+WFd*H[R? £T?0U#2*?nH̃ <d5hwg9n|A^\Gr=]9yh{_wIX4 xOҭl DkcQywE?A@-aQ sGdTTվ7âW[-!{\ʪX? 6Y(վ7âW[-!{\ʪX? 6Y+?`}/\~Mm)|EKwqxN[ko6io.ۮ. :21_|Ro|{ڝ<%}kQ%(((((((*?2ogOOxgw6ڴ6i="oۂ4 r,Rm 't֓l[md7\>qh&d,BkrG|u[y#]5agkv3,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0xOs~x.?Tҵm<I{ !ݪxA/n[UK{uV c3ZO1=*v,]T ^"G$foڿ|oߟo/wZ5?y}_e-`yf>-Ϳ(Ki =\0% YL(+%*}\_o?<|}E*ӷh}W>W{<ݿs?y_:Qcھۿڀ::r[ۮ\-RyUTDUb ^θz#\i|WsmՊ+t " Q*#bj;?>+o7G~Vy7/YZgG?|H>ߵh.߷U?m^yt~_iӼO5WźFeEpҋm>IԮR%[+M\u!oFa:{kIo^-y.8{H2?YKyJ+h0{?Aԛ jWV:Zw<%Dsa$r˅GC76PrSķriQ_jCI4QxgxtR,$wU;uVV{vc3Z?-M*C)F,]dCxP(nloKnK,3^@kW/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RxĞ"Γைa xYx2ҩ3 {Uwh5ibgECş q -!9PPZßk:燼A<;4p_}Z8/b0_[]`oL1`As_$Q@Q@Q@Q@Q@s5~"Qi#mKx&V(+5«*\[ʤ<v4L!9V(*/cwr^d< M} mtOi)>ku\X[n`dtKO>4 |\cGdt:O V[=F~7א2OU]l tG|u[y#]5agkv3,iYsr$ l^HA&][kB=7/żY ǗZ=$ ,ХZܑVH-MXeY݌)hY7% t!a?4 #m_[yy<0[ڷ/i-+maO:y0Y61|¤ V xpjWٚOLZ'!-ҙquFL++][> z%j ^PH^[s2C4;]ua˵QC$g" aPfYxC^=GXOKM hmcмYη̂Q.'s7Qŕ=I/ov2 pd4~Z,{ee2bT|y+>ImN -5[ߤ׉#[3ƱEp!x&.i)e 5 xO 躾նD۬[c,k݇jZ|]xI֬P+>!Ya/*K9L;.E\O!>>0k-5Kq ۬7ͫ?(SCr,[K5?LדE Z怾 %a~w$K%cr'i~'ntR֬fQĶ 6C~5F;N浆ox3]ntK~*|eaxUӼLuMgc8y $|~аoҵh4m_ѵ6;=֛wi {we14D9M>g@5Ve/yCgm= oHjc)# `쫍>&C/U bSӵ]RSRӮ.<<` v ܿGWԲ%xOu+-'Q.>"cZnfᴽjK؋ϞaWu>:MJž,G~=cśFC,k"ϛlPy\_Δ}<7/f3L2k5Ӽ;㫟]o ֋ubܧXZT^'f(Z[%wi'Ӽ;x5δӉe3{4k- zm~]m[ͦ:15u,纒=y_J@tl+ȓ;_I0yfF?a~]hh}<7/f3L2k5> j? 7<Ck)>7on߿pxGho*O?71S }GGMOojn7ZJO}\}UEPEPEPEPEPEPEP^U?:&xK*Z>|UI|7DmnW⏅M~Fݯ|WPc[6v"2!#1,|-\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ pW-񷇴彶-֊>Ig|:i  \3L^ φYG1g*Bь3wVko]ͻ*Yl*A03`v49FTੑ~$J+ ѥxlKlV[K˽IתYqh&d,BkrG|u[y#]5agkv3ߥ^[go}uI3'p˕ WOTXZ+ʿ~dEOTXZ+ʿ~dEZO7{_l3⿁JdO+Td%I ( ( ( O?WZ'4m?-ߴiڥ\͵l2 V>W K0ֿ>& [6@ GGCX#dx}KٓU[ -Y^Z?&V,l ,ةT+s)(h&R=]iWMe[].&mF]6A,($4j! |m=Aỻ&$_;~gM &+ge{5R\Y(+t42=(ghtnv*Q5Ь/΅%ټ-Eȯ/|G|7wqo=!h$b$o0HۀAvޢ[kB=7/żY ǗZ=$ ,ХXm3AԴO]RRl>D6FՑ2m@I@ýK\|awrOҮu{+BiDd΃SI[E,1%#:[ʳ۵RnoUTJJ1bC&4h>*}v=?Wtֱ+a\S-cgt cHmR4#`;I%Żi K۰% '&YLAT"(<+DЮ> x?jCPt_VAx8$oc"۽I"n\UxQ]rY[G&WiK; OX^(m.qZMgwiM+h+@!a!.i t{?O wVRU/IUm'~_;U{?S*].YC+X5_"LzVDh2yvG)>Ķ(Ek2hZ9EG^$5? jvY˨+C}[UwDkT5%\ w2|Mkxg[u?WozN}mHix>k7\-lĨtesֿ]A^w&vڮ-"$rU'1fGx2-aOº-ɷգlͭo,votrMc4q\EkRXQj7OB`O MpE1'$kMKcP)Q'ttԕUYl@<*4 [Úle!/]Q*y"=Lݎ2Eig8kiwŸz^&xBa<+/><^]xkwtD;iɍ:iUMTH?ϰl~j66am۹qʇn>Me\ng k:Uo iPOg/[a"HDcpD"*p?}<7/f3L2k5<#7'ey]Mw}[&:wc&*58gӮ vxJ?[{)"w{4(P.|:c=4MV6}ߔi=[lL4u$ p"`w?`<.h-S>.G#Ryo_ge߻w??jxGho*O?71S }GGMOI0yfF?a~]hh}<7/f3L2k5<#7'ey]Mw}[&|]F<3w#0˿w?ן߇uxNcᤛFVc̢8䙤؂fuy<#7'ey]Mw}[&_g㷁fǃ5_h}|%'Ѿ֍ڮ<~,x~a~t-A.~m%-6lƓ ݽ/wp[Lt"XpHat@eI`iym}[ϳ]g[vÿq^;g x? xaxZ5WBF)gFUK8TWuo+hN|߳ٷߙ[][uwh?dFy\m 8]|HVh /hCyP$y)G܊??9:9/q리14 pgb4{UU`Xks=vb-?rż0>&zÔf~ +StK/>ۨycY痌mF['QWſEӛ+=j[*l2wj^KbIrͰ8풫LuWW:Ymoiû*)o*Wq 0fbv,EW䱍m%mݴֆVLEa R]J@Wo wM♬<;i"ԢT5k7e,?U>,/v5~dAL2yj7ۙK7I}Zu {}?gᮗOCoe2#EuH.[lf[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P?_ >'AOxs)֬Na,ve[ dJoU B=GKoa4V閗%Y-`ۤ;ڨq *.$2mY/fMVl.$e{hYZ0.bP"}̤rkKiQM3FVLhd{P6*U hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDMf+ j wso7Ki-i+K$33r>Dmkr^̚\Io,20ac`\9gJ\DI@4gQׅ.Fۚ"X3 O-Bs)fVMԭ_cmޮé#ĶѽHM3D]\ J?$`UW7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Jsୟ #Y\_˫]y_߹Q:ݗK/|_ƃoc0NWIuH/'R@PSk#FgY/fMVl.$e{hYZ0.bP"}̤rkKiQM3FVLhd{P6*UşM [Mg][cV6%&u%X0bh_46[[}+~R[Wp- m4m,q/,qmt}DGI>a~t-A.~m%- 񿉵j—Zh% Ҽ' G4siwAxUb9',JR5xG<[}&XRMcNo;HD{n"ܯEJN?-9Oux <CS[K+_.M[[n[6>;ҵ۫] אxGJ[[6onƒ%eKId.cGnuijN廇wTRߺ%T`Yc M:-uZhwZ啻yiEf4Z6+P <jz>/ x{{k+;mem[[{Xn 5)V;^#Քw"O[\i-Zit0[=xGW{G].Ѥh-XJMcVu OOӵho+hwjt*do;M?,Cs5[֣;"Y ݯRB>c`E"C,xoK6/ig#k~&V6֖N+i|[{yrOVs>ŧ@!-?Vukݭ emdK<" ƺ -cxetO(nN>JK]..bakycWb0:!eĺEn^F-źD5y$V5I|3c{7$yŬ-;eG&--.]:D؞^wgWQ߻ nl;wcVo?>P;}ӵy Q_Guۘt{WC- -7_k7~"Wm0TЭBD؞^wgWQ߻ nl;wcVo?./\gP}K(aFīFLk(K7Č,n|a*x'xZ5%#h~)g(gKXcK[X}yoo~gO_Pq;M1>,)D׶mm'?nT *B6op%{Wޡ_i> oϋu i-ֳ, nmF~n}C#l{gߙ.iķ?g# <+/pO|Nmx; o9eA[i~nX&y/ ̭+W=OßL>)~.jJ ̨e/l#cY]JUOU?.o?`˯GyW_?F wK~ ]|=P3 <;byz O]F~-w'yηݏ[_ =GW}cdӼWq̹prZ-p=H%h.w?g_y˅r$i3]$}|w&>(((((((*?$_%oX~¿3mo0HCjz'$ez}-5 ._@$+gF!^t}+55{'zI}}u{[=Uy ?/|_n|_6>gV#~7_>y˷g?o巗]e| s¶%}>g[.~S͞6 x%h#U2#ez[mq,Etn,Vw !31Gl"rXHZG?H>/hyUbfys?Joϕ~^<7o<{+eK-Z~B&|LƇ(ʜ25#:[ʳ۵RnoUTJJ1bC&մ k5;-cQ/u7Y'w*025JH*A6ă\ũk:WeN?`y.nYJ8bٵ:y`+hy~v|߳߷痷5徭↱ Ծx4'J5+M^4"/,Ko6Elch (W@=)-XD}헋`mˇ-̏RhRnHo$w리2ng~[UURXɰ>hV-ů_fXgHFX-Д4aeo&S]{Uе rLLKML7L ɔ[`eQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!: #:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KKNJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ ~~ 0| ImnJk̰3q9~go?`չ},xNIoh\k2yΗɱ &?7he` vQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!: #:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KKNJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ ~~ 0| ImnJk̰3q9~go?`չ},xNIoh\k2yΗɱ &?7he` vQ%][nHm6/-I 6md]wЬ"}GOmi>Űqo6CqzfG)o4)V4gQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!9 ѼK#[<) WÓa}yt%ᢔCv"HnO1%KY*|95~gU1C;_s,jV"+U_K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥u?[NH`čG-46B}eX 숶c,KL.%Qdq)> |C5 _e֟x/]H^sD7[&i7Zmi6j hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDݔws~wۼv@RF.FYi*]%4+QZO}l[͵ypţޢ@[ Uua˵QC$g" aPfY6گ<sWvͭ `Ho$w리2ng~[UURXɰ,K f۴m ^Z1v7$m ȻIRR9%erm>@:_ &0/TݡJua˵QC$g" aPfYa:{kIo^-y.8{H2?YKyJzd?>6tlIr2COx H&:`6گ<sWvͭ c^nj 5뻛)N]JXIc$S0dQ@7G?H>/hyUbfys?Joϕ~^<7o<{ 7Pd9S@.7Y#:[ʳ۵RnoUTJJ1bC&¼ !x~ ҼI7tXXK EDe|2s"Ȭ$+K߅|co Դ]n KhuH$,H*KWS/|^mHt=[GޗǬՔm A ILHy@b)GZмQK]Mc.gfۭK#\KZpWM(Mç -Wiu. A fC$FK䍤i)m|[_ojqkiW7w߭DmyDSyʊR"=)#|9Zk #zvk>jZnOȴ^w٥ta|X^0l=kñx7ZmK ~؟zg8ةnʊUg|@uO[ZmN]55q1}a{mHb)/ۀ]\[M3̫V#NEґ44 `UX]U1,m&i+Z5i߈Y:Ʃo亡XMhmxH"U.O^k:60|7-5wl+{mY[tK%|GJ'g> phz{ɥojmퟃ58/4صKim%;j ae@u*Cx~]ZӴm#xW#eo9TR?EC`C%ҵ}_NE]]4;</`UXQefW1,mu"w+Z6ڛhM4脽2ٚ"Xb&3+ú'~-`*m6m۷so|}ʸxw@!?ųUln*6qC~g6y? MCw&v7r|Pl{-/ פxηqΰm-qBW+ifwgxnnHw^Ja4Kf[۫8KJ]@O=Vٖ8\2zWt "O/C[>Uln*6q]>h Y -- Ϡy~6H嶙^pbebyCs ;xK|cVhT!H@DJ ?$jVv&JO|;4'7a9l<=0س"im-e(#d2yrfZ( ( ( ( ( ( ( >8ӼI|75;mb_ xSD/uY 1ZE+OT(8>^U?:&xK*'SZҬ t.U0`򎡔"EQEQE4 jneqZ>=YD6yq* w ,lIi3EtPOfe8k!GD3#e[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY#:[ʳ۵RnoUTJJ1bC&.o{w5CnѴ1yh HH`k"%KᏊiYZXxDK%64x t ZMf!hUVlPoGF[3+ hIjzf6hO7gt"G8}ȫmcS9չi };+B~Ȍ[qT|"?fʑo*qgž}\EK际c@maG9\r}ȭs#S5=OOG>?3f?ŜNyx&eIEqR~[{{/ӝd״}k QSŲx ,w^9'⇝߲VhӟMVwzպxNmorY\W=ҾiK"e Oiym}[ϳ]g[vÿqQ}VѮ~$Go1J']ffiFj% E,YTCk ×z$ i5 iV_L-![ #䴿;Mξmun*m[EvVIo q/<⮙v(~"BZfͣ&Xm -Cϳ?War+\b @<-2ioĭd>VAYChtbp]GYsDۨycY痌mF['Q?o-`oh5!^H^Z\LRz&oh[ ~L,XYñRW>RP?+x7>~1En^c[ᑡCx"6}ЉD{Ѕ Z2|4W5šVwzi7^0 5Hd%2j)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PܯO뚎_ xW{ Ւ -,[^f6*1R;-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&4>ռ=&Y8v,2 ft*JD|i/ i1oiCL}+֐[HA4aSs;v{)ciSlK f۴m ^Z1v7$m ȻIR7>ho&Ӯլ;knO3ɸ̾w9x7Z^(Qtj退+b%VI%xGDkz~N_G&ž񕖧nG= " ui%ILһAfWK}Ndf%uYxAD49'VO*xf #%"@ hf6zlquH4Vf<0I#[k$8g%)YPNsYjze\ZK˧bhdIR`LrFN_GO7f>ճ~^>ѨG}a}[h_y{O7f~˿~^~W)!k~x~J|)5͇.XIn.%NO)daV}#NEQ#$gVY/QV[2hv@M#_/ٿټxG;VV u -G7}l<ݘVxsG}&wt;o;R?yk7gy~_ά^JeY , j,U"l!"y^*K6$qvUWL(UH~ HEQEQEQEQEQEQEW|Y6_Kޙ=c7/D:$Q 6`9l‘=ּt?L/hTZMڎewqaqO K%F[3(&71e'1&PEPEPEP^?H'{NCp ̐7Z9Ee'K,2K#f[?`2n_K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥> ~@kᵿ/['Q?y\`b#2*e 񭏏uM.+0\\*g*~wG/Nʒ*  6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%C/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf]rwt iCgmc? 7Lc6ԭ%k+Y Lw>Zxžm |ckiڼ1Dѫ^I2[{\zRk7X_ PKy[IoO5_"_(!ˑ#o/%C[dmKyaWVɅ 8v*U 'J]vm2ᾟK2SM7JIkakC0F7 ,FgAt?5Iwq*1EskD:aiee{5R\Y(+t42=(ghtnv*Q忉{\k\GY K!vܕY~a*G%n#tՆ&nF` "pU6-nudzN⻛oQ_XgoXrQyW*/^o.켖>#R'}^yJʛ#x?Y4Cz6߳x]vPg-F *)ӎ2w_+tY(nuijN廇wTRߺ%T`YcےKi =\0% YL(+%9O#$f|w<ُo3oչ%Zv?/|gn|g6_Ps;v~G/6g7m?wm[KG% M1-'UDEX;.l93#hyv[oUح3c[qo|M:qi]ͷV(,[s3`79Fg਍q,Ӵnw+縄31t;l"XƹZgG?|H>ߵh.߷U?m^ytj6 7?ǜ[V}[y}PA$U;{vZZ{a2J?-=2K1u*QWJTN;O|#}|3ϛy[66Uoخ|/cyq~oueģ>Q}G}ӵU񯂯W}c-i4O4,iڂKGXC/->=%Ӭv< +HZvix Ԥ(u(gV`$j;?>+o7G~Vy7/\Woi:Ʃ4WZ# EoluyX"yq5,1f;[NJ֍ɶs'x<~,aRcvQ+4gQׅ.Fۚ"X3 O-Bs)f['HWBDcECoRP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%C/i-+maO:y0Y61|¤ V hϥ ]B5'<$Ef Z6RnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP8Mua˵QC$g" aPfY6گ<sWvͭ nkKiQM3FVLhd{P6*Uk7X_ PKy[IoO5_"_(!ˑ#o/%Cyé/ӭRN:} 6~,kM?mu{H"C|u[䷷]5a[3<bMp=yៈBPuBEь֯yK`rKؐ.JIcQ[yg>~ϙ'|?q Ot]>hS0 [9$!Cթi "Fng^^Kn!cfnoce"hь>ceX >[~N_G\o,~/7<>Wqmxgm\~c̷O16dI_aHtQEQEQEQEQEQEQU5mZ@үu=NNl{˹V(`UPIb@hxWśX~_ 뚑K}oWMbfGmpKn6NO:_|+xDnYCXm$ V \ؙ_.ШҴ/Ҭ'ᧆ)J2!u %W8袀 ( ( ( ( &nu_ k|Sq.-ϰ*>T4~Uю.#Q (o"ѭ?IG'.泵WE΁\#XI TR@5H$cG|u[y#]5agkv3,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0«?_ Ο Yb[S\ķ6E{YK[m"Eszj״KE Emz< [K[DϖPOMHoWrV^en9+;yf7? I5>|wqov:~ 5̪$h][[!n$Y;_k?tW~ѻgߛo/ojq VI.-MhbX-݄(i(ĭ7N_Z\%y±[2 > Q-hIƞ s 6V)Y]DI! tə]\̂-<Yq÷VX,C10fb7Ed䰑Kmqt,i 砘0w;*pT+~ҟ46i ƶYʋ*[^4L"U/h$i,|??ym3 lC"IN";ź =[-&UD.2l!}\gWg?|y{sEͭNmq\Dgh7Tefiym}'ȳ]hm<黷yųt|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHxQ]rY[G&WiK; OXifO|6~_ش"99PpMmd]պ[[}GOmR`Pz s2LnHo$w리2ng~[UURXɰ=3OGR'B3f#͜Hxy>UI1Aۿ>wq{!?dFx -8>J|H0_ZwSͽ"@"J:`iv_)fF*=_$&I|j7yahbhP-g U9"w;umkn*nD=ܖVɭ})o7|u>&@W1íx]vMvc '[d _$WObCF Ta:{kIo^-y.8{H2?YKyJ+x~.O-OGM5R˥R,8n 2/?_x'J~XHO/\k!񄰬$󃬑](ŌQ{TVH-MXeY݌)hY7% t!aYG|7wqo=!h$b$o0HۀAvޥcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹ m 't֓l[md7\>qh&d,BkrG|u[y#]5agkv3$_%oX~¿3mo0HCjܾfe8k!GD3#e3okzPqI l,D'A|͹eA?4 #m_[yy<0[VH-MXeY݌)hY7% t!auzԻ>2x~k->i)6n:V tw8핽V9%erm>@:_ &0/TݡJ}-fX_|3B5'ȋab &< m̥mmijQ廇oX:%X7b`oia"Vko]ͻ*Yl*A03`v49FTੑ3OGLQx'>?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* @5u2=>wvW{e}ؠ_gWmb > [܃AmZѼAmE5515!R4 +4r3[wVp'.㲹=od'{}żG)Coռ3^.<qwZ5#_:I#o0J.jwIA.j_?}eif:;lE\,~7#!7c6Oo5[}vz m|K{kx[[{H-$Iiy)+۷fmm KHaS'tb",ͭHؖpP7&eo.Y7)g~)>Y.k 7 o3>#o6Ίey1"J2NWPu >ZؚF"GVbs4q[y HpYOxW/G[:տt&cEZK(D\)E1b#I& $*((((((jzMlM sȫ,R,H$YT [҇ohZQums,V|Y!-"Z"h?wOxIQ󵥲LQ$Qs"< 1`$lf[ 4E4enƏG؅ #nҥYkEҢGL.^PVk;VTHx'@hdBr5¸ǁD{B}OT.Xn~۳ryqG8~VBn[dW>Hfg| P余5[{EXeaehrB2}>3z/izmίYT"$DH2_R&bcٽWMԿ WOݓN[/3h&ugeC[)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)()l.,aSLѕS?b3xp7;Jf$Gqnj*nfyKGɼUQ(e(ŋ r;乿ky`i F)#a#yF .Y} Z]KZyaG \y~a*ܗ&oh[ ~L,XYñRW>RP=Da:{kIo^-y.8{H2?YKyJ#:[ʳ۵RnoUTJJ1bC&)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| P죾K f۴m ^Z1v7$m ȻIRQ-XD}헋`mˇ-̏RhRnKٓU[ -Y^Z?&V,l ,ةT+s)(ʬfs૏#78hG̞#2;ƢnFY(W$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wSEh?Aa+xÚM[4A|Z| Lv ';Gы߶?O`q%-a|ǹVG3%R\O'پx-n<|Q LYe-*Gqnj*nfyKGɼUQ(e(ŋ p+!_Yh.󵥲I&~tGmXwyt#3 D Ijz|?eyb<3 lqF"0NF"O/Շtn;ռ҂47k!hKv):!vⴟdq!E4 gPt&U ,mgg72.dV8H=>ol϶}sq9(Q$I'1Asun*ӭ[=ܖW2Go}q|șF>&2?5qe3YXmuNeȱC5dd)Bah]PKi =\0% YL(+%9=??ooky뿴|_ n;w߼[kwVn.㲶M|'8K|t˱Co)>Ӯgo/{_eF7sV;gͿq|u[䷷]5a[3<bM?jz|?eyb<3 lqF"0NF"SA|%XU3jv2C1#u&([9-ߵDk;OmڱE~bCAAa3?Dl]\gw쨥tKܩ_=$سa_5Y>VMy-՗TU88xddXaqJg];4X}*o [5 ƶt&*=I/ov2 pd4~Z,{ee2bTs;v~G/6g7m?wmyUx V๼׉y4=kuđǕxʌ dW0ʑ]vUdmKyaWVɅ 8v*U 'Jijn`x[_,GmdxlI*5_4#0Zlо6p̴>l`)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| Pke៍ v7t9iEORGd-fZ+)BF;,MDCЬ,$f{K*O(K q*G&2LC@%ɪ-Ė,| +F6ÖpTO_oOB>]|xzt]ʾt/W8ihm He݄dg'ho6 Mibaj}KR!uK`,mfEu}_&y-c~$n<}mOLѥXyv֑BYZT$l$9;]3S,^6ІٟHg+R0фr1t&6_gg}P#/Dڌ?"O9 [[qFӴWi-90D3TFθz[|pʊ[DʕBL6U,cPO3ɸ̾w︯ |L|c ցx=Nzoj/C($m<'kygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|{?O wVRU/IUm'~_;]Քvy~Gl{y7ygc$ ~e/u]~߲[&yMe|^Y?%߭YKWg쿿$yVɷ|gq|y>Wqmxgm\~c̷O16dI_aI{?O wVRU/IUm'~_;u\xiǨ[yy~tW-&!6ǙWw{]Q@Q@Q@Q@Q@Q@Q@xWş?αkoIpkwTŅ憠m%p,T2u ¿ i/MWM^$[hl##(,Up4ZNYiq%)os3*P^YF݋1$M[NcVZ{o鷰ͭ夫,3$GRC+)0$An ( ( ( ( ( ( ( (?K{xOӵ#LnuK:o&/"n*/@Y>|-~kk> wF :@)3fkI:F +j3xmCwě%\_&$ZA_E/s HQfo:Vb*ʞ/t]xNMN9Mim>6M463hB'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PcZrKFX}΀<tg M`_01C(3okzPqI l,D'A|͹[dmKyaWVɅ 8v*U 'J,f[ 4E4enƏG؅ #nҥY9'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJoB:w?ftk"DQC3?#F_J%ɪ-Ė,| +F6ÖpTOSF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB)l.,aSLѕS?b3xp7;JfVBn[dW>Hfg| PWîj}U|wsO:GZӣ`%>r,or;YîXgo2ĝ"x;PlJGiެ7eRXo,fYe)06;(sfmG_ifZcQ[yg>~ϙ'|/cBޭb}_zcMnՓQn$ ^J35#T[kC[/bmy[B{,GjHd)kdc'߻Wr[mFo?~K>yŻ_?lؿ巙ey7 =|M}?q|5o|0!a'Qh1k\yhB72oCGCt{}Nsj0ڵŲDbMtMn d` W?cN\^_>vϗ;|G#0}k?jO7ngj$Gqnj*nfyKGɼUQ(e(ŋ zf?hoow~7~3^m?Jo}~^+wG$foڿ|oߟo/wZ#jIqnkCn&ICI;IVSUJ9,JYq÷VX,C10fb7Ed䰑@2?y}_e-`yf>-Ϳ+Vi>++Gynyyy/Eնz:|Wsnʖ[tʅL ;Q8*dkrG|u[y#]5agkv3ow~wUKvZ ua2JO1M2E*QgsgG?|H>ߵh.߷U?m^yuTm7ow~- VCb|ϴ}?nǛ3;O5dc'߻Wr[m]q VI.-MhbX-݄(i[vj]yf& Q(+/ xS?Nk o%MN+y1MxsydY;Iq L] ռ9>*x̺In5"&K)zG1!4GdzQ⻛wT;T/`ghrS#[;ź =[-&UD.2l!<*oDŽt|aGqAũ^q4[EGpKhv4?W߆Ρ]ZQ5kdiKmF4e26GO|?}/ϛϺ_|U -[PFq)3izۚ/-""FxpU]Քvy~Gl{y7C~og|Fmߝ|6|i$[̋VXz^/n RӦj NVmHf/-$6V2U[—MdPuDwZHȕR nc Q^U cC'*,TG6oh3<2#(h41.c l ( lv^ OZYxWna]= ԚbmZLӼd47 du[}2O8MJn`mOÂibY$T*4`0 7 {7o0u>MVŭSxCxg&Xl-o"qZ}vU|cv>6Z:牗PH!ȫ!IL*9 Exσ~'>*Ӭ5ߎ:~xtx^k3BmCtQoU"8MA-]ߌ_,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KDa:{kIo^-y.8{H2?YKyJ>,/v5~dAL2yj7ۙK6T`@=;;Uܕיags ! ImtՆUݭux PQB6ws~wۼv@RF.FYi*]\,/v5~dAL2yj7ۙK0Ь"}GOmi>Űqo6CqzfG)o4)V$wU;uVV{vc3Z?-M*C)F,]dCOMHoWrV^en9+;yf6cZrKFX}΀<tg M`_01C([.o{w5CnѴ1yh HH`k"%KO't+ׇH+Z\;p yP9f1}WF}-xX_oTj>?"-0d(>o2l'&$z wv+}2?7}ǜ3kyB~ xBVS⟝Ο =X%xR ^󏳨c,/v5~dAL2yj7ۙK0Iqxߊ>]ީ𴍛:[4^D2z>~дC-,.--Bv<2Ce+I)Q캰OMHoWrV^en9+;yf7?߅^ռdu /W/J:.b-%ż,I,q+\0_̭@ih6_hCy}O,$y G܊&?88#[[wVp'.㲹=od'{}żG)Co'm/|;:u1-4sakؤy!S~m.#MqR}V?/Zf?Ŝ8I &fF2Eͣ)| ?ȳ?$<<r* M3S,^6ІٟHg+R0фr1t&6_gg}P#/Dڌ?"O9 [[wVp'.㲹=od'{}żG)Co? FGOgGywngչOiK+#7>֊W>IdLi\=??ooky뿴|_ n;w߼ [k[tVp'䲶Mod#h9K}wèA24>1EliEsr$(Q1qmun*m[EvVIo q/<⮙v(~"BZfͣ&Xm -Cϳ?War+\b @ OLm ІnYHg@mLpqG:6:O]eszOy*R9R# z|:?m<1,sQ6-HvNb(V?/Zf?Ŝ8I &fF2EyխqᧇDʒ IBomEcbͅT2|#7i6b7_ص>G9\r}ȭs#S{I$so |F*>%,aEPk(((((((*?RP>V's]!PK U1b(\#HUmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W7KaqffҘ;ÄmѹT5DoB:w?ftk"DQC3?#F_Je\ߵż0k4ݣhb#nEJzm 't֓l[md7\>qh&d,B` r^̚\Io,20ac`\9gJ\DI@W7KaqffҘ;ÄmѹT1$wU;uVV{vc3Z?-M*C)F,]dCQ%][nHm6/-I 6md]wVBn[dW>Hfg| P余5[{EXeaehrB2%4+QZO}l[͵ypţޢ@[ UmtՆUݭux PQB6W/ j<+)b<7j*%(/*[H^KIG ++jZ~ya|L(us%v-;.r|f.b̈́U~K+LO ٿw?<3.O#$f|w<ُo3o$jonkC+Op &ICGǰVS)f.J Ji?gioo}oy9~+f3~fQs?Joϕ~^<7o<{&zÔf~ ض%Z>?/|_n|_6>gV#~7_>y˷g?o巗]j\gw쨥tKܩ_=$سa_5$U;{vZZ{a2J?-=2K1u*QWJsG?H>/hyUbfys?Joϕ~^<7o<{oyl~UK{uV c3ZO1=*v,]T (sfmG_ifZcQ[yg>~ϙ'|-nudzN⻛oQ_XgoXrQy% [{x-^$[7iWy2.\mTmDt}ٿj]o?y~~-߾ q᯳hy_mGyߓߙm{]Q@Q@Q@Q@Q@Q@dŚ+oĚΟo5R-|BYFO%kZ'_?9=oh~9Эu :4[gtkm!*ee8<#t?L/hT|;oGjX ' \jK{G'̰,MY~JT@ hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcIDdo?VoVO?d/^)E?!Mhh~d)2}sUUPgQׅ.Fۚ"X3 O-Bs)fʂ hGggjے,?cLwya_6$!k??i;ƺ_._K*Ӓ[/Z6W&̞t8`lcIDџK}G^l[?nkOxHab &< m̥ ?'_ R1Z߀YQkojR5QC3Nks?A:'&$z wv+}2?7}ǜ3kyBV9%erm>@:_ &0/TݡJ 0E5 ONU xe%%6-0J:G>7C.hџK}G^l[?nkOxHab &< m̥* 0| ImnJk̰3q9~go?`Ew 0E4}OQY| x%Uu6.(B@=~9%erm>@:_ &0/TݡJ6l][[zfj$8aU2VH\IGg(s 0F|<5-+LҠ| yWRK#0`Q >A Ҡ6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+?Ewo?_j<:UԶY)h0W$2Jua˵QC$g" aPfY6گ<sWvͭ nWύP}˚?Ew9%erm>@:_ &0/TݡJua˵QC$g" aPfY? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.h hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcID@:_ &0/TݡJ 0E5 ONU xe%%6-0J:G>7C.hџK}G^l[?nkOxHab &< m̥* 0| ImnJk̰3q9~go?`Ew 0E4}OQY| x%Uu6.(B@=~9%erm>@:_ &0/TݡJ6l][[zfj$8aU2VH\IGg(s 0F|<5-+LҠ| yWRK#0`Q >A Ҡ6گ<sWvͭ m[NJ֍ɶs'x<~,aRcvQ+?Ewo?_j<:UԶY)h0W$2Jua˵QC$g" aPfY6گ<sWvͭ nWύP}˚?Ew9%erm>@:_ &0/TݡJua˵QC$g" aPfY? 0WZfi#\xSMVf-X[+k0˴w3:G>7C.h hGggjے,?cLwya_6$!n_K*Ӓ[/Z6W&̞t8`lcID$xjZV}AhFa A|@K/KT|+M_42Cy N]wG֧$_Df04/۾$hs\ ̬"X ^ҽG>7C.kįxďeΕu-odx'd-0 3Ҁ=Ho$w리2ng~[UURXɰms;g/7y^_7w?y| kZ|%ݞ^Լ=y"w,5exيDb gOHӿ+O𥄗W6kq\] %_TJFPֱ|5[$m5`[v$C+)*R}%K[mq,Etn,Vw !31Gl"rXHwQ^ g&'/aug%Ǔo1kBTiʻxi$9˚~|S--UC_n4 (1!1v^[mqt,i 砘0w;*pTGqnj*nfyKGɼUQ(e(ŋ =|EK@|_麮aqEJpVa*C `#O|aUwԭ }xf)65휪CeƄh}\gWg?|y{sVjIqnkCn&ICI;IVSUJ9,OaO;?`o\y_jGھѷco?}ϟ;|-G/PFO_]_׷Zy$jD[GOڲ``B3q+'%溼wW-- xv^$b$o0HۀAvޥvVz%h{Ҧ|"2}KV5fMW[ӥaH岄-㸷;Ѽ7 !+Mo5oiz5+$3cqd31dks ?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip)x^?dV6}?>H4K{bś!;8J>=Lj|w%ןj⋫Ҭ tKBgWP ( ( ( (xCO.OֵM_U1]8K/]4pn<!ށ" WߎwMi<\&ww}jbp_nh&,ys\$!CK D@<'x|:k~ Dῴ\[ɚ$}fVsw, <5 1ìiǓmZK3m}o /QEQEQEQE柴wo|&/x_Cu}'LEEin[K;K>P"#wxԘм]q_}+࿏!KoPҭefXRYʫ@'=+.l{wpѴ1ynCơH`vk;n%B8|9j%dž'ya2{{u8۷.%H6 h|$ַ7s^kNsG=ik.Ͷy4b17@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPf|Dd(#N % C *A%integral$R{XZeyV\y#g{F{XZeyV\y#gJFIFC     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((|Y$b/[հ>[m95,!smcm[ukJ;h+kpp_L>Y_.PExľ<ѮxCN7B]ys1Ql#(#s$*x??V|+Y '<3o ;>uOal,E;=J d\W/h^?eZE g'P @$f1b2@’;Z((((.|_Y֝wJ50H? coCI٤)Υ"ݕݻ-ߢ5袊faEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPMZ;鴫ˋ{=IuiRcj]C`@eGi㏆jľ/u{{e5F`"EEX?.(1Pj ;Z[ㆯc⛍ZU1JIcUI7u[t%A@X|e|]C}KP>y~wao&;sz1nJUi=z5N*>;YN/g(Uc(=R|]SѢ?5ϊ_Dݲ{oEϹvFzy^9ƤT~gbpU熭nh;5%u6QEhryčwM[ Ckfգ{Q2Iv,Z6yM3+aa >]zx.~"ӡ]V-#KfKtvQYᘨgkP)lE>ti\D.? =,EW޾ݤYhǪwH+Ҽmo6s4>gkh'7ZFYv3GU«vz5}^)WJb^-[N-8I4I f//? $_j>^~q5S8ՂtTb#:rq٫f;QZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^gw?i/m][/[h%0cy&+Hu\)ʅkʼG'Ov@pZUn—ݴ*UlQ2U((((~1gMW ?d?Z5|G~˰3̖ c  :ВZ(G-O-P)Vw^ޗ{kћ-Ot?cWſ>VHgů,_2@'iVs9S^{j>4=Nf[!|gG`ϴ$B_ ,~24kDҵ /Vk SʙpFn`FGe4o񇌼;sw~%9)T.۔0$$*ԦyZӽO#ў`ѭC N*xH?{K_鿵7>!,~/[[[8d-pLn)Hyk i m9ͨjNO jWޥffLqk6CF}o'ÿ:~kZi~$K_-{1ܤ?)#6joÏ~8ՓG_lʓ(r-dUHϕW?z|/_u?x৏bkK ,lAr%BSO>GX/kds^G c+7oc)7# >_%o 8bմKFK ;8'yov_fh8|;ݖݥqNK> Z/z/d[-& $  X=ztȬWWeN>OrQ{݇<יk}?lEAP]E%7$/b2A9]5 5'`DiV/S]"NeXW-%/y,x5J,eKm~ hxwzuoh:ܶ&vd3E*rʡM>'> |Kj^l4`KJL`2(<'Ҿ7|4>%=-믵. 7mV˝uK/cyCQJ7( 7dakksi+[4^cnrpEpשo.utu _W$^ng+|Zy/d_5mf"6Y[KñoBK/9Y6ctśw~0X3~h3RҵMkGoo,7QFTo@O>ÿ<+qO?=HkͭZ[b;*xeH`*!mv _ɣƚݝgkv46puy-w EyJxjyGF>s8դSf:2q$p%#bċ9.[&Ot?B__ o |2|1aI$Mvy-frҤw:3IrKlrB7*|9Þ [o%;;>-_pt*I*xsE77kIEI?k{d/|SӬi7iH>yp<4w8«o?f#oBs?]>5;4,3=Cq"ʣQ#֚JNJu2u(9ԡ4ť5Q[pQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW|YΣKὦc /J$VRM" Ȼ6 l}ּ+ώ4~_ NX^$T4KV`C`LVJS 9`i6SiUƩq)krʠFp` uSIִ-B.#.#Ki-Ue "~gS:*`nJVڻvKŸ |ЧѼ#diܵܐ}YJʨ[t|95EmFT`cb+bʾ"nsɶoVQEYQEP±R6dy|ȷoUu, O2MyRI-;s;OBB5]?QλjV&u;wܡUP@_K`$y+OoՅQL((zMޡ囦G`.rۿn/̩DhOr9E5d~jAT?Noԅwvo.-QIn`_ˏq>ZmE 'Fr]Fx#,O'燑y*!NȒWbOT"f,VW+Z k폆F"Fvff 3*(,ʪ W%|K欟پ 'dPt7EypI67 X)NϕjgR>֣妺ۯdmv[/SxWFlX-JݟwĞdB >'mɨiL+mbP2A-ԥF;  騢ch#z֛o (+#мiat];]A2[jvF@p 0\ZRiIY )ԝ)Ԗh5 kZSۦӕ+ئv8rmB꫶9# /#O`/8%'y+!Nܶ ۼJ?|V~g:b𕦭"?xVmukei:u7Iv,y|XFҗ-_x.o>j?ub[nnᷖIt[ $V#TN@W'-,/W4V;}W:l.Ù$.]݀A0Ah(((((((((((((( }nZqt,N1ǘ興w;Y%EjuKV}–}}#-AP3MAn e0^HȌ-/j/?Uچpo/s@v70U")ڊ\,>/B*'VQ[={mdԕ MM.MJ3g ΦJdyq:(^LD.vK ( ( ( ( ( V>%ҧӵ r8& T$veTG5 BǷ:Fs5m#Ai{KW :A3o{~Ot khl쭣X`$qFEQ¨ v_Ǩ R*d]_h?=4- ZTvi;33wwbYݙؖfff$jV$:sI9ݽ[{QE2((((((( c]*};Qϴi*# C+*@5m3Zƙy"c A;Љ5fcUUrDL[\v_Puk ho,chgS~=Q\ww Ѵbˆ3HOGP<]Դ2UetR+nbXLV&Fep\0(_stJ_dWiÝsUUfH   V|WOzmxV$Αyi>4sȢ9j %$ Cy{ #_ [),V@ij't CmcU~ȿm= Ԡ[oxÓK xdytV/hyq$vn$yWؙ_.ШҴ/Ҭ'ᧆ)J2!u %W8袀 M[{S}鴴Wu)ً7ig<~U*[tP>~⾟sLOxF!hYeBBH$KEY^U \i}Y$1T[xO9=V< #Kۭ4kN5 Yk[B%O,E <!#(((((Ot |VrE)uV ܥs ,0XGKZ oVuvrLP.oooy"k{fBVXՉ3\)䡅~wf{ÊƩ]K뺃!TC$ ώV +f4}/-H7 Xˤm-n8vO_ |7]X=}YmV9En cohXK!k'wm\U)я,?'/utW|#>8#lQuNԭ7\]M[z+]z6w.-dhY%kZ ( ( kI~k=Dže"Ś$VEoۖ)X w>L"EQ"F@okvknytSKYԴE msch&#Ɏk/@[KukYVFу,r!ꎒ!WGEeeer|SZ뺧|Uu{NM/͈bX:nj:/wPG@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^g~%~_ gGVIsa)(HE`+݌kk¾,o'4m\ԏH[zl+4<;k[pA`w @=Ilt *L,6bBhUUM&K鴫)5;{{=IFiRz$]Cd( U(([JwlPCG*$ly'"veCaw2[xGEҰK,֓/ 䅘K:[M[I3St^%u*0!T$EyW 'W_kR (Uύ ɖ(#k( 3Cۭlg&l]_׎2>Ĭwlb G*$O$l@:( ( +#,a޳Cc W$s102N3PMs_[2 X)TQ|WV_3uaf!|ʝe~ *j]X[7[qɷZYv _k+>ҏpFZwox[~Uwww%f];W ?q|GDKh^BC򇷚4+J0Ȩ 2 x^dbYA' $0,nJdfZַ7:_vo:ذ[+9Te?+⧈32O 36o"Dv#;$8u/`2Q#?4rA['}HdH%$exhch5TOdItKE<^!>$98Уvl"@#FtMV*(((((((,xfOx7ڵ$:F!CržUq$Һd_|+o[nYM[yc7! V#*A@W&N{o}>6\kjRfKЪ2Fn5 @((((((((((((((((((?|SxĿh_bִ zϖy3k$[ +<: >>kz. \γ_[k 7OiunҴ[VPxb|Ym/>|7E,ﭼƏ΂T1ț\ AW þ*Ok^15{)u,b;2S]FJwN' o~ƚ߈t&Nd6Lz\:hEvJ4>I5 kxGjTU*pUƜaZ?~5|e|JQ/ulWU (8Š((((((((((?mRK~g|? Mkvʠ7lj< LxO:_|+xDnYCXm$ V ZZZ/oxChgc2BL%D v񩵈zQ@Q@Q@Wcm?@'ֵ'B﵋}K}Zo6-і61aVo՛Qook{]xrDr>mjt)d^#nVOܴ$QEQEQEQEWοE/OG5k;-WUּG m,"r1+]t5ռUQEQEQEQEQEQEQEQEQE_|xow:ŭ^%¾Se'eRpHʂ=ּ+ω _ 1 x&%hhdM eZNYiq%)os3*P^YF݋1$M[MڎewqaqO K%F[3(&71e'1&QEU w_/O:ͼa=w;X2y$y>!I-߄|04Km!T#wޜ0C+_?c!<~ߌ>$,}xIƙP#ܯ7@ 2 $^u BghnM%226ۧpJ {k?9 /_&&q}MJw[O"pΊ#]B{Ĉ[B<^o|;em,,uecJFu ەCnxռW#w<m?/u׎ﴝvT^\*4 f_13_*/|!hZI 8&1}qNn`c-19NSq3*c!<~ߌ>$,}xIƙP#ܯ7@ 2 $ |UF|955~/ҤѤ#RxH%sͧYxSZj <]T,M;2:Z0|xX-t}%㷺fK?=ؙYܑ~*[<^6> Ufgeyq*nyr%_zmޠ0סO?]/G${ ;d.˺,6MFS1<-Mxᮨ_E0RF`nV3m[y@K@_a.#i 4 W̡fX<#%.*[ǟG~GFoMao9/ok’oaYwp2Ŕ7(u/mKĐ|^4 jyG:%YYm}c7䲷}J Ax)(KI2 E|1CqkxJeyjSxAľqIyf)PZ5iƸ+;_o<mq?M8a>kbxdٴ%s(Нb<~?(J?)F9@'}&ͿOF4m^LT5{M7XX:Yxą#ll(h<;g^5pM6SocmzkEw/F|iL-xWE4sN[}xoڒش3[wy3`-Eel"/W1:znk/Ŭ*j2xU-K+HVD! "x x3u)ѧx/;mY.`ٰ`g>5_UPEPEPEPEPEPEPEP^U?:&xK*Z>ӼI|7;b/ x_Dt @2KX8$eAETtt]*O{-!KxKUB6.YI$juψ#A®#I!d+-Gls)k+CP.oooy"k{fBVXՉ3\)䡅~wm xWMlS*!ieBiY(.ąDQPҞۿ޺K *mjWNɦ`&wsCo čcBA³gSr%2@m-ה_i-c+ʼ⟇ ̝n?˻-Fw#lZ/?;U5?~ -:[IEylH6JϰQ@xC-|sOei4"[w$wr.ŋ$wGxI Po W ØF+ޠ6uZ(7ȿhWL!2_ԴZn-&"P*HRW=_ +/wBI6JI$fyWs!UaU@h* DϾ6z_b,i<[IDf0R mB{oWPuŬ[7q&B1*w^T3##/c-P_~/x\'&DnmZզ&C" 5VI+. `|_/GWi66>++jGt7r@+FyHb;aQ9bcPEP^{RxռC,1} ՛L0Aw-QsP=֊OfxN/ [x{XO4+g{n\9(ۤ-Mt[ x2ҴϲşcڽDb&b>E\''Sÿ |1OZV_xWhXV#1DڌGȫ^kC8ƓkW5;yA+K6דEE#<E2˜i9QCHZ(7+׺`ѥԦneUGbwƯ"勷WbjAw/vf5(,/nJbD*yq # (?dx6_>)񷉵/B^Zl[Tc@\) +k(((((((ciW{oiPܫ0DYwb$ 5+}˦iXԒrzm9(V4I]4ٵ*KKfPLncwBN Ge8b0O|Q杩%ʗ<1B ԩ!el's3TY?|7+Olyn0|mvoeT-+ jGo{ *zߣޣw}?Ol-lma0G *Vh-&wl(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE i~9n.e6}m4~tD܄2Xg kQ@S:[#w_l_A|SƑ4M^R}$m@*[~|Vo2vɸ&;.$ڞdch((((((((((((((((?i&_~+eƣ^KVy^UH@ $r'/ V%'?t#Zy_} ho0[{HFv6=֊_?x~2x3ؚΩAmgyWZgplKgmg\ǂx{2ִtWRem^Vv,H ;:)R>ǯ ;}CS.-4MU1RBNXon-44G?i 'Wi::֕e[vpiwm%ʬxUxu AnU  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz_>8!?|#AqCP4G?i 'W@U  @ÏN??^EyW3O/?:f_uz=J5;j:m/mugw 8!Z(ʿ|#AqC4G?h*i 'Q  @ÏNU<??G3O/?:Vf_u>8!Z(ʿ|#AqC4G?h*i 'Q  @ÏNU<??G3O/?:Vf_uu^i|;wU.ٳٻ_';6;W]QEQEQEQEQEQEQEWxN% V+φu~_ 4kO xV"i^h`Eݼ鴖!eF UM&m;J. "cYYT#3rN n ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<7[k Յu n[Jϙip #vAk6s^^ڦG? :o4E2=ƚ9]Bdܑ}+x[:_4+]cG]ѴNRHxGWGº:2)Z((((((((((((((((+ώ4~_ NX^$T4KV`C`LVJS 9`וxN% =+Iִ-B.#.#Ki-Ue "HtfCbB%I/EZ ռ9Kqko o,RPCEsn#%LF9Q@|*^[ѵx**K 6՞kk BDh((((((((((((((/kP|$.7<7;hvsݽ̉u-L-7A/@W|YΣKὦc /J$VRM" Ȼ6 lm~Пu|7.}{<'x X@{,kMwh1XymZ??ŋm'ONJ^)^ԜQсqlym)J@e6YZ\_jBI}v,h' \W/h^?eZE g'P @$f1b2@’;Z((((((((((((((((((((n/#izK̒Mr~fD HJ=HC^U-77uW|wϤ "Z^mHDҐU((((((((((((((iw w?꼯yUW|9;a4N{ctG-wљ>ƌF7 (V~%yj[:Fmo"ʑD[ 7O5}|cYjͮ/jY35/5}m(o Oq(8#?EW|YU%?k:> xu(Z/hyAw66vm9{SI*=NRHQn--e(;R!KYn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >$x {kNTҵAm.mH bw2#IGD>x }uc[ִ'͗I-ݷzʛu4?5+ PD5ð%P\Oh.TYV-x@ukJ}GM.mo-%Ya'P":YH!  tQEQEQEQEQEQEQEQEQEQEQEQEQEQE_~!xW%S KĖkwY aeƽּt?L/hTZNcVZ{o鷰ͭ夫,3$GRC+)0$An((((((((((((((((((((((*/hxWPInnVCld䘯fH̘ !6SVlu*L6exJnee$ -^i {ן=ڟm|5/ {Pie]fªF$qHTk ¿ t?G,;n+8^R02Q Oc^{X OLtxU{Du$2CAVG'Ov^iNJ,<_ԴxJ-oCSxO$أ+XX灀h +ʿEw? 0WZfi#\xSMVf-X[+k0˴w3=֊_ 0J|!H<n\WRxfHvB\H#8=+s?A=V|&kzďqM[5dlI_.CAܨsA?EwU*7>/GΥ:T7o<[ce ZPĒT$|o;\AƷ?Eo  4[eeSugN9b0k^|ďo>>f^y*Dc!BI'>|amj< [xXg{ JKkm2[a,{_|o;\?{ o#RҴ*KEu-3팖 eR3=֊G>7C.ko>ּY|H<%UY xV9V,`k#8$8 u+o?_j<:UԶY)h0W$2J?Ew5閑[o_M^4ţtB4d0HH#k8H# 7o>*ּ'HA koU⿉ZeVkVm i"m+O-!,Ao2Aڨ1IEw? 0WZfi#\xSMVf-X[+k0˴w3=֊_ 0J|!H<n\WRxfHvB\H#8=+s?A=V|&kzďqM[5dlI_.CAܨsA?EwU*7>/GΥ:T7o<[ce ZPĒT$|o;\{Ʒ𥆧o5 [fQkg+Õ9`27h:f#[ϩ:5ρo^J%ÅPrI㏄|iďojV2yLc%KAEyW#?5&|H8Դ2J%-]Ki,c%YD  uύP}˚3ujv<%lju4ooU !|H 's9h įxďeΕu-odx'd-0 3ҺG>7C.hh 7o>*ּ'HA k5o>"Ϋ{|<-u3]SXI^L^i"tk9p7JXC<ҵEw? 0WZfi#\xSMVf-X[+k0˴w3*|XT|,}_Z-֗o7Go"o+l-١tFso澀 įxďeΕu-odx'd-0 3Ҹd_ik?|V :NH׾vGhbD}+?/7OúԺՕ)őP A.qF\^(zV_ 0xY|<u-WLҧ yV(bײ$B's?A=V& L$xky=GUf-0kT$p NIsJH\BbIQEQEQEQEQEQER=&VS5+bbQ4F4q,JUI29snh7^E,zu͢V&v!;,|Kfo7J?鶛|,bEe  `9?% xz>i:fIkzt/Svr5/aŷoWχ˄ﵭSWLWNwwś.k3wip9j%dž'ya2{{u8۷.%H6 h|$ַ7s^kNsG=ik.Ͷy4b17@PEPEP_?5?g&;??~v}v}_@W|q_B %i!_mj۟WE|V>WCOkEϢ^k1AKsq#Yq.-vǼ{u~ xPn_i7×xHCqey<.H 0]kf+ v%M6Z6i͖y|cI XԲGS WJi)F.Osemm-I"ٔnT*U ( ( ^ͧiWv4k5*#C#b0 H-@/Z_OugKyuh$uVrSq؀4X>-Dc}G4/5'K4ޗB3!_@osnOԵuWy>٩[$S4,񫰍C3Z߆H|?qΈg۵CSGm2O*-Kj&]1|(((4ox__hvjsX_7s]GJrX52I& "* Kǿ $Vc֓];[S$0fi"Ou4lV}mW*_]N[x5 [ř46Y w mW9񽿋|16++}.lS "pc$qb_0cƿiO.|/R?eY"TU3(g*=VᇄT2oaX__ w#-+GH͛n۸8@]Q@Q@yGĽWOa+kEsTۧW8bh|&.ğjPLM+7o/u]3Iд? 0ƝxMSv_.MXc~76|aˋ=5$,mg(xQ`v (xƺZ;j_قM > Ky)wL /zzVos²XYͧ[Zn{iNȋ C Dұi&xk^!ռj'X5k-y22jd@=.oGo1^h>i&0VrB`[g'?x^?g }C->I/57eH&# C[ƞ6ߎ4/֓e荣j:ZKȺKIXJOt>N82tk} GS=JSkVHgDfcAg()w۽Zx*>v-ާ7Ih-ʦE bB\ bbQEQEa/[Y߅UOcdH".w"_3jaRfBk}ޟj[]@VJmE ̰}n.c.#9H0x?Nkxa5ᝤhZ+uÆE*yB0.K% SWχ˄ﵭSWLWNwwś.k3wip||Cw]еwO'> Comment ReferenceCJ^^  Comment Text d$x^`ECJOJQJkHzO"z Block Quotation-$d %d &d 'd -D ]X^Xa$@CJOJQJkHJB@"J Body Text a$@CJOJQJkH|O| Block Quotation First'$$d%d'd-D ]^`<@CJOJQJO" Block Quotation Last,$$d%d&d'd-D]^a$6@CJOJQJkH@C@!R@ Body Text Indent`h<O!"< Body Text Keep$>""> Caption@OJQJkH`O"` Chapter Label$&d;@FCJKHOJQJkHlO"l Chapter Subtitle$$dh]6@CJKHOJQJkHpOp Chapter Title$$pdh]p@B*CJHKHOJQJphZOZ Company Named<;CJ&KH$OJQJkHHL@!H Date a$5@CJOJQJkHPOP Document Label $h 5CJ$KH8X@8 EmphasisCJOJQJkHB*B Endnote ReferenceCJH*^+^  Endnote Text d$x^`ECJOJQJkHL @L Footer!$ !$da$ OJQJkH2O"2 Footer Even"FO2F Footer First# !$d@8OB8 Footer Odd $ JORJ Footnote Base%CJOJQJkHD&D Footnote ReferenceCJH*:Qr:  Footnote Text'xN@N Header($ !;@<CJOJQJkHPOP Header Base)$ !CJOJQJkH2O2 Header Even*LOL Header First + !5OJQJkH<O< Header Odd , a$XO"X Heading Base -$x5CJ$KHOJQJkHxOx Icon 15.$d`<&`#$-D /M a$5@B*CJOJ QJ phT T Index 1 / x 0d^`0 CJOJQJL L Index 20 x d^ CJOJQJD D Index 31 x d^CJD "D Index 42 xd^CJD2D Index 53 xd^CJBB Index 64  `^``BB Index 75  ``^```BB Index 86  `^``NOrN Index Base7 xdCJOJQJkHT!T  Index Heading 8$d ;B*CJ$KHph@O@ Lead-in Emphasis;CJ>(@> Line NumberCJOJQJkH0/@!0 List; ^h62@6 List 2< 8^863@6 List 3= ^64@6 List 4> ^65@6 List 5? p^pF0@F List Bullet@ & F h]h:6@: List Bullet 2A^8:7@": List Bullet 3B^:8@2: List Bullet 4C^|9@B| List Bullet 5CD & F(dD&#$&d(dPRCJO List Bullet FirsthEP>T  ]a$@CJOJQJkHO" List Bullet Last`F>T  ]a$@CJOJQJkHD@r List ContinuekG & F >Th.>E@q> List Continue 2H^8>F@q> List Continue 3I^>G@q> List Continue 4J^>H@q> List Continue 5K^pXOX List FirstLPP^`a$@CJOJQJkHNO"N List Last M^`a$@CJOJQJkH1@ List NumbersN & F >T h.]h^`::@: List Number 2O^8:;@: List Number 3P^:<@: List Number 4Q^:=@": List Number 5R^pO List Number FirsthSP>Th.]a$@CJOJQJkHO" List Number Last`T>Th.]a$@CJOJQJkHF-@!RF  Macro TextUB*OJQJph2)@2 Page Number5O Part Label=W$d@&P#$-D./M a$B*CJOJQJph\O"\ Part SubtitleX$hxa$6CJ KHOJQJkH~Or~ Part Title?Y$$$d &P#$-D./M a$@CJ$OJQJ.O!r. PictureZ$DOD Return Address[a$@CJXO"X Section Heading\d;@<CJOJQJkH\O\ Section Label]dh@B*CJ0OJQJkHXJ@"X Subtitle^$d5;@CJOJQJkHX>@X Title_dd&da$5@B*CJ0OJQJkHXOX Subtitle Cover`$d $d @CJ,KH6O6 SuperscriptEHH*T,"T Table of Authoritiesb !JCJL#2L Table of Figuresc !J^`0~O~ Title Cover:d$d`$d%d&d'd-D ]X^Xa$5@CJOJQJl.l  TOA Heading'e d<<$d(da$5@CJOJQJD@bD TOC 1 fxx5;OJQJ\aJB@arB TOC 2g^ 5:;\T@TTOC 3h  @^@6OJQJ]aJmHnHu:@: TOC 4 i^ OJQJaJ:@: TOC 5 j^ OJQJaJ:: TOC 6 k ^  OJQJaJ:: TOC 7 l^ OJQJaJ:: TOC 8 m`^` OJQJaJ:: TOC 9 n^ OJQJaJ,Oq, TOC BaseoRYR  Document Mapp-D M OJ QJ ^J 6U@6 Hyperlink >*B*ph:: Index 9r`^``FV@1F FollowedHyperlink >*B* phd^@Bd Normal (Web)tdd[$\$!B*CJOJPJQJ^JaJphBb@QB HTML CodeCJOJPJQJ^JaJe@b HTML Preformatted7v 2( Px 4 #\'*.25@9B*CJOJPJQJ^Jph@Z@r@ Plain TextwCJOJQJ^Je AL%D,=CMJOeX_~otz'Ϯr}oqz,e J;JpJJJ"K]KKKLILLLL2MmMMMNVNNNOBO}OOO+PcPPPQe  56789:;<=>?@ABCDEFGHIJKLMNOPQRS\ohkZK;rjd d N  y \ > ,vR2wnJaI4{=c SS>@AIKL\w(8CReszrk7 V u!!/"A##%%+%&'y(((((3)^)r)))b+C,D,L,N,Y,,,.?///B0i00001,1m11M2h22 3*3^33&4[444.555,66666&7H7n7777:8D88t9999Y::::1<r<<<=i======?H?&@@@AaAAABBCCCDESEtEESFFFFG"G0HYHoI}IIIILJMJUJWJfJKK=MmMMMMMMN'NNNNOOPPPSQzQ-R=RJRWRaRcRRRSST4UFUPURUUUU|VVVVVWWWWWWWWXXbXdXeX~XY-YZy\o]]^d^^^^_4_6_D______`a}bb?dAdddyeeSffffggg%g.g9g;ggghhhhiiiiiijjjjjIkqkkllxlllmmmmmn n0n@nLn\n^ninmn~nnnnnnnnn}o~ooooppq?rRrrrXstttvwwwwxyy=yPy9zhzzzzz{({R{{{g|h|j|}e~{~~~~%'11#r$7C j1J*DdyƎ؎%>[} CV;Cqݒ2cjEJ{Ք֔EFPuv˖̖ܖijx=>M՘֘טbcrҙәݙ'(0Z[kΜϜޜfghyƝÞ>F:;Cghixz|}~ !Ѥ*by{4Fw ٩7ڪ:DFʬ&twήϮ׮ ܳ#t߷6Obdhż&]þ/7w¿տ &0Whs~}@\*;qr5lUv>}1By|} )y_no~!?A)aF D ,Epqy{:5Frv ^8<qZ GyzVDvmy5Kp`)0L+,B19AIO+sYS O S Y }    > v z      1 N V \   ) * + 6 7 L M N O P Q ] ^ _ ` a b c f Z0_0_0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0 [0[0[0 0]0g0h0j0h0h0g0h0j0j0j0h0j0j0h0j0j0j0g0h0j0h0h0j0j0i0h0j0j0j0h0j0j0j0i0i0g0h0j0h0h0h0h0h0h0h0j0j0j0j0g0h0h0h0j0j0i0h0h0i0h0h0h0g0h0h0j0j0j0h0g0h0j0h0j0j0h0h0j0g00Y0W000000w0wx0w6 D0' D0( D0) D0* D0+ D0, D0000. N0. N00(0w07 07 07 07 07 07 07 07 00%00&0&4 O0&4 O0&4 O0&4 O0&4 O0&4 O0&4 O0&0&0&0&0&Y0&W0&0&0&00, @0, @0,0,0, A0, A0,0, A0, A0, A0, A0,0,0,(0,0M20M20M20M20M20M20M20M20M20M20M20M20M20M2x0M2D06D0606060606060606(0,0:80:80:80:80:80:80:80:8(0,0:0:0:0:0:0:0:0:0:00=(0=0=?0=?0=?0=?0=?0=?0=?0=?(0=0B0B00C(0C0DU0DU0D0D @0D @0 D @0 D0D(0C0GU0G0GU0GU0GU0G(0C0I0IY0IW0I0I0I00K0K(0K0mM0mM0mM0mM0mM00NU0NU0N0N0N00O(0O0P0P0PU0PU0PU0PU0PU0P0PU0P @0 P0P(0O0SU0SU0SU0S0SU0SU0S0SU0SU0SU0S0S0O0VU0VU0VU0VU0VU0V0V 0V 0V 0VZ0V0V00eX0eX @0 eX @0 eX @0eX0eX(0eX0]U0]U0](0eX0^U0^U0^(0eX06_U06_U06_U06_00_0_0_(0_0}b0}b(0_0Ad(0_0ye0yeU0yeU0yeU0yeU0yeU0yeU0yeU0yeU0ye0ye0ye0_0gU0gU0gU0gU0g0g0gU0gU0gU0g0gU0gU0gU0g0_0jU0jU0jt0jU0jU0jU0j0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0jU0j0j0j0jY0jW0j0j0j0j0j0jU0j0jU0j0j0j0j00t0tp0tp0tx(0t0wU0wU0wU0wU0w0wU0wU0wU0wU0w00zU0z0z @0z @0z @0z0z0z0z0z0z0z0z0z0zU0zU0zU0zU0zU0z0z00'0'0'0t0t00000000U0U0U0U0U0007070707000U000U0U0U0U0U0U0U0U0xU0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U00000000U00U00(00;0;0;0U0;U0;U0;0;(00E0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E0E0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E(00h0h 0h 0h 0h 0h 0h 0h0h0h0h0h 0h 0h 0h 0h 0h 0h0h0h 0h 0h 0h(00~U0~U0~U0~U0~0~0~7 N0~7 N0~7 N0~7 N0~7 N0~7 N0~000Y0W00000U0U000000000000000 @0 @0 @0 @0 @0 @0 @000000(00000(0000U0U0U0U0U0U0U0000000U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0000000U0U00 @0 @0 @0 @0 @00000 @0 @0 @00 @0 @0 @00 @0 @0 @0000000000000000000U0U0U0U0U0000 @0 @0 @0 `@0000U00U000000U00U000U0U000U0U000U0U00U0U0U0U0U0Y0W0000000(00(00(000000U000 @0 @0 @0 @0 `@0Y0W000 @0 @0 @0 @00 @0 @0 @0000000(0000000(00 @0 @0(0000000U00U000U0U00U0U00000000000000000U0U0U0U000U0U0U00U0U0U0U00U0U0U0U0U0(00U0U0U00U0U0U00U0U0U0U0U0U0U0U0U0U0U00U0@(0@(0\~00@!0\~00\~00\~00@!0\~00@(0\~00@!0@!0\~0 0@(0\~000t\>00- 56XXՔ֔EFuv˖̖ij=>՘֘bcҙә'(Z[ΜϜfg:;gh|}f \>0 (9u\>0\>0^>0,LF0^>00,H\T U(UDU`U|U\>0,8_xVVVVVW\>0,p_XXXXY4Y\>0,ccd,dHdddd\>0,0,tcHidiiiii\>0,gjjk$k@k\k\>0 ,hp4pPpolpp\>0",0$,th\>\>0&,Z\>\>0(,4[(=\>\>0*,l[L L\>0,,[,YhOOȀ\>0.,24Pl\>00,2h؃\>02,,3؆,H\>04,d3D`|Ј\>06,3 <X\>08,30=0>0>08>0T>0p>0\>0:,;0l?0?0?0?0?0?0\>0<,;0@0A0,A0HA0dA0A0\>0>,<0|B0B0B0B0B0C0^>0,+ACCEESUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUX6 h 6  \ K 5 =IDle&q5hAg6|8CM S!!"C&-29>zBZF)RZc?lXsxLG/E,t  JDD $M 8$-7>iENUF]`4g9ouw[ Sx=p|ddvo '8uwjBD    #D7Hcefh7Kfhik%:UWXZy+FHIKj 689;Zk>Rmopr5Jeghj7D_abd  * D _ a b d  . I K L N m     5 Y t v w y  < W Y Z \ {  9 ; < > ] e ')*,KVqstv%2MOPRq -/02QWrtuw6Nikln!*EGHJit A\^_a)DFGIhu/124S[vxy{8:;=\n6C^`ac )3NPQSr3NPQSr9;<>e  tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%tX%t̕&(ELOX!!l,b$Jb&~fC@@0(  B S  ?e d _Hlt24341581 _Hlt24341582 _Hlt16144422 _Toc24275097 _Hlt16144402_About_This_Guide _Toc24275098 _Hlt20103945 _Hlt20103946 _Hlt20103953 _Hlt20103955 _Hlt20103956 _Toc24275099 _Toc24275100 _Hlt16144269 _Toc24275101 _Toc24275102_Data_Representation _Toc24275103 _Toc24275104 _Toc24275105 _Toc24275106 _Toc24275107 _Toc24275108 _Toc24275109 _Toc24275110 _Toc24275111 _Toc24275112 _Toc24275113 _Toc24275114 _Toc24275115 _Toc24275116 _Toc24275117_Two-dimensional_graphs _Toc24275118 _Toc24275119 _Toc24275120a _Toc24275121 _Toc24275122 _Toc24275123 _Toc24275124 _Toc24275125 _Toc24275126 _Toc24275127 _Toc24275128 _Hlt16419679 _Hlt16424760 _Toc24275129 _Hlt16419658 _Hlt16419665 _Toc24275130 _Hlt23827052 _Hlt23827059 _Toc24275131 _Toc24275132 _Toc24275133 _Toc24275134 _Toc24275135 _Toc24275136 _Toc24275137 _Hlt23224678 _Hlt23224679 _Toc24275138 _Toc24275139 _Toc24275140 _Toc24275141 _Toc24275142 _Toc24275143 _Toc24275144 _Toc24275145 _Toc24275146 _Toc24275147 _Toc24275148 _Toc24275149 _Toc24275150 _Toc24275151 _Toc24275152 _Toc24275153 _Toc24275154 _Toc24275155 _Toc24275156 _Toc24275157 _Toc24275158 _Toc24275159 _Toc24275160 _Toc24275161 _Toc24275162 _Toc24275163 _Toc24275164 _Toc24275165 _Toc24275166 _Toc24275167 _Toc24275168 _Toc24275169 _Toc24275170 _Toc24275171 _Toc24275172 _Toc24275173 _Toc24275174{{LLwww(((((7 %&&N,,,M2:8:==?BCDGIWJKmMNOOPSVVeX]^6__}bAdyeyeyegggjjjotwz'||7;Eh~ :Ϯ ܳ&r}o{5rzm5,f @@@@@@ @ @ @ @ !"#$%&'()*+,-.@/@01@2@34@5@6789:;<=@>@?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc||L[ww77777U *%&'X,,,g2C8:=G?BCE!GIeJKM&NOPPTV W}X]^C__bcdyeyeegggjjjotwz0 }}BBIx3C֮\(}9EuJAf  ( /( LH+( *+( ( \,+( +( .+( Y( /+( ++( *( D*ooz3(4W f    x3,4W f  8*urn:schemas-microsoft-com:office:smarttagstime> *urn:schemas-microsoft-com:office:smarttags PostalCode9 *urn:schemas-microsoft-com:office:smarttagsState8 *urn:schemas-microsoft-com:office:smarttagsCity9 *urn:schemas-microsoft-com:office:smarttagsplace 101319208HourMinute   %%!/'/7/=/9:<<<<-A2A5A:AAA2EAEPPRRRRSSSTTTRTUTUUXXYYx[{[\\]]``bbbchhhhhhhhhhCiLi{vvʅ-6;<XYnyz{`k %&+,19>?DEMNSTYZbjxbm>ANQ^a8;HKmpx{ !'PTU[*2fkvw)*cd %'.LMQRTXYZ\`aben ,-49:CMNRS25:?9E#-(=GU_SXA B   7 : @ C I L  a b f ""##)) 3 3*3,3338333&4(4247444445 555555566&7(7/727H7J7Q7T7n7p7x7{77777777778 88999999999:`:d:h:n:::< <1<3<?<B<r<t<~<<<<<<<<<<_=h=========Z>l>>>??@@+A,A?ACAAAAA7EAESEUEcEiEzE}EEEAHBHoIqIIIfJrJPP`QdQ8R:RCRGRPRTRSTUTWWXXYYZYy[{[\\]]s^t^&_'___````bbhhhhii(j,jXk^kkkmmmmp%pxx&y*yVyYyQzUzzz̀Ҁ΅ׅ ߋ Ǝ͎؎ߎۏPXܖrzݙksƝɝ FIw4E $]b7:DP̫FN&+tz 'ٵrsǷη<>57,/'U]gk~`g  X#%+1FLcd 39hm .4SWX] uFMrv 189@gnsx|Y^bfSX`d % S W         # ' 5 7 l v    a b f 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333U[_onCa3Q3Q<UUXdXwwtvSUdyz{ 78hi  ) + 5 O O Q \ b b c f  a b f (Dmov` !r 8  Vj v V|Z0=~4v%xwָ}Kנ8 V.V l|$.>Pf *tK"*v*vP-8:Tt1wd6vD|@zzw)pE|Z0s(K9QL豞>O|Z0{aO9s}WvI WxwָrZaC_fq@ Tbxwָ.+cMVll {Pp 8ހrt:vWkx/|AB||Z0*@h^`CJOJQJo(. hh^h`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@hhh^h`CJOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h8^8`CJOJQJo(.hh^h`CJOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h@h^`CJOJQJo(.hh^h`CJOJ QJ o(" ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h ^`CJOJQJ. hh^h`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h^`CJOJQJo(.@h^`CJOJQJo(. hh^h`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(<^`B*OJPJQJ^Jo(ph pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJQJo(@ ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(! ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h^h`CJOJ QJ o(" ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJQJo(7 ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h@h^`. hh^h`OJ QJ o(@h@h^`.hh^h`CJOJ QJ o(1 ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h ^`CJOJQJ.@h^`CJOJQJo(. hh^h`OJ QJ o(@h ^`CJOJQJ.@hhh^h`CJOJ QJ o(" ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( hh^h`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h@hhh^h`CJOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(hh^h`CJOJ QJ o(M ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(@h7WOs(K8  V8  AB|mo.W`@h h^h`CJOJ QJ 1HX`u@h h^h`CJOJ QJ !X`@h h^h`CJOJ QJ :Y @h h^h`CJOJ QJ &tY@h ^`CJOJQJY @h ^`CJOJQJ       o`        x"        LzH        ę                F                 ),        z        j ֖        ^          # vk#j+l1[SghWWWXX{Ք֔EFPuv˖̖ܖijx=>M՘֘bcrҙәݙ'(0Z[kΜϜޜfgƝÞ>F:;Cghxz|} O a f @d ^|e `@``,@``T@``\@``@`@UnknownG: Times New Roman5Symbol3& : Arial?& Arial Black9Garamond?5 z Courier New71 CourierI& ??Arial Unicode MSG5  hMS Mincho-3 fg5CMTT10;WingdingsC"MS Sans Serif9New York5& zaTahoma=" HelvArial9 WebdingsWTms RmnTimes New Roman5"Geneva"q hhf2kfK-K-$24d+ 3Q_H(?[S;C:\Program Files\Microsoft Office\Templates\1033\Manual.dotManual Joe Chuma Joe Chuma(                           ! " # $ % & ' Oh+'0X  , 8 D P\dlt|Manualanu Joe Chuma oe  Manual.dot Joe Chuma29 Microsoft Word 10.0@E@@%o@h$;@Xy[K-GVT$m Y   ."System$0 - @Garamond-,A 2299(22x((xTP|xx((""""""""""""5ffffffffffff"""""""""""""Efffffffffff"""""""""""""$vffffffffff""""""""""""""$Vfffffffff"""""""""""""""vfffffffff"""""""""""""""(fffffffff""""""""""""""""Fffffffff""""""""""""""""$ffffffff""""""""$C"""""""fffffff"""""""I""""""Efffffff""""""$"""""$fffffff""""""9CI2"""""vffffff"""""""#IB"""""5ffffff"""""$""$"""""(ffffff"""""$"""B"""""#ffffff"""""#""""""""""fffff""""""2""""""""7fffff""""""IB"""""""$fffff""""""ID""""""""Vffff""""""(28"""""""ffff"""""""""IB""""""6ffff """""""")""""""&ffff"""""""I"#""""""$ffff"""""""#""2""""""vfff""""""""9B""""""""Efff""""""""$3"""""""'fff""""""""""y"""""""""fff""""""""""""""""""""""Vff"""""""""""""")""""ff""""""""""""""(8"""Fff""""""""""""""""I""""6ff"""""""""""""""")""""'ff"""""""""""""""")""""$ff"""""""""""""""")"""""f """""""""""""""")2""""f"""""""""""""""4s"""6f """""""""""""""$DB$B"""'f"""""""""""""""""""""""(f """""""""""""""""""""""$f"""""""""""""""""""""""#f """"""""""""""""""""""""v""""""""""""""""""""""""F""""""""""""""""""""""""%""""""""""""""""""""""""$""""""""""""""""""""""""#"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'' 2 , +8@"Arial Black- 72 ~Data Analysis & VisualizationsJw4ww8kk5k454lwv44asJ5ww 2 n  p@"Arial- )2 $Extrema Users Guideaw?`Ca(K 2 $   - @ !-'@Garamond- 2 j  $ 2   $ 2 &  $ 2   $ 2   $ 2 ?  $ 2  $ 2  $ 2 X  $ 2  $ 2   $ 2 q  $ 2  $ 2 -  $ 2  $ 2  $ 2 F  $ 2  $ 2   $ 2 _  $ 2   $ 2   $ 2 y  $ 2   $ 2 4  $ 2   $ 2   $ 2 M  $ 2   $ 2  $@Symbol- 2 s5 A- 2 sv  2 s TRIUMF23:D. 2 s  #2 400&&&"2 " 4 Wesbrook Mall&H")))&D  2 ;  #2 .Van7!);2 . couver, British Columbia V6T 2A3")(&!1)4)(?)!7%2&7& 2 .Y  #2 n Phone: 604..)))"&&&2 222.1047&%&&&&%2   Fax: 604.-!%%&&2 b 222&&& 2  .2  1074&&&& 2 }  #@Garamond- 2  -                    ^`X՜.+,D՜.+,| px  DLCR: HManualAbout This Guide' Conventions used in this guideInstalling ExtremaRunning ExtremaData Representation# Addressing parts of arrays Constants ExpressionsReading Data From Files Text files Binary filesGenerating Data Sequences Functions Interpolating DataGraphics sub-windows Pre-defined windowsOne-dimensional graphsTwo-dimensional graphs Line graphs Scatterplots Histograms and bar chartsThree-dimensional graphs Contour Plots Density plots Surface plotsFour+ dimensional graphs7 Graphing two 3-D functions on the same drawing+ Multiple plots on the same drawing1 Tile numerous graphs on the same drawing> Draw two sets of data on the same graph at the same scaleG Draw two sets of data on the same graph, but at different Y-scalesColors Default Drawing ColorPlotting Symbols Line type Line widthText Axis Labels Graph Legend Graph Axes Scaling Tics Logarithmic axes Axis placement Operators FunctionsFitting Smoothing Fitting to a function; Fitting different data segments to different functionsBinningInterpolation 2-D interpolation IntegrationOther functionsData SelectionPrinting graphs2Exporting graphs for inclusion in other documents PostScript & EPS PNG JPEG Saving DataCreating and editing scripts CommentsRunning scripts" Interacting with the user Initialization script SubroutinesBranching and looping DO loops Title HeadingsG8  _PID_HLINKSUseDefaultLanguageVersionLCIDAd2 _Toc242751742 _Toc242751732 _Toc242751722 _Toc242751712 _Toc242751703 _Toc242751693 _Toc242751683 _Toc242751673 _Toc242751663 _Toc242751653 _Toc242751643 _Toc242751633 _Toc242751623 _Toc242751613| _Toc242751600v _Toc242751590p _Toc242751580j _Toc242751570d _Toc242751560^ _Toc242751550X _Toc242751540R _Toc242751530L _Toc242751520F _Toc242751510@ _Toc242751501: _Toc2427514914 _Toc242751481. _Toc242751471( _Toc242751461" _Toc242751451 _Toc242751441 _Toc242751431 _Toc242751421  _Toc242751411 _Toc242751406 _Toc242751396 _Toc242751386 _Toc242751376 _Toc242751366 _Toc242751356 _Toc242751346 _Toc242751336 _Toc242751326 _Toc242751316 _Toc242751307 _Toc242751297 _Toc242751287 _Toc242751277 _Toc242751267 _Toc242751257 _Toc242751247 _Toc242751237 _Toc242751227 _Toc242751217 _Toc242751204 _Toc242751194 _Toc242751184z _Toc242751174t _Toc242751164n _Toc242751154h _Toc242751144b _Toc242751134\ _Toc242751124V _Toc242751114P _Toc242751105J _Toc242751095D _Toc242751085> _Toc2427510758 _Toc2427510652 _Toc242751055, _Toc242751045& _Toc242751035  _Toc242751025 _Toc242751015 _Toc24275100< _Toc24275099< _Toc24275098< _Toc24275097 x   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   Root Entry F%\ Data )<1TableHN.WordDocumentOQSummaryInformation(DocumentSummaryInformation8!Macros \\VBA \\dir5ThisDocument _VBA_PROJECT PROJECT L  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKMNOPQRV10* pHdProjectQ(@= l > J< rstdole>stdoleP h%^*\G{00020430-C 0046}#2.0#0#C:\WINDOWS\System32\e2.tlb#OLE Automation`Tem plater>F FmpJaAOePrQjE c>1*\C<gram Files\Microsoft Office\0s\1033\Manual .dotM ..\ 5(q7>Ofic` ;=G{2DF8D04C-5BFA-101B-BHDE5XAAW42Xc:\&<MSO9.DLL#B 9.0 Ob Libra,ry!™MSForms>AMSF]r@ms3@BD452EE@1-E08FA,A-8-02608C4D0BB4AQYSTEM@FM20 'B &/;"1BŸ 00}#0# 50 A12198BC0-64C9-4D3A-AFA6-F9E80E3107396DOCUME~1\CHUMA~2.TRI\LO0CALSA\Word8.0\DV.exde@.E .`M E! oBxThisDocumentGT`Tyi6D6cu@8enU g2` H1B tb,"+ oxME (S"SS"<:1TemplateProject.ThisDocument@(%H0xAttribute VB_Name = "ThisDocument" Bas1TemplateProject.hGlobaBlSpac~False Cre atablPr@edeclaI"dTru BEx0poseDeriv$Cust0omizC1am  *\G{000204EF-0000-0000-C000-000000000046}#4.0#9#c:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA6\VBE6.DLL#Visual Basic For Applications *\G{00020905-0000-0000-C000-000000000046}#8.1#0#c:\Program Files\Microsoft Office\Office\MSWORD9.OLB#Microsoft Word 9.0 Object Library*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINDOWS\System32\stdole2.tlb#OLE Automation|*\CC:\Program Files\Microsoft Office\Templates\1033\Manual.dot*\C..\..\..\..\..\..\Program Files\Microsoft Office\Templates\1033\Manual.dotq7 *\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.1#0#c:\Program Files\Microsoft Office\Office\MSO9.DLL#Microsoft Office 9.0 Object Library*\G{0D452EE1-E08F-101A-852E-02608C4D0BB4}#2.0#0#C:\WINDOWS\SYSTEM32\FM20.DLL#Microsoft Forms 2.0 Object Library*\G{12198BC0-64C9-4D3A-AFA6-F9E80E310739}#2.0#0#C:\DOCUME~1\CHUMA~2.TRI\LOCALS~1\Temp\Word8.0\MSForms.exd#Microsoft Forms 2.0 Object Library.E .`M  > oThisDocument053ed5e027ThisDocument 뛤etE gs`&WordkVBAWin16~Win32MacVBA6#Project1 stdole`Project- ThisDocument< _EvaluateTemplateProjectEOfficeuDocumentjMSFormsCImage1_`  ID="{4ECB11ED-39F1-4FC7-AB06-A3356EC69A36}" Document=ThisDocument/&H00000000 Name="Project" HelpContextID="0" VersionCompatible32="393222000" CMG="53515B0AAA0EAA0EA810A810" DPB="A6A4AEFF5201A402A402A4" GC="F9FBF102F202F2FD" [Host Extender Info] &H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000 &H00000002={000209F2-0000-0000-C000-000000000046};Word8.0;&H00000000 AYL&i eThisDocumentThisDocument  FMicrosoft Word Document MSWordDocWord.Document.89qPROJECTlk SPROJECTwmT)CompObjUjextrema-4.4.5/extrema_icons.tar.bz20000644012702201742730000002071411274636625016273 0ustar spangspangBZh91AY&SYJ929}nnW|xw炙}z>==̽Ww6{_|{wi{*OS&LhdƩMl&&FdmLMOi T50&ީA4iz40e=ƣ@A64jH&FHi&z~04444S&&L=~L=OCBy )L42eOdѦLjT*DI䞉O6SMSMm&$la3QSFI 24Fz50=I=0OM&тdyiMi<l@D0hLS24OI鲙4ɦSeO412iH6a'Cj?S L4d#FhOI5i&i  3C)$l3ʛLx&4= jm&S0M4M)dlyM4dTFdѣz!24iOiG0 Fz&mAzO'S6imOSz54xjz(35<$d46SC22 ='=Os/( μb),GI!]eBBiAi A L$zA"}k C+A1QNNWL ,L/i,p @+JR/HHnJ"/>Q2.vzۮlkSCtu򧵀^tCݓn;_[g1|qPShХӥFs7S_xW7p/Rx +YvhTän)3g ,V(f&/45#AeS/fsɲ_ސtmKvK#F!v\;ϧ7E *ER-#~iAYj*D.@mw B"T KX @ K@CY^ZmgBBGI)a.%`}!NdL)|x@m0-Gꤗz^~퓇 8٥A/[2&[o. ,v`",TYyxd\;&=A֨@]#wkv&ye{Sa&kwS&sKmz{ 6dQ?M)1)Kϼ^I2+FO/荶s7'P('-ĝYfE1"l!⪄&,U=P!J;<]e66 Ų*mQwHRF=c=b#SkMP,O4*]-As&ֵ/ŕhP@s"ZsWQ +,˽Me/Y EĴ[ҿ>H䜱/5!|# :ڢ,BS~ӚW Z_\ ƬFM@`CgD` loW]*}J r0UgWhL{zU+3Kwa@}M;1W^c5F5 _SkͯRX|bFh,'DZݑ;Y`5?Vq<1v܆[wckō:#xIGz/޿r^'; "w/7X8^jQoaLWC>K EЪ+:ODv!?57  f a{K|IͽLt:GQs3PX<߭ݬkg?.>i&@+S _R+f A}@+LCvtirURO{V%d@@  %0H*% >tPm'#g6mt՘5& J - mMxjlEL Cq2k\ш"_@] "kV]TMV{h tX.dz\7zpkݧ) pFJ~5'V[kxF3{#|a#Dr!u#zCU5v'Xv)qX'0R`Lc46fFD]t2\XLb-} 4r_odN],nL ikxWiJa7J8][!]$YV$`Ŵ9 e9QKԋn@RSoaTrcr..0vV6fV, 1WOp:H#YIYm u} Wٖ`: $jR8R{ :&Х1dWF*x- ]vІ}=cnTV7x{3BbB񹄁7;*5Uܿ~3 Uţ>|6WMa\U@G %m_q|<,]݉m[3 vǁP-@ HᎅHW*ܞC onW0Kvb@wYgD_#aev6zB"JmC=QRaFCϩҐdCP@Τ'Wlu{g.Tz0yt6]rv7 w(FauRxP,Yho?R]i^/c!Xfθ"]C)fY#{89U ΑTƂxOY("V|cXaztݢEfI4<% Uc.[0nwe2L*<% `f!܃j̄ ,SVa{guQ)㸤,~g=7rU@t9գr^Ja蚒{3B%-@س;Ѝ_'F'5w, ^w7?sX"la}"89k1d QM}s5ďj@H'H K̓zEn~t#gApzD @?J{[Źl߳L*SM Gaj_RI}Eb3եO.Ϥ _ȽRgC]=ag#{~]a}r!!iOT/wvtԪEpZ$~˥0XհNLMZ"{M 7ٿR:rVpwwWळ.y3xGʋ#SCWtfʚ0hLEv+u*"(tI(n ڧ}Ϯq]DMc}nu|F qW: k_`>:fO˦lj4}wqD)AW)P]+u0ʯ+~ԧwL я^7yy'f!wrY_*𸏅j>~S̿=hݥ,;_f;QobT̑WLj&g ч޾誝VNS۬[|F՗ DBUF|лce+;98U߼l t(EzL[|6i{r$ uoA A63&TٕXM<ږ)5C{W:;[ RX|4ʒ|&ؙ!2H{/с3\Z/YȭSa`u[;ADa)iYwv (UosY|ugy)^luћJ;^:VEL;7ԊI>3Kk )FyJ#OhШK[ɔVU$3VZGoR_3Hk!C؁(?0;S=Jd]U qlȔa 7qwة3ԡ`bN?GF ,"%0a WRؚ%<)^w妚od4 B'8|.b%lYqX1sIl UţnU,0ʒ_Lx+\ 'fLSbn7JzhFJ&mF|֝&Zރ&EOGiJt^r'x36e/Ę wu'PQ2w;tE2>ajN酮)a\32s:p 2i{e03 ).KV2)8Tܐw$]룘GD.yWJ2Cj (Ժ~[ >k9jЋmutpCd)H^ c {69rz &]L\ /`a1Ó_<〃5S~ϣk&5@buq++ZkSg%q#\91 /qZAS򹖵c!WibE@~xb};+}9(͚9PxqɴfTKAO.ep@tAڼes3󰔇Ȏ&soS^n0yiDV$RD=~vrK PUb}f*}&em}^Iy&=L/gn7 񾀅!k L,16'ؖcJt`3n6Ps3Y2teg=T*qI(=,q'28S;p:& BD]y6^j#'/ʓ]Y1W Ҿ NLN:;oT?6 O; <ˍ$_ !*2Y=1f`R*Q$@%^ϛwkl4hR׏@/a5>ͽ? NkEY<2^<M4 鞖^9h\$tnqKPOɄXXM g6bZWs\(~8P'a/ ,q!uj0c.r&y f$uM5IwmEKOxU%Ͼ $K, #W&Ӥ'bay<;FX2#J/3kyx_ =9Y^&V#q:W[ΏO3Q2нIټ}a=jCGf xU0lL#4nAX˱J ldS4z_3(%ˌɣ6"jM\q@ICa@K&׳b#<> 1kɘdsR75ɹer|-a R=fٹ;jBZ@L50cw(FSۈ˪q4 0v`7z_w 6ŧ 6tNdC+Vhcps6b: [x"\":%T/wއh'Y\  Hi9 FL/}2i1aN-5Aqۄc\FVH\9@TH4Dpb0%aPWmDO52_ ۖQߐT0~$z*~ H8ltQKqoPV<7v`z; 8^vs=|3GjE`ݤG } Opj-x<>&W)lW{PLͿެFbx>?3SkEB-i8}t'N.LOH}\pTe49_!c^j .4%Eѯ _9BK6.#N rT)+/T xaտ2Ho.F"Lߕ%CMO}Hθk=tvp큻sݮg;]TefCV&@5KJ(bU_L}/UCdQ"`7}>s+j9+kR쀛H40W~+M3hx5:l-j~h+V% chwmpGʾ?!!-",PVI]H ġhiRU\`l-x_4n,{ l6MPi󡂀3 Rm1[l՟j-]/nz+aV,tv}[IWEE~foC(KBh=k ] MMl/5N7u+-sh9Xb:V Mӿ@1I#Q TĽ~'MdN|^Ǚ 7?k(֣^GhwM0=_ \VOj9wb없1 @'_)„V1ɐextrema-4.4.5/extrema.spec0000644012702201742730000000417311274636625014551 0ustar spangspangName: extrema Version: 4.1.6 Release: 1 License: GPL Vendor: TRIUMF Source0: ftp://csftp.triumf.ca/pub/CompServ/extrema/%{name}-%{version}.tar.gz Patch0: extrema.desktop.patch Icon: %{name}.gif Requires: wxGTK >= 2.6.3 BuildRequires: wxGTK-devel >= 2.6.3, dos2unix BuildRoot: /var/tmp/%{name}-root Group: Applications/Math Summary: Extrema is a powerful visualization and data analysis tool %description Extrema is a powerful visualization and data analysis tool that enables researchers to quickly distill their large, complex data sets into meaningful information. Its flexibility, sophistication, and power allow you to easily develop your own commands and create highly customized graphs. %prep %setup -q # clean up cvs directores if they exist find . -name CVS -type d | xargs -r rm -rf # Patch desktop file and convert to unix linefeeds %patch0 -p0 dos2unix extrema.desktop %build %configure --exec-prefix=%{_prefix} --datarootdir=%{_datadir} --with-wxGTK=%{_prefix} --disable-static make %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/Scripts cp -fR $RPM_BUILD_DIR/%{name}-%{version}/Scripts/* $RPM_BUILD_ROOT%{_datadir}/%{name}/Scripts # icons mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/crystalsvg tar --bzip2 -xf %{name}_icons.tar.bz2 -C $RPM_BUILD_ROOT%{_datadir}/icons/crystalsvg mkdir -p $RPM_BUILD_ROOT%{_datadir}/pixmaps install -m 644 Images/%{name}.gif $RPM_BUILD_ROOT%{_datadir}/pixmaps # desktop menu entry mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications install -m 644 %{name}.desktop $RPM_BUILD_ROOT%{_datadir}/applications %clean rm -rf $RPM_BUILD_ROOT %post # Update the desktop database update-desktop-database /usr/share/applications %postun # If we are erasing then update the desktop database-file. if [ "$1" = 0 ]; then update-desktop-database /usr/share/applications fi %files %defattr(-, root, root, -) %doc AUTHORS ChangeLog COPYING INSTALL NEWS README THANKS %{_datadir}/applications/* %attr(0755,root,root) %{_datadir}/icons/crystalsvg/* %{_bindir}/extrema %{_libdir}/libextrema* %{_datadir}/%{name}/* %{_datadir}/pixmaps/%{name}.gif %changelog extrema-4.4.5/configure0000755012702201742730000235556611440762627014155 0ustar spangspang#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.64 for extrema 4.4.5. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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. 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 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" 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 : # 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. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} 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 and Joseph L. Chuma $0: joe.chuma@gmail.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: 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_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 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=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&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; } # 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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='extrema' PACKAGE_TARNAME='extrema' PACKAGE_VERSION='4.4.5' PACKAGE_STRING='extrema 4.4.5' PACKAGE_BUGREPORT='Joseph L. Chuma joe.chuma@gmail.com' 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 GTK_LIBS EX_CXXFLAGS MINUIT_LIB MINUIT_CXXFLAGS MUD_LIB MUD_CXXFLAGS WX_LIBS WX_CXXFLAGS WX_CONFIG LIBTOOL ac_ct_F77 FFLAGS F77 CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX CPP RANLIB AR ECHO LN_S EGREP GREP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build 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 enable_shared enable_static enable_fast_install enable_dependency_tracking with_gnu_ld enable_libtool_lock with_pic with_tags with_wxGTK with_MUD with_MINUIT ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP F77 FFLAGS' # 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=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 $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 extrema 4.4.5 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/extrema] --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 extrema 4.4.5:";; 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-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] --with-wxGTK(=DIR) use the wxGTK wxWidgets package (in DIR) --with-MUD(=DIR) use the MUon Data package (in DIR) --with-MINUIT(=DIR) use the Minuit minimization package (in DIR) Some influential environment variables: CC C compiler command CFLAGS 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 C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags 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 . _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 extrema configure 4.4.5 generated by GNU Autoconf 2.64 Copyright (C) 2009 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_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_compile # 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 || $as_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_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; } >/dev/null && { 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_cpp # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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.$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;} ( cat <<\_ASBOX ## -------------------------------------------------- ## ## Report this to Joseph L. Chuma joe.chuma@gmail.com ## ## -------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_run # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func # 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_cxx_try_compile # 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; } >/dev/null && { 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_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_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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_cxx_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_func # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_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_f77_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_f77_try_compile # ac_fn_f77_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_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_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_f77_try_link 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 extrema $as_me 4.4.5, which was generated by GNU Autoconf 2.64. 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 cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX 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 cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX 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 cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX 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 ac_site_file1=$CONFIG_SITE 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 -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" 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. if 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 # automake < 1.9 will not be allowed # use gnu strictness am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done 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 test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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; } # Just in case sleep 1 echo timestamp > conftest.file # 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 ( 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 rm -f conftest.file 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 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; } 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 --run true"; then am_missing_run="$MISSING --run " 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 test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_path_mkdir+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 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. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac 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 test "${ac_cv_prog_AWK+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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 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='extrema' VERSION='4.4.5' 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"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' LF_CONFIGURE_CC LF_CONFIGURE_CXX LF_SET_WARNINGS # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=no fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # 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 test "${ac_cv_build+set}" = set; 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 test "${ac_cv_host+set}" = set; 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 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='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 rm -f conftest.er1 conftest.err fi $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. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; 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 conftest.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 for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : $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_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } fi ac_exeext=$ac_cv_exeext # 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 the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { { 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: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ac_clean_files=$ac_clean_files_save # 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; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $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$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 { $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 test "${ac_cv_objext+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 #include #include /* 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 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if test "${lt_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done SED=$lt_cv_path_SED fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 $as_echo "$SED" >&6; } { $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 test "${ac_cv_path_GREP+set}" = set; 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" { test -f "$ac_path_GREP" && $as_test_x "$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 test "${ac_cv_path_EGREP+set}" = set; 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" { test -f "$ac_path_EGREP" && $as_test_x "$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" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD-compatible nm" >&5 $as_echo_n "checking for BSD-compatible nm... " >&6; } if test "${lt_cv_path_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } NM="$lt_cv_path_NM" { $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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognise dependent libraries" >&5 $as_echo_n "checking how to recognise dependent libraries... " >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi4*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | kfreebsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) case $host_cpu in alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) lt_cv_deplibs_check_method=pass_all ;; *) # glibc up to 2.1.1 does not perform some relocations on ARM # this will be overridden with pass_all, but let us keep it just in case lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; esac lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' else lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 4806 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; esac need_locks="$enable_libtool_lock" 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 test "${ac_cv_prog_CPP+set}" = set; 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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 ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; 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 " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done 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 test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 rm -f conftest.er1 conftest.err fi $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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cxx_g+set}" = set; 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=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 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 test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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=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 test "${ac_cv_prog_CXXCPP+set}" = set; 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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 ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn 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 test "${ac_cv_prog_F77+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_F77="$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 F77=$ac_cv_prog_F77 if test -n "$F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 $as_echo "$F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn 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 test "${ac_cv_prog_ac_ct_F77+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_F77="$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_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 $as_echo "$ac_ct_F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" 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 F77=$ac_ct_F77 fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 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 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } if test "${ac_cv_f77_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_f77_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_f77_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 $as_echo "$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 $as_echo_n "checking whether $F77 accepts -g... " >&6; } if test "${ac_cv_prog_f77_g+set}" = set; then : $as_echo_n "(cached) " >&6 else FFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_g=yes else ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 $as_echo "$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi if test $ac_compiler_gnu = yes; then G77=yes else G77= 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 # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris* | sysv5*) symcode='[BDRT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" $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 AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" $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_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" 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 AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" 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 test "${ac_cv_prog_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 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 test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # # Check for any special shared library compilation flags. # lt_prog_cc_shlib= if test "$GCC" = no; then case $host_os in sco3.2v5*) lt_prog_cc_shlib='-belf' ;; esac fi if test -n "$lt_prog_cc_shlib"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 $as_echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 $as_echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} lt_cv_prog_cc_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_prog_compiler_static works" >&5 $as_echo_n "checking if $compiler static flag $lt_prog_compiler_static works... " >&6; } if test "${lt_prog_compiler_static_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_prog_compiler_static" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_static_works" >&5 $as_echo "$lt_prog_compiler_static_works" >&6; } if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6879: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:6883: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic='-Kpic' lt_prog_compiler_static='-dn' ;; solaris*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test "${lt_prog_compiler_pic_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7112: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7116: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works" >&5 $as_echo "$lt_prog_compiler_pic_works" >&6; } if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7172: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:7176: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds="$tmp_archive_cmds" fi else ld_shlibs=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec=' ' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi4*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then archive_cmds_need_lc=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='-all_load $convenience' link_all_deplibs=yes else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=no hardcode_shlibpath_var=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no hardcode_shlibpath_var=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4.2uw2*) archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=no hardcode_shlibpath_var=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv5*) no_undefined_flag=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec= hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 $as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 8448 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var " || \ test "X$hardcode_automatic"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" { $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; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=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_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=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_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=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_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which librarie types wil actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; darwin* | rhapsody*) if test "$GCC" = yes; then archive_cmds_need_lc=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag='-undefined dynamic_lookup' ;; esac fi ;; esac output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='-all_load $convenience' link_all_deplibs=yes else ld_shlibs=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 $as_echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 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 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. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" # Check whether --with-tags was given. if test "${with_tags+set}" = set; then : withval=$with_tags; tagnames="$withval" fi if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not exist" >&5 $as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not look like a libtool script" >&5 $as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 $as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) as_fn_error "invalid tag name: $tagname" "$LINENO" 5 ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then as_fn_error "tag name \"$tagname\" already exists" "$LINENO" 5 fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && test "X$CXX" != "Xno"; then 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 archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_CXX=yes else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_CXX=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX=' ' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) if test "$GXX" = yes; then archive_cmds_need_lc_CXX=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag_CXX='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='-all_load $convenience' link_all_deplibs_CXX=yes else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd12*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_CXX='+b $libdir' hardcode_libdir_separator_CXX=: ;; ia64*) hardcode_libdir_flag_spec_CXX='-L$libdir' ;; *) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes archive_cmds_need_lc_CXX=no archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sco*) archive_cmds_need_lc_CXX=no case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.0-5 | solaris2.0-5.*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) archive_cmds_need_lc_CXX=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) lt_prog_compiler_pic_CXX='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 $as_echo "$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:11218: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:11222: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:11278: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:11282: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 $as_echo "$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 11789 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var CXX" || \ test "X$hardcode_automatic_CXX"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" { $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; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_cxx_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=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_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else ac_fn_cxx_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=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_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=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_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_CXX" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code=" subroutine t\n return\n end\n" # Code to be used in simple link tests lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) test "$enable_shared" = yes && enable_static=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_F77='-Kpic' lt_prog_compiler_static_F77='-dn' ;; solaris*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_F77" >&5 $as_echo "$lt_prog_compiler_pic_F77" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } if test "${lt_prog_compiler_pic_works_F77+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13267: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13271: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_F77" >&5 $as_echo "$lt_prog_compiler_pic_works_F77" >&6; } if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13327: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13331: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_F77="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_F77="$tmp_archive_cmds" fi else ld_shlibs_F77=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_F77=yes else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_F77=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77=' ' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi4*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then archive_cmds_need_lc_F77=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag_F77='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='-all_load $convenience' link_all_deplibs_F77=yes else ld_shlibs_F77=no fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; ia64*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; *) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; sco3.2v5*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4.2uw2*) archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_F77='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv5*) no_undefined_flag_F77=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_F77= hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 $as_echo "$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_F77" >&5 $as_echo "$archive_cmds_need_lc_F77" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 14591 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var F77" || \ test "X$hardcode_automatic_F77"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 $as_echo "$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" { $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; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_F77" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15335: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15339: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_GCJ='-Kpic' lt_prog_compiler_static_GCJ='-dn' ;; solaris*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_GCJ" >&5 $as_echo "$lt_prog_compiler_pic_GCJ" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15568: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15572: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_GCJ" >&5 $as_echo "$lt_prog_compiler_pic_works_GCJ" >&6; } if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15628: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:15632: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 $as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_GCJ="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_GCJ="$tmp_archive_cmds" fi else ld_shlibs_GCJ=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_GCJ=yes else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_GCJ=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ=' ' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi4*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) if test "$GXX" = yes ; then archive_cmds_need_lc_GCJ=no case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='-undefined suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' ;; 10.*) allow_undefined_flag_GCJ='-undefined dynamic_lookup' ;; esac fi ;; esac lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='-all_load $convenience' link_all_deplibs_GCJ=yes else ld_shlibs_GCJ=no fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; ia64*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; *) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; sco3.2v5*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4.2uw2*) archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_GCJ='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv5*) no_undefined_flag_GCJ=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_GCJ= hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_GCJ" >&5 $as_echo "$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_GCJ" >&5 $as_echo "$archive_cmds_need_lc_GCJ" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi4*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # find out which ABI we are using libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) echo '#line 16904 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *64-bit*) libsuff=64 sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ;; esac fi rm -rf conftest* ;; esac # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=yes library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var GCJ" || \ test "X$hardcode_automatic_GCJ"="Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_GCJ" >&5 $as_echo "$hardcode_action_GCJ" >&6; } if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" { $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; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=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_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=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_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=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_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_GCJ" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_RC" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" ;; *) as_fn_error "Unsupported tag name: $tagname" "$LINENO" 5 ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" as_fn_error "unable to update list of available tagged configurations." "$LINENO" 5 fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # Check whether --with-wxGTK was given. if test "${with_wxGTK+set}" = set; then : withval=$with_wxGTK; fi if test "$with_wxGTK" = "no"; then as_fn_error "fatal error: wxGTK is required to build extrema" "$LINENO" 5 elif test "$with_wxGTK" = ""; then # Extract the first word of "wx-config", so it can be a program name with args. set dummy wx-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 test "${ac_cv_path_WX_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG="$WX_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_WX_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 WX_CONFIG=$ac_cv_path_WX_CONFIG if test -n "$WX_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG" >&5 $as_echo "$WX_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "$WX_CONFIG"; then WX_CXXFLAGS=`$WX_CONFIG --cxxflags` WX_LIBS=`$WX_CONFIG --libs` else as_fn_error "fatal error: could not find wx-config. wxGTK is required to build extrema" "$LINENO" 5 fi else # Extract the first word of "wx-config", so it can be a program name with args. set dummy wx-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 test "${ac_cv_path_WX_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG="$WX_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$with_wxGTK:$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_WX_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 WX_CONFIG=$ac_cv_path_WX_CONFIG if test -n "$WX_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG" >&5 $as_echo "$WX_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "$WX_CONFIG"; then WX_CXXFLAGS=`$WX_CONFIG --cxxflags` WX_LIBS=`$WX_CONFIG --libs` else as_fn_error "fatal error: could not find wx-config. wxGTK is required to build extrema" "$LINENO" 5 fi fi # Check whether --with-MUD was given. if test "${with_MUD+set}" = set; then : withval=$with_MUD; else with_MUD=no fi if test "$with_MUD" != "no" && test "$with_MUD" != ""; then MUD_CXXFLAGS="-DHAVE_MUD -I$with_MUD/src" MUD_LIB="-L$with_MUD/lib -lmud" fi # Check whether --with-MINUIT was given. if test "${with_MINUIT+set}" = set; then : withval=$with_MINUIT; else with_MINUIT=no fi if test "$with_MINUIT" != "no" && test "$with_MINUIT" != ""; then MINUIT_CXXFLAGS="-DHAVE_MINUIT -I$with_MINUIT/include/Minuit" MINUIT_LIB="-L$with_MINUIT/lib -llcg_Minuit" fi EX_CXXFLAGS='-I${top_srcdir}/src -I${top_srcdir}/src/Commands -I${top_srcdir}/src/Expression -I${top_srcdir}/src/Functions -I${top_srcdir}/src/Graphics -I${top_srcdir}/src/Operators -I${top_srcdir}/src/Parsing -I${top_srcdir}/src/Utilities -I${top_srcdir}/src/Variables -I${top_srcdir}/src/wxForms -DEX_DATADIR="\"$(datadir)\"" -DEX_BINDIR="\"$(bindir)\""' GTK_LIBS=`pkg-config --libs gtk+-2.0` ac_config_files="$ac_config_files Makefile src/Makefile src/Commands/Makefile src/Expression/Makefile src/Functions/Makefile src/Graphics/Makefile src/Operators/Makefile src/Parsing/Makefile src/Utilities/Makefile src/Variables/Makefile src/wxForms/Makefile" 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 test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file 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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= 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 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__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 "${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 : ${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. 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 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=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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 extrema $as_me 4.4.5, which was generated by GNU Autoconf 2.64. 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" 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 -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 Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ extrema config.status 4.4.5 configured by $0, generated by GNU Autoconf 2.64, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2009 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=$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 ;; --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"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --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" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/Commands/Makefile") CONFIG_FILES="$CONFIG_FILES src/Commands/Makefile" ;; "src/Expression/Makefile") CONFIG_FILES="$CONFIG_FILES src/Expression/Makefile" ;; "src/Functions/Makefile") CONFIG_FILES="$CONFIG_FILES src/Functions/Makefile" ;; "src/Graphics/Makefile") CONFIG_FILES="$CONFIG_FILES src/Graphics/Makefile" ;; "src/Operators/Makefile") CONFIG_FILES="$CONFIG_FILES src/Operators/Makefile" ;; "src/Parsing/Makefile") CONFIG_FILES="$CONFIG_FILES src/Parsing/Makefile" ;; "src/Utilities/Makefile") CONFIG_FILES="$CONFIG_FILES src/Utilities/Makefile" ;; "src/Variables/Makefile") CONFIG_FILES="$CONFIG_FILES src/Variables/Makefile" ;; "src/wxForms/Makefile") CONFIG_FILES="$CONFIG_FILES src/wxForms/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_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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$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 -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # 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 {' >"$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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$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 $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :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="$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 "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 >"$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 "$tmp/subs.awk" >$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' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :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"" || { # Autoconf 2.62 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"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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 $? 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 extrema-4.4.5/Scripts/0000755012702201742730000000000011322775506013646 5ustar spangspangextrema-4.4.5/Scripts/waterpipes.pcm0000644012702201742730000000420111274636625016533 0ustar spangspang! Suppose we were given the job of figuring out the minimum amount of water ! pipe necessary to connect up the houses on a street to a water main. We ! have to determine where to dig a straight trench down the street for the ! water main pipe. Suppose that the houses are set back from the street by ! varying distances, and that each house should be about 5 meters from the ! water main. The problem is to find the trench which would result in the ! minimum usage of water pipe segments from the main to the houses. We also ! should determine the total length of the pipe we will need. ! ! Suppose the (x,y) coordinates of the connections to the houses are stored ! in a file, HOUSES.DAT. Remember from plane geometry that the distance from ! point (x,y) to a straight line with slope A and y-intercept B is given by ! D = |A*x+B-y|/sqrt(A^2+1), see the figure (waterpipe-fig.gif). We want ! to minimize the connecting pipe lengths by varying the free parameters A ! and B. The following small script does what we want. ! ! Since least squares is used for fitting, we take the square root of the ! expression. Note that we have more than one independent variable in the ! expression. Extension to multidimensional cases is straightforward. ! The problem of fitting to a scattered set of points with a straight line ! which is, on the average, a fixed number of units away will, in general, ! have two solutions and which one you get will depend on the starting values ! of the free parameters. ! ! FILE = 'houses.dat' LENGTH_GOAL = 5 ! try to achieve this goal READ\-MESSAGES FILE X Y ! read in the house positions SCALAR\FIT A B ! declare the free parameters A = 1 ! initialize B = 1 ! initialize D[1:LEN(X)] = LENGTH_GOAL ! DISTANCE = 'ABS(A*X+B-Y)/SQRT(A*A+1)' ! FIT\-MESSAGES D=SQRT(DISTANCE) ! do the fit FIT\UPDATE PIECES ! redo using calculated A and B STATISTICS PIECES PSUM\SUM ! the total length of pipe needed DISPLAY 'Total length of pipe = '//RCHAR(PSUM,'%4.2f') waterpipesDone = 1 extrema-4.4.5/Scripts/area.pcm0000644012702201742730000000051711274636625015266 0ustar spangspangCLEAR DEFAULTS WINDOW 0 ! GENERATE THETA 0 .25 360 R[1:LEN(THETA)] = 1 clear defaults SET AUTOSCALE COMMENSURATE GRAPH R*COSD(THETA) R*SIND(THETA) PIC = AREA(R*COSD(THETA),R*SIND(THETA)) set textalign 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 text 'Calculated = '//rchar(pic)//', acos(-1) = '//rchar(acos(-1)) extrema-4.4.5/Scripts/sample_graphs.pcm0000644012702201742730000000065111274636625017202 0ustar spangspangclear window 5 defaults x=[1:10] set xlabelon 1 xlabel 'X<^>2<_> vs X' %xlabelheight 6 graph x x*x window 6 defaults x2=[-5:5] set xlabelon 1 xlabel 'X<^>3<_> vs X' %xlabelheight 6 graph x2 x2^3 window 7 defaults pi = acos(-1) theta=[0:2*pi:0.05] if exist('r') then destroy\-messages r r[1:len(theta)] = 1 set xlabelon 1 xlabel 'R*SIN() vs R*COS()' %xlabelheight 6 graph r*cos(theta) r*sin(theta) extrema-4.4.5/Scripts/SplineSmooth.pcm0000644012702201742730000000053411274636625017001 0ustar spangspangclear window 0 defaults ! x = [0:10] y = 2*x^2-3*x+50 + 75*ran(x) generate xx 0,,10,100 set plotsymbol -10 set plotsymbolcolor red graph x y set plotsymbol 0 set curvecolor black t = [0;0.001;0.01;0.1] do i = [1:len(t)] set tension t[i] set curvecolor -(i+6) display 'Using tension = '//rchar(t[i]) graph\overlay xx smooth(x,y,xx) enddo replot extrema-4.4.5/Scripts/yonright.pcm0000644012702201742730000000117011274636625016215 0ustar spangspangx=[1:20:.5] y1=x^2 y2=exp(sin(x/5)) clear window 0 defaults ! set %yloweraxis 15 set %yupperaxis 90 set %xloweraxis 15 set %xupperaxis 80 ! set %xtextlocation (80+15)/2 set %ytextlocation 1 set textalign 2 set textinteractive 0 set %textheight 4 text 'This is the x-axis label' ! set %xtextlocation 3 set %ytextlocation (90+15)/2 set textalign 8 set textangle 90 text 'x<^>2' ! set graphbox 0 graph x y1 ! set yaxiscolor blue set ynumberscolor blue set curvecolor blue set xaxison 0 ! graph\yonright x y2 ! set %xtextlocation 93 set %ytextlocation (90+15)/2 set textalign 8 set textangle -90 set textcolor blue text 'e<^>sin(x/5)' extrema-4.4.5/Scripts/colorTest.pcm0000644012702201742730000000055411274636625016335 0ustar spangspangclear window 0 defaults ! x=[1:19] set xaxiscolor red set yaxiscolor blue set xnumberscolor green set ynumberscolor purple set curvecolor salmon set %plotsymbolsize 4 set plotsymbol 14 set plotsymbolcolor -x set xlabel 'X Axis Label' set xlabelcolor navy set xlabelon 1 set ylabel 'Y Axis Label' set ylabelcolor brown set ylabelon 1 set %xloweraxis 12 graph x x^2 extrema-4.4.5/Scripts/two_way_anova.pcm0000644012702201742730000000472311274636625017236 0ustar spangspang! ! two-way analysis of variance without interaction ! nameList = ?1 ! @splitString nameList k names error if (error) then display 'an error occurred splitting the name list into vector names' return endif ! ! k = number of populations ! n = number of blocks ! T[i] = total of the observations for the i_th population ! TT = grand total of all observations from all populations ! df = population degrees of freedom ! dfe = error degrees of freedom ! dft = total degrees of freedom ! SSTr = sum of squares for the populations ! SSE = error sum of squares ! SSB = block sum of squares ! SST = total sum of squares ! MSTr = population mean square ! MSE = error mean square ! n = len(names[1]) do i = [2:k] tmp = len(names[i]) if (tmp~=n) then display 'all vectors must be the same length for the 2-way anova' return endif enddo destroy tmp df = k-1 dfb = n-1 dfe = df*dfb dft = df+dfb+dfe ! = n*k-1 if exist('T') then destroy T do i = [1:k] T[i] = sum(names[i]) enddo TT = sum(T) if exist('TB') then destroy TB TB[1:n] = 0 do j = [1:n] do i = [1:k] TB[j] = TB[j] + (names[i])[j] enddo enddo SSB = sum(TB^2)/k - TT^2/k/n SSTr = sum(T^2)/n - TT^2/k/n SST = 0 do i = [1:k] do j = [1:n] SST = SST + (names[i])[j]^2 enddo enddo SST = SST - TT^2/k/n MSTr = SSTr/df SSE = SST - SSTr - SSB MSB = SSB/dfb MSE = SSE/dfb/df FTr = MSTr/MSE FB = MSB/MSE ='Source of Degrees of Sum of Mean F' ='Variation Freedom Squares Square' ='----------------------------------------------------------------------' ='Populations '//rchar(df,'%12.0f')//rchar(SSTr,'%15.1f')//rchar(MSTr,'%15.1f')//rchar(FTr,'%15.1f') ='Blocks '//rchar(dfb,'%12.0f')//rchar(SSB,'%15.1f')//rchar(MSB,'%15.1f')//rchar(FB,'%15.1f') ='Error '//rchar(dfe,'%12.0f')//rchar(SSE,'%15.1f')//rchar(MSE,'%15.1f') ='Total '//rchar(dft,'%12.0f')//rchar(SST,'%15.1f') =' ' criticalValue = 1-fisher(df,dfe,FTr) ='Null hypothesis: the differences among the population means can be atributed to chance' ='Accept the null hypothesis at a significance level of '//rchar(criticalValue*100,'%4.1f')//'%' =' ' criticalValue = 1-fisher(dfb,dfe,FB) ='Null hypothesis: the differences among the block means can be atributed to chance' ='Accept the null hypothesis at a significance level of '//rchar(criticalValue*100,'%4.1f')//'%' =' ' !destroy error k n df dfe dft i j T TT SST SSTr SSB MSTr MSB SSE MSE FTr FB !destroy nameList names rowLen numberOfPopulations extrema-4.4.5/Scripts/areafill1.pcm0000644012702201742730000000011511274636625016210 0ustar spangspangwindow 0 defaults clear ! generate x -5,,5 50 y=x^2+3*x-2 @curvefill x y red extrema-4.4.5/Scripts/ShowColorMap.pcm0000644012702201742730000000066111274636625016733 0ustar spangspangclear defaults window 0 ! cmap='DEFAULT' inquire 'What colormap would you like to see ('//cmap//')' cmap set colormap cmap get colormapsize cSize ! xmax = int(sqrt(cSize)+0.5) ymax = xmax ! scales\commensurate\-messages 0 17 0 17 do j = [0:ymax-1] do i = [1:xmax] n = i+j*xmax if (n>cSize) then goto DONE set areafillcolor n graph\overlay [i;i+1;i+1;i;i] [ymax-j-1;ymax-j-1;ymax-j;ymax-j;ymax-j-1] enddo enddo DONE: return extrema-4.4.5/Scripts/areafill3.pcm0000644012702201742730000000006511274636625016216 0ustar spangspangclear window 0 defaults ! @filledring 12 5 green 100 extrema-4.4.5/Scripts/filled_ring.pcm0000644012702201742730000000054211274636625016632 0ustar spangspangclear defaults GENERATE THETA 0,,360 100 XTEMP = 12*COSD(THETA) YTEMP = 12*SIND(THETA) XTEMP[200:101:-1] = 5*COSD(THETA) YTEMP[200:101:-1] = 5*SIND(THETA) SET AREAFILLCOLOR green PLOTSYMBOL 0 ! no plotting symbol AUTOSCALE COMMENSURATE ! choose axis autoscaling type GRAPH XTEMP YTEMP ! plot data with axes extrema-4.4.5/Scripts/good-pairs.pcm0000644012702201742730000000732711274636625016430 0ustar spangspang! The following macro takes measured component values and finds the pairs ! of components which most closely sum to a given value. For example, suppose ! you have measured values for 143 capacitors: these values range from 18.27nF ! to 20.61nF, and you wish to select the pairs of capacitors whose sum most ! closely approaches a value of 39.5nF. All the capacitors do not need to be ! used, but a given capacitor can only be used once. !---------------------------------------------------------------------------+ ! The mod function is the modulus function, mod(a,b) = a-b*int(a/b) ! The operator | is the "OR" operator ! It only takes about 2.5 minutes to find 42 pairs !---------------------------------------------------------------------------+ generate\random cap 18.27 20.61 143 ! fake some data !read pfn_cap.data\(2) cap goal = 39.5 npairs = 10 inquire 'goal (def='//rchar(goal)//')' goal inquire 'number of pairs (def='//rchar(npairs)//')' npairs time0 = time t0 = eltime(0) ! initialize elapsed time function ! lc = len(cap) matrix m lc lc ! upper triangular matrix m do i = [1:lc] ! contains all combinations of sums m[1:lc,i] = cap[i]+cap ! m[i,j] = cap[i]+cap[j] m[i,i] = 0 ! set diagonal to zero enddo xx = [1:lc*lc] mv = unfold(abs(goal-m)) destroy m ! mv is a vector containing the differences between the goal and the sums ! abs(goal-m[i,j]) = mv[i+(j-1)*lc] ! must make it into a vector so it can be sorted sort\up mv xx ! mv is sorted into ascending order ! mv[1] is the sum closest to goal and mv[lc*lc] is the worst ! xx is re-arranged along with mv to keep track of mv's original indices ! now all we have to do is pick off the elements of mv one-by-one and ! make sure that it's corresponding index decomposes into unique capacitor ! indices, ix and jx jx = int((xx-1)/lc)+1 ! column index ix = xx-(jx-1)*lc ! row index ! mv[k] = abs(goal-m[ix[k],jx[k]]) ! we know the first one is the best one, so take it icnt = 1 if exist('ibest') then destroy ibest jbest sums diffs ibest[icnt] = ix[1] jbest[icnt] = jx[1] sums[icnt] = cap[ix[1]]+cap[jx[1]] diffs[icnt] = mv[1] ! = abs(goal-(cap[ix[1]]+cap[jx[1]])) ='icnt ibest jbest sum |goal-sum|' =rchar(icnt,' %3.0f')//rchar(ibest[icnt],' %4.0f')//- rchar(jbest[icnt],' %4.0f')//rchar(sums[icnt],' %7.4f')//- rchar(diffs[icnt],' %7.4f') kstart = 2 more: do k = [kstart:lc*lc] ! the following test determines uniqueness ! this is the trick I mentioned above test = ((ix[k]=ibest)|(ix[k]=jbest)|(jx[k]=jbest)|(jx[k]=ibest)) if (icnt=1) then testSum=test[1] if (icnt=2) then testSum=test[1]+test[2] if (icnt>2) then statistics\-messages test[1:icnt] testSum\sum if (testSum>0) then goto next ! write out the k's if you want to see how many sums need to be skipped over ! ='k='//rchar(k) ! if we get to here, we have found a unique pair icnt = icnt+1 ibest[icnt] = ix[k] jbest[icnt] = jx[k] sums[icnt] = cap[ix[k]]+cap[jx[k]] diffs[icnt] = mv[k] ! =abs(goal-(cap[ix[k]]+cap[jx[k]])) =rchar(icnt,' %3.0f')//rchar(ibest[icnt],' %4.0f')//- rchar(jbest[icnt],' %4.0f')//rchar(sums[icnt],' %7.4f')//- rchar(diffs[icnt],' %7.4f') if (icnt=npairs) then goto done next: enddo done: time1=time t1 = eltime(1) statistics\-messages sums-goal rms_err\rms ='RMS error = '//RCHAR(rms_err) =' ' ='Start Analysis Time '//time0 ='End Analysis Time '//time1//' elapsed time = '//rchar(t1)//' sec' answer='NO' inquire\yesno 'more pairs' answer if eqs(ucase(answer[1]),'Y') then kstart = k+1 npairs = npairs+1 inquire 'number of pairs (def='//rchar(npairs)//')' npairs goto more endif clear defaults npairs = icnt graph [1:npairs] diffs[1:npairs] extrema-4.4.5/Scripts/logstyles.pcm0000644012702201742730000000057411274636625016406 0ustar spangspangx=[1:100] y=x^2 clear window 3 0 50 100 100 defaults set %ximagticlength 3 set %yimagticlength 3 set %xloweraxis 15 set ylogbase 10 set ylogstyle 1 set %ynumbersheight 6 set %xnumbersheight 6 graph x y window 4 0 0 100 50 defaults set %ximagticlength 3 set %yimagticlength 3 set %xloweraxis 15 set ylogbase 10 set ylogstyle 0 set %ynumbersheight 6 set %xnumbersheight 6 graph x y extrema-4.4.5/Scripts/extremaInit.pcm0000644012702201742730000000020511274636625016641 0ustar spangspangx=[1:10] y=x*x window 1 0 0 50 50 window 2 0 50 50 100 window 3 50 50 100 100 window 4 50 0 100 50 window 0 clear defaults graph x y extrema-4.4.5/Scripts/fill.pcm0000644012702201742730000000036311274636625015303 0ustar spangspang! script fill.pcm ! X0 = ?1 Y0 = ?2 X02 = ?3 Y02 = ?4 L = LEN(X0) L1 = LEN(X02) X0[L+1:L+L1] = X02[L1:1:-1] Y0[L+1:L+L1] = Y02[L1:1:-1] SET AREAFILLCOLOR STRING(?5) GRAPH X0 Y0 !DEFAULTS !DESTROY X0 Y0 X02 Y02 L L1 ! eliminate dummy variables extrema-4.4.5/Scripts/inverse.pcm0000644012702201742730000000050311274636625016024 0ustar spangspangm=[[3;10;5];[4;2;-4];[15;3;3]] b=[26;14;22] soln=gaussj(m,b) ='solve mx=b for x, where m =' =m ='and b =' =b =' ' ='solution = ' =soln =' ' ='check by looking at m<>solution =' =m<>soln =' ' ='now for the matrix inverse...' inv=inverse(m) =' ' ='inverse =' =inv =' ' ='check by looking at m<>inverse =' =abs(m<>inv-1)<.001 extrema-4.4.5/Scripts/densityplots.pcm0000644012702201742730000000201011274636625017105 0ustar spangspangX=[ 1; 0; 1; 0; .2; .3; .5; .8] Y=[ 5; 5; 0; 0; 1;1.5; 2.5; 4] Z=[ 10; 10; 10; 10; -100; 10; -100; 500] GRID\XYOUT X Y Z M XOUT YOUT window 1 20 20 80 80 defaults clear set %yimagticlength 2 set %xnumbersheight 5 set %ynumbersheight 5 set xdropfirstnumber 1 set xdroplastnumber 1 set ydropfirstnumber 1 set ydroplastnumber 1 set %legendsize 2 density xout yout m pause ! clear density\legend xout yout m pause ! clear density\dithering x y z pause ! clear density\dithering\legend x y z pause ! clear D=[ 1;1; 2;2; 4;4; 7;7; 11;11; 0;0 ] density\dithering\dithervector\legend d x y z pause ! clear density\diffusion x y z pause ! clear density\diffusion\xpro\ypro x y z pause ! clear window 0 defaults set %legendsize 2 set %yimagticlength 2 r=mod([0:143],4)+1 sort r t=mod([0:143],36)*10 d=[1;1; 2;2; 4;4; 7;7; 11;11; 0;0] x = r*cosd(t) y = r*sind(t) z = exp(-r/2)*cosd(180*(r-1)) grid\xyout x y z m xout yout density\legend\dithering\dithervector d xout yout m ! window 0 destroy\-mess r t d x y z xout yout m extrema-4.4.5/Scripts/fit-demo.pcm0000644012702201742730000000171411274636625016062 0ustar spangspangclear window 0 defaults ! x=[0:720:5] y=5+sind(x+20)*exp(x/800)+ran(x) set plotsymbol -1 nsxinc 5 nsyinc 5 curvecolor red graph x y scalar\fit a b c c=100 fit\e1\e2 y=a+sind(x+b)*exp(x/c) display 'root mean square standard errors of estimate for each paramter' display '--------------------------------------------------------------' display 'for A: '//rchar(fit$e2[1]) display 'for B: '//rchar(fit$e2[2]) display 'for C: '//rchar(fit$e2[3]) display ' ' fit\update yf set plotsymbol 0 curvecolor blue graph\overlay x yf set %xtextlocation 18 %ytextlocation 91 %textheight 3 textalign 1 textinteractive 0 text 'Fitted function y=a*sin(x+b)*exp(x/c)' set %xtextlocation 70 %ytextlocation 85 %textheight 2 text 'a = '//rchar(a) set %ytextlocation 80 text 'b = '//rchar(b) set %ytextlocation 75 text 'c = '//rchar(c) !set ! %xtextlocation 55 ! %ytextlocation 94 ! %textheight 6 ! textalign 2 ! textcolor red ! !text 'Extrema fitting demonstration' extrema-4.4.5/Scripts/testexpand.pcm0000644012702201742730000000023511274636625016532 0ustar spangspanga=2 b=3 fc1="(a+b)/a" fc2="sqrt(a/b)" fc3="fc1*fc2" fc4="fc3+4*fc2" show\text display "fc4 --> "//ucase(fc4) display "expand(fc4) --> "//expand(fc4) extrema-4.4.5/Scripts/intersecting circles.pcm0000644012702201742730000000234011274636625020455 0ustar spangspanginquire 'Enter first circle centre coordinates and radius: cx1, cy1, r1' x1 y1 r1 inquire 'Enter second circle centre coordinates and radius: cx2, cy2, r2' x2 y2 r2 dsq = (x2-x1)^2+(y2-y1)^2 d = sqrt(dsq) if (d>=r1+r2) then display `no intersection' return endif r = 0.5*(r2+r1-d) if ( r>=r2 ) then r = r2 a = x2 b = y2 goto draw endif if ( r>=r1 ) then r = r1 a = x1 b = y1 goto draw endif !a = 0.5*(r1*r1-r2*r2)*(x2-x1)/dsq + 0.5*(x2+x1) !b = 0.5*(r1*r1-r2*r2)*(y2-y1)/dsq + 0.5*(y2+y1) a = (d-r2+r)*(x2-x1)/d+x1 b = (d-r2+r)*(y2-y1)/d+y1 draw: generate theta 1,,360 100 clear window 0 defaults set autoscale commensurate graph\-axes r1*cosd(theta)+x1 r1*sind(theta)+y1 set plotsymbol -1 set plotsymbolcolor red graph\overlay x1 y1 set plotsymbol 0 set curvecolor red graph\overlay r1*cosd(theta)+x1 r1*sind(theta)+y1 set plotsymbol -1 set plotsymbolcolor blue graph\overlay x2 y2 set plotsymbol 0 set curvecolor blue graph\overlay r2*cosd(theta)+x2 r2*sind(theta)+y2 set plotsymbol -1 set plotsymbolcolor green graph\overlay a b set plotsymbol 0 set curvecolor green graph\overlay r*cosd(theta)+a r*sind(theta)+b !replot display `Largest circle in the intersection: center= ('//rchar(a)//`,'//rchar(b)//`) radius= '//rchar(r) extrema-4.4.5/Scripts/fit-test.pcm0000644012702201742730000000065511274636625016120 0ustar spangspangclear window 0 defaults ! set plotsymbol -17 %plotsymbolsize 2 plotsymbolcolor red curvecolor blue x=[0:5:.25] y=2*exp(-3*x)-0.5*ran(x) set autoscale on graph x y scalar\fit a b c a=1 b=-1 c=1 fit y = a*exp(b*x) + c fit\update yfit set curvecolor blue plotsymbol 0 graph\overlay x yfit set %xtextlocation 10 %ytextlocation 92 textalign 1 textinteractive 0 text 'FIT: y = a*exp(b*x)+c' ! destroy\-mess x y a b c yfit extrema-4.4.5/Scripts/anova.pcm0000644012702201742730000000233511274636625015462 0ustar spangspang! ! one-way analysis of variance test ! nameList = ?1 ! @splitString nameList numberOfPopulations names error if (error) then goto ASK_AGAIN ! k = numberOfPopulations df = k-1 dfe = 0 do i = [1:k] T[i] = sum(names[i]) n[i] = len(names[i]) dfe = dfe + n[i] - 1 enddo dft = df + dfe TT = sum(T) SSTr = sum(T^2/n)-TT^2/sum(n) SST = 0 do i = [1:k] do j = [1:n[i]] SST = SST + (names[i])[j]^2 enddo enddo SST = SST - TT^2/sum(n) MSTr = SSTr/df SSE = SST - SSTr MSE = SSE/dfe F = MSTr/MSE ='Source of Degrees of Sum of Mean F' ='Variation Freedom Squares Square' ='--------------------------------------------------------------------' ='Treatments'//rchar(df,'%12.0f')//rchar(SSTr,'%15.1f')//rchar(MSTr,'%15.1f')//rchar(F,'%15.1f') ='Error '//rchar(dfe,'%12.0f')//rchar(SSE,'%15.1f')//rchar(MSE,'%15.1f') ='Total '//rchar(dft,'%12.0f')//rchar(SST,'%15.1f') =' ' criticalValue = 1-fisher(df,dfe,F) ='Null hypothesis: the differences among the sample means can be atributed to chance' ='Accept the null hypothesis at a significance level of '//rchar(criticalValue*100)//'%' =' ' destroy error k n df dfe dft i j T TT SST SSTr MSTr SSE MSE F nameList names rowLen numberOfPopulations extrema-4.4.5/Scripts/filterDeriv.pcm0000644012702201742730000000074211274636625016635 0ustar spangspangX=[0:4:.2] H=X[2]-X[1] Y=X^2-3*X+3 window 5 0 50 50 100 window 7 50 50 100 100 ! CLEAR DRAW_TITLE = 'DRAW_TITLE.PCM' WINDOW 5 defaults SET PLOTSYMBOL -1 %XNUMBERSHEIGHT 6 %YNUMBERSHEIGHT 6 @DRAW_TITLE 6 'original data' GRAPH X Y ! window 7 defaults SET PLOTSYMBOL 0 %XNUMBERSHEIGHT 6 %YNUMBERSHEIGHT 6 @DRAW_TITLE 6 'first derivatives' FILTER\-RECURSIVE Y YF [-4;30;-120;40;60;-6] SCALES 0 4 -3 5 SET PLOTSYMBOL -2 GRAPH X YF/(120*H) SET PLOTSYMBOL 0 GRAPH\overlay X 2*X-3 extrema-4.4.5/Scripts/bragg.pcm0000644012702201742730000001256411274636625015445 0ustar spangspang! Proton Beam Therapy uses protons to fight cancer. Protons are stable, ! positively-charged subatomic particles with a mass 1800 times that of an ! electron. Protons slow down relatively fast when entering biological tissue, ! and most of their energy is deposited, with little scatter, at the end of their ! path in a peak called a Bragg peak. The depth at which the peak occurs can be ! controlled by the amount of energy the protons are given by their ! accelerator. The proton's dose of radiation is released in an exact shape and ! depth within the body. Tissues in front of the target receive a very small ! dose, while tissues adjacent to the tumor receive virtually none. ! ! When a high energy proton enters a body, it gives up its energy as it is slowed ! down. The proton creates secondary ions by stripping electrons from atoms in ! the target tissue. These secondary ions snip the DNA strands of the tumor, ! thereby affecting the tumor's survival. At first entry into a patient, the ! protons do not generate many ions, for they are moving at a large fraction of ! the speed of light. As they penetrate the tissue and slow down, an increasing ! dosage of ions is generated per unit volume of tissue. When the proton has lost ! about half of its energy, it absorbs an electron and is no longer able to ! generate ions. It comes to a stop, exhausted of energy. That is carefully ! tuned to occur at the back side of the target tumor. Essentially no energy is ! available beyond it's stopping point. The medical value of this effect was ! first published in 1947 in a paper entitled "Radiological Use of Fast Protons" ! by Robert R. Wilson. Proton beam therapy has demonstrated success for the ! treatment of selected tumours. More than 20,000 patients have been treated with ! protons or light ions in research laboratories or hospitals around the world. ! ! The problem solved in the following script is described here. ! Given some numerical function (e.g., BRAGG energy loss distribution) explore ! how a weighted set of these functions, appropriately shifted in the independent ! variable, can be used to attain a flat distribution over a given range. ! The script first plots the original data for the BRAGG energy loss distribution ! and then asks the user for the amount of the shift and the number of functions. ! The script then calculates the best weights to apply to the individual functions ! and plots the resultant weighted individual functions and the spread out Bragg ! peak, which is the sum of these functions. A vector, output, is created ! containing the calculated weight values. ! !------------------------------------------------------------------------- ! This is the latest version of the BRAGG script ! A "better" flat top is achieved by carefully choosing the fitting range, ! which is now done automatically. !------------------------------------------------------------------------- window 0 defaults clear datafile = 'bragg.dat' read\-messages datafile xdata ydata set tension 0.001 npts = 100 generate x1 xdata[1],,xdata[#] npts y1 = smooth(xdata,ydata,x1) statistics\-messages y1 ylev\max iymax\imax xupr = x1[iymax] ! window 5 defaults set graphbox 0 plotsymbol -1 %xnumbersheight 3 %ynumbersheight 3 %xloweraxis 20 ylabel 'Normalized Dose' ylabelon 1 %ylabelheight 5 xlabel 'Depth (mm)' xlabelon 1 %xlabelheight 3 graph xdata ydata set plotsymbol 0 graph\overlay x1 y1 set textcolor blue textalign 1 textinteractive 0 %xtextlocation 24 %ytextlocation 80 %textheight 6 text 'raw Bragg peak' ! dx = 1 nstep = 5 inquire 'shift amount ( '//rchar(dx)//' ) & #functions ( '//rchar(nstep)//' ) >> ' dx nstep destroy\-mess m m[1:npts,1] = y1 ! destroy\-mess a1 scalar\fit 'a1' a1 = 1 params = '[a1;' do i = [2:nstep] m[1:npts,i] = step(y1,-abs(dx)/(x1[2]-x1[1])*(i-1)) destroy\-mess\expand 'a'//rchar(i) scalar\fit 'a'//rchar(i) 'a'//rchar(i) = 1 params = params//'a'//rchar(i)//';' enddo paramLen = 1 + 3*min(nstep,9) + 4*(nstep>9)*(nstep-9) params[paramLen:paramLen] = ']' xlow = xupr-(nstep-1)*abs(dx) ! thresh = 0.01 ! lower limit of fit parameters itmax = 10 ! max. # of fit iterations destroy\-messages yf yf[1:npts] = ylev fit_again: fit\weight\itmax\-messages 10*(x1>xlow)*(x1params pmin=1.e30 ipmin=0 do i = [1:nstep] temp = 'a'//rchar(i) value = evaluate(temp) if ( value=thresh ) then goto done_fit temp = 'a'//rchar(ipmin) destroy\-mess\expand temp scalar temp txtemp = temp txtemp = 0 goto fit_again done_fit: window 7 50 50 100 100 defaults set graphbox 0 %xnumbersheight 3 %ynumbersheight 3 %xloweraxis 15 ylabel 'Normalized Dose' ylabelon 1 %ylabelheight 5 xlabel 'Depth (mm)' xlabelon 1 %xlabelheight 3 graph x1 m<>params set textcolor blue textalign 1 textinteractive 0 %xtextlocation 18 %ytextlocation 18 %textheight 5 text 'spread out Bragg peak' ! window 4 0 0 100 50 defaults set graphbox 0 %xnumbersheight 3 %ynumbersheight 3 graph x1 m[*,1]*a1 vector output nstep output[1] = a1 do i = [2:nstep] temp = 'a'//rchar(i) graph\overlay x1 m[*,i]*temp output[i] = evaluate(temp) enddo set %textheight 6 get %xloweraxis xlaxis %yupperaxis yuaxis %textheight txthit set %xtextlocation xlaxis+3 %ytextlocation yuaxis-txthit textalign 1 textinteractive 0 text 'shift = '//rchar(dx)//' mm' set %ytextlocation yuaxis-2.5*txthit text '# functions = '//rchar(nstep) extrema-4.4.5/Scripts/solve.pcm0000644012702201742730000000010711274636625015501 0ustar spangspang m=[[3;10;5];[4;2;-2];[15;3;3]] b=[26;14;22] soln=gaussj(m,b) =soln extrema-4.4.5/Scripts/areafill6.pcm0000644012702201742730000000043111274636625016216 0ustar spangspangclear defaults window 0 ! X = [1:10] ! fake some data SET HISTOGRAMTYPE 1 ! no tails SET AREAFILLCOLOR BLUE ! fill pattern #8 SCALES\-MESSAGES 0 11 0 10.5 ! fix axis scales GRAPH X X ! draw the histogram extrema-4.4.5/Scripts/user-x-axis.pcm0000644012702201742730000000255611274636625016550 0ustar spangspangx=[1:10] ! fake some data y=x*x ! clear window 0 defaults ! set graphbox 0 set plotsymbol -2 set plotsymbolcolor red set autoscale on set xticson 1 set yticson 1 graph x y ! graph the data set autoscale off set graphbox 1 set xticson 0 graph\axesonly ! get %xnumbersheight xnumsz get %yloweraxis ylaxis get %yupperaxis yuaxis get %ximagticlength xiticl get yloweraxis ylaxisw get yupperaxis yuaxisw get ximagticlength xiticlw get ymin ymin get ymax ymax ! ASK: x2={1.2;2.5;4.3;8.9} inquire 'Enter x-coordinates (default=[1.2;2.5;4.3;8.9])' x2 if (len(x2)=0) then goto ASK y2=[1:len(x2)] ! ! now figure out where to plot the tic marks ! y1 = ymax-2*xiticlw/(yuaxisw-ylaxisw)*(ymax-ymin) yloc = yuaxis+1.2*xiticl ! yloc is for plotting the labels set %textheight xnumsz set textinteractive 0 set textalign 2 set %ytextlocation yloc set textangle 0 !set clip 0 ! allow graphing outside the box set plotsymbol 0 set textcolor blue set curvecolor blue world\percent x2 y2 xp yp ! convert graph units to % world coordinates ydum = [y1;ymax] do j = [1:len(x2)] set %xtextlocation xp[j] text rchar(x2[j]) ! the labels xdum[1:2] = x2[j] graph\overlay xdum ydum ! plot the tic marks enddo ! destroy x y j xdum ydum y1 yloc x2 y2 xp yp xnumsz ylaxis yuaxis xiticl ylaxisw yuaxisw xiticlw ymin ymax extrema-4.4.5/Scripts/curvefill.pcm0000644012702201742730000000046511274636625016353 0ustar spangspang! script curvefill.pcm ! XO = ?1 YO = ?2 SET AREAFILLCOLOR STRING(?3) L = LEN(XO) XO[2:L+1] = XO[1:L] XO[L+2] = XO[L+1] YO[2:L+1] = YO[1:L] YO[1] = 0 YO[L+2] = 0 GRAPH XO YO set areafillcolor 0 ZEROLINES\HORIZONTAL ! draw horizontal line thru (0,0) !DEFAULTS !DESTROY XO YO L ! eliminate dummy variables extrema-4.4.5/Scripts/ellipseTest.pcm0000644012702201742730000000056311274636625016654 0ustar spangspangclear defaults ! generate\random x -4 4 1000 generate\random y 3 5 1000 ellipse\fit\xyout\fraction\parameters x y 0.8 a b xc yc angle xo yo set plotsymbol -17 set %plotsymbolsize 0.5 graph x y set plotsymbol 0 set curvecolor red graph\overlay xo yo polygon\inside xo yo x y key idx = where(key=1) set plotsymbol -17 set plotsymbolcolor green graph\overlay x[idx] y[idx] extrema-4.4.5/Scripts/zerolines.pcm0000644012702201742730000000066711274636625016376 0ustar spangspangCLEAR ! WINDOW 5 DEFAULTS set %xnumbersheight 4 set %ynumbersheight 4 SCALES\-messages -5 5 -5 5 GRAPH\AXESONLY set curvecolor red ZEROLINES WINDOW 7 DEFAULTS set %xnumbersheight 4 set %ynumbersheight 4 SCALES\-messages -5 5 -5 5 GRAPH\AXESONLY set curvecolor red ZEROLINES\HORIZONTAL WINDOW 12 25 0 75 50 DEFAULTS set %xnumbersheight 4 set %ynumbersheight 4 SCALES\-messages -5 5 -5 5 GRAPH\AXESONLY set curvecolor red ZEROLINES\VERTICAL extrema-4.4.5/Scripts/bivinterp.pcm0000644012702201742730000000106211274636625016354 0ustar spangspangr = mod([1:1000]-1,5)+1 sort\up r generate t 0,1.8,,200 t[201:400] = t[1:200] t[401:800] = t[1:400] t[801:1000] = t[1:200] z = exp(-r/2)*cosd(180*(r-1)) grid\xyout\size\-messages 10 r*cosd(t) r*sind(t) z m x y ! npts = 30 generate d min(x),,max(x) npts vector u0 npts*npts if exist('v0') then destroy\-messages v0 v0[1:npts] = d u0[1:npts] = d[1] do i = [2:npts] u0[(i-1)*npts+1:i*npts] = d[i] v0 = v0//d enddo w0 = bivinterp(x,y,m,u0,v0) grid\pattern\xyout\-messages u0 v0 w0 w u v ! set colormap rainbow clear window 5 density x y m window 7 density u v w extrema-4.4.5/Scripts/cpu.dat0000644012702201742730000000064411274636625015137 0ustar spangspang1980 1 0 0 1984.5 5 0 0 1988.3 13 0 0 1989.0 29 0 0 1989.2 0 10 0 1990 0 30 0 1990.8 45 65 0 1991.8 55 142 0 1992.0 75 276 0 1993.0 110 360. 0 1994.0 150 748 0 1995.0 144 938 0 1995.5 144 1328 0 1996.0 144 1646 0 1997.0 149 2362 0 1997.2 0 0 80 1997.4 0 0 260 1997.7 149 2290 900 1999.0 149 3379 2785 1999.7 149 3379 6000 2000.2 149 3279 10600 2001.2 149 3700 37219 extrema-4.4.5/Scripts/hyperbolicTrig.pcm0000644012702201742730000000123611274636625017343 0ustar spangspangclear defaults ! generate x -2,,2 100 ! scales -8 3 -5 5 set legendon 1 set legendframeon 0 set %legendframe 15 51 45 87 set plotsymbol 0 ! set curvecolor black graph 'sinh' x sinh(x) ! set curvecolor red graph\overlay 'cosh' x cosh(x) ! set curvecolor blue graph\overlay 'tanh' x tanh(x) ! set curvecolor green graph\overlay 'coth' x coth(x) ! set curvecolor purple graph\overlay 'sech' x sech(x) ! set curvecolor sienna graph\overlay 'csch' x csch(x) ! replot zerolines ! get %xlaxis xlx get %xuaxis xux get %yuaxis yux set %xtextlocation (xux+xlx)/2 set %ytextlocation yux+1 set textalign 2 set textinteractive 0 set textcolor black text 'Hyperbolic trig functions' extrema-4.4.5/Scripts/density_gradient_example.pcm0000644012702201742730000000107311274636625021423 0ustar spangspangclear ! r=mod([0:143],4)+1 sort r t=mod([0:143],36)*10 x = r*cosd(t) y = r*sind(t) z = exp(-r/2)*cosd(180*(r-1)) grid\xyout\-messages x y z m xout yout window 0 get backgroundcolor bgcolor defaults set %yimagticlength 2 %xnumbersheight 5 %ynumbersheight 5 xdropfirstnumber 1 xdroplastnumber 1 ydropfirstnumber 1 ydroplastnumber 1 xticangle -90 yticangle 90 colormap topo256 backgroundcolor bgcolor scales\commensurate\-messages -4 4 -4 4 density\-reset xout yout m !density\legend\-reset xout yout m ! !set contourlabelheight 0 !contour\-axes xout yout m 10 extrema-4.4.5/Scripts/integration_example.pcm0000644012702201742730000000061111274636625020407 0ustar spangspangclear defaults pi=acos(-1) generate x 0,,2*pi 100 y = cos(x)^3+sin(x)^3 graph x y ! set curvecolor red graph\overlay x integral(x,y) set curvecolor black set %xtextlocation 53 %ytextlocation 76 textalign 1 textinteractive 0 text 'f(x)dx' set %xtextlocation 45 %ytextlocation 30 textalign 9 text 'f(x) = cos(x)<^>3<_> + sin(x)<^>3<_>' replot zerolines\horizontal extrema-4.4.5/Scripts/fourAreaFills.pcm0000644012702201742730000000111011274636625017102 0ustar spangspangclear destroy\-messages * ! window 5 defaults generate x -5,,5 50 y=x^2+3*x-2 @curvefill x y red ! window 6 defaults generate x 0,,180 100 y=sind(x) generate x1 0,,180 50 y1=exp(-x1/90)*sind(x1) scales\-messages -10 200 -.2 1 @fill x y x1 y1 red ! window 7 defaults @filledring 12 5 green 100 ! window 8 defaults C = [1:10] ! produces f=[7;8;9;10;7;8;9;10;7;8] X = [1:10] ! fake some data SET AREAFILLCOLOR -C ! fill colors are in C SCALE\-MESSAGES 0 11 0 10.5 ! fix axis scales GRAPH\HISTOGRAM X ! draw the histogram extrema-4.4.5/Scripts/bragg.dat0000644012702201742730000000157611274636625015437 0ustar spangspang0.00 .290 21.60 .367 22.10 .373 22.60 .376 23.10 .382 23.60 .388 24.10 .393 24.60 .397 25.10 .403 25.60 .407 26.10 .412 26.60 .418 27.10 .425 27.60 .433 28.10 .437 28.60 .444 29.10 .453 29.60 .461 30.10 .474 30.60 .487 31.10 .498 31.60 .510 32.10 .524 32.60 .540 33.10 .555 33.60 .576 34.10 .597 34.60 .622 35.10 .654 35.60 .687 36.10 .728 36.60 .770 37.10 .814 37.60 .871 38.10 .938 38.60 1.032 39.10 1.168 39.60 1.286 40.10 1.325 40.60 1.184 41.10 .907 41.60 .553 42.10 .211 42.60 .048 43.10 .006 43.60 .000 44.10 .000 extrema-4.4.5/Scripts/aspect_control.pcm0000644012702201742730000000050111274636625017366 0ustar spangspangclear window 0 defaults x=[1:22] set xaxiscolor red yaxiscolor blue xnumberscolor green ynumberscolor purple curvecolor coral %plotsymbolsize 4 plotsymbol x plotsymbolcolor -x xlabel 'X Axis Label' xlabelcolor navy xlabelon 1 ylabel 'Y Axis Label' ylabelcolor brown ylabelon 1 %xloweraxis 15 graph x x^2 extrema-4.4.5/Scripts/fill_under_curve.pcm0000644012702201742730000000033111274636625017677 0ustar spangspangclear defaults generate x -5,,5 50 y=x^2+3*x-2 SET AREAFILLCOLOR red L = LEN(X) X[2:L+1] = X[1:L] X[L+2] = X[L+1] Y[2:L+1] = Y[1:L] Y[1] = 0 Y[L+2] = 0 GRAPH X Y ZEROLINES\HORIZONTAL ! draw horizontal line thru (0,0) extrema-4.4.5/Scripts/convol.pcm0000644012702201742730000000743111274636625015660 0ustar spangspangDEFAULTS clear ! X=[1:256] YJ='A[J]*EXP(-(X-B[J])^2/C[J])' A=[100;10;200;1] B=[50;75;100;40] C=[25;25;25;50] Y[1:256] = 0 DO J = [1:3] Y = Y+YJ ENDDO YSAVE=Y ! WINDOW 5 defaults SET %XnumbersHeight 5 set %YnumbersHeight 5 GET %YupperAxis YUAXIS get %XlargeTicLength XTICL set %XimagTicLength 2 SET %XtextLocation 50 set %YtextLocation YUAXIS+XTICL+1 set %TextHeight 5 set TextAlign 2 set TextInteractive 0 GRAPH X Y TEXT `Ideal function' ! WINDOW 7 defaults SET %XnumbersHeight 5 set %YnumbersHeight 5 GET %YupperAxis YUAXIS get %XlargeTicLength XTICL set %XimagTicLength 2 SET %XtextLocation 50 set %YtextLocation YUAXIS+XTICL+1 set %TextHeight 5 set TextAlign 2 set TextInteractive 0 J=4 GRAPH X 1*YJ TEXT `Convoluting function' ! WINDOW 6 defaults SET %XnumbersHeight 5 set %YnumbersHeight 5 GET %YupperAxis YUAXIS get %XlargeTicLength XTICL set %XimagTicLength 2 SET %XtextLocation 50 set %YtextLocation YUAXIS+XTICL+1 set %TextHeight 5 set TextAlign 2 set TextInteractive 0 R=CONVOLUTE(Y,YJ) GRAPH X R TEXT `Result of convolution' ! WINDOW 8 defaults SET %XnumbersHeight 5 set %YnumbersHeight 5 GET %YupperAxis YUAXIS get %XlargeTicLength XTICL set %XimagTicLength 2 SET %XtextLocation 50 set %YtextLocation YUAXIS+XTICL+1 set %TextHeight 5 set TextAlign 2 set TextInteractive 0 GRAPH X DECONVOLUTE(R,YJ) TEXT `Deconvoluted' ! answer = 'YES' INQUIRE\yesno "Do you want to see more?" answer if nes(answer,"YES") then return CLEAR ! WINDOW 5 GRAPH X Y TEXT `Ideal function' ! WINDOW 7 J=4 B[J]=18 GRAPH X 1*YJ TEXT `Convoluting function' ! WINDOW 6 R=CONVOLUTE(Y,YJ) GRAPH X R TEXT `Result of convolution' ! WINDOW 8 GRAPH X DECONVOLUTE(R,YJ) TEXT `Deconvoluted' ! answer = 'YES' INQUIRE\yesno "Do you want to see more?" answer if nes(answer,"YES") then return CLEAR R=CONVOLUTE(Y,YJ) ! WINDOW 5 GRAPH X DECONVOLUTE(R,YJ+.2*(RAN(X)-.5)) TEXT `10% noise on convoluting function' ! WINDOW 7 GRAPH X DECONVOLUTE(R,YJ+.02*(RAN(X)-.5)) TEXT `1% noise on convoluting function' ! WINDOW 6 GRAPH X DECONVOLUTE(R,YJ+.002*(RAN(X)-.5)) TEXT `0.1% noise on convoluting function' ! WINDOW 8 GRAPH X DECONVOLUTE(R,YJ+.0002*(RAN(X)-.5)) TEXT `0.01% noise on convoluting function' ! answer = 'YES' INQUIRE\yesno "Do you want to see more?" answer if nes(answer,"YES") then return CLEAR R=CONVOLUTE(Y,YJ) ! WINDOW 5 GRAPH X DECONVOLUTE(R+.2*(RAN(R)-.5),YJ) TEXT `10% noise on data' ! WINDOW 7 GRAPH X DECONVOLUTE(R+.02*(RAN(R)-.5),YJ) TEXT `1% noise on data' ! WINDOW 6 GRAPH X DECONVOLUTE(R+.002*(RAN(R)-.5),YJ) TEXT `0.1% noise on data' ! WINDOW 8 GRAPH X DECONVOLUTE(R+.0002*(RAN(R)-.5),YJ) TEXT `0.01% noise on data' ! answer = 'YES' INQUIRE\yesno "Do you want to see more?" answer if nes(answer,"YES") then return cLEAR ! F=[.06666;.25;.375;.25;.06666] R=CONVOLUTE(Y,YJ) ! WINDOW 5 FILTER\-recursive R+.2*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `10% noise - 5 pt. filter' ! WINDOW 7 FILTER\-recursive R+.02*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `1% noise - 5 pt. filter' ! WINDOW 6 FILTER\-recursive R+.002*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `0.1% noise - 5 pt. filter' ! WINDOW 8 FILTER\-recursive R+.0002*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `0.01% noise - 5 pt. filter' ! answer = 'YES' INQUIRE\yesno "Do you want to see more?" answer if nes(answer,"YES") then return CLEAR ! F = [-21;14;39;54;59;54;39;14;-21]/231 R=CONVOLUTE(Y,YJ) ! WINDOW 5 FILTER\-recursive R+.2*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `10% noise - 9 pt. filter' ! WINDOW 7 FILTER\-recursive R+.02*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `1% noise - 9 pt. filter' ! WINDOW 6 FILTER\-recursive R+.002*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `0.1% noise - 9 pt. filter' ! WINDOW 8 FILTER\-recursive R+.0002*(RAN(R)-.5) RN F GRAPH X DECONVOLUTE(RN,YJ) TEXT `0.01% noise - 9 pt. filter' ! display "...convolute script finished..." extrema-4.4.5/Scripts/bivsmooth.pcm0000644012702201742730000000076111274636625016371 0ustar spangspangr = mod([1:1000]-1,5)+1 sort\up r generate t 0,1.8,,200 t[201:400] = t[1:200] t[401:800] = t[1:400] t[801:1000] = t[1:200] z = exp(-r/2)*cosd(180*(r-1)) grid\xyout\size\-messages 10 r*cosd(t) r*sind(t) z m x y ! nx = 10 ! number of subdivisions in x ny = 5 ! number of subdivisions in y ww = bivsmooth(x,y,m,nx,ny) ! nrows = vlen(ww)[1] ncols = vlen(ww)[2] ! u = ww[1,2:ncols] v = ww[2:nrows,1] w = ww[2:nrows,2:ncols] ! set colormap rainbow clear window 5 density x y m window 7 density u v w extrema-4.4.5/Scripts/special.pcm0000644012702201742730000003575511274636625016012 0ustar spangspangclear window 0 defaults ! set %xloweraxis 1 %xupperaxis 95 %yloweraxis 5 %yupperaxis 99 xticson 0 yticson 0 graphbox 1 xnumberson 0 ynumberson 0 scales\-messages -1 1 -1 1 graph [-1;1] [0.9;0.9] graph\overlay [-0.55;-0.55] [-1;1] graph\overlay [-0.035;-0.035] [-1;1] graph\overlay [0.5;0.5] [-1;1] set textangle 0 textalign 1 textinteractive 0 ! txthite = 2.0 skip = txthite+0.75 ! ! first column ! x1 = 2 x2 = 16 x3 = 19 yloc = 90 set %textheight txthite %ytextlocation yloc+2*skip %xtextlocation x1 text 'Name' set %xtextlocation x2 text 'U' set %xtextlocation x3 text 'L' ! yloc = yloc+1 set %textheight txthite %ytextlocation yloc %xtextlocation x1 text 'Alpha' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Beta' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Gamma' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Delta' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Epsilon' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Zeta' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Eta' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Theta' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Iota' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Kappa' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Lambda' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Mu' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Nu' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Xi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Omicron' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Pi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Rho' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Sigma' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Tau' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Upsilon' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Phi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Chi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Psi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Omega' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Vartheta' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Varphi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Varepsilon' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Varpi' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Aleph' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Nabla' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Partial' set %xtextlocation x2 text '' set %xtextlocation x3 text '' ! ! second column ! x1 = 25 x2 = x1+14 x3 = x2+3 yloc = 90 ! set %textheight txthite set %ytextlocation yloc+2*skip set %xtextlocation x1 text 'Name' set %xtextlocation x2 text 'U' set %xtextlocation x3 text 'L' ! yloc = yloc+1 set %textheight txthite set %ytextlocation yloc set %xtextlocation x1 text 'Leftarrow' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Rightarrow' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Uparrow' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Downarrow' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Leftrightarrow' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Hookleftarrow' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Perp' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Mid' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Sum' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Prod' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Int' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Surd' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Plus' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Minus' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Pm' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Times' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Div' set %xtextlocation x2 text '

' set %xtextlocation x3 text '
' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Oplus' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Otimes' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Cap' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Cup' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Subset' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Supset' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Subseteq' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Supseteq' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Emptyset' set %xtextlocation x2 text '' set %xtextlocation x3 text '' ! ! third column ! x1 = 50 x2 = x1+14 x3 = x2+3 yloc = 90 ! set %textheight txthite set %ytextlocation yloc+2*skip set %xtextlocation x1 text 'Name' set %xtextlocation x2 text 'U' set %xtextlocation x3 text 'L' ! yloc = yloc+1 set %textheight txthite set %ytextlocation yloc set %xtextlocation x1 text 'Equiv' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Approx' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Sim' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Neq' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Lt' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Gt' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Leq' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Geq' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Neg' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Cdot' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Ldots' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Therefore' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'In' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Ni' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Exists' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Forall' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Propto' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Infty' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Degree' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Re' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Im' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Wp' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Langle' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Rangle' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Angle' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Vee' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Wedge' set %xtextlocation x2 text '' set %xtextlocation x3 text '' ! ! fourth column ! x1 = 75 x2 = x1+14 x3 = x2+3 yloc = 90 ! set %textheight txthite set %ytextlocation yloc+2*skip set %xtextlocation x1 text 'Name' set %xtextlocation x2 text 'U' set %xtextlocation x3 text 'L' ! yloc = yloc+1 set %textheight txthite set %ytextlocation yloc set %xtextlocation x1 text 'Bullet' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Diamond' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Clubsuit' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Diamondsuit' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Heartsuit' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Spadesuit' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Tm' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Copyright' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip set %ytextlocation yloc set %xtextlocation x1 text 'Registered' set %xtextlocation x2 text '' set %xtextlocation x3 text '' yloc = yloc-skip extrema-4.4.5/Scripts/fill_between_curves.pcm0000644012702201742730000000032111274636625020375 0ustar spangspangclear defaults generate x 0,,180 100 y=sind(x) generate x1 0,,180 50 y1=exp(-x1/90)*sind(x1) X[101:150] = X1[50:1:-1] Y[101:150] = Y1[50:1:-1] SET AREAFILLCOLOR red scales\-messages -10 200 -.2 1.2 GRAPH X Y extrema-4.4.5/Scripts/ditheringDensity.pcm0000644012702201742730000000122211274636625017665 0ustar spangspangX=[ 1; 0; 1; 0; .2; .3; .5; .8] Y=[ 5; 5; 0; 0; 1;1.5; 2.5; 4] Z=[ 10; 10; 10; 10; -100; 10; -100; 500] GRID\XYOUT\-messages X Y Z M XOUT YOUT window 5 defaults clear set %yimagticlength 2 %xnumbersheight 5 %ynumbersheight 5 xdropfirstnumber 1 xdroplastnumber 1 ydropfirstnumber 1 ydroplastnumber 1 scale\-messages -.1 1.1 -.2 5.2 density\dither\leg\xprofile\yprofile xout yout m ! window\inherit 6 5 density\boxes\xpro\ypro xout yout m ! window\inherit 7 5 get colormap cmap set colormap thermal density\gradient\xprofile\yprofile xout yout m set colormap cmap ! window\inherit 8 5 density\diffusion\xprofile\yprofile xout yout m extrema-4.4.5/Scripts/waterpipes-fig.pcm0000644012702201742730000000224411274636625017303 0ustar spangspangif ~exist('waterpipesDone') then display 'first execute waterpipes.pcm' return endif clear window 1 0 0 80 100 defaults set xnumberson 0 ynumberson 0 xticson 0 yticson 0 xcross 1 ycross 1 graphbox 0 xaxison 0 yaxison 0 scales\commensurate\-messages -15 100 -15 100 set curvecolor blue graph [-10;90] [10;90] a = 0.8 b = 18 v = 20 w = 80 set plotsymbol 17 set plotsymbolcolor green graph\overlay v w set curvecolor black set plotsymbol 0 graph\overlay [v;v] [a*v+b;w] graph\overlay [(w-b)/a;v] [w;w] c = (1/a)*[w-b-(w-b-a*v)/(a*a+1)] d = a*c+b set curvecolor blue graph\overlay [c;v] [d;w] set textinteractive 0 %textheight 5 textalign 3 %xtextlocation 42 %ytextlocation 75 text '(x,y)' set textalign 1 %xtextlocation 53 %ytextlocation 53 text '(v,w)' set %xtextlocation 70 set %ytextlocation 71 text '((y-B)/A,y)' set %xtextlocation 44 set %ytextlocation 42 text '(x,A*x+B)' set %textheight 5 %xtextlocation 50 %ytextlocation 33 text 'v = (1/A)*[y-B-(y-B-A*x)/(A*A+1)]' set %ytextlocation 27 text 'w = A*v+B' ! b2 = a*46+b b3 = 46/a+b2 b4 = (-1/a)*42+b3 b5 = -a*42+b4 x1 = (105-b5)/(a+1.25) y1 = a*x1+b5 set curvecolor black graph\overlay [46;42;x1] [b2;b4;y1] extrema-4.4.5/Scripts/asymmetricerrorbars.pcm0000644012702201742730000000076211274636625020457 0ustar spangspangclear window 0 defaults ps = 14 inquire 'Enter plotsymbol code ('//rchar(ps)//')' ps ! define\constants generate x 0,,2*pi,25 y=sin(x)+2*ran(x) generate\random ey1 0 .5 25 generate\random ey2 0 .5 25 set %plotsymbolsize 2 plotsymbol -ps plotsymbolcolor blue graph x y ey1,,ey2 ! get %xloweraxis xlx %xupperaxis xux %yupperaxis yux set %textheight 6 textfont 'ArialBlack' %xtextlocation (xlx+xux)/2 %ytextlocation yux+2 textalign 2 textinteractive 0 text 'Asymmetric error bars' extrema-4.4.5/Scripts/density_dithering_example.pcm0000644012702201742730000000052211274636625021601 0ustar spangspangclear window 0 defaults r=mod([0:143],4)+1 sort r t=mod([0:143],36)*10 x = r*cosd(t) y = r*sind(t) z = exp(-r/2)*cosd(180*(r-1)) set %yimagticlength 2 %xnumbersheight 5 %ynumbersheight 5 xdropfirstnumber 1 xdroplastnumber 1 ydropfirstnumber 1 ydroplastnumber 1 colormap topo256 scales\-messages -5 5 -5 5 density\dithering x y z extrema-4.4.5/Scripts/filled_histograms.pcm0000644012702201742730000000177411274636625020063 0ustar spangspangclear X = [1.1:1.6:0.1] Y = [2.2;2.4;2.6;3.1;4.5;5.1] WINDOW 5 defaults SET %xnumbersheight 4 %ynumbersheight 4 %ximagticlength 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 textalign 2 %textheight 5 histogramtype 1 areafillcolor red GRAPH X Y text 'histogramtype = 1' ! WINDOW 6 defaults SET %xnumbersheight 4 %ynumbersheight 4 %ximagticlength 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 textalign 2 %textheight 5 histogramtype 2 areafillcolor [-1:-6:-1] GRAPH X Y text 'histogramtype = 2' ! WINDOW 7 defaults SET %xnumbersheight 4 %ynumbersheight 4 %ximagticlength 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 textalign 2 %textheight 5 histogramtype 3 areafillcolor blue GRAPH X Y text 'histogramtype = 3' ! WINDOW 8 defaults SET %xnumbersheight 4 %ynumbersheight 4 %ximagticlength 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 textalign 2 %textheight 5 histogramtype 4 areafillcolor [-7:-12:-1] GRAPH X Y text 'histogramtype = 4' extrema-4.4.5/Scripts/fit-test.dat0000644012702201742730000000042311274636625016102 0ustar spangspang 2.4414E-01 -3.2333E+01 2.6367E-01 -2.8333E+01 3.5156E-01 -2.0833E+01 4.4922E-01 -1.7333E+01 6.6406E-01 -1.1500E+01 9.3750E-01 -8.0000E+00 1.3086E+00 -5.6667E+00 1.8848E+00 -4.0000E+00 2.5488E+00 -2.8333E+00 3.4082E+00 -2.6667E+00 4.4434E+00 -2.1667E+00 extrema-4.4.5/Scripts/DisplayPlotSymbols.pcm0000644012702201742730000000124211274636625020167 0ustar spangspang!set orientation portrait window 0 defaults clear ! set textcolor -2 textinteractive 0 textalign 4 %textheight 4 top = 80 delta = 10 scales\-mess -1 1 -1 1 set %xtextlocation 32.75 do i=[0:5] set %ytextlocation top-i*delta text rchar(i+1) enddo set %xtextlocation 51.25 do i=[0:5] set %ytextlocation top-i*delta text rchar(i+7) enddo set %xtextlocation 69.75 do i=[0:5] set %ytextlocation top-i*delta text rchar(i+13) enddo a = [-0.3;-0.3;-0.3;-0.3;-0.3;-0.3;0.2;0.2;0.2;0.2;0.2;0.2;0.7;0.7;0.7;0.7;0.7;0.7] b = [0.75;0.5;0.25;0.0;-0.25;-0.5;0.75;0.5;0.25;0.0;-0.25;-0.5;0.75;0.5;0.25;0.0;-0.25;-0.5] set plotsymbol -[1:18] %plotsymbolsize 4 graph\overlay a b extrema-4.4.5/Scripts/fft.pcm0000644012702201742730000000212011274636625015125 0ustar spangspangclear defaults ! DEFINE\CONSTANTS ! define pi (among other constants) N = 16 ! even number of points X = [0:N-1]*2*PI/N ! generate some "data" Y = SIN(X)+5*RAN(X) ! M = FFT(Y,'COS&SIN') ! calculate Fourier coefficients H = M[*,1] ! extract column 1 as a vector G = M[*,2] ! extract column 2 as a vector Z = [0:2*PI:.05] DO J = [3:N/2+1:2] WINDOW (J-3)/2+5 ! choose a graphics window DEFAULTS SCALE\-mess 0 6 0 -2 7 0 ! set axis scales SET PLOTSYMBOL -1 ! choose plotting symbol %XNUMBERSHEIGHT 5 %YNUMBERSHEIGHT 5 GRAPH X Y ! plot original data SET PLOTSYMBOL 0 ! choose no plotting symbol TMP[1:LEN(Z)] = 0 DO K = [2:J] TMP = TMP + H[K]*COS((K-1)*Z)+G[K]*SIN((K-1)*Z) ENDDO GRAPH\OVERLAY Z H[1]/2+TMP DESTROY\-mess TMP SET %TEXTHEIGHT 5 ! increase the size of the x-axis label %XTEXTLOCATION 50 %YTEXTLOCATION 80 TEXTALIGN 2 TEXTINTERACTIVE 0 TEXT RCHAR(J)//' harmonics used' replot ENDDO GRAPH\OVERLAY [0;2*PI] [H[1]/2;H[1]/2] ! overlay the mean value extrema-4.4.5/Scripts/sigma_example.pcm0000644012702201742730000000303011274636625017162 0ustar spangspangCLEAR window 0 DEFAULTS FILE='sigma.dat' READ\-messages FILE\[8:31] T1 OSET1 READ\-MESSages FILE\[34:57] T2 OSET2 READ\-MESSages FILE\[60:83] T3 OSET3 READ\-MESSages FILE\[86:105] T4 READ\-MESSages FILE\[108:127] ROCK2\2 ! set %TEXTHEIGHT 3 FONT Arial YLOGbase 10 NSYINC 9 NSXINC 4 XTICA 90 YTICA -90 LEGENDON 1 LEGENDENTRYLINEON 1 LEGENDSYMBOLS 3 LEGENDFRAMEON 0 %LEGENDFRAME 13 69 58 89 %legendtitleheight 4 legendtitlecolor blue LEGENDTITLE '<^>16<_>O(<^>+<_>,<^>-<_><^>+<_>)' LEGENDTITLEON 0 ylogstyle 1 %ynumbersheight 3 %xnumbersheight 3 %yloweraxis 15 SCALES\-messages 180 305 7 0 4.5 5 set xvirtualmax 320 set yvirtualmax 5 GRAPH\AXESONLY SET Plotsymbol 3 plotsymbolcolor black CURVECOLOR BLUE GRAPH\OVERLAY 'Cohen et al. (1983)' T1 OSET1 SET Plotsymbol 16 plotsymbolcolor red CURVECOLOR RED GRAPH\OVERLAY 'Oset et al. (1986)' T2 OSET2 SET PLOTSYMBOL 18 plotsymbolcolor olive CURVECOLOR GREEN GRAPH\OVERLAY 'Rockmore (1983)' T3 OSET3 set plotsymbol 17 plotsymbolcolor navy CURVECOLOR BLACK GRAPH\OVERLAY 'This work' T4 ROCK2*7 set %textheight 4 set textcolor blue get %yupperaxis yux get %xupperaxis xux get %xloweraxis xlx set %xtextlocation 0.5*(xlx+xux) set %ytextlocation yux+1 set textinteractive 0 set textalign 2 text '<^>16<_>O(<^>+<_>,<^>-<_><^>+<_>)' set %textheight 3 set textalign 3 set %xtextlocation xlx+2 set %ytextlocation yux+1 text '(b)' set textalign 3 set %xtextlocation xux set %ytextlocation 5 text 'T<_><^> (MeV)' replot !set legendon 0 extrema-4.4.5/Scripts/splinterp.pcm0000644012702201742730000000056311274636625016377 0ustar spangspangclear ! x = [0;1;2;3;5;6;4;3;5;10] y = 2*x^2-3*x+50 + 100*ran(x) ! window 0 defaults set plotsymbol -10 plotsymbolcolor red graph x y set plotsymbol 0 tension 0 curvecolor blue m = splinterp(x,y,100) graph\overlay m[*,1] m[*,2] set textinteractive 0 textalign 1 %xtextlocation 15 %ytextlocation 80 %textheight 6 textcolor blue text 'tension = 0' replot extrema-4.4.5/Scripts/polygonTest.pcm0000644012702201742730000000154511274636625016707 0ustar spangspangclear ! GEN\RANDOM X -5 5 2000 ! generate some "data" GEN\RANDOM Y 10 20 2000 ! WINDOW 5 ! SET %XNUMBERSHEIGHT 5 ! SET %YNUMBERSHEIGHT 5 ! SET PLOTSYMBOL -11 ! choose unjoined point plotting symbol GRAPH X Y ! display the data graphically XP = {-0.5;1.2;-0.2;1.3;-3;-2} ! the polygon vertices YP = {13;13.5;16;18.5;18;14} ! POLYGON\OUTSIDE XP YP X Y K ! find data points outside polygon, create key vector, K WINDOW\INHERIT 7 5 ! IDX = WHERE(K=1) ! choose indices of points inside polygon GRAPH X[IDX] Y[IDX] ! display data without unwanted points SET PLOTSYMBOL 0 ! choose no plotting symbol GRAPH\OVERLAY XP//{-0.5} YP//{13} ! overlay the polygon (close by appending first point) extrema-4.4.5/Scripts/hists.pcm0000644012702201742730000000136211274636625015507 0ustar spangspang!x=[1;2.75;3.2;5;6;7;8;10;10.5] generate\random x 1 11 10 sort\up x i=[1:len(x)] error=x-x+.5 clear window 5 defaults scales -1 12 -1 12 set histogramtype 1 set plotsymbol 1 graph x i error window 6 defaults scales -1 12 -1 12 set histogramtype 2 set plotsymbol 1 graph x i error window 7 defaults scales -1 12 -1 12 set histogramtype 3 set plotsymbol 1 graph i x,, error window 8 defaults scales -1 12 -1 12 set histogramtype 4 set plotsymbol 1 graph i x,, error pause clear window 5 set histogramtype 1 set areafillcolor red graph x i error window 6 set histogramtype 2 set areafillcolor green graph x i error window 7 set histogramtype 3 set areafillcolor blue graph i x,, error window 8 set histogramtype 4 set areafillcolor coral graph i x,, error extrema-4.4.5/Scripts/areafill2.pcm0000644012702201742730000000017411274636625016216 0ustar spangspangclear defaults window 0 ! generate x 0,,180 100 y=sind(x) generate x1 0,,180 50 y1=exp(-x1/90)*sind(x1) @fill x y x1 y1 red extrema-4.4.5/Scripts/gridtest.pcm0000644012702201742730000000377611274636625016215 0ustar spangspangX=[ 1; 0; 1; 0; .2; .3; .5; .8] Y=[ 5; 5; 0; 0; 1;1.5; 2.5; 4] Z=[ 10; 10; 10; 10; -100; 10; -100; 500] GRID\XYOUT X Y Z M XOUT YOUT ! window 0 clear defaults DENSITY\BOXES\XPROFILE\YPROFILE XOUT YOUT M pause 'four more box density plots' defaults clear ! WINDOW\inherit 5 0 set %xlabelheight 3 XLABEL 'DENSITY\BOXES XOUT YOUT M' %ylabelheight 3 ylabel 'Another y-axis label ' ylabelcolor red areafillcolor cyan DENSITY\BOXES XOUT YOUT M ! WINDOW\inherit 7 5 set XLABEL 'DENSITY\BOXES XOUT YOUT M .5 1' ylabel '<^><_>' ylabelcolor blue DENSITY\BOXES XOUT YOUT M .5 1 ! WINDOW\inherit 6 5 set XLABEL 'DENSITY\BOXES XOUT YOUT M 0 1 .5 1' ylabel '' ylabelcolor green DENSITY\BOXES XOUT YOUT M 0 1 .5 1 ! WINDOW\inherit 8 5 set XLABEL 'DENSITY\BOXES XOUT YOUT M .5 1 .5 1' ylabel '' ylabelcolor brown DENSITY\BOXES XOUT YOUT M .5 1 .5 1 ! !return ! pause 'now a few more examples' ! window 1 20 20 80 80 defaults set %yimagticlength 2 clear set %xnumbersheight 5 set %ynumbersheight 5 set xdropfirstnumber 1 set xdroplastnumber 1 set ydropfirstnumber 1 set ydroplastnumber 1 set xticangle -90 set yticangle 90 density xout yout m pause 'click OK to continue' ! clear density\legend xout yout m pause 'click OK to continue' ! clear density\dithering x y z pause 'click OK to continue' ! clear density\dithering\legend x y z pause 'click OK to continue' ! clear D=[ 1;1; 2;2; 4;4; 7;7; 11;11; 0;0 ] density\dithering\dithervector\legend d x y z pause 'click OK to continue' ! clear density\diffusion x y z pause 'click OK to continue' ! clear density\diffusion\xpro\ypro x y z pause 'click OK to continue' ! clear window 0 defaults set %yimagticlength 2 r=mod([0:143],4)+1 sort r t=mod([0:143],36)*10 d=[1;1; 2;2; 4;4; 7;7; 11;11; 0;0] x = r*cosd(t) y = r*sind(t) z = exp(-r/2)*cosd(180*(r-1)) grid\xyout x y z m xout yout density\dithering\dithervector d xout yout m ! window 0 destroy r t d x y z xout yout m extrema-4.4.5/Scripts/areafill4.pcm0000644012702201742730000000033711274636625016221 0ustar spangspangclear defaults window 0 ! X = [1:10] ! fake some data SET HISTOGRAMTYPE 2 ! tails to y=0 AREAFILLCOLOR RED SCALES\-MESSAGES 0 11 0 10.5 ! fix axis scales GRAPH X ! draw the histogram extrema-4.4.5/Scripts/Draw_Title.pcm0000644012702201742730000000113311274636625016407 0ustar spangspang! call this script with the %textheight and the title string ! e.g., @Draw_Title 6 'Some Title' ! get %xloweraxis xlp get %xupperaxis xup get %yupperaxis yup get %xtextlocation txtx get %ytextlocation txty get %textheight txthite get textalign txtalign get textinteractive txtinteractive set %xtextlocation (xup+xlp)/2 set %ytextlocation yup+2 set %textheight ?1 set textalign 2 set textinteractive 0 text ?2 set %xtextlocation txtx set %ytextlocation txty set %textheight txthite set textalign txtalign set textinteractive txtinteractive destroy xlp xup yup txtx txty txthite txtalign txtinteractive extrema-4.4.5/Scripts/fit_2_parts_a.pcm0000644012702201742730000000110011274636625017057 0ustar spangspangdefaults clear x=[1:19] y=[1:10]//[9:1:-1]+5*ran(x) f1='(a+b*x)*(x<=x0)+(c+d*x)*(x>=x0)+(a+b*x-c-d*x)*1.e5*(x=x0)' f2='(a+b*x)*(x<=x0)+(c+d*x)*(x>x0)' window 5 defaults set plotsymbol -1 graph x y scalar\fit a b c d x0=10 fit y=1*f1 set plotsymbol 0 graph\overlay x[where(x<=x0)] (a+b*x)[where(x<=x0)] graph\overlay x[where(x>=x0)] (c+d*x)[where(x>=x0)] window 7 defaults set plotsymbol -1 graph x y destroy a b c d scalar\fit a b c d fit y=1*f2 set plotsymbol 0 graph\overlay x[where(x<=x0)] (a+b*x)[where(x<=x0)] graph\overlay x[where(x>x0)] (c+d*x)[where(x>x0)] replot\all extrema-4.4.5/Scripts/houses.dat0000644012702201742730000000007411274636625015653 0ustar spangspang10 30 25 7 13 50 40 17 33 58 50 22 42 82 65 30 65 90 75 50 extrema-4.4.5/Scripts/diffusion.pcm0000644012702201742730000000063411274636625016344 0ustar spangspangX=[ 1; 0; 1; 0; .2; .3; .5; .8] Y=[ 5; 5; 0; 0; 1;1.5; 2.5; 4] Z=[ 10; 10; 10; 10; -100; 10; -100; 500] GRID\XYOUT\-messages X Y Z M XOUT YOUT ! window 0 defaults clear ! set %yimagticlength 2 %xnumbersheight 5 %ynumbersheight 5 xdropfirstnumber 1 xdroplastnumber 1 ydropfirstnumber 1 ydroplastnumber 1 xticangle -90 yticangle 90 density\diffusion x y z ! !destroy x y z xout yout m extrema-4.4.5/Scripts/cpu_example.pcm0000644012702201742730000000245111274636625016657 0ustar spangspangclear window 0 defaults y=[1980;1984.5;1988.3;1989.0;1989.2;1990;1990.8;1991.8;1992.0;1993.0;1994.0;1995.0;1995.5;1996.0;1997.0;1997.2;1997.4;1997.7;1999.0;1999.7;2000.2;2001.2] v=[1;0;13;29;0;0;45;55;75;110;150;144;144;144;149;0;0;149;149;149;149;149] r=[0;0;0;0;10;30;65;142;276;360;748;938;1328;1646;2362;0;0;2290;3379;3379;3279;3700] p=[0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;80;260;900;2785;6000;10600;37219] scales\-messages 1980 2004 6 0 16 13 set xlabel `YEAR' xlabelon 1 ylabel `Relative Compute Power (1980 = 1)' ylabelon 1 %xloweraxis 20 get %xloweraxis xls %xupperaxis xus set %xtextlocation (xus+xls)/2 %ytextlocation 95 textalign 2 textinteractive 0 text "CPU POWER GROWTH" set ylogbase 2 ylogstyle 0 ynsincs 1 xnsincs 4 linecolour black %plotsymbolsize 2 ! legendon 0 ! legendsymbols 1 ! legendframeon 0 ! legendframe 20 65 60 85 ! legendtitleon 0 ! legendentryline 0 ynumberofdigits 2 graph\axesonly ! set plotsymbol -14 plotsymbolcolour black legendon 1 %legendframe 25 70 65 85 graph\overlay 'VAX' y v set plotsymbol -16 plotsymbolcolour red graph\overlay 'RISC' y r set plotsymbol -17 plotsymbolcolour blue graph\overlay 'PENTIUM' y p replot set legendon 0 xx = [1980:2004:1] yd = 2^((xx-1980)/2) set linecolour green plotsymbol 0 graph\overlay xx yd set legendon 1 extrema-4.4.5/Scripts/gaussFit.pcm0000644012702201742730000000155611274636625016147 0ustar spangspangclear window 0 defaults ! a=2 b=0.3 c=4 generate x 0,,10 50 generate\random r 1 1.2 50 y=a*exp(-b*(x-c)^2)+r set plotsymbol -1 %xnumbersheight 3 %ynumbersheight 3 graph x y scalar\fit a b c d fit\chisq y=a*exp(-b*(x-c)^2)+d fit\update yf set plotsymbol 0 curvecolor red graph\overlay x yf get %xloweraxis xlx %xupperaxis xux %yupperaxis yux set %textheight 3 textfont 'Arial' %xtextlocation 0.5*(xlx+xux) %ytextlocation yux+1 textalign 2 textinteractive 0 yux = yux-2 text 'Fit: y=a*e<^>-b*(x-c)<^>2<_><_> + d' set textfont 'Courier New' textalign 1 %textheight 2 %xtextlocation 55 %ytextlocation yux-5 text 'a = '//rchar(a) set %ytextlocation yux-10 text 'b = '//rchar(b) set %ytextlocation yux-15 text 'c = '//rchar(c) set %ytextlocation yux-20 text 'd = '//rchar(d) set %ytextlocation yux-25 text 'Total <^>2<_> = '//rchar(fit$chisq) extrema-4.4.5/Scripts/anovaTest.pcm0000644012702201742730000000070111274636625016315 0ustar spangspang!x1=[22;26;25;25;31] !x2=[25;27;28;26;29] !x3=[26;29;33;30;33] !x4=[26;28;27;30;30] ! x1 = [51;49;56] x2 = [38;43;50] x3 = [44;46;52] x4 = [47;48;53] ! !x1 = [88;99;96;68;85;90;99;76] !x2 = [78;62;98;83;61;88;74;59;73] !x3 = [80;61;74;92;78;54;77;83] !x4 = [71;65;90;46;53;67] ! !x1 = [8;9;11;9] !x2 = [13;15;12;17;18] !x3 = [15;19;20;20] !x4 = [19;22;26;19;21] !x5 = [14;10;12;15;17] ! !@one_way_anova 'x1 x2 x3 x4 x5' @two_way_anova 'x1 x2 x3 x4' extrema-4.4.5/Scripts/linetypes.pcm0000644012702201742730000000044411274636625016371 0ustar spangspangclear defaults ! generate x 2,,30,100 y[1:100] = 1 scales\-messages 0 40 0 11 set textalign 5 textinteractive 0 %textheight 5 linewidth 1 do i = [1:10] set linetype i graph\overlay x y*i world\percent 0 i xp yp set %xtextlocation xp set %ytextlocation yp text rchar(i) enddo extrema-4.4.5/Scripts/splsmooth.pcm0000644012702201742730000000100611274636625016400 0ustar spangspangclear ! x = [0;1;2;3;5;6;4;3;5;10] y = 2*x^2-3*x+50 + 100*ran(x) ! window 0 defaults set plotsymbol -10 plotsymbolcolor red graph x y set plotsymbol 0 tension 0 curvecolor blue m = splsmooth(x,y,100) graph\overlay m[*,1] m[*,2] set textinteractive 0 textalign 1 %xtextlocation 15 %ytextlocation 80 %textheight 6 textcolor blue text 'tension = 0' set tension 0.01 curvecolor lime m = splsmooth(x,y,100) graph\overlay m[*,1] m[*,2] set %ytextlocation 70 textcolor lime text 'tension = 0.01' replot extrema-4.4.5/Scripts/density2.pcm0000644012702201742730000000060011274636625016110 0ustar spangspangX=[ 1; 0; 1; 0; .2; .3; .5; .8] Y=[ 5; 5; 0; 0; 1;1.5; 2.5; 4] Z=[ 10; 10; 10; 10; -100; 10; -100; 500] GRID\XYOUT\-messages X Y Z M XOUT YOUT window 5 defaults clear set %yimagticlength 2 %xnumbersheight 5 %ynumbersheight 5 xdropfirstnumber 1 xdroplastnumber 1 ydropfirstnumber 1 ydroplastnumber 1 scale\-messages -.1 1.1 -.2 5.2 density\leg xout yout m extrema-4.4.5/Scripts/automatic_axis_labels.pcm0000644012702201742730000000053711274636625020714 0ustar spangspangclear x=[1:10] window\tile\-messages 3 2 20 do i = [0:4] window i+20 defaults set %xloweraxis 15 xforcecross 1 yforcecross 1 xlabel `some x-axis label' xlabelon 1 ylabel `some other y-axis label' ylabelon 1 plotsymbol i plotsymbolcolor -i xlabelcolor -(23-i) ylabelcolor -(22-i) graph x-2^i x^2-i*10 enddo extrema-4.4.5/Scripts/displayTest.pcm0000644012702201742730000000016311274636625016660 0ustar spangspangdisplay 'Now is the time\nfor all good men\nto come to the aid of their party.\n\nNotice the multi-line display.' extrema-4.4.5/Scripts/volume.pcm0000644012702201742730000000045611274636625015667 0ustar spangspangdestroy\all x=[1:5] y=[1:5] matrix m 5 5 m=m+1 display 'Volume = '//rchar(volume(x,y,m)) x=x//x//x//x//x y[1:5]=1 y[6:10]=2 y[11:15]=3 y[16:20]=4 y[21:25]=5 z=(x-2.5)^2+(y-2.5)^2 display 'Volume = '//rchar(volume(x,y,z)) grid\xyout\-messages x y z mm xo yo display 'Volume = '//rchar(volume(xo,yo,mm)) extrema-4.4.5/Scripts/legendTest.pcm0000644012702201742730000000132011274636625016445 0ustar spangspangclear window 0 defaults ! x=[1:10] set %textheight 3 legendon 1 legendtitlecolor teal legendtitle 'The Legend Title' %legendframe 15 63 68 83 legendframeon 1 legendframecolor red lineCodes = [1;0;1;0] symbolSizes = [2;2.5;3;2] symbols = [15;16;17;18] colors[1] = 'red' colors[2] = 'blue' colors[3] = 'coral' colors[4] = 'cyan' widths = [1;2;3;4] do i = [1:4] set plotsymbol symbols[i] plotsymbolcolor colors[i] %plotsymbolsize symbolSizes[i] legendsymbols i legendentrylineon lineCodes[i] curvecolor colors[5-i] linetype i+2 curvelinewidth widths[i] graph 'legend entry<^>'//rchar(i) x i*x^2 enddo !pause 'hit the key to replot on a common scale...' replot ! !set legendon 0 extrema-4.4.5/Scripts/SplineInterpolate.pcm0000644012702201742730000000262711274636625020023 0ustar spangspangclear ! x = [0:10] y = 2*x^2-3*x+50 + 100*ran(x) generate xx 0,,10,100 tensions = [0;1;5;10;100] colors = [-7;-5;-2;-3;-11] ! display 'first try cubic spline interpolation with various tensions' window 1 0 0 50 50 defaults set plotsymbol -10 set plotsymbolcolor red set xlabel 'Spline under tension interpolation' set xlabelon 1 graph x y set plotsymbol 0 set curvecolor black set legendon 1 set %legendframe 15 65 60 90 do i = [1:len(tensions)] set tension tensions[i] ='Using tension = '//rchar(tensions[i]) set curvecolor colors[i] graph\overlay 'tension='//rchar(tensions[i]) xx interpolate(x,y,xx,'spline') enddo replot set legendon 0 ! display 'and now for linear, Lagrange, and Fritch-Carlson interpolation' window 2 0 50 50 100 defaults set plotsymbol -10 set plotsymbolcolor red set xlabel 'Linear interpolation' set xlabelon 1 graph x y set plotsymbol 0 set curvecolor black ylinear = interpolate(x,y,xx,'linear') graph\overlay xx ylinear ! window 3 50 50 100 100 defaults set plotsymbol -10 set plotsymbolcolor red set xlabel 'Lagrange interpolation' set xlabelon 1 graph x y set plotsymbol 0 set curvecolor black ylagrange = interpolate(x,y,xx,'lagrange') graph\overlay xx ylagrange ! window 4 50 0 100 50 defaults set plotsymbol -10 set plotsymbolcolor red set xlabel 'Fritch-Carlson interpolation' set xlabelon 1 graph x y set plotsymbol 0 set curvecolor black yfc = interpolate(x,y,xx,'fc') graph\overlay xx yfc extrema-4.4.5/Scripts/3dplot.pcm0000644012702201742730000000014411322774526015554 0ustar spangspangr[1:100] = 5 gen th 0,,359 20 th = th//th//th//th//th x = r*cosd(th) y = r*sind(th) gen z 0,,10 100 extrema-4.4.5/Scripts/areafill7.pcm0000644012702201742730000000117111274636625016221 0ustar spangspangclear defaults window 0 defaults SET %xnumbersheight 4 %ynumbersheight 4 %ximagticlength 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 textalign 2 %textheight 5 ! X = [1.1:1.6:0.1] Y = [2.2;2.4;2.6;3.1;4.5;5.1] WINDOW\inherit 5 0 set histogramtype 1 areafillcolor red GRAPH X Y text 'histogramtype = 1' ! WINDOW\inherit 6 0 SET histogramtype 2 areafillcolor [-1:-6:-1] GRAPH X Y text 'histogramtype = 2' ! WINDOW\inherit 7 0 SET histogramtype 3 areafillcolor blue GRAPH X Y text 'histogramtype = 3' ! WINDOW\inherit 8 0 SET histogramtype 4 areafillcolor [-7:-12:-1] GRAPH X Y text 'histogramtype = 4' extrema-4.4.5/Scripts/areafill7_sub.pcm0000644012702201742730000000023111274636625017066 0ustar spangspangdefaults SET %xnumberheight 4 %ynumberheight 4 %ximagticlength 2 %xtextlocation 50 %ytextlocation 90 textinteractive 0 textalign 2 %textheight 5 extrema-4.4.5/Scripts/axislabeltest.pcm0000644012702201742730000000052311274636625017217 0ustar spangspangclear window 0 defaults ! x=[1:10] set xforcecross 1 set yforcecross 1 set xlabel `some x-axis label' set xlabelon 1 set ylabel `some other y-axis label' set ylabelon 1 do i = [1:5] clear set plotsymbol i set plotsymbolcolor -i set xlabelcolor -(23-i) set ylabelcolor -(22-i) graph x-2^i x^2-i*10 pause enddo clear graph x x extrema-4.4.5/Scripts/contourTest.pcm0000644012702201742730000000021611274636625016703 0ustar spangspangclear !window 0 defaults set %contourlabelseparation 50 set %legendsize 2 ! x=[1:30] m=sin(x>=clen(?1)) then goto DONE if (clen(?1)>=j__+start__+1) then do i__ = [j__+start__:clen(?1)] if nes(?1[i__],' ') then start__ = i__ goto NEXT_2 endif enddo endif NEXT_2: if (?2>10) then return ?2 = ?2+1 goto TOP ! DONE: ! destroy i__ j__ k__ start__ extrema-4.4.5/Scripts/filledring.pcm0000644012702201742730000000262611274636625016500 0ustar spangspang! This script will draw two circles and fill the region between them ! ! OUTER_RADIUS = outer circle radius ! INNER_RADIUS = inner circle radius ! NPTS = number points used to draw circles ! FILLCOLOR = area fill color name ! ! set up circle parameters and fill pattern ! OUTER_RADIUS = ?1 ! make scalar INNER_RADIUS = ?2 ! make scalar FILLCOLOR = string(?3) ! make color name string variable NPTS = ?4 ! make scalar ! ! Generate the data for the circles ! GENERATE THETA 0,,360 NPTS ! make temporary vectors XTEMP = OUTER_RADIUS*COSD(THETA) ! YTEMP = OUTER_RADIUS*SIND(THETA) ! ! ! append in reverse order ! XTEMP[NPTS*2:NPTS+1:-1] = INNER_RADIUS*COSD(THETA) YTEMP[NPTS*2:NPTS+1:-1] = INNER_RADIUS*SIND(THETA) YTEMP = YTEMP*(ABS(YTEMP)>1.E-5) XTEMP[2*NPTS+1] = XTEMP[NPTS] YTEMP[2*NPTS+1] = YTEMP[NPTS] ! ! Draw the circles and fill ! SET AREAFILLCOLOR FILLCOLOR PLOTSYMBOL 0 ! no plotting symbol AUTOSCALE COMMENSURATE ! choose axis autoscaling type GRAPH XTEMP YTEMP ! plot data with axes SET AREAFILLCOLOR 0 ! turn off area fill color CURVECOLOR FILLCOLOR GRAPH\OVERLAY XTEMP YTEMP ! to get rid of the outline color SET CURVECOLOR BLACK LINEWIDTH 1 GRAPH\OVERLAY OUTER_RADIUS*COSD(THETA) OUTER_RADIUS*SIND(THETA) GRAPH\OVERLAY INNER_RADIUS*COSD(THETA) INNER_RADIUS*SIND(THETA) extrema-4.4.5/Scripts/breakUpString.pcm0000644012702201742730000000126311274636625017135 0ustar spangspang! longString = ?1 ! number of strings = ?2 ! vector of strings = ?3 ! error flag = ?4 ! ?4 = 0 ! ! eliminate blanks at the beginning of longString ! do i__ = [1:clen(longString)] if nes(longString[i__],' ') then start__ = i__ goto NEXT endif enddo ?4 = 1 return ! NEXT: ! do k__ = [1:?2] j__ = index(longString[start__:#],' ') if (j__=0) then j__=clen(longString)-start__+2 ?3[k__] = longString[start__:j__+start__-2] if (clen(longString)>=j__+start__+1) then do i__ = [j__+start__:clen(longString)] if nes(longString[i__],' ') then start__ = i__ goto NEXT_2 endif enddo endif NEXT_2: enddo ! destroy\-messages i__ j__ k__ start__ extrema-4.4.5/Scripts/limaconPascal2.pcm0000644012702201742730000000122111274636625017177 0ustar spangspangclear set aspectratio 1 window 0 defaults define\constants generate theta 0,,360,1000 b = 0.5 r = -b+cosd(theta) set curvelinewidth 5 set curvecolor red set polargrid 1 set polarnaxes 3 set polarticsbothsides 1 graph\polar r theta get %polaraxislength plen get %polaroriginx px get %polaroriginy py set %textheight 5 set textfont 'Arial Black' set %xtextlocation 50 set %ytextlocation 100 set textalign 8 set textinteractive 0 text 'Limacon of Pascal' set %textheight 3 set textfont 'Arial' set %xtextlocation 65 set %ytextlocation 84 set textalign 1 text ' = [0:2*]' set %ytextlocation 79 text ' = -'//rchar(b)//' + cos()' extrema-4.4.5/Scripts/demo.pcm0000644012702201742730000000404511274636625015302 0ustar spangspangclear ! ANSWER='YES' INQUIRE\YESNO 'First, some sample graphs?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @sample_graphs ! ANSWER='YES' INQUIRE\YESNO 'View a graph with 2 y axes?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @2yaxes ! ANSWER='YES' INQUIRE\YESNO 'View filling the area under a curve?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @fill_under_curve ! ANSWER='YES' INQUIRE\YESNO 'Filling the area between two curves?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @fill_between_curves ! ANSWER='YES' INQUIRE\YESNO 'A filled ring?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN clear window 0 defaults @filledring 12 5 green 100 ENDIF ! ANSWER='YES' INQUIRE\YESNO 'Some filled histogram examples?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @filled_histograms ! ANSWER='YES' INQUIRE\YESNO 'Examples of automatic axis label placement?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @automatic_axis_labels ! ANSWER='YES' INQUIRE\YESNO 'The next example shows that you can control just about every aspect of a graph?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @aspect_control ! ANSWER='YES' INQUIRE\YESNO 'A contour plot example, with legend?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @contour_example ! ANSWER='YES' INQUIRE\YESNO 'Now for a real life example of a data plot?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @cpu_example ! !ANSWER='YES' !INQUIRE\YESNO 'And another real life example?' ANSWER !IF EQS(UCASE(ANSWER),'YES') THEN @sigma_example ! ANSWER='YES' INQUIRE\YESNO 'A color gradient density plot (with legend)?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @density_gradient_example ! ANSWER='YES' INQUIRE\YESNO 'A dithering type density plot?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @density_dithering_example ! ANSWER='YES' INQUIRE\YESNO 'A diffusion type density plot (with x and y profiles)?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @density_diffusion_example ! ANSWER='YES' INQUIRE\YESNO 'A derivative example?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @derivative_example ! ANSWER='YES' INQUIRE\YESNO 'An integration example?' ANSWER IF EQS(UCASE(ANSWER),'YES') THEN @integration_example extrema-4.4.5/Scripts/mx.pcm0000644012702201742730000000031211274636625014773 0ustar spangspangr = mod([1:1000]-1,5)+1 sort\up r generate t 0,1.8,,200 t[201:400] = t[1:200] t[401:800] = t[1:400] t[801:1000] = t[1:200] z = exp(-r/2)*cosd(180*(r-1)) grid\xyout\size 30 r*cosd(t) r*sind(t) z m xo yo extrema-4.4.5/Scripts/vectorField.pcm0000644012702201742730000000125211274636625016621 0ustar spangspangCLEAR window 0 DEFAULTS ! GENERATE A 0,,360 20 ! create vector A: min= 0, max= 360, length= 20 GENERATE R 5,,5 20 ! create vector R: min= 5, max= 5, length= 20 SET PLOTSYMBOL -13 ! symbol 'centered arrow', angle A %PLOTSYMBOLSIZE 7 PLOTSYMBOLANGLE A %XNUMBERSHEIGHT 4 %YNUMBERSHEIGHT 4 AUTOSCALE COMMENSURATE GRAPH R*COSD(A) R*SIND(A) ! data is in polar coordinates SET %PLOTSYMBOLSIZE 3 GRAPH\OVERLAY R/2*COSD(A) R/2*SIND(A) ! overlay curve in polar coordinates SET PLOTSYMBOLANGLE 90-A ! symbol 'centered arrow', size 1, colour 1, angle 90-A %PLOTSYMBOLSIZE 7 GRAPH\OVERLAY 3*R/4*COSD(A) 3*R/4*SIND(A) ! overlay curve extrema-4.4.5/Scripts/one_way_anova.pcm0000644012702201742730000000331511274636625017202 0ustar spangspang! ! one-way analysis of variance test ! nameList = ?1 ! @splitString nameList k names error if (error) then display 'an error occurred splitting the name list into vector names' return endif ! ! k = number of populations ! n[i] = i_th population size ! T[i] = total of the observations for the i_th population ! TT = grand total of all observations from all populations ! df = population degrees of freedom ! dfe = error degrees of freedom ! dft = total degrees of freedom ! SSTr = sum of squares for the populations ! SSE = error sum of squares ! SST = total sum of squares ! MSTr = population mean square ! MSE = error mean square ! df = k-1 dfe = 0 do i = [1:k] T[i] = sum(names[i]) n[i] = len(names[i]) dfe = dfe + n[i] - 1 enddo dft = df + dfe TT = sum(T) SSTr = sum(T^2/n)-TT^2/sum(n) SST = 0 do i = [1:k] do j = [1:n[i]] SST = SST + (names[i])[j]^2 enddo enddo SST = SST - TT^2/sum(n) MSTr = SSTr/df SSE = SST - SSTr MSE = SSE/dfe F = MSTr/MSE ='Source of Degrees of Sum of Mean F' ='Variation Freedom Squares Square' ='----------------------------------------------------------------------' ='Populations '//rchar(df,'%12.0f')//rchar(SSTr,'%15.1f')//rchar(MSTr,'%15.1f')//rchar(F,'%15.1f') ='Error '//rchar(dfe,'%12.0f')//rchar(SSE,'%15.1f')//rchar(MSE,'%15.1f') ='Total '//rchar(dft,'%12.0f')//rchar(SST,'%15.1f') =' ' criticalValue = 1-fisher(df,dfe,F) ='Null hypothesis: the differences among the sample means can be atributed to chance' ='Accept the null hypothesis at a significance level of '//rchar(criticalValue*100)//'%' =' ' destroy error k n df dfe dft i j T TT SST SSTr MSTr SSE MSE F nameList names rowLen numberOfPopulations extrema-4.4.5/Scripts/density1.pcm0000644012702201742730000000100711274636625016111 0ustar spangspangX=[ 1; 0; 1; 0; .2; .3; .5; .8] Y=[ 5; 5; 0; 0; 1;1.5; 2.5; 4] Z=[ 10; 10; 10; 10; -100; 10; -100; 500] GRID\XYOUT\-messages X Y Z M XOUT YOUT window 5 defaults clear set %yimagticlength 2 %xnumbersheight 5 %ynumbersheight 5 xdropfirstnumber 1 xdroplastnumber 1 ydropfirstnumber 1 ydroplastnumber 1 scale\-messages -.1 1.1 -.2 5.2 density\dither\leg xout yout m ! window\inherit 6 5 dens\leg xout yout m ! window\inherit 7 5 dens\diff xout yout m ! window\inherit 8 5 dens\boxes xout yout m extrema-4.4.5/Scripts/arrows.pcm0000644012702201742730000000073711274636625015677 0ustar spangspangCLEAR WINDOW 0 !DEFAULTS ! figure\percent arrow 1 1 12 90 32 90 figure\percent arrow 2 1 12 80 32 80 figure\percent arrow 3 1 12 70 32 70 figure\percent arrow 1 2 40 90 60 90 figure\percent arrow 2 2 40 80 60 80 figure\percent arrow 3 2 40 70 60 70 set textalign 1 textinteractive 0 %textheight 4 %xtextlocation 5 %ytextlocation 88 text '1' set %ytextlocation 78 text '2' set %ytextlocation 68 text '3' set %xtextlocation 6 %ytextlocation 94 textalign 2 text 'style' extrema-4.4.5/Scripts/parametricPath.pcm0000644012702201742730000000150411274636625017317 0ustar spangspangclear window 0 defaults ! define\constants generate phi 0,,3*pi 100 a=0.2 b=0.5 x=a*phi-b*sin(phi) y=a-b*cos(phi) f=2*phi^2-3*phi+5 set colormap rainbow get colormapsize csize c=int(f*csize/max(f)+0.99) scales\-messages min(x) max(x) min(y) max(y) set plotsymbol 0 %xnumbersheight 3 %ynumbersheight 3 curvelinewidth 15 %xupperaxis 80 graph\axesonly do i = [1:len(phi)-1] set curvecolor c[i] graph\overlay [x[i];x[i+1]] [y[i];y[i+1]] enddo scales\-messages 0 1 min(f) max(f) generate tmp min(f),,max(f) len(phi) set %xloweraxis 85 %xupperaxis 90 xaxison 0 yaxison 1 graph\axesonly\yonright do i = [1:len(phi)-1] set curvecolor c[i] graph\overlay [0.5;0.5] [tmp[i];tmp[i+1]] enddo set %textheight 6 textfont 'Arial Black' textalign 1 textinteractive 0 %xtextlocation 10 %ytextlocation 90 text 'Prolate Cycloid' extrema-4.4.5/Scripts/nonlinearAxes.pcm0000644012702201742730000000522211274636625017162 0ustar spangspangclear window 0 defaults ! generate theta 0,,180 100 ! make a vector with 100 elements from 0 to 180 x = cosd(theta) y = x^2 x2 = [0;45;90;135;180] ! the upper axis large tic mark locations x3 = [5;10;15;20;25;30;35;40] ! the upper axis small tic mark increments lx2 = len(x2) ! length of vector x2 = number of large tic marks y2 = [1:lx2] ! y2 = [1;2;3;4;...] xupper = cosd(x2) ! convert to functional values lx3 = len(x3) ! y3 = [1:lx3] ! set %yupperaxis 85 ! make room for a label %xloweraxis 15 graphbox 0 ! turn off automatic tic marks on top axis plotsymbol 0 ! no plotting symbol autoscale on ! autoscale the plot xlabel 'Cos()' ylabel 'Cos<^>2<_>()' xlabelon 1 ylabelon 1 curvecolor red ydroplastnumber 1 ! do not draw ymax graph x y ! draw the graph with the bottom x-axis set autoscale off curvecolor black xticson 0 graphbox 1 graph\axesonly ! get %xnumbersheight xnumsz ! number size on x-axis %yloweraxis ylaxis ! lower end of y-axis (as % of window) %yupperaxis yuaxis ! upper end of y-axis (as % of window) %ximagticlength xiticl ! distance from x-axis to top of numbers (as %) yloweraxis ylaxisw ! lower end of y-axis (world units) yupperaxis yuaxisw ! upper end of y-axis (world units) ximagticlength xiticlw ! distance from x-axis to top of numbers (world units) ymin ymin ! number at bottom of y-axis ymax ymax ! number at top of y-axis ticlen = xiticlw/(yuaxisw-ylaxisw)*(ymax-ymin) y1 = ymax-2*ticlen y11 = ymax-ticlen yloc = yuaxis+1 set %textheight xnumsz ! height of text (% of window height) textalign 2 ! centre justify text textinteractive 0 ! %ytextlocation yloc ! vertical location of text textangle 0 ! text angle (degrees) !set clip 0 world\percent xupper y2 xp yp ! convert graph units to % of window do j = [1:lx2] ! for each large tic mark ... set %xtextlocation xp[j] ! set horizontal location of text text rchar(x2[j]) ! draw the upper x-axis numbers graph\overlay [xupper[j];xupper[j]] [ymax;y1] ! draw large tic marks xtmp = cosd(x2[j]+x3) ! on top of box world\percent xtmp y3 xpp ypp do k = [1:lx3] graph\overlay [xtmp[k];xtmp[k]] [ymax;y11] ! draw small tic marks enddo ! on top of box enddo ! find the mid point of the x-axis get %xupperaxis xux %xloweraxis xlx set %xtextlocation (xux+xlx)/2 ! position a label at the mid point %ytextlocation 90 textalign 2 ! centre justify textinteractive 0 text '' extrema-4.4.5/Scripts/limaconPascal.pcm0000644012702201742730000000123411274636625017121 0ustar spangspangclear window 0 defaults ! define\constants generate theta 0,,2*pi,1000 b=0.5 r=-b+cos(theta) set autoscale commensurate %xnumbersheight 2 %ynumbersheight 2 curvelinewidth 5 curvecolor red graph r*cos(theta) r*sin(theta) set curvecolor black curvelinewidth 1 zerolines ! get %xupperaxis xux %xloweraxis xlx %yupperaxis yux set %textheight 6 textfont 'Arial Black' %xtextlocation (xux+xlx)/2 %ytextlocation yux+1 textalign 2 textinteractive 0 text 'Limacon of Pascal' set %textheight 3 textfont 'Arial' %xtextlocation 45 %ytextlocation 75 textalign 1 text ' = [0:2*]' set %ytextlocation 70 text ' = -b + cos()' extrema-4.4.5/Scripts/2yaxes.pcm0000644012702201742730000000232611274636625015571 0ustar spangspangclear window 0 defaults ! x = [1:20:.5] ! the independent variable LHSFunction = 'x^2' LHSString = 'x<^>2' RHSFunction = 'exp(sin(x/5))' RHSString = 'e<^>sin(x/5)' set graphbox 0 %xnumbersheight 2 %ynumbersheight 2 %xloweraxis 15 %xupperaxis 85 xlabelon 1 xlabel 'This is the X axis label' ylabelon 1 ylabel 'This is the LHS Y axis label' scales\-messages min(x) max(x) min(LHSFunction) max(LHSFunction) graph x 1*LHSFunction ! draw y-axis on left side of box set %textheight 5 %xtextlocation 43 %ytextlocation 19 textangle 0 textalign 1 textinteractive 0 textcolor black text 'y = '//LHSString get %yupperaxis yux %yloweraxis ylx %xloweraxis xlx %xupperaxis xux set curvecolor blue ! change the line type for the next curve yaxiscolor blue ynumberscolor blue ylabelon 0 %xtextlocation 98 %ytextlocation (ylx+yux)/2 %textheight 3 textalign 8 textangle -90 textcolor blue text 'This is the RHS Y axis label' scales\-messages min(x) max(x) min(RHSFunction) max(RHSFunction) graph\yonright x 1*RHSFunction ! draw the other data curve (without axes) set %textheight 5 %xtextlocation 50 %ytextlocation 85 textangle 0 textalign 1 textinteractive 0 textcolor blue text 'y = '//RHSString extrema-4.4.5/Scripts/derivative_example.pcm0000644012702201742730000000061011274636625020225 0ustar spangspangclear window 0 defaults pi=acos(-1) generate x 0,,2*pi 100 y = cos(x)^3+sin(x)^3 graph x y ! set curvecolor red graph\overlay x deriv(x,y) set curvecolor black replot set %xtextlocation 67 %ytextlocation 72 textalign 3 textinteractive 0 textcolor red text 'df(x)/dx' set %xtextlocation 40 %ytextlocation 30 textalign 1 textcolor black text 'f(x) = cos(x)<^>3<_> + sin(x)<^>3<_>' extrema-4.4.5/Scripts/eigen.pcm0000644012702201742730000000035711274636625015447 0ustar spangspangm=[[2;-1;0;0];[-1;2;-1;0];[0;-1;2;-1];[0;0;-1;2]] e=eigen(m) ='matrix m' =m =' ' ='matrix e' =e ! ! check ! n=vlen(m)[1] do j = [1:n] ! these should be all zero (or close to zero) =' ' ='j = '//rchar(j) =m<>e[*,j]-e[j,n+1]*e[*,j] enddo extrema-4.4.5/Scripts/sigma.dat0000644012702201742730000000666411274636625015460 0ustar spangspang! incident energy, cross section (mbarn), +/- error ! THE experimental point (LINES 3-3) 280 1000 200 ! ! theories... ! ! Oset 1st curve: no modifications 16O(pi-,pi+pi-) (LINES 8-31) 1.8500E+02 7.1991E+00 1.9000E+02 1.2613E+01 1.9500E+02 2.0785E+01 2.0000E+02 3.2428E+01 2.0500E+02 4.8202E+01 2.1000E+02 6.8663E+01 2.1500E+02 9.4250E+01 2.2000E+02 1.2529E+02 2.2500E+02 1.6207E+02 2.3000E+02 2.0486E+02 2.3500E+02 2.5404E+02 2.4000E+02 3.1011E+02 2.4500E+02 3.7384E+02 2.5000E+02 4.4622E+02 2.5500E+02 5.2860E+02 2.6000E+02 6.2267E+02 2.6500E+02 7.3043E+02 2.7000E+02 8.5427E+02 2.7500E+02 9.9683E+02 2.8000E+02 1.1609E+03 2.8500E+02 1.3493E+03 2.9000E+02 1.5643E+03 2.9500E+02 1.8077E+03 3.0000E+02 2.0793E+03 ! ! Oset 2nd curve: binding of outgoing pions 16O(pi-,pi+pi-) (LINES 34-57) 1.8500E+02 1.1869E+01 1.9000E+02 1.9436E+01 1.9500E+02 3.0898E+01 2.0000E+02 4.7749E+01 2.0500E+02 7.1829E+01 2.1000E+02 1.0532E+02 2.1500E+02 1.5074E+02 2.2000E+02 2.1084E+02 2.2500E+02 2.8857E+02 2.3000E+02 3.8698E+02 2.3500E+02 5.0907E+02 2.4000E+02 6.5772E+02 2.4500E+02 8.3558E+02 2.5000E+02 1.0450E+03 2.5500E+02 1.2880E+03 2.6000E+02 1.5663E+03 2.6500E+02 1.8812E+03 2.7000E+02 2.2339E+03 2.7500E+02 2.6254E+03 2.8000E+02 3.0569E+03 2.8500E+02 3.5296E+03 2.9000E+02 4.0453E+03 2.9500E+02 4.6062E+03 3.0000E+02 5.2157E+03 ! ! Oset 3rd curve: renormalization of virtual pion of pole term 16O(pi-,pi+pi-) (LINES 60-83) 1.8500E+02 1.3580E+01 1.9000E+02 2.6681E+01 1.9500E+02 4.6853E+01 2.0000E+02 7.5300E+01 2.0500E+02 1.1299E+02 2.1000E+02 1.6094E+02 2.1500E+02 2.2053E+02 2.2000E+02 2.9378E+02 2.2500E+02 3.8356E+02 2.3000E+02 4.9358E+02 2.3500E+02 6.2846E+02 2.4000E+02 7.9342E+02 2.4500E+02 9.9399E+02 2.5000E+02 1.2354E+03 2.5500E+02 1.5215E+03 2.6000E+02 1.8543E+03 2.6500E+02 2.2325E+03 2.7000E+02 2.6509E+03 2.7500E+02 3.1011E+03 2.8000E+02 3.5725E+03 2.8500E+02 4.0553E+03 2.9000E+02 4.5446E+03 2.9500E+02 5.0458E+03 3.0000E+02 5.5803E+03 ! ! Rockmore not attenuated 18O(pi-,pi-pi-) (LINES 86-105) 1.9000E+02 2.2425E+00 1.9500E+02 3.2872E+00 2.0000E+02 4.6924E+00 2.0500E+02 6.5336E+00 2.1000E+02 8.8878E+00 2.1500E+02 1.1832E+01 2.2000E+02 1.5438E+01 2.2500E+02 1.9778E+01 2.3000E+02 2.4916E+01 2.3500E+02 3.0920E+01 2.4000E+02 3.7856E+01 2.4500E+02 4.5803E+01 2.5000E+02 5.4856E+01 2.5500E+02 6.5137E+01 2.6000E+02 7.6812E+01 2.6500E+02 9.0101E+01 2.7000E+02 1.0530E+02 2.7500E+02 1.2282E+02 2.8000E+02 1.4319E+02 2.8500E+02 1.6715E+02 ! ! Rockmore pion attenuated 18O(pi-,pi-pi-) (LINES 108-127) 1.9000E+02 1.9478E-01 1.9500E+02 2.8068E-01 2.0000E+02 3.9645E-01 2.0500E+02 5.4958E-01 2.1000E+02 7.4866E-01 2.1500E+02 1.0035E+00 2.2000E+02 1.3251E+00 2.2500E+02 1.7261E+00 2.3000E+02 2.2209E+00 2.3500E+02 2.8258E+00 2.4000E+02 3.5603E+00 2.4500E+02 4.4474E+00 2.5000E+02 5.5152E+00 2.5500E+02 6.7983E+00 2.6000E+02 8.3401E+00 2.6500E+02 1.0196E+01 2.7000E+02 1.2438E+01 2.7500E+02 1.5157E+01 2.8000E+02 1.8478E+01 2.8500E+02 2.2563E+01 ! ! Cohen and Eisenberg ! ! g' = 0.4 (LINES 132-132) 285 6020 ! ! g' = 0.5 (LINES 135-135) 285 4480 ! ! g' = 0.6 (LINES 138-138) 285 3750 extrema-4.4.5/Scripts/contour_example.pcm0000644012702201742730000000015211274636625017555 0ustar spangspangclear window 0 defaults set %contourlabelheight 3 x=[1:30] contour\color -[1:20] sin(x>=Base) then display 'N must be < '//rchar(Base) return endif NChar = rchar(N) ! ! Guess the number of digits (on BASE) ! M = int(((N+0.5)*log(N+1)-N-0.081+1/(12*(N+1)))/log(Base)+1) ! ! Create and initialize Digits ! destroy Dg Dg[1:M]=0 Dg[M]=1 ! ! Do the multiply loop ! if (N>1) then do i = [2:N] Dg = mod(Dg*i,Base)+roll(int(Dg*i/Base),-1) enddo endif ! ! Post process ! C = 0 do i = [M:1:-1] D = Dg[i]+C C = int(D/Base) Dg[i] = mod(D,Base) enddo ! ! Output the result ! ='------------ Factorial( '//rchar(N)//` ) ------------' L = log10(Base)+1 Fmt = '%'//char(48+L)//'.0f' Nj = int(78/L) Sl = ' ' i = 1 S = rchar(Dg[i]+Base,Fmt) do j = [2:L] if nes(S[j],'0') then goto done S[j] = ' ' enddo done: Sl = Sl//S[2:L]//',' j = 1 if (M>1) then do i = [2:M] S = rchar(Dg[i]+Base,Fmt) Sl = Sl//S[2:L]//',' j = j+1 if (j=Nj) then = Sl[1:#-(i=M)] j = 0 Sl = ' ' endif enddo endif if (J>0) then =Sl[1:#-1] !goto startfactorial endfactorial: extrema-4.4.5/config.sub0000755012702201742730000007301511274636625014214 0ustar spangspang#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-06-18' # 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., 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. # 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 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 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # 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 0;; * ) 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* | freebsd*-gnu* | netbsd*-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) 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 ;; -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/'` ;; -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] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | s390 | s390x \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) 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) ;; # 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-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | s390-* | s390x-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # 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 ;; 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 ;; 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 ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; 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 ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; 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 ;; 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 ;; 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 ;; 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 ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; 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 ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; 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 ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; 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 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; 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 ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; 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 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-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 ;; 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 ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) 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* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -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*) # 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* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -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 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -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 ;; -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 ;; -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 *-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 ;; 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 ;; *-ibm) os=-aix ;; *-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 ;; -ptx*) vendor=sequent ;; -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 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: extrema-4.4.5/ChangeLog0000644012702201742730000004250411345041257013770 0ustar spangspang07/03/2010 Joe Chuma v4.4.4 * modified src/Utilities/ExGlobals fixed a bug in the calculation of the world and monitor units after a change in the aspect ratio * modified src/Graphics/GRA_postscript removed a "fudge factor" in the location for drawing text (related to preceeding fix) 05/02/2010 Joe Chuma v4.4.3 * added 3D graphing speed button to the visualization window which allows the user to plot (x,y,z) data on basic graph axes, with the ability to zoom in/out and rotate in 3 dimensions. * enabled figure drawing speed button to the visualization window which allows the user to interactively draw various types of arrows, polygons, and ellipses 03/12/2009 Joe Chuma v4.4.2 * modified the entire Help file structure, reorganizing and simplifying (and correcting in some cases). * modified src/Commands/CMD_graph Autoscaling one axis while the other was fixed, was causing problems. This has been fixed. * modified src/Utilities/ExGlobals The locations of the Help and Images directories have finally been rationalized. 05/10/2009 Joe Chuma v4.4.1 * modified src/Graphics/GRA_postscript PostScript output of graphs with an automatic graph legend were not producing all the proper line widths. This should now be fixed. 26/09/2009 Joe Chuma v4.4.0 * modified the fit gui src/wxForms/FitForm the parameter errors displayed on the resultant graph are now the more usual standard errors (E1), instead of the so-called "reduced standard errors" (E2) where E2 = E1/sqrt(chi-sq/#degrees_of_freedom). I appologize for any confusion this may have caused. * added two new general characteristics: BACKGROUNDCOLOR and BACKGROUNDFILE these control the background for each graphics sub-window. BACKGROUNDFILE refers to a png image file. The default background color is white. * added two new general characteristics: ARROWHEADWIDTH and ARROWHEADLENGTH these are scale factors which are applied to the width and length of any arrow heads drawn with the FIGURE command, e.g., to double the width, SET ARROWHEADWIDTH 2 while to halve it, SET ARROWHEADWIDTH 0.5 The default for both characteristics is 1.0 06/02/2008 Joe Chuma v4.3.6 * modified src/wxForms/CommandTextCtrl.cpp the cursor is now positioned at the end of the command line on a command line recall with the up/down arrow keys * modified src/Utilities/UsefulFunctions.cpp initial indexing for linear interpolation was off by one causing incorrect results in some cases 30/01/2008 Joe Chuma v4.3.5 * modified src/Graphics/GRA_window.cpp the REPLOT command was failing for some cases of XLOGBASE or YLOGBASE > 1, this is fixed. * modified src/Graphics/GRA_cartesianAxes.cpp the GRAPH command was failing if autoscaling was on and a linear axis was drawn first, with large max value, and then logbase set > 1, and GRAPH drawn again, this is fixed. * modified src/Graphics/GRA_cartesianAxes.cpp, src/Commands/CMD_scales.cpp setting the virtual min/max was not working properly when the number of large increments was set to zero. This is fixed. * modified src/Graphics/GRA_postscript,GRA_font,GRA_fontControl attempting to rationalize the linux and windows fonts. Now both version try to use the same fonts. Changed the font names used in PostScript output for better results. * modified many files to fix up unicode stream output when saving a session 11/01/2008 Joe Chuma v4.3.4 * modified src/Expression/Expression.cpp, Workspace.cpp the FIT command was failing when the fit expression was an evaluatable text string, e.g., FIT y=EVALUATE(f) or FIT y=1*f where f is a string variable, this has been fixed 08/01/2008 Joe Chuma v4.3.3 * modified src/Graphics/GRA_window.cpp the REPLOT command was failing when the axis min > max, now fixed * modified src/Commands/CMD_read.cpp when reading data from a file into vectors, a record in the data file which begins with the comment character, default '!', will be ignored * modified help files attempting better explanation of expression variables in the Introduction 07/01/2008 Joe Chuma v4.3.2 * modified several source files to accomodate gcc v4.3 which "cleaned up" some header dependencies. 27/11/2007 Joe Chuma v4.3.1 * added more polar plot characteristics, modified GRAPH\RADAR, and updated the help files. added characteristics: POLARAXISANGLE, POLARAXISLINEWIDTH, POLARCLOCKWISE, POLARCOMPASSLABELS 19/11/2007 Joe Chuma v4.3.0 * added polar plots GRAPH\POLAR now draws a true polar plot polar plots have their own set of characteristics the help files have been updated 01/11/2007 Joe Chuma v4.2.10 * modified src/Commands/CMD_read when reading a matrix where the number of columns is not given, extrema was returning 1000 columns, which is obviously wrong. This has been fixed. * modified all help files removed extraneous Windows specific stuff from the html help files and tried to fix up broken links and incorrect information * modified src/Functions/FCN_integral added trapezoid rule calculation. Syntax: INTEGRAL(x,y,'TRAPEZOID') 05/10/2007 Joe Chuma v4.2.9 * modified src/Utilities/ExGlobals can now pass a script and parameters as command line arguments. This script will be executed immediately. For example: $ extrema --script "testIt.pcm 50 90 'some string'" will execute the script testIt.pcm with 3 parameters. 14/09/2007 Joe Chuma v4.2.8 * modified src/Utilities/ExXML, src/Utilities/ExGlobals removed dependency on libxml2, now using wxXmlDocument, wxXmlNode * modified Command, FCN_adev, FCN_mean, FCN_gmean, FCN_rms, FCN_skew, FCN_stdev, CMD_get, CMD_read, CMD_scalar, CMD_set, FCN_date, FCN_time, GRA_axis, ExSpinCtrlD.h, ExSpinCtrlI.h, and ExColorCtrl.h to comply with the latest gcc compiler. * added FCN_heaviside 0.0 for x < 0 The Heaviside function has been added. HEAVISIDE(x) = 0.5 for x = 0 1.0 for x > 0 17/08/2007 Joe Chuma v4.2.7 * added src/wxForms/LegendPopup New context sensitive options. If you right-click on a graph legend, a form pops up allowing you to modify aspects of the legend, such as position, size, frame colour, title colour, etc. * modified src/Utilities/ExGlobals New feature. A command line beginning with the % character is now interpreted as a system command, e.g., %ls. The output from the command will be displayed in the terminal window. 01/08/2007 Joe Chuma v4.2.6 * added src/wxForms/TextPopup New context sensitive options. If you right-click on a drawn text string, a form pops up allowing you to modify aspects of the text string, such as color, height, font, location, etc. * modified src/Commands/CMD_write Writing a text string to a file was writing gibberish instead, due to a unicode confusion. This has been fixed. Also, writing a scalar to a file was failing with a complaint that it wasn't a vector. This has also been fixed. 27/07/2007 Joe Chuma v4.2.5 * modified src/Graphics/GRA_window.cpp Fixed up replot for commensurate autoscaling. * added src/wxForms/CurvePopup, src/wxForms/ExColorCtrl,ExSpinCtrlD,ExSpinCtrlI. New context sensitive options. If you right-click on a data curve on a graph, a form pops up allowing you to modify aspects of the curve, such as histogram type, line type, line thickness, plotsymbol type, color, size, etc. 10/07/2007 Joe Chuma v4.2.4 * added src/wxForms/AxisPopup, src/wxForms/BasicColors New context sensitive options. If you right-click on the x- or y-axis of a graph, a form pops up allowing you to modify many axis characteristics, including color, location, scales, grid lines, tic marks, etc. This new feature will be extended to other graphical objects soon. 06/06/2007 Joe Chuma v4.2.3 * modified src/wxForms/VisualizationSpeedButtonPanel Minor bug fix for PostScript output: if the .eps extension was not supplied, the plot file was created but not completed. If the .eps extension was supplied, everything was ok. This is now fixed. * modified src/Commands/CMD_graph Minor bug fix: if the legend is off and a string is supplied as the first argument to the GRAPH command, an error occurred. The string is now ignored, as specified in the documentation. 04/06/2007 Joe Chuma v4.2.2 * added src/Commands/CMD_ellipse New command ELLIPSE can be used to populate an ellipse given the major- and minor-axes, centre, and angle; or it can be used to fit an ellipse to a set of data. The Help files have also been updated. * added src/Commands/CMD_polygon New command POLYGON takes the coordinates for a polygon and some data coordinates, and returns a vector indicating which data points are inside/outside the polygon. The Help files have also been updated. 15/05/2007 Joe Chuma v4.2.1 * modified src/wxForms/VisualizationWindow, SetAspectRatioForm Minor changes to allow linking with wxGTK v2.6.3 * modified src/wxForms/VisualizationWindow, src/Utilities/ExGlobals, src/wxForms/SetAspectRatioForm. Minor fixes for aspect ratio changes, hidden pages were not being reset properly. * added src/Commands/CMD_alias, CMD_dealias. New command ALIAS allows the user to create new commands out of the current commands. New command DEALIAS is used to remove an alias. 08/05/2007 Joe Chuma v4.2.0 * added src/wxForms/GraphicsPage, src/Commands/CMD_page. These allow for multiple graphics pages in a tabbed format. A new graphics page adds another tab in the visualization window. Use the speed buttons on the visualization window, or the PAGE command, to add/remove pages. * added src/wxForms/SetAspectRatioForm. This allows for interactively changing the aspect ratio. * modified src/Utilities/ExGlobals, src/wxForm/VisualizationWindow to fix up the SAVE/RESTORE feature for multiple graphics pages. * modified src/Graphics/GRA_postscript to break up long sets of "lineto"s in order to speed up ghostview display of postscript files, also included shorter names for "lineto", "moveto", and "stroke", to make the files smaller. * modified src/Commands/CMD_get,CMD_set to modify orientation, which now uses aspectratio. For letter size paper, use SET ASPECTRATIO 8.5/11 to get landscape orientation, and use SET ASPECTRATIO 11/8.5 to get portrait orientation. 18/04/2007 Joe Chuma v4.1.10 * added src/Functions/FCN_asinh,FCN_acosh,FCN_atanh,FCN_asech,FCN_acsch,FCN_acoth, FCN_cosh,FCN_sinh,FCN_tanh,FCN_sech,FCN_csch,FCN_coth the hyperbolic trig functions (I simply forgot to include them before) * added src/Graphics/GRA_postscript (a PostScript driver) to fix up the PostScript output, i.e., it is now encapsulated postscript (with a bounding box), and the Greek characters and the math symbols should now appear in the postscript output 30/03/2007 Joe Chuma v4.1.9 * modified src/Commands/CMD_execute to fix a bug in appending the current path to a filename. The / was missing before the filename. * modified src/Commands/CMD_inquire,CMD_execute,CMD_text,CMD_quit,CMD_if, CMD_pause,CMD_set,CMD_get,CMD_return and src/Graphics/GRA_drawableText and src/Parsing/Script and src/Utilities/ExGlobals and src/wxForms/AnalysisMessagePanel,CommandTextCtrl,ExecuteDialog, VisualizationWindow,AnalysisWindow to fix script handling. Previously, nested scripts were simply not handled correctly, leading to stack overflow or other serious problems. It should now be fixed. * added src/Functions/FCN_skew,FCN_mean,FCN_var,FCN_stdev,FCN_rms,FCN_median, FCN_kurt,FCN_imin,FCN_imax,FCN_gmean,FCN_adev so the various statistics can be obtained easier than via the STATISTICS command. * modified src/Functions/FCN_time,FCN_date to fix more bugs in the TIME and DATE functions. 27/03/2007 Joe Chuma v4.1.8 (for various reasons, 4.1.8 was skipped) 06/03/2007 Joe Chuma v4.1.7 * modified src/Graphics/GRA_axis to fix a bug with log scales when there are no major tic marks showing * modified src/Commands/CMD_fit to fix a bug with the \CL qualifier not being recognized * added optional support for MINUIT (minimization code from CERN) * modified src/Commands/CMD_scalar to allow limits on fit parameters destined for use in MINUIT, e.g., SCALAR\FIT A[min:max]. These limits are ignored by the FIT command. * modified src/Graphics/GRA_ditheringPlot, GRA_gradientPlot and src/Parsing/ParseLine to remove un-named temporary to be passed as a reference to const argument to a function. * modified src/Utilities/ExGlobals to fix a bug with the PAUSE command. A pause in a second level macro (one called by another macro) was causing all scripts to stop after the pause. * modified src/Graphics/GRA_axis to fix a bug in drawing a linear axis when the virtual min and/or max are within the axis min/max. 08/02/2007 Joe Chuma v4.1.6 * modified src/Commands/CMD_hardcopy so that the file path defaults to the current directory * modified src/Functions/FCN_date and src/Functions/FCN_time so that they work and not seg.fault. * modified Help/html/Functions/StringManipulation/time.htm to fix an error in the description of the format * modified src/Commands/CMD_statistics to fix the calculation of the median * modified src/Parsing/ParseLine to fix a bug so that a qualifier can be appended to a variable with indices, e.g., STAT X XM[1]\MEAN * modified src/Commands/CMD_text and src/wxForms/VisualizationWindow to fix a problem with interactive text placement from within a script * modified src/Utilities/ExGlobals, src/wxForms/HintForm, and src/wxForms/VisualizationWindow to fix up the hint window for interactive text placement * upgraded to wxGTK-2.8.0 24/01/2007 Joe Chuma v4.1.5 * added extrema.spec extrema.desktop extrema_icons.tar.bz2 to the distribution * modified src/Command/CMD_set and src/Utilities/ExGlobals to add ECHOON characteristic. ECHOON controls whether an executing script is displayed in the command history and message window. * modified src/Commands/CMD_read and src/Commands/CMD_write so that the file path defaults to the current directory. * modified src/Commands/CMD_set to fix a bug when setting AUTOSCALE ON\VIRTUAL * modified src/Commands/CMD_destroy, src/Variables/TextVariable and src/Variables/TVariableTable to fix a bug when DESTROYing a text variable or when DESTROYing an element of an array text variable * modified src/Commands/CMD_graph to fix an autoscaling bug * modified src/Parsing/ParseLine to fix not parsing properly a qualifier after a closing bracket, e.g. STATISTICS X XM[1]\MEAN * modified src/Graphics/GRA_cartesianAxes to fix replot of log scales when autoscale is off 19/01/2007 Joe Chuma v4.1.4 * renamed extremaHelp/ back to Help/ and extremaImages/ back to /Images These directories will now be placed, by default, in /usr/local/share/extrema/ * Makefile.am : added fonts/ directory to the distribution These TrueType fonts are freely available, but the user must install them. The SYMBOL font is neccessary for the special symbols such as , , etc. * fixed the QUIT command so the quit dialog only has "Yes" and "No" buttons and if you click "No", the program does not quit * modified src/Functions/FCN_iclose.cpp default calculated index was initialised to 1 instead of 0 * added new characteristic MAXHISTORY MAXHISTORY controls how many history records are stored for each variable * modified src/wxForms/FontChooser.h added #include "wx/notebook.h" * modified src/wxForms/FitForm.h changed 'std::size_t nFree_;' to 'unsigned int nFree_;' * modified src/Commands/CMD_fit.cpp changed 'std::size_t nfree=0;' to 'unsigned int nfree=0;' * modified src/wxForms/AnalysisWindow.h removed member function 'GetPointer' 11/01/2007 Joe Chuma v4.1.3 * renamed Help/ to extremaHelp/ and Images/ to extremaImages/ * Makefile.am : added extremaHelp/ and extremaImages/ to $(prefix)/share directory (make install) added extremaHelp/, extremaImages/, Scripts/, and doc/ to distribution tar file (make dist) * modified src/Commands/CMD_density.h, src/Commands/Command.h, src/Functions/ScalarFunction.h, and src/Graphics/GRA_window.h to remove extraneous class qualifiers, as more recent compilers complain about this (submitted by S.Umar) * modified src/Utilities/ExGlobals.h and .cpp to rationalize the locations for the help and image files they now go to $(prefix)/share with "make install" also modified VisualizationSpeedButtonPanel.cpp, PeakFindForm.cpp, ChooseFilePanel.cpp, and AnalysisSpeedButtonPanel.cpp to accommodate the new image file location * modified src/Graphics/GRA_axis.cpp to fix the grid line color ------------------------------------------------------------------------------------------------------------ Copyright (C) 2006, 2007 Joseph L. Chuma Copying and distribution of this file, with or without modification, are permitted, provided the copyright notice and this notice are preserved. extrema-4.4.5/reconf0000755012702201742730000000117211274636625013426 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. #!/bin/sh rm -f config.cache echo "- aclocal." aclocal -I m4 echo "- autoconf." autoconf #echo "- autoheader." #autoheader echo "- automake." automake -a exit extrema-4.4.5/missing0000755012702201742730000002453311274636625013631 0ustar spangspang#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2004-09-07.08 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 # 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., 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # 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' 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 0 ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit 0 ;; -*) 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 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` 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 [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -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 [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -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 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -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." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi 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: extrema-4.4.5/AUTHORS0000644012702201742730000000331311274636625013273 0ustar spangspangAuthors of extrema. See also the files THANKS and ChangeLog. Joseph L. Chuma designed and implemented extrema. Acknowledgments =============== EXTREMA has evolved from software developed over the years at TRIUMF, Canada's national laboratory for particle and nuclear physics. The need for a general purpose graphics and analysis package was seen early and the first such program was OPDATA, created, using FORTRAN, by C.J. Kost, Philip Bennett, and Arthur Haynes. The next program, PLOTDATA, also in FORTRAN, used many ideas from OPDATA, but had a different, more user friendly, interface, and was created by Joseph Chuma in 1983. At the heart of OPDATA and PLOTDATA was the expression evaluator, but it was limited in that only element-by-element operations were possible, and variable indices were not allowed in expressions. Philip Bennett and Joseph Chuma re-wrote the expression evaluator, again in FORTRAN, allowing for array operations and indices on variables, functions, and entire expressions. This work was incorporated into a new program, PHYSICA, which also introduced many other new graphics and analysis features. After a few aborted attempts at creating a GUI for PHYSICA, EXTREMA for Microsoft Windows was born, followed by EXTREMA for Linux. EXTREMA was first written completely in C++ by Joe Chuma using Borland C++Builder 5. This version of EXTREMA has now been ported to Linux using wxWidgets, an open source cross-platform toolkit. EXTREMA makes use of the wxWidgets toolkit, which is "a single, easy-to-use API for writing GUI applications on multiple platforms that still utilize the native platform's controls and utilities." Information on the wxWidgets project can be found at http://wxwidgets.org extrema-4.4.5/aclocal.m40000644012702201742730000010351011440762623014054 0ustar spangspang# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 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_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],, [m4_warning([this file was generated for autoconf 2.64. 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'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 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.11' 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.11], [], [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.11])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, 2003, 2005 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, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # 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. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$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, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # 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. # serial 10 # 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", "GCJ", or "OBJC". # 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 ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # 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. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 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"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 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. # serial 16 # 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. # 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.62])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], [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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [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([AM_PROG_MKDIR_P])dnl # 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)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl 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 ]) 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, 2003, 2005, 2008 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, 2005 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. # serial 2 # 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, 2002, 2003, 2005, 2009 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. # serial 4 # 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, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # 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. # serial 6 # 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 supports --run. # If it does, 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 --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 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_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 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. # serial 4 # _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])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # 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. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # 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 ( 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 rm -f conftest.file 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 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)]) # Copyright (C) 2001, 2003, 2005 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, 2008 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. # serial 2 # _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, 2005 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. # serial 2 # _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. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. 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([acinclude.m4]) extrema-4.4.5/install-sh0000755012702201742730000002176611274636625014243 0ustar spangspang#!/bin/sh # install - install a program, script, or datafile scriptversion=2004-09-10.20 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit 0;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit 0;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } # 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: extrema-4.4.5/ltmain.sh0000755012702201742730000054666211274636625014071 0ustar spangspang# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 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 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. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # RH: define SED for historic ltconfig's generated by Libtool 1.3 [ -z "$SED" ] && SED=sed # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.6 TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)" # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" ##################################### # Shell function definitions: # This seems to be the best place for them # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` if test "X$win32_nmres" = "Ximport" ; then win32_libid_type="x86 archive import" else win32_libid_type="x86 archive static" fi fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" $echo $echo "Copyright (C) 2003 Free Software Foundation, Inc." $echo "This is free software; see the source for copying conditions. There is NO" $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $EXIT_SUCCESS ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $EXIT_SUCCESS ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $EXIT_SUCCESS ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case "$arg_mode" in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi else if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi fi build_libtool_libs=no build_old_libs=yes prefer_static_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 exit $EXIT_FAILURE fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-mingw* | *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) deplibs="$deplibs $arg" continue ;; -module) module=yes continue ;; # gcc -m* arguments should be passed to the linker via $compiler_flags # in order to pass architecture information to the linker # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo # but this is not reliable with gcc because gcc may use -mfoo to # select a different linker, different libraries, etc, while # -Wl,-mfoo simply passes -mfoo to the linker. -m*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" if test "$with_gcc" = "yes" ; then compiler_flags="$compiler_flags $arg" fi continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # The PATH hackery in wrapper scripts is required on Windows # in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir status=$? if test "$status" -ne 0 && test ! -d "$output_objdir"; then exit $status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) if test "$deplibs_check_method" != pass_all; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var"; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $dir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5* ) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case "$libdir" in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case "$libdir" in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else convenience="$convenience $dir/$old_library" old_convenience="$old_convenience $dir/$old_library" deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$deplibs $path" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor - 1` age="$number_minor" revision="$number_minor" ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in [0-9]*) ;; *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in [0-9]*) ;; *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in [0-9]*) ;; *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) major=`expr $current - $age + 1` case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. for path in $notinst_path; do lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" status=$? if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "$mkdir $xdir" $run $mkdir "$xdir" status=$? if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi # We will extract separately just the conflicting names and we will no # longer touch any unique names. It is faster to leave these extract # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$save_output-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$save_output-${k}.$objext k=`expr $k + 1` output=$output_objdir/$save_output-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadale object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" else gentop="$output_objdir/${obj}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" status=$? if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "$mkdir $xdir" $run $mkdir "$xdir" status=$? if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi # We will extract separately just the conflicting names and we will no # longer touch any unique names. It is faster to leave these extract # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$output.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' else $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) cwrappersource=`$echo ${objdir}/lt-${output}.c` cwrapper=`$echo ${output}.exe` $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR #define DIR_SEPARATOR '/' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) #define HAVE_DOS_BASED_FILE_SYSTEM #ifndef DIR_SEPARATOR_2 #define DIR_SEPARATOR_2 '\\' #endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); char * basename (const char *name); char * fnqualify(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup ((char *) basename (argv[0])); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = fnqualify(argv[0]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } char * basename (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha (name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return (char *) base; } char * fnqualify(const char *path) { size_t size; char *p; char tmp[LT_PATHMAX + 1]; assert(path != NULL); /* Is it qualified already? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha (path[0]) && path[1] == ':') return xstrdup (path); #endif if (IS_DIR_SEPARATOR (path[0])) return xstrdup (path); /* prepend the current directory */ /* doesn't handle '~' */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ p = XMALLOC(char, size); sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); return p; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \$progdir\\\\\$program \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \$progdir/\$program \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" status=$? if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" # Add in members from convenience archives. for xlib in $addlibs; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "$mkdir $xdir" $run $mkdir "$xdir" status=$? if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi # We will extract separately just the conflicting names and we will no # longer touch any unique names. It is faster to leave these extract # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` done fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # GNU ar 2.10+ was changed to match POSIX; thus no paths are # encoded into archives. This makes 'ar r' malfunction in # this piecewise linking case whenever conflicting object # names appear in distinct ar calls; check, warn and compensate. if (for obj in $save_oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 AR_FLAGS=cq fi # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg="$nonopt" fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest="$arg" continue fi case $arg in -d) isdir=yes ;; -f) prev="-f" ;; -g) prev="-g" ;; -m) prev="-m" ;; -o) prev="-o" ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest="$arg" continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # To insure that "foo" is sourced, and not "foo.exe", # finese the cygwin/MSYS system by explicitly sourcing "foo." # which disallows the automatic-append-.exe behavior. case $build in *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; *) wrapperdot=${wrapper} ;; esac # If there is no directory component, then add one. case $file in */* | *\\*) . ${wrapperdot} ;; *) . ./${wrapperdot} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # To insure that "foo" is sourced, and not "foo.exe", # finese the cygwin/MSYS system by explicitly sourcing "foo." # which disallows the automatic-append-.exe behavior. case $build in *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; *) wrapperdot=${wrapper} ;; esac # If there is no directory component, then add one. case $file in */* | *\\*) . ${wrapperdot} ;; *) . ./${wrapperdot} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" tmpdir="$tmpdir/libtool-$$" save_umask=`umask` umask 0077 if $mkdir "$tmpdir"; then umask $save_umask else umask $save_umask $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyways case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "----------------------------------------------------------------------" $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "----------------------------------------------------------------------" exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi if test "${save_LANG+set}" = set; then LANG="$save_LANG"; export LANG fi # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" if test "$mode" = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. fi fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $EXIT_SUCCESS # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: extrema-4.4.5/README0000644012702201742730000000053511274636625013106 0ustar spangspangWelcome to EXTREMA. EXTREMA is distributed under the GNU GPL. Please see the file COPYING for details. EXTREMA requires that wxWidgets be installed first. wxWidgets can be obtained from http://wxwidgets.org For documentation, please see the files in the doc subdirectory. For building and installation instructions please see the INSTALL file. extrema-4.4.5/depcomp0000755012702201742730000003554511274636625013614 0ustar spangspang#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2004-05-31.23 # Copyright (C) 1999, 2000, 2003, 2004 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, 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. # 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 outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit 0 ;; -v | --v*) echo "depcomp $scriptversion" exit 0 ;; esac 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" # 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 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. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## 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). ## - 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 -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## 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. tr ' ' ' ' < "$tmpdepfile" | ## 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. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then : else 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 ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; 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. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else 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" ;; 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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # Dependencies are output in .lo.d with libtool 1.4. # With libtool 1.5 they are output both in $dir.libs/$base.o.d # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the # latter, because the former will be cleaned when $dir.libs is # erased. tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir$base.o.d" tmpdepfile3="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" tmpdepfile3="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" elif test -f "$tmpdepfile2"; then tmpdepfile="$tmpdepfile2" else tmpdepfile="$tmpdepfile3" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #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 $1 != '--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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. 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 $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac 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. -*|$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" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. 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 $1 != '--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 '/^# [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, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; 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-end: "$" # End: extrema-4.4.5/INSTALL0000644012702201742730000002760411306000662013243 0ustar spangspangInstallation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Getting ready to build ====================== Required: Extrema requires the wxGTK ( >= v2.6.3, although > v2.8.0 is recommended ) package to be installed before installing extrema. See http://www.wxwidgets.org for information on downloading and installing. Specifically for extrema, wxGTK should be built with the following configure command: $ ./configure --enable-optimise --enable-exceptions --enable-unicode --enable-htmlhelp --enable-postscript --enable-giff --enable-static --with-gtk --with-libpng --with-libjpeg --with-libtiff --with-gnomeprint Optional: The MUon Data package, known as MUD, is for storing and retrieving muSR data. See http://musr.org/mud for information on downloading and installing. If you have no idea what muSR is, you probably don't need it. The MUD package comes with various Makefiles for the supported architectures. The Minuit minimization package "finds the minimum value of a multi-parameter function". Extrema uses Minuit as an alternate fitting package, or to minimize a chi-square expression directly, via the MINUIT command. See http://seal.web.cern.ch/seal/snapshot/work-packages/mathlibs/minuit/ for information on downloading and istalling. Minuit is installed with the standard configure/make tools. To configure Minuit, I used: $ ./configure --enable-static --disable-shared Building ======== Untar the distribution: $ tar zxf extrema-x.y.z.tar.gz which will create a directory named extrema-x.y.z. $ cd extrema-x.y.z Then type the command: $ ./reconf Then, if you have the MUD and MINUIT optional packages: $ ./configure --with-wxGTK= --with-MUD= --with-MINUIT= If you do not have the optional packages: $ ./configure --with-wxGTK= or if wx-config is located in your PATH, it is no longer necessary to mention it specifically, so just enter: $ ./configure One configure option to consider is --prefix=DIR, which specifies the location where the program and associated files will be installed. By default, the prefix directory is /usr/local, so the extrema executable will be placed in /usr/local/bin and the help and image files will be placed in /usr/local/share/extrema. You can specify a different location via the --prefix=DIR configure option, e.g., $ ./configure --prefix=/usr which will cause the extrema executable to be installed in /usr/bin, and the help and image files in /usr/share/extrema. To compile and link the program, type $ make To install the program, type $ sudo make install then to run extrema, type $ extrema NOTE: If you do not have root privilege, or just do not want to install extrema, you should create an environment variable pointing to the location of the extrema Help folder, e.g., $ export EXTREMA_DIR=~/extrema-x.y.z and to run extrema, type $ $EXTREMA_DIR/src/extrema Basic Installation ================== These are generic installation instructions. 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 only 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. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. 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=c89 CFLAGS=-O2 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 must use a version of `make' that supports the `VPATH' variable, such as 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 `..'. If you have to use a `make' that does not support the `VPATH' variable, you have 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' will install the package's files in `/usr/local/bin', `/usr/local/man', 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 give `configure' the option `--exec-prefix=PREFIX', the package will use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will 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 `--target=TYPE' option 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 will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `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. extrema-4.4.5/Makefile.am0000644012702201742730000000351511440761416014253 0ustar spangspang# Copyright (C) 2010 Joseph L. Chuma # # This file is free software; as a special exception the author 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. EXTRA_DIST = reconf configure extrema.spec extrema.desktop extrema_icons.tar.bz2 ./fonts ./Images ./Help ./Scripts ./doc ./src/wxForms/ExColorCtrl.h ./src/wxForms/ExSpinCtrlD.h ./src/wxForms/ExSpinCtrlI.h ./src/wxForms/ExSlider.h # list immediate subdirectories only SUBDIRS = src myimagesdir = $(datadir)/extrema/Images myimages_DATA = ./Images/*.GIF ./Images/*.bmp myhelpdir = $(datadir)/extrema/Help myhelp_DATA = ./Help/extrema.hhc ./Help/extrema.hhk ./Help/extrema.hhp ./Help/*.gif ./Help/extremaMain.htm myCommandsdir = $(myhelpdir)/Commands myCommands_DATA = ./Help/Commands/*.htm ./Help/Commands/*.png ./Help/Commands/*.gif ./Help/Commands/*.jpg myBasicTasksdir = $(myhelpdir)/BasicTasks myBasicTasks_DATA = ./Help/BasicTasks/*.htm ./Help/BasicTasks/*.gif ./Help/BasicTasks/*.dat ./Help/BasicTasks/*.pcm myCharacteristicsdir = $(myhelpdir)/Characteristics myCharacteristics_DATA = ./Help/Characteristics/*.htm ./Help/Characteristics/*.png ./Help/Characteristics/*.jpg myFunctionsdir = $(myhelpdir)/Functions myFunctions_DATA = ./Help/Functions/*.htm ./Help/Functions/*.png ./Help/Functions/*.gif myIntroductiondir = $(myhelpdir)/Introduction myIntroduction_DATA = ./Help/Introduction/*.htm ./Help/Introduction/*.png myLicensedir = $(myhelpdir)/License myLicense_DATA = ./Help/License/*.htm myOperatorsdir = $(myhelpdir)/Operators myOperators_DATA = ./Help/Operators/*.htm extrema-4.4.5/config.guess0000755012702201742730000012206511274636625014551 0ustar spangspang#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-06-17' # 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., 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. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 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 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # 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 -q "$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 ;' # 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 ## for Red Hat Linux if test -f /etc/redhat-release ; then VENDOR=redhat ; else VENDOR= ; fi # 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 tupples: *-*-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 ;; *) 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 __ELF__ >/dev/null 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 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # 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 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/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; 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 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; 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 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; 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 0 ;; 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 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; 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 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # 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 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; 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 \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; 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 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; 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 0 ;; *: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 $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 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 0 ;; *:AIX:*:[45]) 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 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 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 # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 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 && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; 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 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; 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 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; 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 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR:-unknown}-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #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-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #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-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-${VENDOR:-unknown}-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-${VENDOR:-unknown}-linux-gnu exit 0 ;; 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 ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; 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-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR:-ibm}-linux-gnu exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-${VENDOR:-unknown}-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR:-pc}-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; 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 0 ;; 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 0 ;; 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 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; 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 0 ;; i*86:*:5:[78]*) 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 0 ;; 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 0 ;; 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 i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; 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 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*: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) 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 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *: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 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; 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 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *: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 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *: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 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 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"); 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 && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # 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 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; 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: extrema-4.4.5/Images/0000755012702201742730000000000011332400643013410 5ustar spangspangextrema-4.4.5/Images/square1.bmp0000644012702201742730000000376611276355716015526 0ustar spangspangBM6(C C 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/exit.GIF0000644012702201742730000000153311274636625014732 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,8 H C FPD /"dXQ!7?fqF$ER,K;extrema-4.4.5/Images/arrow22.bmp0000644012702201742730000001110611276340124015411 0ustar spangspangBMF6(<<# # 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/extrema.gif0000644012702201742730000000056311274636625015570 0ustar spangspangGIF87a22x((x((PTxx|,220I8ͻ`(di'Ɗiq9еx=s a X]QTVxxZf_TZ,ms(vR_by\h^V"QV^Xr}X`u^Cvx ˮɲGiKWǰ#ԑJ"@}qWqJu1)Ga8#q L_Ʌ6^aJ4lQg%}ދ;extrema-4.4.5/Images/leftarrow.bmp0000644012702201742730000000246611321710200016114 0ustar spangspangBM66(  &extrema-4.4.5/Images/print.GIF0000644012702201742730000000157211274636625015120 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,_@@H0!CJt8qE lp!E7JyÁS\A˗.c"(d)˕@ RK5(ѣC ƴҦ ;extrema-4.4.5/Images/star1.bmp0000644012702201742730000000376611276355716015177 0ustar spangspangBM6(  3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/fit.GIF0000644012702201742730000000154211274636625014543 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,? H r&EB p!Ŋ+Z1aF ~ĈBM\8aKU)S;extrema-4.4.5/Images/regularPolygon.bmp0000644012702201742730000000376611332400704017133 0ustar spangspangBM6(C C 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/arrow33.bmp0000644012702201742730000001110611276340124015413 0ustar spangspangBMF6(<<# # 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/removePage.GIF0000644012702201742730000000156111274636625016054 0ustar spangspangGIF89a%%%<<U&hRΒQӧ;extrema-4.4.5/Images/drawfigure.GIF0000644012702201742730000000156111274636625016121 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,VH@*L8#2PE/&X1"  aH8,$ʃ ]LyPfH*m$RȂ=g)t(LF>;extrema-4.4.5/Images/importdrawing.GIF0000644012702201742730000000155611274636625016654 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,S D0B8ŋ':XQD=rH`VLp`J O <Œ&m"xΆ5Q܉"D;extrema-4.4.5/Images/newPage.GIF0000644012702201742730000000157111274636625015351 0ustar spangspangGIF89a%%%<<tOĆ! Q#Î9fLx$ɍ$Sr%ʄ~ɜy"TRKEfʘ:e$sњRT$ȉ;extrema-4.4.5/Images/figures.bmp0000644012702201742730000000246611321700775015573 0ustar spangspangBM66(" " extrema-4.4.5/Images/uparrow.bmp0000644012702201742730000000246611321710200015606 0ustar spangspangBM66(  &extrema-4.4.5/Images/linewidth.GIF0000644012702201742730000000152711274636625015753 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,4 H(\Ȑ>q"E3^lhq#3jEIDY0 ;extrema-4.4.5/Images/3dplot.bmp0000644012702201742730000000246611321700640015323 0ustar spangspangBM66(extrema-4.4.5/Images/clear.GIF0000644012702201742730000000153411274636625015050 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,AH&<@†FP"Ŋ0Ž ?j )bŒ=LYʏ,[bqM;extrema-4.4.5/Images/stack.GIF0000644012702201742730000000155711274636625015074 0ustar spangspangGIF89a!,L  0a "TaD%&@;N$Ǎ%56rŔ Q$IbL ! rʘ ;extrema-4.4.5/Images/arrow12.bmp0000644012702201742730000001110611276340124015410 0ustar spangspangBMF6(<<# # 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/linecolors.bmp0000644012702201742730000000246611276364514016306 0ustar spangspangBM66(# # 3extrema-4.4.5/Images/constants.GIF0000644012702201742730000000152311274636625015774 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,8H:|pbEJbƁ n YPɏ/Lx2K;extrema-4.4.5/Images/downarrow.bmp0000644012702201742730000000246611321710200016131 0ustar spangspangBM66(  &extrema-4.4.5/Images/arrow21.bmp0000644012702201742730000001110611276340124015410 0ustar spangspangBMF6(<<# # 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fextrema-4.4.5/Images/fillcolors.bmp0000644012702201742730000000246611276364514016305 0ustar spangspangBM66(3 3 3extrema-4.4.5/Images/leftArrow.GIF0000644012702201742730000000153611274636625015731 0ustar spangspangGIF89a!,;H*\hE'ZhPĉ/`ǂ >`Ȑ4)e([D2f́4edxL0RLXѣH];extrema-4.4.5/Images/fillcolor.GIF0000644012702201742730000000157211274636625015751 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,W H@&"4xÇLcD*lǏ-"NG5*0 IIL3E2gM2䩳ʅ*;extrema-4.4.5/Images/generate.GIF0000644012702201742730000000160011274636625015546 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,eD p  ,aÇ|0"C1a ?yგK<eJ+_2ȓ#C !Ϟ?MhQH-TѝC,:դU;extrema-4.4.5/Images/executeClearList.GIF0000644012702201742730000000160311274636625017224 0ustar spangspangGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,` `0!A &\ZT~0j0bD()῅(ظ$J#9r͙ O, J&_9ѧ͖= /S=;extrema-4.4.5/Images/rectangle.bmp0000644012702201742730000000376611332400742016070 0ustar spangspangBM6(S S 3f333f3333f3ffffff3f3f3f333f333333333f333333333f33ff3f3f3f3f333f3333333f3333333f3333f3fffffff33f3ff3f3f3f3ff3ffffffffffff3fffffff3fffffff3ffffff3f̙333f33̙33f3ffff̙ff3f̙3f̙3f̙3f333f3333f3ffffff̙3̙f̙̙̙̙3f3f3f333f3333f3ffffff3f3f3fCCCCCCCCCCCextrema-4.4.5/Makefile.in0000644012702201742730000010232211440762626014264 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2010 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS THANKS config.guess config.sub depcomp \ install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.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_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(myBasicTasksdir)" \ "$(DESTDIR)$(myCharacteristicsdir)" \ "$(DESTDIR)$(myCommandsdir)" "$(DESTDIR)$(myFunctionsdir)" \ "$(DESTDIR)$(myIntroductiondir)" "$(DESTDIR)$(myLicensedir)" \ "$(DESTDIR)$(myOperatorsdir)" "$(DESTDIR)$(myhelpdir)" \ "$(DESTDIR)$(myimagesdir)" DATA = $(myBasicTasks_DATA) $(myCharacteristics_DATA) \ $(myCommands_DATA) $(myFunctions_DATA) $(myIntroduction_DATA) \ $(myLicense_DATA) $(myOperators_DATA) $(myhelp_DATA) \ $(myimages_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(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 distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ EXTRA_DIST = reconf configure extrema.spec extrema.desktop extrema_icons.tar.bz2 ./fonts ./Images ./Help ./Scripts ./doc ./src/wxForms/ExColorCtrl.h ./src/wxForms/ExSpinCtrlD.h ./src/wxForms/ExSpinCtrlI.h ./src/wxForms/ExSlider.h # list immediate subdirectories only SUBDIRS = src myimagesdir = $(datadir)/extrema/Images myimages_DATA = ./Images/*.GIF ./Images/*.bmp myhelpdir = $(datadir)/extrema/Help myhelp_DATA = ./Help/extrema.hhc ./Help/extrema.hhk ./Help/extrema.hhp ./Help/*.gif ./Help/extremaMain.htm myCommandsdir = $(myhelpdir)/Commands myCommands_DATA = ./Help/Commands/*.htm ./Help/Commands/*.png ./Help/Commands/*.gif ./Help/Commands/*.jpg myBasicTasksdir = $(myhelpdir)/BasicTasks myBasicTasks_DATA = ./Help/BasicTasks/*.htm ./Help/BasicTasks/*.gif ./Help/BasicTasks/*.dat ./Help/BasicTasks/*.pcm myCharacteristicsdir = $(myhelpdir)/Characteristics myCharacteristics_DATA = ./Help/Characteristics/*.htm ./Help/Characteristics/*.png ./Help/Characteristics/*.jpg myFunctionsdir = $(myhelpdir)/Functions myFunctions_DATA = ./Help/Functions/*.htm ./Help/Functions/*.png ./Help/Functions/*.gif myIntroductiondir = $(myhelpdir)/Introduction myIntroduction_DATA = ./Help/Introduction/*.htm ./Help/Introduction/*.png myLicensedir = $(myhelpdir)/License myLicense_DATA = ./Help/License/*.htm myOperatorsdir = $(myhelpdir)/Operators myOperators_DATA = ./Help/Operators/*.htm all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-myBasicTasksDATA: $(myBasicTasks_DATA) @$(NORMAL_INSTALL) test -z "$(myBasicTasksdir)" || $(MKDIR_P) "$(DESTDIR)$(myBasicTasksdir)" @list='$(myBasicTasks_DATA)'; test -n "$(myBasicTasksdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myBasicTasksdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myBasicTasksdir)" || exit $$?; \ done uninstall-myBasicTasksDATA: @$(NORMAL_UNINSTALL) @list='$(myBasicTasks_DATA)'; test -n "$(myBasicTasksdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myBasicTasksdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myBasicTasksdir)" && rm -f $$files install-myCharacteristicsDATA: $(myCharacteristics_DATA) @$(NORMAL_INSTALL) test -z "$(myCharacteristicsdir)" || $(MKDIR_P) "$(DESTDIR)$(myCharacteristicsdir)" @list='$(myCharacteristics_DATA)'; test -n "$(myCharacteristicsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myCharacteristicsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myCharacteristicsdir)" || exit $$?; \ done uninstall-myCharacteristicsDATA: @$(NORMAL_UNINSTALL) @list='$(myCharacteristics_DATA)'; test -n "$(myCharacteristicsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myCharacteristicsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myCharacteristicsdir)" && rm -f $$files install-myCommandsDATA: $(myCommands_DATA) @$(NORMAL_INSTALL) test -z "$(myCommandsdir)" || $(MKDIR_P) "$(DESTDIR)$(myCommandsdir)" @list='$(myCommands_DATA)'; test -n "$(myCommandsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myCommandsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myCommandsdir)" || exit $$?; \ done uninstall-myCommandsDATA: @$(NORMAL_UNINSTALL) @list='$(myCommands_DATA)'; test -n "$(myCommandsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myCommandsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myCommandsdir)" && rm -f $$files install-myFunctionsDATA: $(myFunctions_DATA) @$(NORMAL_INSTALL) test -z "$(myFunctionsdir)" || $(MKDIR_P) "$(DESTDIR)$(myFunctionsdir)" @list='$(myFunctions_DATA)'; test -n "$(myFunctionsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myFunctionsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myFunctionsdir)" || exit $$?; \ done uninstall-myFunctionsDATA: @$(NORMAL_UNINSTALL) @list='$(myFunctions_DATA)'; test -n "$(myFunctionsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myFunctionsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myFunctionsdir)" && rm -f $$files install-myIntroductionDATA: $(myIntroduction_DATA) @$(NORMAL_INSTALL) test -z "$(myIntroductiondir)" || $(MKDIR_P) "$(DESTDIR)$(myIntroductiondir)" @list='$(myIntroduction_DATA)'; test -n "$(myIntroductiondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myIntroductiondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myIntroductiondir)" || exit $$?; \ done uninstall-myIntroductionDATA: @$(NORMAL_UNINSTALL) @list='$(myIntroduction_DATA)'; test -n "$(myIntroductiondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myIntroductiondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myIntroductiondir)" && rm -f $$files install-myLicenseDATA: $(myLicense_DATA) @$(NORMAL_INSTALL) test -z "$(myLicensedir)" || $(MKDIR_P) "$(DESTDIR)$(myLicensedir)" @list='$(myLicense_DATA)'; test -n "$(myLicensedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myLicensedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myLicensedir)" || exit $$?; \ done uninstall-myLicenseDATA: @$(NORMAL_UNINSTALL) @list='$(myLicense_DATA)'; test -n "$(myLicensedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myLicensedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myLicensedir)" && rm -f $$files install-myOperatorsDATA: $(myOperators_DATA) @$(NORMAL_INSTALL) test -z "$(myOperatorsdir)" || $(MKDIR_P) "$(DESTDIR)$(myOperatorsdir)" @list='$(myOperators_DATA)'; test -n "$(myOperatorsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myOperatorsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myOperatorsdir)" || exit $$?; \ done uninstall-myOperatorsDATA: @$(NORMAL_UNINSTALL) @list='$(myOperators_DATA)'; test -n "$(myOperatorsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myOperatorsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myOperatorsdir)" && rm -f $$files install-myhelpDATA: $(myhelp_DATA) @$(NORMAL_INSTALL) test -z "$(myhelpdir)" || $(MKDIR_P) "$(DESTDIR)$(myhelpdir)" @list='$(myhelp_DATA)'; test -n "$(myhelpdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myhelpdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myhelpdir)" || exit $$?; \ done uninstall-myhelpDATA: @$(NORMAL_UNINSTALL) @list='$(myhelp_DATA)'; test -n "$(myhelpdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myhelpdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myhelpdir)" && rm -f $$files install-myimagesDATA: $(myimages_DATA) @$(NORMAL_INSTALL) test -z "$(myimagesdir)" || $(MKDIR_P) "$(DESTDIR)$(myimagesdir)" @list='$(myimages_DATA)'; test -n "$(myimagesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(myimagesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(myimagesdir)" || exit $$?; \ done uninstall-myimagesDATA: @$(NORMAL_UNINSTALL) @list='$(myimages_DATA)'; test -n "$(myimagesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(myimagesdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(myimagesdir)" && rm -f $$files # 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. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 -777 -exec chmod a+rwx {} \; -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__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__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) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(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) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(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 --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(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__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: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { 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 $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(myBasicTasksdir)" "$(DESTDIR)$(myCharacteristicsdir)" "$(DESTDIR)$(myCommandsdir)" "$(DESTDIR)$(myFunctionsdir)" "$(DESTDIR)$(myIntroductiondir)" "$(DESTDIR)$(myLicensedir)" "$(DESTDIR)$(myOperatorsdir)" "$(DESTDIR)$(myhelpdir)" "$(DESTDIR)$(myimagesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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 clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-myBasicTasksDATA \ install-myCharacteristicsDATA install-myCommandsDATA \ install-myFunctionsDATA install-myIntroductionDATA \ install-myLicenseDATA install-myOperatorsDATA \ install-myhelpDATA install-myimagesDATA 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 mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-myBasicTasksDATA \ uninstall-myCharacteristicsDATA uninstall-myCommandsDATA \ uninstall-myFunctionsDATA uninstall-myIntroductionDATA \ uninstall-myLicenseDATA uninstall-myOperatorsDATA \ uninstall-myhelpDATA uninstall-myimagesDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-libtool \ 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-myBasicTasksDATA install-myCharacteristicsDATA \ install-myCommandsDATA install-myFunctionsDATA \ install-myIntroductionDATA install-myLicenseDATA \ install-myOperatorsDATA install-myhelpDATA \ install-myimagesDATA 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 \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-myBasicTasksDATA \ uninstall-myCharacteristicsDATA uninstall-myCommandsDATA \ uninstall-myFunctionsDATA uninstall-myIntroductionDATA \ uninstall-myLicenseDATA uninstall-myOperatorsDATA \ uninstall-myhelpDATA uninstall-myimagesDATA # 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: extrema-4.4.5/NEWS0000644012702201742730000000344411274636625012727 0ustar spangspangEXTREMA -- History of visible changes. Copyright (C) 2006, 2007 Joseph L. Chuma See the end for copying conditions. Please send extrema bug reports to chuma@triumf.ca. Version 4.1.3 ------------- Bug fixes: * "make install" did not copy the image directory (for buttons) or the help file directory (for online help) to the proper location. These directories have new names, extremaImages/ and extremaHelp/, and should now be copied to the $(prefix)/share directory on a make install, where $(prefix) is the directory mentioned with the configure command, which defaults to /usr/local. * It seems the latest compilers do not like unnecessary class qualifiers in header files. This required modifying src/Commands/CMD_density.h, src/Commands/Command.h, src/Functions/ScalarFunction.h, and src/Graphics/GRA_window.h Thanks to S. Umar for finding this and suggesting the simple fix. * The optional grid lines (controlled by characteristics YGRID and XGRID) were being drawn in the color of the last text string drawn. This has now been fixed, and they are drawn using the corresponding axis color (YAXISCOLOR or XAXISCOLOR). ---------------------------------------------------------------------------------------------------- Copying information: Copyright (C) 2006, 2007 Joseph L. Chuma Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. extrema-4.4.5/src/0000755012702201742730000000000011440766112013000 5ustar spangspangextrema-4.4.5/src/Graphics/0000755012702201742730000000000011440766117014545 5ustar spangspangextrema-4.4.5/src/Graphics/GRA_distanceCharacteristic.cpp0000644012702201742730000000574111274636605022417 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_distanceCharacteristic.h" double GRA_distanceCharacteristic::GetAsPercent() const { double result; setAsPercent_ ? result=value_ : result=(value_-min_)/(max_-min_)*100.0; return std::min(100.0,std::max(0.0,result)); } std::vector GRA_distanceCharacteristic::GetAsPercents() const { std::vector results; std::vector::const_iterator end = values_.end(); for( std::vector::const_iterator i=values_.begin(); i!=end; ++i ) { double result; setAsPercent_ ? result=(*i) : result=((*i)-min_)/(max_-min_)*100.0; results.push_back(std::min(100.0,std::max(0.0,result))); } return results; } double GRA_distanceCharacteristic::GetAsWorld() const { double result; setAsPercent_ ? result=min_+value_*(max_-min_)/100.0 : result=value_; return std::min(max_,std::max(min_,result)); } std::vector GRA_distanceCharacteristic::GetAsWorlds() const { std::vector results; std::vector::const_iterator end = values_.end(); for( std::vector::const_iterator i=values_.begin(); i!=end; ++i ) { double result; setAsPercent_ ? result=min_+(*i)*(max_-min_)/100.0 : result=(*i); results.push_back(std::min(max_,std::max(min_,result))); } return results; } std::ostream &operator<<( std::ostream &out, GRA_distanceCharacteristic const &c ) { if( c.isAVector_ ) { std::vector values( c.GetAsPercents() ); std::size_t size = values.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_distanceCharacteristic::CopyStuff( GRA_distanceCharacteristic const &rhs ) { min_ = rhs.min_; max_ = rhs.max_; value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); setAsPercent_ = rhs.setAsPercent_; } // end of file extrema-4.4.5/src/Graphics/GRA_characteristic.h0000644012702201742730000000421511274636605020404 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_CHARACTERISTIC #define GRA_CHARACTERISTIC #include #include "wx/wx.h" class GRA_characteristic { protected: enum Type { SIZE, DISTANCE, INT, DOUBLE, BOOL, ANGLE, FONT, COLOR, STRING }; public: GRA_characteristic( wxString const &name, Type type, bool isAVector ) : name_(name), type_(type), isAVector_(isAVector) {} GRA_characteristic() {} virtual ~GRA_characteristic() {} GRA_characteristic( GRA_characteristic const &rhs ) { CopyStuff( rhs ); } GRA_characteristic &operator=( GRA_characteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } bool IsSize() const { return (type_ == SIZE); } bool IsDistance() const { return (type_ == DISTANCE); } bool IsInt() const { return (type_ == INT); } bool IsDouble() const { return (type_ == DOUBLE); } bool IsBool() const { return (type_ == BOOL); } bool IsAngle() const { return (type_ == ANGLE); } bool IsFont() const { return (type_ == FONT); } bool IsColor() const { return (type_ == COLOR); } bool IsString() const { return (type_ == STRING); } wxString GetName() const { return name_; } bool IsVector() const { return isAVector_; } protected: void CopyStuff( GRA_characteristic const &rhs ) { name_ = rhs.name_; type_ = rhs.type_; isAVector_ = rhs.isAVector_; } wxString name_; Type type_; bool isAVector_; }; #endif extrema-4.4.5/src/Graphics/GRA_multiLineFigure.h0000644012702201742730000000421511332173311020501 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #ifndef GRA_MULTILINEFIGURE #define GRA_MULTILINEFIGURE #include #include #include "wx/wx.h" #include "GRA_shape.h" class GRA_color; class GRA_wxWidgets; class GRA_multiLineFigure : public GRA_shape { protected: enum MultiType { UNKNOWN, ARROW3 }; public: GRA_multiLineFigure() : GRA_shape(0,0,0,1,wxT("MULTILINEFIGURE")) {} GRA_multiLineFigure( std::vector const &, std::vector const &, std::vector const &, GRA_color * =0, int =1, int =1 ); ~GRA_multiLineFigure() {} GRA_multiLineFigure( GRA_multiLineFigure const &rhs ) : GRA_shape(rhs) { CopyStuff(rhs); } GRA_multiLineFigure &operator=( GRA_multiLineFigure const &rhs ) { if( this != &rhs ) { GRA_shape::CopyStuff(rhs); CopyStuff(rhs); } return *this; } void GetCoordinates( std::vector &x, std::vector &y, std::vector &pen ) { x.assign( x_.begin(), x_.end() ); y.assign( y_.begin(), y_.end() ); pen.assign( pen_.begin(), pen_.end() ); } void Draw( GRA_wxWidgets *, wxDC & ); bool IsaArrow3() const { return (type_ == ARROW3); } void SetArrow3() { type_ = ARROW3; } friend std::ostream &operator<<( std::ostream &, GRA_multiLineFigure const & ); protected: void CopyStuff( GRA_multiLineFigure const & ); // std::vector x_, y_; std::vector pen_; MultiType type_; }; #endif extrema-4.4.5/src/Graphics/GRA_stringCharacteristic.h0000644012702201742730000000422411274636605021573 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_STRINGCHARACTERISTIC #define GRA_STRINGCHARACTERISTIC #include #include #include "wx/wx.h" #include "GRA_characteristic.h" class GRA_stringCharacteristic : public GRA_characteristic { public: GRA_stringCharacteristic( wxChar const *name, wxString const &value ) : GRA_characteristic(name,STRING,false), value_(value), default_(value) {} GRA_stringCharacteristic( wxChar const *name, std::vector const &values ) : GRA_characteristic(name,STRING,true) { values_.assign( values.begin(), values.end() ); } ~GRA_stringCharacteristic() {} GRA_stringCharacteristic( GRA_stringCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_stringCharacteristic &operator=( GRA_stringCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void Set( wxString const &value ) { value_ = value; isAVector_ = false; } void Set( std::vector const &values ) { values_.assign( values.begin(), values.end() ); isAVector_ = true; } wxString Get() const { return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_stringCharacteristic const & ); private: void CopyStuff( GRA_stringCharacteristic const & ); static wxString Encode( wxString const & ); // wxString value_, default_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_cartesianAxes.cpp0000644012702201742730000010067611274636605020551 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "GRA_cartesianAxes.h" #include "EGraphicsError.h" #include "GRA_axis.h" #include "GRA_window.h" #include "GRA_wxWidgets.h" #include "GRA_distanceCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "GRA_drawableText.h" GRA_cartesianAxes::GRA_cartesianAxes( std::vector const &x, std::vector const &y, bool xOnTop, bool yOnRight ) : GRA_drawableObject(wxT("CARTESIANAXES")), xOnTop_(xOnTop), yOnRight_(yOnRight) { try { AutoScale( x, y ); } catch ( EGraphicsError &e ) { throw; } // GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); // gridLineType_ = static_cast(generalC->Get(wxT("GRIDLINETYPE")))->Get(); // double xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); bool graphBox = static_cast(generalC->Get(wxT("GRAPHBOX")))->Get(); double const xlength = xuaxis - xlaxis; double const ylength = yuaxis - ylaxis; // GRA_setOfCharacteristics xCharacteristics( *xAxisC ); GRA_setOfCharacteristics yCharacteristics( *yAxisC ); // boxXAxis_ = 0; boxYAxis_ = 0; if( graphBox ) { GRA_setOfCharacteristics boxSettings( xCharacteristics ); static_cast(boxSettings.Get(wxT("GRID")))->Set(0); static_cast(boxSettings.Get(wxT("LABELON")))->Set(false); static_cast(boxSettings.Get(wxT("NUMBERSON")))->Set(false); // if( xOnTop )boxXAxis_ = new GRA_axis( xlaxis, ylaxis, xlength, &boxSettings ); else { double angle = static_cast(xAxisC->Get(wxT("TICANGLE")))->Get(); static_cast(boxSettings.Get(wxT("TICANGLE")))->Set(-angle); boxXAxis_ = new GRA_axis( xlaxis, yuaxis, xlength, &boxSettings ); } boxSettings = yCharacteristics; static_cast(boxSettings.Get(wxT("GRID")))->Set(0); static_cast(boxSettings.Get(wxT("LABELON")))->Set(false); static_cast(boxSettings.Get(wxT("NUMBERSON")))->Set(false); if( yOnRight )boxYAxis_ = new GRA_axis( xlaxis, ylaxis, ylength, &boxSettings ); else { double angle = static_cast(yAxisC->Get(wxT("TICANGLE")))->Get(); static_cast(boxSettings.Get(wxT("TICANGLE")))->Set(-angle); boxYAxis_ = new GRA_axis( xuaxis, ylaxis, ylength, &boxSettings ); } } if( yOnRight ) { double ytica = static_cast(yCharacteristics.Get(wxT("TICANGLE")))->Get(); double yitica = static_cast(yCharacteristics.Get(wxT("IMAGTICANGLE")))->Get(); static_cast(yCharacteristics.Get(wxT("TICANGLE")))->Set(-ytica); static_cast(yCharacteristics.Get(wxT("IMAGTICANGLE")))->Set(-yitica); yAxis_ = new GRA_axis( xuaxis, ylaxis, ylength, &yCharacteristics ); } else { yAxis_ = new GRA_axis( xlaxis, ylaxis, ylength, &yCharacteristics ); } if( xOnTop ) { double xtica = static_cast(xCharacteristics.Get(wxT("TICANGLE")))->Get(); double xitica = static_cast(xCharacteristics.Get(wxT("IMAGTICANGLE")))->Get(); static_cast(xCharacteristics.Get(wxT("TICANGLE")))->Set(-xtica); static_cast(xCharacteristics.Get(wxT("IMAGTICANGLE")))->Set(-xitica); xAxis_ = new GRA_axis( xlaxis, yuaxis, xlength, &xCharacteristics ); } else { xAxis_ = new GRA_axis( xlaxis, ylaxis, xlength, &xCharacteristics ); } } void GRA_cartesianAxes::DeleteStuff() { delete xAxis_; xAxis_=0; delete yAxis_; yAxis_=0; delete boxXAxis_; boxXAxis_=0; delete boxYAxis_; boxYAxis_=0; } void GRA_cartesianAxes::CopyStuff( GRA_cartesianAxes const &rhs ) { gridLineType_ = rhs.gridLineType_; xOnTop_ = rhs.xOnTop_; yOnRight_ = rhs.yOnRight_; // if( rhs.xAxis_ )xAxis_ = new GRA_axis( *rhs.xAxis_ ); if( rhs.yAxis_ )yAxis_ = new GRA_axis( *rhs.yAxis_ ); if( rhs.boxXAxis_ )boxXAxis_ = new GRA_axis( *rhs.boxXAxis_ ); if( rhs.boxYAxis_ )boxYAxis_ = new GRA_axis( *rhs.boxYAxis_ ); } void GRA_cartesianAxes::Make() { xAxis_->Make(); yAxis_->Make(); if( boxXAxis_ )boxXAxis_->Make(); if( boxYAxis_ )boxYAxis_->Make(); } void GRA_cartesianAxes::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { xAxis_->Draw( graphicsOutput, dc ); DrawXLabel( graphicsOutput, dc ); yAxis_->Draw( graphicsOutput, dc ); DrawYLabel( graphicsOutput, dc ); if( boxXAxis_ )boxXAxis_->Draw( graphicsOutput, dc ); if( boxYAxis_ )boxYAxis_->Draw( graphicsOutput, dc ); // // draw the x-axis grid lines // if xgrid is zero, no tic coordinates are recorded, so no grid lines will be drawn // GRA_setOfCharacteristics *xAxisC = xAxis_->GetCharacteristics(); std::vector ticX, ticY; xAxis_->GetTicCoordinates( ticX, ticY ); std::size_t size = ticX.size(); double const eps = 0.001; // int lineTypeSave = graphicsOutput->GetLineType(); graphicsOutput->SetLineType( gridLineType_ ); wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor( static_cast(xAxisC->Get(wxT("AXISCOLOR")))->Get()) ); // double xlaxis, ylaxis, xuaxis, yuaxis; xAxis_->GetOrigin( xlaxis, ylaxis ); xAxis_->GetEndPoint( xuaxis, yuaxis ); int ngrid = abs(xAxis_->GetGrid()); for( std::size_t i=0; ieps && fabs(x-xlaxis)>eps ) // don't draw on top of y-axis { graphicsOutput->StartLine( x, y ); graphicsOutput->ContinueLine( x, y+(yuaxis-ylaxis), dc ); } } // draw the y-axis grid lines // if ygrid is zero, no tic coordinates are recorded, so no grid lines will be drawn // GRA_setOfCharacteristics *yAxisC = yAxis_->GetCharacteristics(); yAxis_->GetTicCoordinates( ticX, ticY ); size = ticX.size(); // wxpen.SetColour( ExGlobals::GetwxColor( static_cast(yAxisC->Get(wxT("AXISCOLOR")))->Get()) ); // ngrid = abs(yAxis_->GetGrid()); for( std::size_t i=0; ieps && fabs(y-ylaxis)>eps ) { graphicsOutput->StartLine( x, y ); graphicsOutput->ContinueLine( x+(xuaxis-xlaxis), y, dc ); } } graphicsOutput->SetLineType( lineTypeSave ); } void GRA_cartesianAxes::DrawXLabel( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_setOfCharacteristics *xAxisC = xAxis_->GetCharacteristics(); // wxString label; bool labelIsOn = static_cast(xAxisC->Get(wxT("LABELON")))->Get(); if( labelIsOn )label = static_cast(xAxisC->Get(wxT("LABEL")))->Get(); if( label.empty() )labelIsOn = false; double power = static_cast(xAxisC->Get(wxT("POWER")))->Get(); if( static_cast(xAxisC->Get(wxT("LOGBASE")))->Get()<=1.0 && power != 0.0 && static_cast(xAxisC->Get(wxT("POWERAUTO")))->Get()!=2 && static_cast(xAxisC->Get(wxT("NUMBERSON")))->Get() ) { wxString powLabel(wxT("(x10<^>")); powLabel << power << wxT("<_>)"); label.empty() ? label=powLabel : label << wxT(" ") << powLabel; labelIsOn = true; } // // the axis label is composed of two parts: // a) the string found in the label // b) the factor by which all the numbers // labelling the axis should be multiplied to get the graph axis units // // if powerAuto_ = 2, calculate the power but do not draw it // if( labelIsOn ) { double sizlab = static_cast(xAxisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); double imagTicAngle = static_cast(xAxisC->Get(wxT("IMAGTICANGLE")))->Get(); double imagTicLen = static_cast(xAxisC->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); double numHeight = static_cast(xAxisC->Get(wxT("NUMBERSHEIGHT")))->GetAsWorld(); GRA_font *labelFont = static_cast(xAxisC->Get(wxT("LABELFONT")))->Get(); GRA_color *labelColor = static_cast(xAxisC->Get(wxT("LABELCOLOR")))->Get(); double x1, y1, angle=0.0; int align = 2; double xOrigin, yOrigin; xAxis_->GetOrigin( xOrigin, yOrigin ); // // draw the label horizontally and centered on the x-axis x1 = xOrigin + 0.5*xAxis_->GetLength(); if( imagTicAngle > 180.0 ) { align = 8; // 8=top centre y1 = yOrigin - 1.10*(imagTicLen+numHeight); } else { align = 2; // 2=bottom centre y1 = yOrigin + 1.10*(imagTicLen+numHeight); } GRA_drawableText *dt = new GRA_drawableText(label,sizlab,angle,x1,y1,align,labelFont,labelColor); try { dt->Parse(); } catch ( EGraphicsError const &e ) { delete dt; throw; } dt->Draw( graphicsOutput, dc ); } } void GRA_cartesianAxes::DrawYLabel( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_setOfCharacteristics *xAxisC = xAxis_->GetCharacteristics(); GRA_setOfCharacteristics *yAxisC = yAxis_->GetCharacteristics(); // wxString label; bool labelIsOn = static_cast(yAxisC->Get(wxT("LABELON")))->Get(); if( labelIsOn )label = static_cast(yAxisC->Get(wxT("LABEL")))->Get(); if( label.empty() )labelIsOn = false; double power = static_cast(yAxisC->Get(wxT("POWER")))->Get(); if( static_cast(yAxisC->Get(wxT("LOGBASE")))->Get()<=1.0 && power != 0.0 && static_cast(yAxisC->Get(wxT("POWERAUTO")))->Get()!=2 && static_cast(yAxisC->Get(wxT("NUMBERSON")))->Get() ) { wxString powLabel(wxT("(x10<^>")); powLabel << power << wxT("<_>)"); label.empty() ? label=powLabel : label << wxT(" ") << powLabel; labelIsOn = true; } // // the axis label is composed of two parts: // a) the string found in the label // b) the factor by which all the numbers // labelling the axis should be multiplied to get the graph axis units // // if powerAuto_ = 2, calculate the power but do not draw it // if( labelIsOn ) { double sizlab = static_cast(yAxisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); double imagTicAngle = static_cast(yAxisC->Get(wxT("IMAGTICANGLE")))->Get(); double imagTicLen = static_cast(yAxisC->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); GRA_font *labelFont = static_cast(yAxisC->Get(wxT("LABELFONT")))->Get(); GRA_color *labelColor = static_cast(yAxisC->Get(wxT("LABELCOLOR")))->Get(); double x1, y1, angle=0.0; int align = 2; double xOrigin, yOrigin; yAxis_->GetOrigin( xOrigin, yOrigin ); // // draw the label vertically and centered on the y-axis // y1 = yOrigin + 0.5*yAxis_->GetLength(); double numWidth = yAxis_->GetMaxWidth(); if( imagTicAngle > 180.0 ) { x1 = xOrigin + 1.05*(imagTicLen+numWidth); angle = 270.0; } else { x1 = xOrigin - 1.05*(imagTicLen+numWidth); angle = 90.0; } GRA_drawableText *dt = new GRA_drawableText(label,sizlab,angle,x1,y1,align,labelFont,labelColor); try { dt->Parse(); } catch ( EGraphicsError const &e ) { delete dt; throw; } dt->Draw( graphicsOutput, dc ); } } void GRA_cartesianAxes::AutoScale( std::vector const &x, std::vector const &y ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); wxString autoScale( static_cast(generalC->Get(wxT("AUTOSCALE")))->Get() ); GRA_setOfCharacteristics *xCharacteristics = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yCharacteristics = gw->GetYAxisCharacteristics(); int autoX, autoY; if( autoScale == wxT("OFF") ) { autoX = 0; autoY = 0; } else if( autoScale == wxT("ON") ) { autoX = 2; autoY = 2; static_cast(xCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(xCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); static_cast(yCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(yCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); } else if( autoScale == wxT("X") ) { autoX = 2; autoY = 0; static_cast(xCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(xCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); } else if( autoScale == wxT("Y") ) { autoX = 0; autoY = 2; static_cast(yCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(yCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); } else if( autoScale == wxT("VIRTUAL") ) { autoX = 3; autoY = 3; static_cast(xCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(xCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); static_cast(yCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(yCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); } else if( autoScale == wxT("XVIRTUAL") ) { autoX = 3; autoY = 0; static_cast(xCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(xCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); } else if( autoScale == wxT("YVIRTUAL") ) { autoX = 0; autoY = 3; static_cast(yCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(yCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set(-1); } else if( autoScale == wxT("COMMENSURATE") ) { double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))-> GetAsWorld(); double ylwind = static_cast(generalC->Get(wxT("YLOWERWINDOW")))-> GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))-> GetAsWorld(); double yuwind = static_cast(generalC->Get(wxT("YUPPERWINDOW")))-> GetAsWorld(); autoX = 0; autoY = 0; // double delxwind = fabs(xuwind - xlwind); double delywind = fabs(yuwind - ylwind); // double xlaxis = 0.15 * delxwind + xlwind; double xuaxis = 0.90 * delxwind + xlwind; double ylaxis = 0.15 * delywind + ylwind; double yuaxis = 0.90 * delywind + ylwind; double xmid = 0.5 * (xlwind + xuwind); double ymid = 0.5 * (ylwind + yuwind); // double xmins, xmaxs, ymins, ymaxs; UsefulFunctions::MinMax( x, 0, x.size(), xmins, xmaxs ); UsefulFunctions::MinMax( y, 0, y.size(), ymins, ymaxs ); // double xmin, xmax, xinc, ymin, ymax, yinc; try { UsefulFunctions::Scale1( xmin, xmax, xinc, 5, xmins, xmaxs ); UsefulFunctions::Scale1( ymin, ymax, yinc, 5, ymins, ymaxs ); } catch ( std::runtime_error &e ) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } double xd = xmax - xmin; double yd = ymax - ymin; int nlxinc = static_cast( xd/xinc + 0.5 ); int nlyinc = static_cast( yd/yinc + 0.5 ); // double delx, dely; if( xd >= yd ) { delx = xuaxis - xlaxis; dely = delx * yd / xd; ylaxis = ymid - 0.5*dely; yuaxis = ymid + 0.5*dely; } else { dely = yuaxis - ylaxis; delx = dely * xd / yd; xlaxis = xmid - 0.5*delx; xuaxis = xmid + 0.5*delx; } if( (ylaxis-ylwind)/delywind < 0.15 ) { dely = 0.15*delywind + ylwind - ylaxis; ylaxis = 0.15*delywind + ylwind; yuaxis = yuaxis - dely; xlaxis = xlaxis + dely; xuaxis = xuaxis - dely; } else if( (xlaxis-xlwind)/delxwind < 0.15 ) { delx = 0.15*delxwind + xlwind - xlaxis; xlaxis = 0.15*delxwind + xlwind; xuaxis = xuaxis - delx; ylaxis = ylaxis + delx; yuaxis = yuaxis - delx; } double xlp = (xlaxis-xlwind)/delxwind*100.; double xup = (xuaxis-xlwind)/delxwind*100.; double ylp = (ylaxis-ylwind)/delywind*100.; double yup = (yuaxis-ylwind)/delywind*100.; // static_cast(xCharacteristics->Get(wxT("LOWERAXIS")))->SetAsPercent( xlp ); static_cast(xCharacteristics->Get(wxT("UPPERAXIS")))->SetAsPercent( xup ); static_cast(xCharacteristics->Get(wxT("MAX")))->Set( xmax ); static_cast(xCharacteristics->Get(wxT("MIN")))->Set( xmin ); static_cast(xCharacteristics->Get(wxT("VIRTUALMAX")))->Set( xmax ); static_cast(xCharacteristics->Get(wxT("VIRTUALMIN")))->Set( xmin ); static_cast(xCharacteristics->Get(wxT("NLINCS")))->Set( nlxinc ); static_cast(xCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set( 7 ); static_cast(xCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); // static_cast(yCharacteristics->Get(wxT("LOWERAXIS")))->SetAsPercent( ylp ); static_cast(yCharacteristics->Get(wxT("UPPERAXIS")))->SetAsPercent( yup ); static_cast(yCharacteristics->Get(wxT("MAX")))->Set( ymax ); static_cast(yCharacteristics->Get(wxT("MIN")))->Set( ymin ); static_cast(yCharacteristics->Get(wxT("VIRTUALMAX")))->Set( ymax ); static_cast(yCharacteristics->Get(wxT("VIRTUALMIN")))->Set( ymin ); static_cast(yCharacteristics->Get(wxT("NLINCS")))->Set( nlyinc ); static_cast(yCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set( 7 ); static_cast(yCharacteristics->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); // return; } int xnlinc = abs(static_cast(xCharacteristics->Get(wxT("NLINCS")))->Get()); double xmin = static_cast(xCharacteristics->Get(wxT("MIN")))->Get(); double xmax = static_cast(xCharacteristics->Get(wxT("MAX")))->Get(); double xmins = static_cast(xCharacteristics->Get(wxT("VIRTUALMIN")))->Get(); double xmaxs = static_cast(xCharacteristics->Get(wxT("VIRTUALMAX")))->Get(); bool xzeroForce = static_cast(xCharacteristics->Get(wxT("ZERO")))->Get(); double xlogBase = static_cast(xCharacteristics->Get(wxT("LOGBASE")))->Get(); bool xlogStyle = static_cast(xCharacteristics->Get(wxT("LOGSTYLE")))->Get(); bool xAxisLinear = (static_cast(xlogBase) <= 1); if( autoX==2 || autoX==3 )xnlinc = 0; if( xmin==xmax && autoX==0 )autoX = 2; bool xAxisScaleFixed = (autoX == 0); double xminValue = xmins; double xmaxValue = xmaxs; try { if( !xAxisLinear )GetActualValues( xminValue, xmaxValue, xlogBase ); } catch ( EGraphicsError &e ) { throw; } // int ynlinc = abs(static_cast(yCharacteristics->Get(wxT("NLINCS")))->Get()); double ymin = static_cast(yCharacteristics->Get(wxT("MIN")))->Get(); double ymax = static_cast(yCharacteristics->Get(wxT("MAX")))->Get(); double ymins = static_cast(yCharacteristics->Get(wxT("VIRTUALMIN")))->Get(); double ymaxs = static_cast(yCharacteristics->Get(wxT("VIRTUALMAX")))->Get(); bool yzeroForce = static_cast(yCharacteristics->Get(wxT("ZERO")))->Get(); double ylogBase = static_cast(yCharacteristics->Get(wxT("LOGBASE")))->Get(); bool ylogStyle = static_cast(yCharacteristics->Get(wxT("LOGSTYLE")))->Get(); bool yAxisLinear = (static_cast(ylogBase) <= 1); if( autoY==2 || autoY==3 )ynlinc = 0; if( ymin==ymax && autoY==0 )autoY = 2; bool yAxisScaleFixed = (autoY == 0); double yminValue = ymins; double ymaxValue = ymaxs; try { if( !yAxisLinear )GetActualValues( yminValue, ymaxValue, ylogBase ); } catch ( EGraphicsError &e ) { throw; } // std::size_t npt = x.size(); double xinc, yinc; if( xAxisScaleFixed ) { if( yAxisScaleFixed ) { try { if( xAxisLinear && xnlinc==0 ) SetNumberOfIncrements( xnlinc, xminValue, xmaxValue, xCharacteristics ); if( yAxisLinear && ynlinc==0 ) SetNumberOfIncrements( ynlinc, yminValue, ymaxValue, yCharacteristics ); } catch ( EGraphicsError &e ) { throw; } } else // x-axis is fixed, autoscale y-axis { try { if( xAxisLinear && xnlinc==0 ) SetNumberOfIncrements( xnlinc, xminValue, xmaxValue, xCharacteristics ); } catch ( EGraphicsError &e ) { throw; } // // only consider data within the x-axis range // bool pointFound = false; for( std::size_t i=0; i=xminValue && x[i]<=xmaxValue ) { pointFound = true; break; } } if( !pointFound ) // no data values within the x-axis range, cannot autoscale the y-axis { static_cast(yCharacteristics->Get(wxT("NLINCS")))->Set( 1 ); static_cast(yCharacteristics->Get(wxT("MIN")))->Set( 0.0 ); static_cast(yCharacteristics->Get(wxT("MAX")))->Set( 1.0 ); static_cast(yCharacteristics->Get(wxT("VIRTUALMIN")))->Set( 0.0 ); static_cast(yCharacteristics->Get(wxT("VIRTUALMAX")))->Set( 1.0 ); return; } yminValue = std::numeric_limits::max(); ymaxValue = -yminValue; for( std::size_t i=0; i= 0.0 ) { if( y[i] < yminValue )yminValue = y[i]; if( y[i] > ymaxValue )ymaxValue = y[i]; } } bool yVirtualMinMax = (autoY==3); FixupScales( yAxisLinear, yzeroForce, yminValue, ymaxValue, ylogBase, ynlinc, ymins, ymaxs, yinc, yCharacteristics, yVirtualMinMax ); } } else // autoscale x-axis { if( yAxisScaleFixed ) // autoscale x-axis, y-axis is fixed { try { if( yAxisLinear && ynlinc==0 ) SetNumberOfIncrements( ynlinc, yminValue, ymaxValue, yCharacteristics ); } catch ( EGraphicsError &e ) { throw; } // // only consider data within the y-axis range // bool pointFound = false; for( std::size_t i=0; i= 0.0 ) { pointFound = true; break; } } if( !pointFound ) // no data values within the y-axis range { static_cast(xCharacteristics->Get(wxT("NLINCS")))->Set( 1 ); static_cast(xCharacteristics->Get(wxT("MIN")))->Set( 0.0 ); static_cast(xCharacteristics->Get(wxT("MAX")))->Set( 1.0 ); static_cast(xCharacteristics->Get(wxT("VIRTUALMIN")))->Set( 0.0 ); static_cast(xCharacteristics->Get(wxT("VIRTUALMAX")))->Set( 1.0 ); return; } xminValue = std::numeric_limits::max(); xmaxValue = -xminValue; for( std::size_t i=0; i= 0.0 ) { if( x[i] < xminValue )xminValue = x[i]; if( x[i] > xmaxValue )xmaxValue = x[i]; } } bool xVirtualMinMax = (autoX==3); FixupScales( xAxisLinear, xzeroForce, xminValue, xmaxValue, xlogBase, xnlinc, xmins, xmaxs, xinc, xCharacteristics, xVirtualMinMax ); } else // autoscale x-axis, autoscale y-axis { UsefulFunctions::MinMax( x, 0, npt, xminValue, xmaxValue ); bool xVirtualMinMax = (autoX==3); FixupScales( xAxisLinear, xzeroForce, xminValue, xmaxValue, xlogBase, xnlinc, xmins, xmaxs, xinc, xCharacteristics, xVirtualMinMax ); UsefulFunctions::MinMax( y, 0, npt, yminValue, ymaxValue ); bool yVirtualMinMax = (autoY==3); FixupScales( yAxisLinear, yzeroForce, yminValue, ymaxValue, ylogBase, ynlinc, ymins, ymaxs, yinc, yCharacteristics, yVirtualMinMax ); } } if( !xAxisLinear && xlogStyle ) static_cast(xCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set( NumberOfDigits(xmins,xmaxs,xlogBase) ); if( !yAxisLinear && ylogStyle ) static_cast(yCharacteristics->Get(wxT("NUMBEROFDIGITS")))->Set( NumberOfDigits(ymins,ymaxs,ylogBase) ); } void GRA_cartesianAxes::GetActualValues( double &minValue, double &maxValue, double logBase ) { try { ResetLogValue( minValue, logBase ); } catch ( EGraphicsError const &e ) { throw EGraphicsError(wxT("problem with axis log scales minimum value")); } try { ResetLogValue( maxValue, logBase ); } catch ( EGraphicsError const &e ) { throw EGraphicsError(wxT("problem with axis log scales maximum value")); } } void GRA_cartesianAxes::SetNumberOfIncrements( int &nlinc, double minValue, double maxValue, GRA_setOfCharacteristics *characteristics ) { nlinc = 5; double inc, mins, maxs; try { UsefulFunctions::Scale1( mins, maxs, inc, nlinc, minValue, maxValue ); } catch ( std::runtime_error &e ) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } nlinc = static_cast( (maxs-mins)/inc + 0.5 ); static_cast(characteristics->Get(wxT("NLINCS")))->Set( nlinc ); static_cast(characteristics->Get(wxT("VIRTUALMIN")))->Set( mins ); static_cast(characteristics->Get(wxT("VIRTUALMAX")))->Set( maxs ); } int GRA_cartesianAxes::NumberOfDigits( double mins, double maxs, double logBase ) { int ndig1p = 1; if( fabs(mins) > 0.0 )ndig1p = static_cast(log10(fabs(mins)))+1; if( mins < 0.0 )++ndig1p; int ndig1b = static_cast(log10(logBase))+1; int ndig1 = ndig1p + ndig1b; int ndig2p = 1; if( fabs(maxs) > 0.0 )ndig2p = static_cast(log10(fabs(maxs)))+1; if( maxs < 0.0 )++ndig2p; int ndig2 = ndig2p + ndig1b; return std::max(ndig1,ndig2); } void GRA_cartesianAxes::ResetLogValue( double &value, double logBase ) { if( value*log(logBase) > log(std::numeric_limits::max()) ) { value = 10.; return; } try { value = exp(value*log(logBase)); } catch (...) { throw EGraphicsError(wxT(" ")); } } void GRA_cartesianAxes::FixupScales( bool linear, bool zeroForce, double minValue, double maxValue, double logBase, int &nlinc, double &mins, double &maxs, double &inc, GRA_setOfCharacteristics *characteristics, bool virtualMinMax ) { if( linear ) // axis is linear { if( minValue == 0.0 )minValue = -0.01; else minValue -= 0.01*fabs(minValue); if( maxValue == 0.0 )maxValue = 0.01; else maxValue += 0.01*fabs(maxValue); if( zeroForce ) // force zero to be displayed on a linear axis { if( minValue > 0.0 )minValue = 0.0; if( maxValue < 0.0 )maxValue = 0.0; } if( nlinc == 0 ) { nlinc = 5; try { UsefulFunctions::Scale1( mins, maxs, inc, nlinc, minValue, maxValue ); } catch ( std::runtime_error &e ) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } nlinc = static_cast( (maxs-mins)/inc + 0.5 ); static_cast(characteristics->Get(wxT("NLINCS")))->Set( nlinc ); } else { nlinc = std::max(nlinc,2); try { UsefulFunctions::Scale2( mins, maxs, inc, nlinc, minValue, maxValue ); } catch ( std::runtime_error &e) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } } } else // axis is logarithmic { if( minValue <= 0.0 )minValue = std::numeric_limits::min(); mins = log(minValue)/log(logBase); // calculate the power mins = static_cast(static_cast(mins)) - 1; if( maxValue <= 0.0 )maxValue = std::numeric_limits::min(); maxs = log(maxValue)/log(logBase); maxs = static_cast(static_cast(maxs)) + 1; if( nlinc==0 || static_cast(maxs-mins)/nlinc*nlinc!=static_cast(maxs-mins) ) { nlinc = std::max(5,nlinc); double incp, minp, maxp; try { UsefulFunctions::Scale1( minp, maxp, incp, nlinc, mins, maxs ); } catch ( std::runtime_error &e ) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } nlinc = static_cast( (maxp-minp)/incp + 0.5 ); static_cast(characteristics->Get(wxT("NLINCS")))->Set( nlinc ); mins = static_cast(static_cast(minp)); maxs = static_cast(static_cast(maxp)); } } if( virtualMinMax ) { static_cast(characteristics->Get(wxT("MIN")))->Set( minValue ); static_cast(characteristics->Get(wxT("MAX")))->Set( maxValue ); static_cast(characteristics->Get(wxT("VIRTUALMIN")))->Set( mins ); static_cast(characteristics->Get(wxT("VIRTUALMAX")))->Set( maxs ); } else { static_cast(characteristics->Get(wxT("MIN")))->Set( mins ); static_cast(characteristics->Get(wxT("MAX")))->Set( maxs ); static_cast(characteristics->Get(wxT("VIRTUALMIN")))->Set( mins ); static_cast(characteristics->Get(wxT("VIRTUALMAX")))->Set( maxs ); } } std::ostream &operator<<( std::ostream &out, GRA_cartesianAxes const &ca ) { int size = 2; if( ca.boxXAxis_ )++size; if( ca.boxYAxis_ )++size; out << "\n"; out << *ca.xAxis_ << *ca.yAxis_; if( ca.boxXAxis_ )out << *ca.boxXAxis_; if( ca.boxYAxis_ )out << *ca.boxYAxis_; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_arrow3.h0000644012702201742730000000215111274636605016626 0ustar spangspang/* Copyright (C) 2005,...,2009 Joseph L. Chuma 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. */ #ifndef GRA_ARROW3 #define GRA_ARROW3 #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_arrow3 : public GRA_multiLineFigure { public: GRA_arrow3( double, double, double, double, double, GRA_color * =0, int =1 ); GRA_arrow3( double, double, double, double, bool, GRA_color * =0, int =1, double =1.0, double =1.0 ); private: bool headsBothEnds_; }; #endif extrema-4.4.5/src/Graphics/GRA_boolCharacteristic.h0000644012702201742730000000404611274636605021222 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_BOOLCHARACTERISTIC #define GRA_BOOLCHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_boolCharacteristic : public GRA_characteristic { public: GRA_boolCharacteristic( wxChar const *name, bool value ) : GRA_characteristic(name,BOOL,false), value_(value), default_(value) {} GRA_boolCharacteristic( wxChar const *name, std::vector const &values ) : GRA_characteristic(name,BOOL,true), value_(false) { values_.assign( values.begin(), values.end() ); } ~GRA_boolCharacteristic() {} GRA_boolCharacteristic( GRA_boolCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_boolCharacteristic &operator=( GRA_boolCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void Set( bool value ) { value_ = value; isAVector_ = false; } void Set( std::vector const &values ) { values_.assign( values.begin(), values.end() ); isAVector_ = true; } bool Get() const { return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_boolCharacteristic const & ); private: void CopyStuff( GRA_boolCharacteristic const &rhs ); // bool value_, default_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_legend.h0000644012702201742730000001042511274636605016652 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_LEGEND #define GRA_LEGEND #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_window; class GRA_color; class GRA_font; class GRA_drawableText; class GRA_rectangle; class GRA_plotSymbol; class GRA_wxWidgets; class GRA_legendEntry; class GRA_outputType; class GRA_legend : public GRA_drawableObject { public: GRA_legend( GRA_window *gw) : GRA_drawableObject(wxT("GRAPHLEGEND")), graphWindow_(gw), frame_(0), title_(0), popup_(false) { Initialize(); } ~GRA_legend(); GRA_legend( GRA_legend const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_legend &operator=( GRA_legend const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff(rhs); } return *this; } void Initialize(); void MakeFrame(); void MakeTitle(); void AddEntry( wxString const & ); void AddEntry( GRA_legendEntry *entry ) { entries_.push_back(entry); } std::vector const &GetEntries() const { return entries_; } void Draw( GRA_wxWidgets *, wxDC & ); bool Inside( double, double ); GRA_rectangle *GetFrame() const { return frame_; } GRA_drawableText *GetTitle() const { return title_; } double GetLineStart() const { return xLineStart_; } double GetLineEnd() const { return xLineEnd_; } double GetXLabel() const { return xLabel_; } void SetFrame( GRA_rectangle * ); void SetTitle( GRA_drawableText * ); GRA_window *GetGraphWindow() const { return graphWindow_; } double GetYHi() const { return yhi_; } int GetNumberOfEntries() const { return static_cast(entries_.size()); } void SetPopup() { popup_ = true; } void Disconnect() { popup_ = false; } friend std::ostream &operator<<( std::ostream &, GRA_legend const & ); private: void DeleteStuff(); void CopyStuff( GRA_legend const & ); // GRA_window *graphWindow_; std::vector entries_; double xlo_, ylo_, xhi_, yhi_, xLineStart_, xLineEnd_, xLabel_; GRA_rectangle *frame_; GRA_drawableText *title_; bool popup_; }; class GRA_legendEntry { public: GRA_legendEntry( GRA_legend *, wxString const &, double, GRA_font *, GRA_color *, int, int, double, double, GRA_color *, int, bool, int, int, GRA_color * ); ~GRA_legendEntry() { DeleteStuff(); } GRA_legendEntry( GRA_legendEntry const &rhs ) { CopyStuff(rhs); } GRA_legendEntry &operator=( GRA_legendEntry const &rhs ) { if( this != &rhs ) { DeleteStuff(); CopyStuff( rhs ); } return *this; } GRA_drawableText *GetLabel() const { return label_; } double GetLabelHeight() const { return labelHeight_; } int GetEntryNumber() const { return entryNumber_; } bool GetDrawLineSegment() const { return drawLineSegment_; } int GetLineType() const { return lineType_; } int GetLineWidth() const { return lineWidth_; } GRA_color *GetLineColor() const { return lineColor_; } int GetNSymbols() const { return nSymbols_; } GRA_plotSymbol *GetPlotSymbol() const { return symbol_; } void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_legendEntry const & ); private: void DeleteStuff(); void CopyStuff( GRA_legendEntry const & ); GRA_legend *legend_; GRA_drawableText *label_; GRA_plotSymbol *symbol_; bool drawLineSegment_; double labelHeight_; int entryNumber_, nSymbols_, lineType_, lineWidth_; GRA_color *lineColor_, *labelColor_; GRA_font *labelFont_; }; #endif extrema-4.4.5/src/Graphics/GRA_densityPlot.cpp0000644012702201742730000004744511274636605020301 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_densityPlot.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_wxWidgets.h" #include "GRA_axis.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "GRA_rectangle.h" #include "GRA_distanceCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "ExGlobals.h" #include "UsefulFunctions.h" GRA_densityPlot::GRA_densityPlot( wxChar const *type, std::vector &x, std::vector &y, std::vector &z, int nrow, double fmin, double fmax, double gmin, double gmax, bool xProfile, bool yProfile, bool border, bool zoom, bool axes, bool reset, bool legend ) : GRA_drawableObject(type), nrow_(nrow), fmin_(fmin), fmax_(fmax), gmin_(gmin), gmax_(gmax), xProfile_(xProfile), yProfile_(yProfile), border_(border), zoom_(zoom), drawAxes_(axes), resetAxes_(reset), legend_(legend) { x_.assign( x.begin(), x.end() ); y_.assign( y.begin(), y.end() ); z_.assign( z.begin(), z.end() ); densityType_ = UNKNOWN; wxString stype( type ); if( stype == wxT("BOXPLOT") ) densityType_ = BOX; else if( stype == wxT("DIFFUSIONPLOT") ) densityType_ = DIFFUSION; else if( stype == wxT("DITHERINGPLOT") ) densityType_ = DITHERING; else if( stype == wxT("GRADIENTPLOT") ) densityType_ = GRADIENT; } void GRA_densityPlot::CopyStuff( GRA_densityPlot const &rhs ) { densityType_ = rhs.densityType_; dataXmin_ = rhs.dataXmin_; dataYmin_ = rhs.dataYmin_; dataXmax_ = rhs.dataXmax_; dataYmax_ = rhs.dataYmax_; alo_ = rhs.alo_; ahi_ = rhs.ahi_; xlo_ = rhs.xlo_; ylo_ = rhs.ylo_; xhi_ = rhs.xhi_; yhi_ = rhs.yhi_; mlo_ = rhs.mlo_; mhi_ = rhs.mhi_; nlo_ = rhs.nlo_; nhi_ = rhs.nhi_; rmlo_ = rhs.rmlo_; rmhi_ = rhs.rmhi_; rnlo_ = rhs.rnlo_; rnhi_ = rhs.rnhi_; fmin_ = rhs.fmin_; fmax_ = rhs.fmax_; gmin_ = rhs.gmin_; gmax_ = rhs.gmax_; nrow_ = rhs.nrow_; border_ = rhs.border_; zoom_ = rhs.zoom_; drawAxes_ = rhs.drawAxes_; resetAxes_ = rhs.resetAxes_; legend_ = rhs.legend_; xuaxisp_ = rhs.xuaxisp_; yuaxisp_ = rhs.yuaxisp_; x_.assign( rhs.x_.begin(), rhs.x_.end() ); y_.assign( rhs.y_.begin(), rhs.y_.end() ); z_.assign( rhs.z_.begin(), rhs.z_.end() ); xProfile_ = rhs.xProfile_; yProfile_ = rhs.yProfile_; xProfileX_.assign( rhs.xProfileX_.begin(), rhs.xProfileX_.end() ); xProfileY_.assign( rhs.xProfileY_.begin(), rhs.xProfileY_.end() ); yProfileX_.assign( rhs.yProfileX_.begin(), rhs.yProfileX_.end() ); yProfileY_.assign( rhs.yProfileY_.begin(), rhs.yProfileY_.end() ); } void GRA_densityPlot::SetUp() { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); xuaxisp_ = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsPercent(); yuaxisp_ = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsPercent(); if( legend_ ) static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( 75.0 ); if( yProfile_ ) { double tmp = legend_ ? 65.0 : 85.0; static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( tmp ); } if( xProfile_ ) static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( 80.0 ); // UsefulFunctions::MinMax( x_, 0, x_.size(), dataXmin_, dataXmax_ ); UsefulFunctions::MinMax( y_, 0, y_.size(), dataYmin_, dataYmax_ ); if( drawAxes_ ) { std::vector xt, yt; xt.push_back( dataXmin_ ); xt.push_back( dataXmax_ ); xt.push_back( dataXmax_ ); xt.push_back( dataXmin_ ); xt.push_back( dataXmin_ ); yt.push_back( dataYmax_ ); yt.push_back( dataYmax_ ); yt.push_back( dataYmin_ ); yt.push_back( dataYmin_ ); yt.push_back( dataYmax_ ); std::auto_ptr cartesianAxes( new GRA_cartesianAxes(xt,yt,false,false) ); try { cartesianAxes->Make(); } catch (EGraphicsError const &e) { throw; } } double xmin = static_cast(xAxisC->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisC->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisC->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisC->Get(wxT("MAX")))->Get(); std::size_t nx = x_.size(); std::size_t ny = y_.size(); // // use the following for zooming in // double dx = dataXmax_ - dataXmin_; double dy = dataYmax_ - dataYmin_; if( dx == 0.0 ) { rmlo_ = 1.; rmhi_ = static_cast(nx); } else { rmlo_ = std::max( 0.0, (xmin-dataXmin_)/dx*(nx-1.0) ) + 1.0; rmhi_ = std::min( nx-1.0, (xmax-dataXmin_)/dx*(nx-1.0) ) + 1.0; } if( dy == 0.0 ) { rnlo_ = 1.0; rnhi_ = static_cast(ny); } else { rnlo_ = std::max( 0.0, (ymin-dataYmin_)/dy*(ny-1.0) ) + 1.0; rnhi_ = std::min( ny-1.0, (ymax-dataYmin_)/dy*(ny-1.0) ) + 1.0; } mlo_ = static_cast(rmlo_); mhi_ = static_cast(rmhi_+0.99999); nlo_ = static_cast(rnlo_); nhi_ = static_cast(rnhi_+0.99999); // double xmn2 = std::max(dataXmin_,xmin); double xmx2 = std::min(dataXmax_,xmax); double ymn2 = std::max(dataYmin_,ymin); double ymx2 = std::min(dataYmax_,ymax); // gw->GraphToWorld( xmn2, ymn2, xlo_, ylo_, true ); gw->GraphToWorld( xmx2, ymx2, xhi_, yhi_ ); } void GRA_densityPlot::MakeProfiles( int i1, int i2, int j1, int j2 ) { std::size_t nx = x_.size(); std::size_t ny = y_.size(); std::vector xr, xc; if( yProfile_ )xr.resize( ny, 0.0 ); if( xProfile_ )xc.resize( nx, 0.0 ); for( int i=i1; iGetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); bool xlabel = static_cast(xAxisC->Get(wxT("LABELON")))->Get(); bool ylabel = static_cast(yAxisC->Get(wxT("LABELON")))->Get(); static_cast(xAxisC->Get(wxT("LABELON")))->Set( false ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( false ); int histyp = static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Get(); bool xaxison = static_cast(xAxisC->Get(wxT("AXISON")))->Get(); bool yaxison = static_cast(yAxisC->Get(wxT("AXISON")))->Get(); int xlinc = static_cast(xAxisC->Get(wxT("NLINCS")))->Get(); int ylinc = static_cast(yAxisC->Get(wxT("NLINCS")))->Get(); bool box = static_cast(generalC->Get(wxT("GRAPHBOX")))->Get(); bool xnumbers = static_cast(xAxisC->Get(wxT("NUMBERSON")))->Get(); bool ynumbers = static_cast(yAxisC->Get(wxT("NUMBERSON")))->Get(); int xndig = static_cast(xAxisC->Get(wxT("NUMBEROFDIGITS")))->Get(); int yndig = static_cast(yAxisC->Get(wxT("NUMBEROFDIGITS")))->Get(); int xndec = static_cast(xAxisC->Get(wxT("NUMBEROFDECIMALS")))->Get(); int yndec = static_cast(yAxisC->Get(wxT("NUMBEROFDECIMALS")))->Get(); // double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double ylwind = static_cast(generalC->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double yuwind = static_cast(generalC->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); double xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double xmin = static_cast(xAxisC->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisC->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisC->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisC->Get(wxT("MAX")))->Get(); double xvmin = static_cast(xAxisC->Get(wxT("VIRTUALMIN")))->Get(); double xvmax = static_cast(xAxisC->Get(wxT("VIRTUALMAX")))->Get(); double yvmin = static_cast(yAxisC->Get(wxT("VIRTUALMIN")))->Get(); double yvmax = static_cast(yAxisC->Get(wxT("VIRTUALMAX")))->Get(); bool ytics = static_cast(xAxisC->Get(wxT("TICSON")))->Get(); bool xtics = static_cast(yAxisC->Get(wxT("TICSON")))->Get(); wxString autoScale( static_cast(generalC->Get(wxT("AUTOSCALE")))->Get() ); if( yProfile_ ) { static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Set( 3 ); static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( false ); static_cast(xAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(yAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(xAxisC->Get(wxT("TICSON")))->Set( true ); static_cast(yAxisC->Get(wxT("TICSON")))->Set( false ); static_cast(xAxisC->Get(wxT("MIN")))->Set( 0.0 ); static_cast(xAxisC->Get(wxT("MAX")))->Set( 1.0 ); static_cast(xAxisC->Get(wxT("NLINCS")))->Set( 1 ); static_cast(xAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(yAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(xAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( xuaxis ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( xuaxis+0.1*(xuwind-xlwind) ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( wxString(wxT("OFF")) ); std::vector xe1, ye1, xe2, ye2; std::auto_ptr cartesianAxes( new GRA_cartesianAxes(yProfileX_,yProfileY_,false,false) ); std::auto_ptr cartesianCurve( new GRA_cartesianCurve(yProfileX_,yProfileY_,xe1,ye1,xe2,ye2,false) ); try { cartesianAxes->Make(); cartesianCurve->Make(); } catch ( EGraphicsError const &e ) { throw; } cartesianAxes->Draw( graphicsOutput, dc ); cartesianCurve->Draw( graphicsOutput, dc ); } if( xProfile_ ) { static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Set( 1 ); static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( false ); static_cast(xAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(yAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(xAxisC->Get(wxT("TICSON")))->Set( false ); static_cast(yAxisC->Get(wxT("TICSON")))->Set( true ); static_cast(xAxisC->Get(wxT("MIN")))->Set( xmin ); static_cast(xAxisC->Get(wxT("MAX")))->Set( xmax ); static_cast(yAxisC->Get(wxT("MIN")))->Set( 0.0 ); static_cast(yAxisC->Get(wxT("MAX")))->Set( 1.0 ); static_cast(yAxisC->Get(wxT("NLINCS")))->Set( 1 ); static_cast(xAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(yAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(xAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( xlaxis ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( xuaxis ); static_cast(yAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( yuaxis ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( yuaxis+0.1*(yuwind-ylwind) ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( wxString(wxT("OFF")) ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( wxString(wxT("OFF")) ); std::vector xe1, ye1, xe2, ye2; std::auto_ptr cartesianAxes( new GRA_cartesianAxes(xProfileX_,xProfileY_,false,false) ); std::auto_ptr cartesianCurve( new GRA_cartesianCurve(xProfileX_,xProfileY_,xe1,ye1,xe2,ye2,false) ); try { cartesianAxes->Make(); cartesianCurve->Make(); } catch ( EGraphicsError const &e ) { throw; } cartesianAxes->Draw( graphicsOutput, dc ); cartesianCurve->Draw( graphicsOutput, dc ); } static_cast(xAxisC->Get(wxT("LABELON")))->Set( xlabel ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( ylabel ); static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Set( histyp ); static_cast(xAxisC->Get(wxT("AXISON")))->Set( xaxison ); static_cast(yAxisC->Get(wxT("AXISON")))->Set( yaxison ); static_cast(xAxisC->Get(wxT("NLINCS")))->Set( xlinc ); static_cast(yAxisC->Get(wxT("NLINCS")))->Set( ylinc ); static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( box ); static_cast(xAxisC->Get(wxT("NUMBERSON")))->Set( xnumbers ); static_cast(yAxisC->Get(wxT("NUMBERSON")))->Set( ynumbers ); static_cast(xAxisC->Get(wxT("NUMBEROFDIGITS")))->Set( xndig ); static_cast(yAxisC->Get(wxT("NUMBEROFDIGITS")))->Set( yndig ); static_cast(xAxisC->Get(wxT("NUMBEROFDECIMALS")))->Set( xndec ); static_cast(yAxisC->Get(wxT("NUMBEROFDECIMALS")))->Set( yndec ); static_cast(xAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( xlaxis ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( xuaxis ); static_cast(yAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( ylaxis ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( yuaxis ); static_cast(xAxisC->Get(wxT("MIN")))->Set( xmin ); static_cast(xAxisC->Get(wxT("MAX")))->Set( xmax ); static_cast(yAxisC->Get(wxT("MIN")))->Set( ymin ); static_cast(yAxisC->Get(wxT("MAX")))->Set( ymax ); static_cast(xAxisC->Get(wxT("VIRTUALMIN")))->Set( xvmin ); static_cast(xAxisC->Get(wxT("VIRTUALMAX")))->Set( xvmax ); static_cast(yAxisC->Get(wxT("VIRTUALMIN")))->Set( yvmin ); static_cast(yAxisC->Get(wxT("VIRTUALMAX")))->Set( yvmax ); static_cast(xAxisC->Get(wxT("TICSON")))->Set( xtics ); static_cast(yAxisC->Get(wxT("TICSON")))->Set( ytics ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( autoScale ); } void GRA_densityPlot::DrawAxes( GRA_wxWidgets *graphicsOutput, wxDC &dc, GRA_cartesianAxes *&axes ) { if( !drawAxes_ )return; std::vector xt, yt; xt.push_back( dataXmin_ ); xt.push_back( dataXmax_ ); xt.push_back( dataXmax_ ); xt.push_back( dataXmin_ ); xt.push_back( dataXmin_ ); yt.push_back( dataYmax_ ); yt.push_back( dataYmax_ ); yt.push_back( dataYmin_ ); yt.push_back( dataYmin_ ); yt.push_back( dataYmax_ ); axes = new GRA_cartesianAxes(xt,yt,false,false); try { axes->Make(); } catch (EGraphicsError const &e) { delete axes; throw; } axes->Draw( graphicsOutput, dc ); } void GRA_densityPlot::DrawAxes2( GRA_wxWidgets *graphicsOutput, wxDC &dc, GRA_cartesianAxes *axes ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); if( border_ ) { GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); double x1, y1, x2, y2; gw->GraphToWorld( dataXmin_, dataYmin_, x1, y1, true ); gw->GraphToWorld( dataXmax_, dataYmax_, x2, y2 ); GRA_rectangle r( x1, y1, x2, y2, 0.0, false, lineColor, 0, 1 ); r.Draw( graphicsOutput, dc ); } if( xProfile_ || yProfile_ )DrawProfiles( graphicsOutput, dc ); if( drawAxes_ ) { axes->Draw( graphicsOutput, dc ); delete axes; } if( resetAxes_ ) { static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( xuaxisp_ ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( yuaxisp_ ); } } // end of file extrema-4.4.5/src/Graphics/GRA_shape.h0000644012702201742730000000527311274636605016521 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_SHAPE #define GRA_SHAPE #include #include "GRA_drawableObject.h" class GRA_color; class GRA_shape : public GRA_drawableObject { public: GRA_shape( GRA_color *lineColor, GRA_color *fillColor, int lineWidth, int lineType, wxChar const *type ) : GRA_drawableObject(type), lineWidth_(lineWidth), lineType_(lineType), lineColor_(lineColor), fillColor_(fillColor) {} virtual ~GRA_shape() {} GRA_shape( GRA_shape const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_shape &operator=( GRA_shape const &rhs ) { if( &rhs != this ) { type_ = rhs.type_; CopyStuff(rhs); } return *this; } void SetLineColor( GRA_color *c ) { lineColor_ = c; } void SetFillColor( GRA_color *c ) { fillColor_ = c; } GRA_color *GetLineColor() const { return lineColor_; } GRA_color *GetFillColor() const { return fillColor_; } void SetLineWidth( int i ) { lineWidth_ = i; } int GetLineWidth() const { return lineWidth_; } void SetLineType( int i ) { lineType_ = i; } int GetLineType() const { return lineType_; } void GetCenter( double &x, double &y ) { x=xc_; y=yc_; } void GetLimits( double &xmin, double &ymin, double &xmax, double &ymax ) const { xmin=xmin_; ymin=ymin_; xmax=xmax_; ymax=ymax_; } protected: double RotX( double x, double y, double sinang, double cosang ) const { return x*cosang - y*sinang; } double RotY( double x, double y, double sinang, double cosang ) const { return x*sinang + y*cosang; } void CopyStuff( GRA_shape const &rhs ) { xc_ = rhs.xc_; yc_ = rhs.yc_; xmin_ = rhs.xmin_; xmax_ = rhs.xmax_; ymin_ = rhs.ymin_; ymax_ = rhs.ymax_; lineColor_ = rhs.lineColor_; fillColor_ = rhs.fillColor_; lineWidth_ = rhs.lineWidth_; lineType_ = rhs.lineType_; } double xc_, yc_; double xmin_, ymin_, xmax_, ymax_; GRA_color *lineColor_, *fillColor_; int lineWidth_, lineType_; }; #endif extrema-4.4.5/src/Graphics/GRA_diamond.h0000644012702201742730000000173711274636605017035 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DIAMOND #define GRA_DIAMOND #include "GRA_polygon.h" class GRA_color; class GRA_diamond : public GRA_polygon { public: GRA_diamond( double, double, double, double, GRA_color * =0, GRA_color * =0, int =1 ); ~GRA_diamond() {} }; #endif extrema-4.4.5/src/Graphics/GRA_legend.cpp0000644012702201742730000003134011274636605017204 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_legend.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_font.h" #include "GRA_drawableText.h" #include "GRA_plotSymbol.h" #include "GRA_rectangle.h" #include "GRA_distanceCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "LegendPopup.h" void GRA_legend::Initialize() { GRA_setOfCharacteristics *legendC = graphWindow_->GetGraphLegendCharacteristics(); xlo_ = static_cast(legendC->Get(wxT("FRAMEXLO")))->GetAsWorld(); ylo_ = static_cast(legendC->Get(wxT("FRAMEYLO")))->GetAsWorld(); xhi_ = static_cast(legendC->Get(wxT("FRAMEXHI")))->GetAsWorld(); yhi_ = static_cast(legendC->Get(wxT("FRAMEYHI")))->GetAsWorld(); xLineStart_ = xlo_ + (xhi_-xlo_)*0.05; xLineEnd_ = xlo_ + (xhi_-xlo_)*0.4; xLabel_ = xlo_ + (xhi_-xlo_)*0.5; MakeFrame(); MakeTitle(); } GRA_legend::~GRA_legend() { DeleteStuff(); if( popup_ )ExGlobals::DisconnectLegendPopup(); } void GRA_legend::DeleteStuff() { while ( !entries_.empty() ) { delete entries_.back(); entries_.pop_back(); } delete frame_; delete title_; } void GRA_legend::CopyStuff( GRA_legend const &rhs ) { xlo_ = rhs.xlo_; ylo_ = rhs.ylo_; xhi_ = rhs.xhi_; yhi_ = rhs.yhi_; xLineStart_ = rhs.xLineStart_; xLineEnd_ = rhs.xLineEnd_; xLabel_ = rhs.xLabel_; // std::size_t size = rhs.entries_.size(); for( std::size_t i=0; iGetDataCurveCharacteristics(); GRA_setOfCharacteristics *legendC = graphWindow_->GetGraphLegendCharacteristics(); GRA_setOfCharacteristics *textC = graphWindow_->GetTextCharacteristics(); // GRA_intCharacteristic *plotSymbol = static_cast(dataC->Get(wxT("PLOTSYMBOL"))); GRA_sizeCharacteristic *pSize = static_cast(dataC->Get(wxT("PLOTSYMBOLSIZE"))); GRA_angleCharacteristic *pAngle = static_cast(dataC->Get(wxT("PLOTSYMBOLANGLE"))); GRA_colorCharacteristic *pColor = static_cast(dataC->Get(wxT("PLOTSYMBOLCOLOR"))); GRA_intCharacteristic *pLineWidth = static_cast(dataC->Get(wxT("PLOTSYMBOLLINEWIDTH"))); // int sym = plotSymbol->IsVector() ? plotSymbol->Gets().at(0) : plotSymbol->Get(); double symSize = pSize->IsVector() ? pSize->GetAsWorlds().at(0) : pSize->GetAsWorld(); double symAngle = pAngle->IsVector() ? pAngle->Gets().at(0) : pAngle->Get(); GRA_color* symColor = pColor->IsVector() ? pColor->Gets().at(0) : pColor->Get(); int symLW = pLineWidth->IsVector() ? pLineWidth->Gets().at(0) : pLineWidth->Get(); // int nSymbols = static_cast(legendC->Get(wxT("SYMBOLS")))->Get(); bool drawLineSegment = static_cast(legendC->Get(wxT("ENTRYLINEON")))->Get(); int lineType = static_cast(dataC->Get(wxT("CURVELINETYPE")))->Get(); int lineWidth = static_cast(dataC->Get(wxT("CURVELINEWIDTH")))->Get(); GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); // double labelHeight = static_cast(textC->Get(wxT("HEIGHT")))->GetAsWorld(); GRA_font *labelFont = static_cast(textC->Get(wxT("FONT")))->Get(); GRA_color *labelColor = static_cast(textC->Get(wxT("COLOR")))->Get(); // // now create the legend entry: line segment with plotsymbols and text label // GRA_legendEntry *entry = 0; try { entry = new GRA_legendEntry( this, label, labelHeight, labelFont, labelColor, nSymbols, sym, symSize, symAngle, symColor, symLW, drawLineSegment, lineType, lineWidth, lineColor ); } catch (EGraphicsError const &e) { delete entry; throw; } GRA_wxWidgets *graphicsOutput = ExGlobals::GetGraphicsOutput(); wxClientDC dc( ExGlobals::GetwxWindow() ); if( entries_.empty() ) { if( static_cast(legendC->Get(wxT("FRAMEON")))->Get() ) frame_->Draw( graphicsOutput, dc ); if( static_cast(legendC->Get(wxT("TITLEON")))->Get() ) title_->Draw( graphicsOutput, dc ); } entry->Draw( graphicsOutput, dc ); entries_.push_back( entry ); } void GRA_legend::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_setOfCharacteristics *legendC = graphWindow_->GetGraphLegendCharacteristics(); if( static_cast(legendC->Get(wxT("ON")))->Get() ) { if( static_cast(legendC->Get(wxT("FRAMEON")))->Get() ) frame_->Draw( graphicsOutput, dc ); if( static_cast(legendC->Get(wxT("TITLEON")))->Get() ) title_->Draw( graphicsOutput, dc ); std::vector::const_iterator end = entries_.end(); for( std::vector::const_iterator i=entries_.begin(); i!=end; ++i ) (*i)->Draw( graphicsOutput, dc ); } } void GRA_legend::MakeFrame() { if( frame_ ) { delete frame_; frame_ = 0; } GRA_setOfCharacteristics *legendC = graphWindow_->GetGraphLegendCharacteristics(); GRA_color *frameColor = static_cast(legendC->Get(wxT("FRAMECOLOR")))->Get(); frame_ = new GRA_rectangle( xlo_, ylo_, xhi_, yhi_, 0.0, false, frameColor, 0, 1 ); } void GRA_legend::MakeTitle() { if( title_ ) { delete title_; title_ = 0; } GRA_setOfCharacteristics *legendC = graphWindow_->GetGraphLegendCharacteristics(); wxString titleString( static_cast(legendC->Get(wxT("TITLE")))->Get() ); if( titleString.empty() )titleString = wxT(" "); double titleHeight = static_cast(legendC->Get(wxT("TITLEHEIGHT")))->GetAsWorld(); GRA_font *titleFont = static_cast(legendC->Get(wxT("TITLEFONT")))->Get(); GRA_color *titleColor = static_cast(legendC->Get(wxT("TITLECOLOR")))->Get(); title_ = new GRA_drawableText( titleString, titleHeight, 0.0, 0.5*(xhi_+xlo_), yhi_+0.1*titleHeight, 2, titleFont, titleColor ); try { title_->Parse(); } catch (EGraphicsError const &e) { delete title_; title_ = 0; throw; } } void GRA_legend::SetFrame( GRA_rectangle *frame ) { delete frame_; frame_ = frame; } void GRA_legend::SetTitle( GRA_drawableText *title ) { delete title_; title_ = title; GRA_setOfCharacteristics *legendC = graphWindow_->GetGraphLegendCharacteristics(); static_cast(legendC->Get(wxT("TITLE")))->Set( title_->GetString() ); } bool GRA_legend::Inside( double x, double y ) { std::vector xp(4,0.0), yp(4,0.0); double const eps = 0.05; xp[0] = xlo_ - eps; yp[0] = ylo_ - eps; xp[1] = xhi_ + eps; yp[1] = ylo_ - eps; xp[2] = xhi_ + eps; yp[2] = yhi_ + eps; xp[3] = xlo_ - eps; yp[3] = yhi_ + eps; return UsefulFunctions::InsidePolygon(x,y,xp,yp); } std::ostream &operator<<( std::ostream &out, GRA_legend const &legend ) { GRA_setOfCharacteristics *legendC = legend.graphWindow_->GetGraphLegendCharacteristics(); std::size_t size = legend.entries_.size(); out << "(legendC->Get(wxT("FRAMEON")))->Get()?1L:0L) << "\" titleon=\"" << (static_cast(legendC->Get(wxT("TITLEON")))->Get()?1L:0L) << "\" xlo=\"" << legend.xlo_ << "\" ylo=\"" << legend.ylo_ << "\" xhi=\"" << legend.xhi_ << "\" yhi=\"" << legend.yhi_ << "\">\n"; for( std::size_t i=0; i\n"; } //---------------- GRA_legendEntry --------------------------------------------- GRA_legendEntry::GRA_legendEntry( GRA_legend *legend, wxString const &label, double labelHeight, GRA_font *labelFont, GRA_color *labelColor, int nSymbols, int sym, double symSize, double symAngle, GRA_color *symColor, int symLW, bool drawLineSegment, int lineType, int lineWidth, GRA_color *lineColor ) : legend_(legend), nSymbols_(nSymbols), drawLineSegment_(drawLineSegment), lineType_(lineType), lineWidth_(lineWidth), lineColor_(lineColor), labelHeight_(labelHeight), labelFont_(labelFont), labelColor_(labelColor) { entryNumber_ = legend_->GetNumberOfEntries(); double y0 = legend_->GetYHi() - 1.5*labelHeight_*(entryNumber_+1); double xLabel = legend->GetXLabel(); symbol_ = new GRA_plotSymbol(sym,symSize,symAngle,symColor,symLW); label_ = new GRA_drawableText(label,labelHeight_,0.0,xLabel,y0,1,labelFont_,labelColor_); try { label_->Parse(); } catch (EGraphicsError const &e) { throw; } } void GRA_legendEntry::DeleteStuff() { delete symbol_; delete label_; } void GRA_legendEntry::CopyStuff( GRA_legendEntry const &rhs ) { legend_ = rhs.legend_; label_ = new GRA_drawableText(*rhs.label_); symbol_ = new GRA_plotSymbol(*rhs.symbol_); entryNumber_ = rhs.entryNumber_; nSymbols_ = rhs.nSymbols_; drawLineSegment_ = rhs.drawLineSegment_; labelHeight_ = rhs.labelHeight_; lineType_ = rhs.lineType_; lineWidth_ = rhs.lineWidth_; lineColor_ = rhs.lineColor_; labelColor_ = rhs.labelColor_; labelFont_ = rhs.labelFont_; } void GRA_legendEntry::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { double y0 = legend_->GetYHi() - 1.5*labelHeight_*(entryNumber_+1); // first draw the line segment // double y = y0 + labelHeight_*0.5; double xStart = legend_->GetLineStart(); double xEnd = legend_->GetLineEnd(); double xLabel = legend_->GetXLabel(); if( drawLineSegment_ ) { int lineTypeSave = graphicsOutput->GetLineType(); graphicsOutput->SetLineType( lineType_ ); wxPen wxpen( dc.GetPen() ); wxpen.SetWidth( lineWidth_ ); wxpen.SetColour( ExGlobals::GetwxColor(lineColor_) ); dc.SetPen( wxpen ); graphicsOutput->StartLine( xStart, y ); graphicsOutput->ContinueLine( xEnd, y, dc ); graphicsOutput->SetLineType( lineTypeSave ); } // draw the symbols on the line segment // if( nSymbols_ > 0 ) { if( nSymbols_ > 1 ) { double xinc = (xEnd-xStart)/(nSymbols_-1.); for( int i=0; iSetLocation( xStart+i*xinc, y ); symbol_->Draw( graphicsOutput, dc ); } symbol_->SetLocation( xEnd, y ); symbol_->Draw( graphicsOutput, dc ); } else { symbol_->SetLocation( (xStart+xEnd)/2.0, y ); symbol_->Draw( graphicsOutput, dc ); } } // draw the label at the end of the line segment // label_->SetX( xLabel ); label_->SetY( y0-0.25*labelHeight_ ); label_->Draw( graphicsOutput, dc ); } std::ostream &operator<<( std::ostream &out, GRA_legendEntry const &entry ) { return out << "\n" << *entry.label_ << *entry.symbol_ << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_font.h0000644012702201742730000000337511274636605016370 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_FONT #define GRA_FONT #include #include "wx/wx.h" class GRA_font { public: // how to pick a font: // -- choose a family (DECORATIVE,ROMAN,SCRIPT,SWISS,MODERN,TELETYPE) // -- or open the font dialog and pick a specific font GRA_font( wxString const & ); GRA_font( wxFont &font ) { wxfont_ = font; } ~GRA_font() {} GRA_font( GRA_font const &rhs ) { wxfont_ = rhs.wxfont_; name_ = rhs.name_; } GRA_font &operator=( GRA_font const &rhs ) { if( &rhs != this ) { wxfont_ = rhs.wxfont_; name_ = rhs.name_; } return *this; } bool operator==( GRA_font const &rhs ) const { return (wxfont_==rhs.wxfont_&&name_==rhs.name_); } bool operator!=( GRA_font const &rhs ) const { return !(wxfont_==rhs.wxfont_)||!(name_==rhs.name_); } wxString GetFontName() const { return name_; } wxFont &GetwxFont() { return wxfont_; } friend std::ostream &operator<<( std::ostream &, GRA_font const & ); private: wxFont wxfont_; wxString name_; }; #endif extrema-4.4.5/src/Graphics/GRA_triangle.cpp0000644012702201742730000000526411274636605017561 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_triangle.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_triangle::GRA_triangle( double xc, double yc, double side, double angle, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth,1) { double cosang = cos(angle*M_PI/180.); double sinang = sin(angle*M_PI/180.); double const eps = 0.000001; if( fabs(cosang) < eps )cosang = 0.0; if( fabs(sinang) < eps )sinang = 0.0; double const xs = side*sqrt(3.)/4.; double const ys = side/4.0; std::vector x, y; x.push_back(xc+RotX( xs, -ys,sinang,cosang)); y.push_back(yc+RotY( xs, -ys,sinang,cosang)); x.push_back(xc+RotX( 0.,2.*ys,sinang,cosang)); y.push_back(yc+RotY( 0.,2.*ys,sinang,cosang)); x.push_back(xc+RotX(-xs, -ys,sinang,cosang)); y.push_back(yc+RotY(-xs, -ys,sinang,cosang)); x.push_back(xc+RotX( xs, -ys,sinang,cosang)); y.push_back(yc+RotY( xs, -ys,sinang,cosang)); // SetUp( x, y ); } GRA_triangle::GRA_triangle( double x1, double y1, double x2, double y2, double x3, double y3, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth,1) { std::vector x, y; x.push_back(x1); y.push_back(y1); x.push_back(x2); y.push_back(y2); x.push_back(x3); y.push_back(y3); x.push_back(x1); y.push_back(y1); // SetUp( x, y ); } /* std::ostream &operator<<( std::ostream &out, GRA_triangle const &p ) { out << "\n"; std::size_t size = p.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } */ // end of file extrema-4.4.5/src/Graphics/GRA_diffusionPlot.h0000644012702201742730000000366011274636605020244 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DIFFUSIONPLOT #define GRA_DIFFUSIONPLOT #include #include "wx/wx.h" #include "GRA_densityPlot.h" class GRA_bitmap; class GRA_color; class GRA_wxWidgets; class GRA_diffusionPlot : public GRA_densityPlot { public: GRA_diffusionPlot( std::vector &x, std::vector &y, std::vector &z, int nrow, double fmin, double fmax, double gmin, double gmax, bool xProfile, bool yProfile, bool border, bool zoom, bool axes, bool reset ) : GRA_densityPlot(wxT("DIFFUSIONPLOT"), x, y, z, nrow, fmin, fmax, gmin, gmax, xProfile, yProfile, border, zoom, axes, reset, false ) { if( xProfile_ || yProfile_ )MakeProfiles( 0, x_.size(), 0, y_.size() ); } ~GRA_diffusionPlot() {} GRA_diffusionPlot( GRA_diffusionPlot const &rhs ) { CopyStuff(rhs); } GRA_diffusionPlot & operator=( GRA_diffusionPlot const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Draw( GRA_wxWidgets *, wxDC & ); void FillBitmap( GRA_bitmap * ); friend std::ostream &operator<<( std::ostream &, GRA_diffusionPlot const & ); private: void DrawBitmap( GRA_wxWidgets *, wxDC & ); }; #endif extrema-4.4.5/src/Graphics/GRA_stringCharacteristic.cpp0000644012702201742730000000451411274636605022130 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_stringCharacteristic.h" std::ostream &operator<<( std::ostream &out, GRA_stringCharacteristic const &sc ) { if( sc.isAVector_ ) { std::size_t size = sc.values_.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( sc.value_ != sc.default_ ) { out << "\n"; } } return out; } wxString GRA_stringCharacteristic::Encode( wxString const &s ) { wxString result; std::size_t length = s.size(); for( std::size_t i=0; i'): result += wxT(">"); break; case wxT('&'): result += wxT("&"); break; case wxT('\"'): result += wxT("""); break; case wxT('\''): result += wxT("'"); break; default: result += s[i]; } } return result; } void GRA_stringCharacteristic::CopyStuff( GRA_stringCharacteristic const &rhs ) { value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_errorBar.h0000644012702201742730000000216211274636605017171 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_ERRORBAR #define GRA_ERRORBAR #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_errorBar : public GRA_multiLineFigure { public: GRA_errorBar( double, double, double, double, bool, double, GRA_color *, int ); friend std::ostream &operator<<( std::ostream &, GRA_errorBar const & ); private: double bottom_, top_, footSize_; bool vertical_; }; #endif extrema-4.4.5/src/Graphics/GRA_sizeCharacteristic.h0000644012702201742730000000654411274636605021246 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_SIZECHARACTERISTIC #define GRA_SIZECHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_sizeCharacteristic : public GRA_characteristic { public: GRA_sizeCharacteristic( wxChar const *name, double value, bool percent, double min, double max ) : GRA_characteristic(name,SIZE,false), min_(min), max_(max), value_(value), setAsPercent_(percent), default_(value) {} GRA_sizeCharacteristic( wxChar const *name, std::vector const &values, bool percent, double min, double max ) : GRA_characteristic(name,SIZE,true), min_(min), max_(max), value_(0.0), setAsPercent_(percent) { values_.assign( values.begin(), values.end() ); } ~GRA_sizeCharacteristic() {} GRA_sizeCharacteristic( GRA_sizeCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_sizeCharacteristic &operator=( GRA_sizeCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } double GetMin() const { return min_; } double GetMax() const { return max_; } void SetAsPercent( double value ) { value_ = value; setAsPercent_ = true; isAVector_ = false; } void SetAsPercent( std::vector const &values ) { values_.assign( values.begin(), values.end() ); setAsPercent_ = true; isAVector_ = true; } void SetAsWorld( double value ) { value_ = value; setAsPercent_ = false; isAVector_ = false; } void SetAsWorld( std::vector const &values ) { values_.assign( values.begin(), values.end() ); setAsPercent_ = false; isAVector_ = true; } void Set( double value, bool setAsPercent ) { value_ = value; setAsPercent_ = setAsPercent; isAVector_ = false; } void Set( std::vector const &values, bool setAsPercent ) { values_.assign( values.begin(), values.end() ); setAsPercent_ = setAsPercent; isAVector_ = true; } double Get( bool percent ) const { if( percent )return GetAsPercent(); else return GetAsWorld(); } std::vector Gets( bool percent ) const { if( percent )return GetAsPercents(); else return GetAsWorlds(); } double GetAsPercent() const; std::vector GetAsPercents() const; double GetAsWorld() const; std::vector GetAsWorlds() const; friend std::ostream &operator<<( std::ostream &, GRA_sizeCharacteristic const & ); private: void CopyStuff( GRA_sizeCharacteristic const & ); // double min_, max_; // dimension size double value_, default_; std::vector values_; bool setAsPercent_; }; #endif extrema-4.4.5/src/Graphics/GRA_intCharacteristic.cpp0000644012702201742730000000317011274636605021411 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_intCharacteristic.h" std::ostream &operator<<( std::ostream &out, GRA_intCharacteristic const &c ) { if( c.isAVector_ ) { std::size_t size = c.values_.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_intCharacteristic::CopyStuff( GRA_intCharacteristic const &rhs ) { value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_window.cpp0000644012702201742730000032164311423457466017267 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include #include #include #include #include "wx/wx.h" #include "GRA_window.h" #include "EGraphicsError.h" #include "GRA_wxWidgets.h" #include "GRA_drawableObject.h" #include "GRA_drawableText.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_stringCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_cartesianCurve.h" #include "GRA_cartesianAxes.h" #include "GRA_point.h" #include "GRA_polyline.h" #include "GRA_polygon.h" #include "GRA_ellipse.h" #include "GRA_plotSymbol.h" #include "GRA_axis.h" #include "GRA_legend.h" #include "GRA_contourLine.h" #include "GRA_multiLineFigure.h" #include "GRA_boxPlot.h" #include "GRA_ditheringPlot.h" #include "GRA_diffusionPlot.h" #include "GRA_gradientPlot.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "GRA_polarAxes.h" #include "GRA_polarCurve.h" #include "VisualizationWindow.h" #include "GRA_rectangle.h" #include "ThreeDPlotForm.h" #include "GRA_threeDPlot.h" void GRA_window::SetUp() { double xminw, yminw, xmaxw, ymaxw; ExGlobals::GetWorldLimits( xminw, yminw, xmaxw, ymaxw ); // double xl = xminw+xLoP_*(xmaxw-xminw)/100.0; double yl = yminw+yLoP_*(ymaxw-yminw)/100.0; double xu = xminw+xHiP_*(xmaxw-xminw)/100.0; double yu = yminw+yHiP_*(ymaxw-yminw)/100.0; // CreateGeneralCharacteristics( xl, yl, xu, yu ); CreateXAxisCharacteristics( xl, yl, xu, yu ); CreateYAxisCharacteristics( xl, yl, xu, yu ); CreateDataCurveCharacteristics( yl, yu ); CreateGraphLegendCharacteristics( xl, yl, xu, yu ); CreateTextCharacteristics( xl, yl, xu, yu ); CreatePolarCharacteristics( xl, yl, xu, yu ); // xPrevious_ = yPrevious_ = 0.0; } void GRA_window::DeleteCharacteristics() { delete xAxisCharacteristics_; delete yAxisCharacteristics_; delete generalCharacteristics_; delete textCharacteristics_; delete graphLegendCharacteristics_; delete dataCurveCharacteristics_; delete polarCharacteristics_; xAxisCharacteristics_ = 0; yAxisCharacteristics_ = 0; generalCharacteristics_ = 0; textCharacteristics_ = 0; graphLegendCharacteristics_ = 0; dataCurveCharacteristics_ = 0; polarCharacteristics_ = 0; } GRA_setOfCharacteristics *GRA_window::GetXAxisCharacteristics() { return xAxisCharacteristics_; } GRA_setOfCharacteristics *GRA_window::GetYAxisCharacteristics() { return yAxisCharacteristics_; } GRA_setOfCharacteristics *GRA_window::GetGeneralCharacteristics() { return generalCharacteristics_; } GRA_setOfCharacteristics *GRA_window::GetTextCharacteristics() { return textCharacteristics_; } GRA_setOfCharacteristics *GRA_window::GetGraphLegendCharacteristics() { return graphLegendCharacteristics_; } GRA_setOfCharacteristics *GRA_window::GetDataCurveCharacteristics() { return dataCurveCharacteristics_; } GRA_setOfCharacteristics *GRA_window::GetPolarCharacteristics() { return polarCharacteristics_; } void GRA_window::SetXAxisCharacteristics( GRA_setOfCharacteristics const &c ) { *xAxisCharacteristics_ = c; } void GRA_window::SetYAxisCharacteristics( GRA_setOfCharacteristics const &c ) { *yAxisCharacteristics_ = c; } void GRA_window::CopyStuff( GRA_window const &rhs ) { xLoP_ = rhs.xLoP_; yLoP_ = rhs.yLoP_; xHiP_ = rhs.xHiP_; yHiP_ = rhs.yHiP_; xPrevious_ = rhs.xPrevious_; yPrevious_ = rhs.yPrevious_; Clear(); wxClientDC dc( ExGlobals::GetVisualizationWindow()->GetPage() ); DisplayBackground( ExGlobals::GetGraphicsOutput(), dc ); drawableVecIter end = rhs.drawableObjects_.end(); GRA_drawableObject *p = 0; for( drawableVecIter i=rhs.drawableObjects_.begin(); i!=end; ++i ) { if( (*i)->IsaPoint() ) p = new GRA_point(*(static_cast(*i))); else if( (*i)->IsaPolyline() ) p = new GRA_polyline(*(static_cast(*i))); else if( (*i)->IsaPlotsymbol() ) p = new GRA_plotSymbol(*(static_cast(*i))); else if( (*i)->IsaDrawableText() ) p = new GRA_drawableText(*(static_cast(*i))); else if( (*i)->IsaAxis() ) p = new GRA_axis(*(static_cast(*i))); else if( (*i)->IsaCartesianAxes() ) p = new GRA_cartesianAxes(*(static_cast(*i))); else if( (*i)->IsaCartesianCurve() ) p = new GRA_cartesianCurve(*(static_cast(*i))); else if( (*i)->IsaGraphLegend() ) p = new GRA_legend(*(static_cast(*i))); else if( (*i)->IsaContour() ) p = new GRA_contourLine(*(static_cast(*i))); else if( (*i)->IsaPolarAxes() ) p = new GRA_polarAxes(*(static_cast(*i))); else if( (*i)->IsaPolarCurve() ) p = new GRA_polarCurve(*(static_cast(*i))); drawableObjects_.push_back( p ); } *xAxisCharacteristics_ = *rhs.xAxisCharacteristics_; *yAxisCharacteristics_ = *rhs.yAxisCharacteristics_; *textCharacteristics_ = *rhs.textCharacteristics_; *generalCharacteristics_ = *rhs.generalCharacteristics_; *graphLegendCharacteristics_ = *rhs.graphLegendCharacteristics_; *dataCurveCharacteristics_ = *rhs.dataCurveCharacteristics_; *polarCharacteristics_ = *rhs.polarCharacteristics_; } void GRA_window::Reset() { Clear(); DeleteCharacteristics(); SetUp(); wxClientDC dc( ExGlobals::GetVisualizationWindow()->GetPage() ); DisplayBackground( ExGlobals::GetGraphicsOutput(), dc ); } void GRA_window::RemoveDrawableObject( GRA_drawableObject *object ) { std::vector::iterator i = find( drawableObjects_.begin(), drawableObjects_.end(), object ); if( i != drawableObjects_.end() )drawableObjects_.erase( i ); } GRA_legend *GRA_window::GetGraphLegend() { drawableVecIter end = drawableObjects_.end(); GRA_legend *legend = 0; for( drawableVecIter i=drawableObjects_.begin(); i!=end; ++i ) { if( (*i)->IsaGraphLegend() ) { legend = static_cast(*i); break; } } if( !legend ) { legend = new GRA_legend( this ); AddDrawableObject( legend ); } return legend; } void GRA_window::InheritFrom( GRA_window const *w ) { static_cast(generalCharacteristics_->Get(wxT("AUTOSCALE")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("AUTOSCALE")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("AREAFILLCOLOR")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("AREAFILLCOLOR")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("GRAPHBOX")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("GRAPHBOX")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("COLOR")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("COLOR")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("FONT")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("FONT")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("LINEWIDTH")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("LINEWIDTH")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("GRIDLINETYPE")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("GRIDLINETYPE")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("LEGENDSIZE")))->SetAsPercent( static_cast(w->generalCharacteristics_->Get(wxT("LEGENDSIZE")))->GetAsPercent() ); static_cast(generalCharacteristics_->Get(wxT("CONTOURLABELHEIGHT")))->SetAsPercent( static_cast(w->generalCharacteristics_->Get(wxT("CONTOURLABELHEIGHT")))->GetAsPercent() ); static_cast(generalCharacteristics_->Get(wxT("CONTOURLABELSEPARATION")))->SetAsPercent( static_cast(w->generalCharacteristics_->Get(wxT("CONTOURLABELSEPARATION")))->GetAsPercent() ); static_cast(generalCharacteristics_->Get(wxT("BACKGROUNDFILE")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("BACKGROUNDFILE")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("BACKGROUNDCOLOR")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("BACKGROUNDCOLOR")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("ARROWHEADWIDTH")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("ARROWHEADWIDTH")))->Get() ); static_cast(generalCharacteristics_->Get(wxT("ARROWHEADLENGTH")))->Set( static_cast(w->generalCharacteristics_->Get(wxT("ARROWHEADLENGTH")))->Get() ); // static_cast(xAxisCharacteristics_->Get(wxT("AXISON")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("AXISON")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LINEWIDTH")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LINEWIDTH")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("AXISANGLE")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("AXISANGLE")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LOWERAXIS")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("LOWERAXIS")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("UPPERAXIS")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("UPPERAXIS")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("MIN")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("MAX")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LOGBASE")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LOGBASE")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LOGSTYLE")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LOGSTYLE")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NLINCS")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NLINCS")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NSINCS")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NSINCS")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("GRID")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("GRID")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("FORCECROSS")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("FORCECROSS")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("ZERO")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("ZERO")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LABEL")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LABEL")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LABELON")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LABELON")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LABELCOLOR")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LABELCOLOR")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LABELFONT")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LABELFONT")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LABELHEIGHT")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("LABELHEIGHT")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSON")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NUMBERSON")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSFONT")))->Set( static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSFONT")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSANGLE")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NUMBERSANGLE")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("MOD")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("MOD")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LEADINGZEROS")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("LEADINGZEROS")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("OFFSET")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("OFFSET")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("TICSON")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("TICSON")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("TICANGLE")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("TICANGLE")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("LARGETICLENGTH")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("SMALLTICLENGTH")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("IMAGTICANGLE")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("IMAGTICANGLE")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("IMAGTICLENGTH")))->SetAsPercent( static_cast(w->xAxisCharacteristics_->Get(wxT("IMAGTICLENGTH")))->GetAsPercent() ); static_cast(xAxisCharacteristics_->Get(wxT("POWER")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("POWER")))->Get() ); static_cast(xAxisCharacteristics_->Get(wxT("POWERAUTO")))->Set( static_cast(w->xAxisCharacteristics_->Get(wxT("POWERAUTO")))->Get() ); // static_cast(yAxisCharacteristics_->Get(wxT("AXISON")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("AXISON")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LINEWIDTH")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LINEWIDTH")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("AXISANGLE")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("AXISANGLE")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LOWERAXIS")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("LOWERAXIS")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("UPPERAXIS")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("UPPERAXIS")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("MIN")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("MAX")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LOGBASE")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LOGBASE")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LOGSTYLE")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LOGSTYLE")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NLINCS")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NLINCS")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NSINCS")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NSINCS")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("GRID")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("GRID")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("FORCECROSS")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("FORCECROSS")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("ZERO")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("ZERO")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LABEL")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LABEL")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LABELON")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LABELON")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LABELCOLOR")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LABELCOLOR")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LABELFONT")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LABELFONT")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LABELHEIGHT")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("LABELHEIGHT")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSON")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NUMBERSON")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSFONT")))->Set( static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSFONT")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSANGLE")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NUMBERSANGLE")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("MOD")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("MOD")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LEADINGZEROS")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("LEADINGZEROS")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("OFFSET")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("OFFSET")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("TICSON")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("TICSON")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("TICANGLE")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("TICANGLE")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("LARGETICLENGTH")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("SMALLTICLENGTH")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("IMAGTICANGLE")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("IMAGTICANGLE")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("IMAGTICLENGTH")))->SetAsPercent( static_cast(w->yAxisCharacteristics_->Get(wxT("IMAGTICLENGTH")))->GetAsPercent() ); static_cast(yAxisCharacteristics_->Get(wxT("POWER")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("POWER")))->Get() ); static_cast(yAxisCharacteristics_->Get(wxT("POWERAUTO")))->Set( static_cast(w->yAxisCharacteristics_->Get(wxT("POWERAUTO")))->Get() ); // static_cast(graphLegendCharacteristics_->Get(wxT("ON")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("ON")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("ENTRYLINEON")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("ENTRYLINEON")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEON")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("FRAMEON")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEXLO")))->SetAsPercent( static_cast(w->graphLegendCharacteristics_->Get(wxT("FRAMEXLO")))->GetAsPercent() ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEYLO")))->SetAsPercent( static_cast(w->graphLegendCharacteristics_->Get(wxT("FRAMEYLO")))->GetAsPercent() ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEXHI")))->SetAsPercent( static_cast(w->graphLegendCharacteristics_->Get(wxT("FRAMEXHI")))->GetAsPercent() ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEYHI")))->SetAsPercent( static_cast(w->graphLegendCharacteristics_->Get(wxT("FRAMEYHI")))->GetAsPercent() ); static_cast(graphLegendCharacteristics_->Get(wxT("TRANSPARENCY")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("TRANSPARENCY")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("SYMBOLS")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("SYMBOLS")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLEON")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("TITLEON")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLE")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("TITLE")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLEHEIGHT")))->SetAsPercent( static_cast(w->graphLegendCharacteristics_->Get(wxT("TITLEHEIGHT")))->GetAsPercent() ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLECOLOR")))->Set( static_cast(w->graphLegendCharacteristics_->Get(wxT("TITLECOLOR")))->Get() ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLEFONT")))->Set( static_cast(graphLegendCharacteristics_->Get(wxT("TITLEFONT")))->Get() ); // static_cast(dataCurveCharacteristics_->Get(wxT("HISTOGRAMTYPE")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("HISTOGRAMTYPE")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("CURVECOLOR")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("CURVELINEWIDTH")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("CURVELINEWIDTH")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("CURVELINETYPE")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("CURVELINETYPE")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLSIZE")))->SetAsPercent( static_cast(w->dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLSIZE")))->GetAsPercent() ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLANGLE")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLANGLE")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLCOLOR")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLCOLOR")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLLINEWIDTH")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLLINEWIDTH")))->Get() ); static_cast(dataCurveCharacteristics_->Get(wxT("CLIP")))->Set( static_cast(w->dataCurveCharacteristics_->Get(wxT("CLIP")))->Get() ); // static_cast(textCharacteristics_->Get(wxT("ALIGNMENT")))->Set( static_cast(w->textCharacteristics_->Get(wxT("ALIGNMENT")))->Get() ); static_cast(textCharacteristics_->Get(wxT("ANGLE")))->Set( static_cast(w->textCharacteristics_->Get(wxT("ANGLE")))->Get() ); static_cast(textCharacteristics_->Get(wxT("COLOR")))->Set( static_cast(w->textCharacteristics_->Get(wxT("COLOR")))->Get() ); static_cast(textCharacteristics_->Get(wxT("FONT")))->Set( static_cast(w->textCharacteristics_->Get(wxT("FONT")))->Get() ); static_cast(textCharacteristics_->Get(wxT("HEIGHT")))->SetAsPercent( static_cast(w->textCharacteristics_->Get(wxT("HEIGHT")))->GetAsPercent() ); static_cast(textCharacteristics_->Get(wxT("INTERACTIVE")))->Set( static_cast(w->textCharacteristics_->Get(wxT("INTERACTIVE")))->Get() ); static_cast(textCharacteristics_->Get(wxT("XLOCATION")))->SetAsPercent( static_cast(w->textCharacteristics_->Get(wxT("XLOCATION")))->GetAsPercent() ); static_cast(textCharacteristics_->Get(wxT("YLOCATION")))->SetAsPercent( static_cast(w->textCharacteristics_->Get(wxT("YLOCATION")))->GetAsPercent() ); // static_cast(polarCharacteristics_->Get(wxT("XORIGIN")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("XORIGIN")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("YORIGIN")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("YORIGIN")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("AXISLENGTH")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("AXISLENGTH")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("NAXES")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NAXES")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("AXISON")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("AXISON")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("AXISCOLOR")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("AXISCOLOR")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LINEWIDTH")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LINEWIDTH")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("AXISANGLE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("AXISANGLE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("COMPASSLABELS")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("COMPASSLABELS")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("CLOCKWISE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("CLOCKWISE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("MIN")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("MIN")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("MAX")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("MAX")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("VIRTUALMIN")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("VIRTUALMAX")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LOGBASE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LOGBASE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LOGSTYLE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LOGSTYLE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NLINCS")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NLINCS")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NSINCS")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NSINCS")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("GRID")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("GRID")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LABEL")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LABEL")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LABELON")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LABELON")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LABELCOLOR")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LABELCOLOR")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LABELFONT")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LABELFONT")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LABELHEIGHT")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("LABELHEIGHT")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSON")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NUMBERSON")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSFONT")))->Set( static_cast(polarCharacteristics_->Get(wxT("NUMBERSFONT")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSANGLE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NUMBERSANGLE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("MOD")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("MOD")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LEADINGZEROS")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("LEADINGZEROS")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("OFFSET")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("OFFSET")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("TICSON")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("TICSON")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("TICANGLE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("TICANGLE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("LARGETICLENGTH")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("SMALLTICLENGTH")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("IMAGTICANGLE")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("IMAGTICANGLE")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("IMAGTICLENGTH")))->SetAsPercent( static_cast(w->polarCharacteristics_->Get(wxT("IMAGTICLENGTH")))->GetAsPercent() ); static_cast(polarCharacteristics_->Get(wxT("POWER")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("POWER")))->Get() ); static_cast(polarCharacteristics_->Get(wxT("POWERAUTO")))->Set( static_cast(w->polarCharacteristics_->Get(wxT("POWERAUTO")))->Get() ); } void GRA_window::Clear() { // destroy all the drawableObjects // the monitor screen is cleared by ExGlobals::ClearGraphicsMonitor() // while ( !drawableObjects_.empty() ) { GRA_drawableObject *obj = drawableObjects_.back(); if( obj->IsaThreeDPlot() ) { ThreeDPlotForm *form = dynamic_cast(obj)->GetForm(); if( form )form->ZeroPlot(); } delete obj; drawableObjects_.pop_back(); } } void GRA_window::Erase() { double xlw = static_cast(generalCharacteristics_-> Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double ylw = static_cast(generalCharacteristics_-> Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double xuw = static_cast(generalCharacteristics_-> Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double yuw = static_cast(generalCharacteristics_-> Get(wxT("YUPPERWINDOW")))->GetAsWorld(); wxClientDC dc( ExGlobals::GetwxWindow() ); int xl, yl, xu, yu; ExGlobals::GetGraphicsOutput()->WorldToOutputType( xlw, ylw, xl, yl ); ExGlobals::GetGraphicsOutput()->WorldToOutputType( xuw, yuw, xu, yu ); dc.SetBrush( *wxWHITE_BRUSH ); dc.SetPen( *wxWHITE_PEN ); dc.DrawRectangle( xl, yu, xu-xl+1, yu-yl+1 ); } void GRA_window::Replot() { if( drawableObjects_.empty() )return; double xmin = std::numeric_limits::max(); double xmax = -xmin; double ymin = xmin; double ymax = xmax; double xlog = static_cast(xAxisCharacteristics_->Get(wxT("LOGBASE")))->Get(); double ylog = static_cast(yAxisCharacteristics_->Get(wxT("LOGBASE")))->Get(); wxString autoScale( static_cast(generalCharacteristics_->Get(wxT("AUTOSCALE")))->Get() ); bool curveFound = false; int size = static_cast(drawableObjects_.size()); for( int i=0; iIsaCartesianAxes() ) { delete drawableObjects_[i]; drawableObjects_.erase( drawableObjects_.begin()+i ); --size; --i; } else if( drawableObjects_[i]->IsaCartesianCurve() ) { curveFound = true; GRA_cartesianCurve *cc = static_cast(drawableObjects_[i]); if( autoScale==wxT("ON") || autoScale==wxT("VIRTUAL") || autoScale==wxT("COMMENSURATE") ) { double xmn, ymn, xmx, ymx; cc->GetXYMinMax( xmn, xmx, ymn, ymx ); xmin = std::min( xmin, xmn ); xmax = std::max( xmax, xmx ); ymin = std::min( ymin, ymn ); ymax = std::max( ymax, ymx ); } else if( autoScale==wxT("Y") || autoScale==wxT("YVIRTUAL") ) { xmin = static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Get(); xmax = static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Get(); if( static_cast(xlog) > 1 ) { xmin = pow(xlog,xmin); xmax = pow(xlog,xmax); } double ymn, ymx; cc->GetYMinMax( xmin, xmax, ymn, ymx ); ymin = std::min( ymin, ymn ); ymax = std::max( ymax, ymx ); } else if( autoScale==wxT("X") || autoScale==wxT("XVIRTUAL") ) { ymin = static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Get(); ymax = static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Get(); if( static_cast(ylog) > 1 ) { ymin = pow(ylog,ymin); ymax = pow(ylog,ymax); } double xmn, xmx; cc->GetXMinMax( ymin, ymax, xmn, xmx ); xmin = std::min( xmin, xmn ); xmax = std::max( xmax, xmx ); } else if( autoScale==wxT("OFF") ) { xmin = static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Get(); xmax = static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Get(); if( static_cast(xlog) > 1 ) { xmin = pow(xlog,xmin); xmax = pow(xlog,xmax); } ymin = static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Get(); ymax = static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Get(); if( static_cast(ylog) > 1 ) { ymin = pow(ylog,ymin); ymax = pow(ylog,ymax); } } if( xmin > xmax ) // no data points within range { // can't allow min > max xmin = 0.0; xmax = 1.0; } else if( xmin == xmax ) { xmin==0.0 ? xmax=1.0 : xmax=xmin+0.01*fabs(xmin); } if( ymin > ymax ) { ymin = 0.0; ymax = 1.0; } else if( ymin == ymax ) { ymin==0.0 ? ymax=1.0 : ymax=ymin+0.01*fabs(ymin); } } } if( curveFound ) { std::vector xTmp, yTmp; xTmp.push_back( xmin ); xTmp.push_back( xmax ); yTmp.push_back( ymin ); yTmp.push_back( ymax ); if( autoScale == wxT("COMMENSURATE") ) { double xlwind = static_cast(generalCharacteristics_->Get(wxT("XLOWERWINDOW")))-> GetAsWorld(); double ylwind = static_cast(generalCharacteristics_->Get(wxT("YLOWERWINDOW")))-> GetAsWorld(); double xuwind = static_cast(generalCharacteristics_->Get(wxT("XUPPERWINDOW")))-> GetAsWorld(); double yuwind = static_cast(generalCharacteristics_->Get(wxT("YUPPERWINDOW")))-> GetAsWorld(); // double delxwind = fabs(xuwind - xlwind); double delywind = fabs(yuwind - ylwind); // double xlaxis = 0.15 * delxwind + xlwind; double xuaxis = 0.90 * delxwind + xlwind; double ylaxis = 0.15 * delywind + ylwind; double yuaxis = 0.90 * delywind + ylwind; double xmid = 0.5 * (xlwind + xuwind); double ymid = 0.5 * (ylwind + yuwind); // double xmins, xmaxs, xincs, ymins, ymaxs, yincs; try { UsefulFunctions::Scale1( xmins, xmaxs, xincs, 5, xmin, xmax ); UsefulFunctions::Scale1( ymins, ymaxs, yincs, 5, ymin, ymax ); } catch ( std::runtime_error &e ) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } double xd = xmaxs - xmins; double yd = ymaxs - ymins; int nlxinc = static_cast( xd/xincs + 0.5 ); int nlyinc = static_cast( yd/yincs + 0.5 ); // double delx, dely; if( xd >= yd ) { delx = xuaxis - xlaxis; dely = delx * yd / xd; ylaxis = ymid - 0.5*dely; yuaxis = ymid + 0.5*dely; } else { dely = yuaxis - ylaxis; delx = dely * xd / yd; xlaxis = xmid - 0.5*delx; xuaxis = xmid + 0.5*delx; } if( (ylaxis-ylwind)/delywind < 0.15 ) { dely = 0.15*delywind + ylwind - ylaxis; ylaxis = 0.15*delywind + ylwind; yuaxis = yuaxis - dely; xlaxis = xlaxis + dely; xuaxis = xuaxis - dely; } else if( (xlaxis-xlwind)/delxwind < 0.15 ) { delx = 0.15*delxwind + xlwind - xlaxis; xlaxis = 0.15*delxwind + xlwind; xuaxis = xuaxis - delx; ylaxis = ylaxis + delx; yuaxis = yuaxis - delx; } double xlp = (xlaxis-xlwind)/delxwind*100.; double xup = (xuaxis-xlwind)/delxwind*100.; double ylp = (ylaxis-ylwind)/delywind*100.; double yup = (yuaxis-ylwind)/delywind*100.; // static_cast(xAxisCharacteristics_->Get(wxT("LOWERAXIS")))->SetAsPercent( xlp ); static_cast(xAxisCharacteristics_->Get(wxT("UPPERAXIS")))->SetAsPercent( xup ); static_cast(xAxisCharacteristics_->Get(wxT("NLINCS")))->Set( nlxinc ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( 7 ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); // static_cast(yAxisCharacteristics_->Get(wxT("LOWERAXIS")))->SetAsPercent( ylp ); static_cast(yAxisCharacteristics_->Get(wxT("UPPERAXIS")))->SetAsPercent( yup ); static_cast(yAxisCharacteristics_->Get(wxT("NLINCS")))->Set( nlyinc ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( 7 ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); } if( static_cast(xlog) > 1 ) { xmin = xmin<=0.0 ? std::numeric_limits::min() : log(xmin)/log(xlog); xmax = xmax<=0.0 ? std::numeric_limits::min() : log(xmax)/log(xlog); } if( static_cast(ylog) > 1 ) { ymin = ymin<=0.0 ? std::numeric_limits::min() : log(ymin)/log(ylog); ymax = ymax<=0.0 ? std::numeric_limits::min() : log(ymax)/log(ylog); } static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Set( xmax ); static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Set( xmin ); static_cast(xAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( xmax ); static_cast(xAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( xmin ); static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Set( ymax ); static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Set( ymin ); static_cast(yAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( ymax ); static_cast(yAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( ymin ); GRA_cartesianAxes *cartesianAxes = 0; try { cartesianAxes = new GRA_cartesianAxes( xTmp, yTmp, false, false ); cartesianAxes->Make(); AddDrawableObject( cartesianAxes ); } catch ( EGraphicsError &e ) { delete cartesianAxes; throw; } } drawableVecIter end = drawableObjects_.end(); wxClientDC dc( ExGlobals::GetwxWindow() ); for( drawableVecIter i=drawableObjects_.begin(); i!=end; ++i ) { (*i)->Make(); (*i)->Draw( ExGlobals::GetGraphicsOutput(), dc ); } } void GRA_window::CreateGeneralCharacteristics( double xl, double yl, double xu, double yu ) { double xminw, yminw, xmaxw, ymaxw; ExGlobals::GetWorldLimits( xminw, yminw, xmaxw, ymaxw ); // generalCharacteristics_ = new GRA_setOfCharacteristics(); // generalCharacteristics_->AddDistance( wxT("XLOWERWINDOW"), xl, false, xminw, xmaxw ); generalCharacteristics_->AddDistance( wxT("YLOWERWINDOW"), yl, false, yminw, ymaxw ); generalCharacteristics_->AddDistance( wxT("XUPPERWINDOW"), xu, false, xminw, xmaxw ); generalCharacteristics_->AddDistance( wxT("YUPPERWINDOW"), yu, false, yminw, ymaxw ); generalCharacteristics_->AddString( wxT("AUTOSCALE"), wxString(wxT("ON")) ); generalCharacteristics_->AddColor( wxT("AREAFILLCOLOR"), 0 ); generalCharacteristics_->AddBool( wxT("GRAPHBOX"), true ); generalCharacteristics_->AddColor( wxT("COLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); generalCharacteristics_->AddFont( wxT("FONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); generalCharacteristics_->AddNumber( wxT("LINEWIDTH"), 1 ); generalCharacteristics_->AddNumber( wxT("GRIDLINETYPE"), 7 ); generalCharacteristics_->AddSize( wxT("LEGENDSIZE"), 3.0, true, yl, yu ); generalCharacteristics_->AddSize( wxT("CONTOURLABELHEIGHT"), 2.0, true, yl, yu ); generalCharacteristics_->AddSize( wxT("CONTOURLABELSEPARATION"), 50.0, true, yl, yu ); generalCharacteristics_->AddString( wxT("BACKGROUNDFILE"), wxString(wxT("")) ); generalCharacteristics_->AddColor( wxT("BACKGROUNDCOLOR"), 0 ); generalCharacteristics_->AddNumber( wxT("ARROWHEADWIDTH"), 1.0 ); generalCharacteristics_->AddNumber( wxT("ARROWHEADLENGTH"), 1.0 ); } void GRA_window::SetGeneralDefaults() { static_cast(generalCharacteristics_->Get(wxT("AUTOSCALE")))-> Set( wxString(wxT("ON")) ); static_cast(generalCharacteristics_->Get(wxT("AREAFILLCOLOR")))-> Set( reinterpret_cast(0) ); static_cast(generalCharacteristics_->Get(wxT("GRAPHBOX")))-> Set( true ); static_cast(generalCharacteristics_->Get(wxT("COLOR")))-> Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(generalCharacteristics_->Get(wxT("FONT")))-> Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(generalCharacteristics_->Get(wxT("LINEWIDTH")))-> Set( 1 ); static_cast(generalCharacteristics_->Get(wxT("GRIDLINETYPE")))-> Set( 7 ); static_cast(generalCharacteristics_->Get(wxT("LEGENDSIZE")))-> SetAsPercent( 3.0 ); static_cast(generalCharacteristics_->Get(wxT("CONTOURLABELHEIGHT")))-> SetAsPercent( 2.0 ); static_cast(generalCharacteristics_->Get(wxT("CONTOURLABELSEPARATION")))-> SetAsPercent( 50.0 ); static_cast(generalCharacteristics_->Get(wxT("BACKGROUNDFILE")))-> Set( wxString(wxT("")) ); static_cast(generalCharacteristics_->Get(wxT("BACKGROUNDCOLOR")))-> Set( reinterpret_cast(0) ); static_cast(generalCharacteristics_->Get(wxT("ARROWHEADWIDTH")))-> Set( 1.0 ); static_cast(generalCharacteristics_->Get(wxT("ARROWHEADLENGTH")))-> Set( 1.0 ); } void GRA_window::CreateXAxisCharacteristics( double xl, double yl, double xu, double yu ) { xAxisCharacteristics_ = new GRA_setOfCharacteristics(); // xAxisCharacteristics_->AddBool( wxT("AXISON"), true ); xAxisCharacteristics_->AddColor( wxT("AXISCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); xAxisCharacteristics_->AddNumber( wxT("LINEWIDTH"), 1 ); xAxisCharacteristics_->AddAngle( wxT("AXISANGLE"), 0.0 ); xAxisCharacteristics_->AddDistance( wxT("LOWERAXIS"), 10.0, true, xl, xu ); xAxisCharacteristics_->AddDistance( wxT("UPPERAXIS"), 90.0, true, xl, xu ); xAxisCharacteristics_->AddNumber( wxT("MIN"), 0.0 ); xAxisCharacteristics_->AddNumber( wxT("MAX"), 1.0 ); xAxisCharacteristics_->AddNumber( wxT("VIRTUALMIN"), 0.0 ); xAxisCharacteristics_->AddNumber( wxT("VIRTUALMAX"), 1.0 ); xAxisCharacteristics_->AddNumber( wxT("LOGBASE"), 0.0 ); xAxisCharacteristics_->AddBool( wxT("LOGSTYLE"), true ); xAxisCharacteristics_->AddNumber( wxT("NLINCS"), 0 ); xAxisCharacteristics_->AddNumber( wxT("NSINCS"), 0 ); xAxisCharacteristics_->AddNumber( wxT("GRID"), 0 ); xAxisCharacteristics_->AddBool( wxT("FORCECROSS"), false ); xAxisCharacteristics_->AddBool( wxT("ZERO"), false ); xAxisCharacteristics_->AddString( wxT("LABEL"), wxString(wxT("")) ); xAxisCharacteristics_->AddBool( wxT("LABELON"), false ); xAxisCharacteristics_->AddColor( wxT("LABELCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); xAxisCharacteristics_->AddFont( wxT("LABELFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); xAxisCharacteristics_->AddSize( wxT("LABELHEIGHT"), 3.0, true, yl, yu ); xAxisCharacteristics_->AddBool( wxT("NUMBERSON"), true ); xAxisCharacteristics_->AddColor( wxT("NUMBERSCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); xAxisCharacteristics_->AddFont( wxT("NUMBERSFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); xAxisCharacteristics_->AddSize( wxT("NUMBERSHEIGHT"), 3.0, true, yl, yu ); xAxisCharacteristics_->AddAngle( wxT("NUMBERSANGLE"), 0.0 ); xAxisCharacteristics_->AddNumber( wxT("NUMBEROFDIGITS"), 5 ); xAxisCharacteristics_->AddNumber( wxT("NUMBEROFDECIMALS"), -1 ); xAxisCharacteristics_->AddNumber( wxT("MOD"), 0.0 ); xAxisCharacteristics_->AddBool( wxT("LEADINGZEROS"), false ); xAxisCharacteristics_->AddNumber( wxT("OFFSET"), 0.0 ); xAxisCharacteristics_->AddBool( wxT("DROPFIRSTNUMBER"), false ); xAxisCharacteristics_->AddBool( wxT("DROPLASTNUMBER"), false ); xAxisCharacteristics_->AddBool( wxT("TICSON"), true ); xAxisCharacteristics_->AddBool( wxT("TICSBOTHSIDES"), false ); xAxisCharacteristics_->AddAngle( wxT("TICANGLE"), 90.0 ); xAxisCharacteristics_->AddSize( wxT("LARGETICLENGTH"), 2.0, true, yl, yu ); xAxisCharacteristics_->AddSize( wxT("SMALLTICLENGTH"), 1.0, true, yl, yu ); xAxisCharacteristics_->AddAngle( wxT("IMAGTICANGLE"), 270.0 ); xAxisCharacteristics_->AddSize( wxT("IMAGTICLENGTH"), 1.0, true, yl, yu ); xAxisCharacteristics_->AddNumber( wxT("POWER"), 0.0 ); xAxisCharacteristics_->AddNumber( wxT("POWERAUTO"), 1 ); } void GRA_window::SetXAxisDefaults() { static_cast(xAxisCharacteristics_->Get(wxT("AXISON")))->Set( true ); static_cast(xAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(xAxisCharacteristics_->Get(wxT("LINEWIDTH")))->Set( 1 ); static_cast(xAxisCharacteristics_->Get(wxT("AXISANGLE")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("LOWERAXIS")))->SetAsPercent( 10.0 ); static_cast(xAxisCharacteristics_->Get(wxT("UPPERAXIS")))->SetAsPercent( 90.0 ); static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Set( 1.0 ); static_cast(xAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( 1.0 ); static_cast(xAxisCharacteristics_->Get(wxT("LOGBASE")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("LOGSTYLE")))->Set( true ); static_cast(xAxisCharacteristics_->Get(wxT("NLINCS")))->Set( 0 ); static_cast(xAxisCharacteristics_->Get(wxT("NSINCS")))->Set( 0 ); static_cast(xAxisCharacteristics_->Get(wxT("GRID")))->Set( 0 ); static_cast(xAxisCharacteristics_->Get(wxT("FORCECROSS")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("ZERO")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("LABELON")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("LABEL")))->Set( wxString(wxT("")) ); static_cast(xAxisCharacteristics_->Get(wxT("LABELCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(xAxisCharacteristics_->Get(wxT("LABELFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(xAxisCharacteristics_->Get(wxT("LABELHEIGHT")))->SetAsPercent( 3.0 ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSON")))->Set( true ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( 3.0 ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBERSANGLE")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( 5 ); static_cast(xAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); static_cast(xAxisCharacteristics_->Get(wxT("MOD")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("LEADINGZEROS")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("OFFSET")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("TICSON")))->Set( true ); static_cast(xAxisCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Set( false ); static_cast(xAxisCharacteristics_->Get(wxT("TICANGLE")))->Set( 90.0 ); static_cast(xAxisCharacteristics_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( 2.0 ); static_cast(xAxisCharacteristics_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( 1.0 ); static_cast(xAxisCharacteristics_->Get(wxT("IMAGTICANGLE")))->Set( 270.0 ); static_cast(xAxisCharacteristics_->Get(wxT("IMAGTICLENGTH")))->SetAsPercent( 1.0 ); static_cast(xAxisCharacteristics_->Get(wxT("POWER")))->Set( 0.0 ); static_cast(xAxisCharacteristics_->Get(wxT("POWERAUTO")))->Set( 1 ); } void GRA_window::CreateYAxisCharacteristics( double xl, double yl, double xu, double yu ) { yAxisCharacteristics_ = new GRA_setOfCharacteristics(); // yAxisCharacteristics_->AddBool( wxT("AXISON"), true ); yAxisCharacteristics_->AddColor( wxT("AXISCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); yAxisCharacteristics_->AddNumber( wxT("LINEWIDTH"), 1 ); yAxisCharacteristics_->AddAngle( wxT("AXISANGLE"), 90.0 ); yAxisCharacteristics_->AddDistance( wxT("LOWERAXIS"), 10.0, true, yl, yu ); yAxisCharacteristics_->AddDistance( wxT("UPPERAXIS"), 90.0, true, yl, yu ); yAxisCharacteristics_->AddNumber( wxT("MIN"), 0.0 ); yAxisCharacteristics_->AddNumber( wxT("MAX"), 1.0 ); yAxisCharacteristics_->AddNumber( wxT("VIRTUALMIN"), 0.0 ); yAxisCharacteristics_->AddNumber( wxT("VIRTUALMAX"), 1.0 ); yAxisCharacteristics_->AddNumber( wxT("LOGBASE"), 0.0 ); yAxisCharacteristics_->AddBool( wxT("LOGSTYLE"), true ); yAxisCharacteristics_->AddNumber( wxT("NLINCS"), 0 ); yAxisCharacteristics_->AddNumber( wxT("NSINCS"), 0 ); yAxisCharacteristics_->AddNumber( wxT("GRID"), 0 ); yAxisCharacteristics_->AddBool( wxT("FORCECROSS"), false ); yAxisCharacteristics_->AddBool( wxT("ZERO"), false ); yAxisCharacteristics_->AddString( wxT("LABEL"), wxString(wxT("")) ); yAxisCharacteristics_->AddBool( wxT("LABELON"), false ); yAxisCharacteristics_->AddColor( wxT("LABELCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); yAxisCharacteristics_->AddFont( wxT("LABELFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); yAxisCharacteristics_->AddSize( wxT("LABELHEIGHT"), 3.0, true, yl, yu ); yAxisCharacteristics_->AddBool( wxT("NUMBERSON"), true ); yAxisCharacteristics_->AddColor( wxT("NUMBERSCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); yAxisCharacteristics_->AddFont( wxT("NUMBERSFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); yAxisCharacteristics_->AddSize( wxT("NUMBERSHEIGHT"), 3.0, true, yl, yu ); yAxisCharacteristics_->AddAngle( wxT("NUMBERSANGLE"), 0.0 ); yAxisCharacteristics_->AddNumber( wxT("NUMBEROFDIGITS"), 5 ); yAxisCharacteristics_->AddNumber( wxT("NUMBEROFDECIMALS"), -1 ); yAxisCharacteristics_->AddNumber( wxT("MOD"), 0.0 ); yAxisCharacteristics_->AddBool( wxT("LEADINGZEROS"), false ); yAxisCharacteristics_->AddNumber( wxT("OFFSET"), 0.0 ); yAxisCharacteristics_->AddBool( wxT("DROPFIRSTNUMBER"), false ); yAxisCharacteristics_->AddBool( wxT("DROPLASTNUMBER"), false ); yAxisCharacteristics_->AddBool( wxT("TICSON"), true ); yAxisCharacteristics_->AddBool( wxT("TICSBOTHSIDES"), false ); yAxisCharacteristics_->AddAngle( wxT("TICANGLE"), 270.0 ); yAxisCharacteristics_->AddSize( wxT("LARGETICLENGTH"), 2.0, true, xl, xu ); yAxisCharacteristics_->AddSize( wxT("SMALLTICLENGTH"), 1.0, true, xl, xu ); yAxisCharacteristics_->AddAngle( wxT("IMAGTICANGLE"), 90.0 ); yAxisCharacteristics_->AddSize( wxT("IMAGTICLENGTH"), 1.0, true, xl, xu ); yAxisCharacteristics_->AddNumber( wxT("POWER"), 0.0 ); yAxisCharacteristics_->AddNumber( wxT("POWERAUTO"), 1 ); } void GRA_window::SetYAxisDefaults() { static_cast(yAxisCharacteristics_->Get(wxT("AXISON")))->Set( true ); static_cast(yAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(yAxisCharacteristics_->Get(wxT("LINEWIDTH")))->Set( 1 ); static_cast(yAxisCharacteristics_->Get(wxT("AXISANGLE")))->Set( 90.0 ); static_cast(yAxisCharacteristics_->Get(wxT("LOWERAXIS")))->SetAsPercent( 10.0 ); static_cast(yAxisCharacteristics_->Get(wxT("UPPERAXIS")))->SetAsPercent( 90.0 ); static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Set( 1.0 ); static_cast(yAxisCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( 1.0 ); static_cast(yAxisCharacteristics_->Get(wxT("LOGBASE")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("LOGSTYLE")))->Set( true ); static_cast(yAxisCharacteristics_->Get(wxT("NLINCS")))->Set( 0 ); static_cast(yAxisCharacteristics_->Get(wxT("NSINCS")))->Set( 0 ); static_cast(yAxisCharacteristics_->Get(wxT("GRID")))->Set( 0 ); static_cast(yAxisCharacteristics_->Get(wxT("FORCECROSS")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("ZERO")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("LABELON")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("LABEL")))->Set( wxString(wxT("")) ); static_cast(yAxisCharacteristics_->Get(wxT("LABELCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(yAxisCharacteristics_->Get(wxT("LABELFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(yAxisCharacteristics_->Get(wxT("LABELHEIGHT")))->SetAsPercent( 3.0 ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSON")))->Set( true ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( 3.0 ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBERSANGLE")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( 5 ); static_cast(yAxisCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); static_cast(yAxisCharacteristics_->Get(wxT("MOD")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("LEADINGZEROS")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("OFFSET")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("TICSON")))->Set( true ); static_cast(yAxisCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Set( false ); static_cast(yAxisCharacteristics_->Get(wxT("TICANGLE")))->Set( 270.0 ); static_cast(yAxisCharacteristics_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( 2.0 ); static_cast(yAxisCharacteristics_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( 1.0 ); static_cast(yAxisCharacteristics_->Get(wxT("IMAGTICANGLE")))->Set( 90.0 ); static_cast(yAxisCharacteristics_->Get(wxT("IMAGTICLENGTH")))->SetAsPercent( 1.0 ); static_cast(yAxisCharacteristics_->Get(wxT("POWER")))->Set( 0.0 ); static_cast(yAxisCharacteristics_->Get(wxT("POWERAUTO")))->Set( 1 ); } void GRA_window::CreateGraphLegendCharacteristics( double xl, double yl, double xu, double yu ) { graphLegendCharacteristics_ = new GRA_setOfCharacteristics(); // graphLegendCharacteristics_->AddBool( wxT("ON"), false ); graphLegendCharacteristics_->AddBool( wxT("ENTRYLINEON"), true ); graphLegendCharacteristics_->AddBool( wxT("FRAMEON"), true ); graphLegendCharacteristics_->AddDistance( wxT("FRAMEXLO"), 15.0, true, xl, xu ); graphLegendCharacteristics_->AddDistance( wxT("FRAMEYLO"), 70.0, true, yl, yu ); graphLegendCharacteristics_->AddDistance( wxT("FRAMEXHI"), 50.0, true, xl, xu ); graphLegendCharacteristics_->AddDistance( wxT("FRAMEYHI"), 90.0, true, yl, yu ); graphLegendCharacteristics_->AddColor( wxT("FRAMECOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); graphLegendCharacteristics_->AddBool( wxT("TRANSPARENCY"), true ); graphLegendCharacteristics_->AddNumber( wxT("SYMBOLS"), 1 ); graphLegendCharacteristics_->AddBool( wxT("TITLEON"), true ); graphLegendCharacteristics_->AddString( wxT("TITLE"), wxString(wxT("")) ); graphLegendCharacteristics_->AddSize( wxT("TITLEHEIGHT"), 3.0, true, yl, yu ); graphLegendCharacteristics_->AddColor( wxT("TITLECOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); graphLegendCharacteristics_->AddFont( wxT("TITLEFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); } void GRA_window::SetGraphLegendDefaults() { static_cast(graphLegendCharacteristics_->Get(wxT("ON")))->Set( false ); static_cast(graphLegendCharacteristics_->Get(wxT("ENTRYLINEON")))->Set( true ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEON")))->Set( true ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEXLO")))->SetAsPercent( 15.0 ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEYLO")))->SetAsPercent( 70.0 ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEXHI")))->SetAsPercent( 50.0 ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMEYHI")))->SetAsPercent( 90.0 ); static_cast(graphLegendCharacteristics_->Get(wxT("FRAMECOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(graphLegendCharacteristics_->Get(wxT("TRANSPARENCY")))->Set( true ); static_cast(graphLegendCharacteristics_->Get(wxT("SYMBOLS")))->Set( 1 ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLEON")))->Set( true ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLE")))->Set( wxString(wxT("")) ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLEHEIGHT")))->SetAsPercent( 3.0 ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLECOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(graphLegendCharacteristics_->Get(wxT("TITLEFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); } void GRA_window::CreateDataCurveCharacteristics( double yl, double yu ) { dataCurveCharacteristics_ = new GRA_setOfCharacteristics(); // dataCurveCharacteristics_->AddNumber( wxT("HISTOGRAMTYPE"), 0 ); dataCurveCharacteristics_->AddColor( wxT("CURVECOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); dataCurveCharacteristics_->AddNumber( wxT("CURVELINEWIDTH"), 1 ); dataCurveCharacteristics_->AddNumber( wxT("CURVELINETYPE"), 1 ); dataCurveCharacteristics_->AddSize( wxT("PLOTSYMBOLSIZE"), 2.0, true, yl, yu ); dataCurveCharacteristics_->AddAngle( wxT("PLOTSYMBOLANGLE"), 0.0 ); dataCurveCharacteristics_->AddColor( wxT("PLOTSYMBOLCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); dataCurveCharacteristics_->AddNumber( wxT("PLOTSYMBOLLINEWIDTH"), 1 ); dataCurveCharacteristics_->AddNumber( wxT("PLOTSYMBOL"), 0 ); dataCurveCharacteristics_->AddBool( wxT("CLIP"), true ); } void GRA_window::SetDataCurveDefaults() { static_cast(dataCurveCharacteristics_->Get(wxT("HISTOGRAMTYPE")))->Set( 0 ); static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(dataCurveCharacteristics_->Get(wxT("CURVELINEWIDTH")))->Set( 1 ); static_cast(dataCurveCharacteristics_->Get(wxT("CURVELINETYPE")))->Set( 1 ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL")))->Set( 0 ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLSIZE")))->SetAsPercent( 2.0 ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLANGLE")))->Set( 0.0 ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOLLINEWIDTH")))->Set( 1 ); static_cast(dataCurveCharacteristics_->Get(wxT("CLIP")))->Set( true ); } void GRA_window::CreateTextCharacteristics( double xl, double yl, double xu, double yu ) { textCharacteristics_ = new GRA_setOfCharacteristics(); // textCharacteristics_->AddNumber( wxT("ALIGNMENT"), 1 ); textCharacteristics_->AddAngle( wxT("ANGLE"), 0.0 ); textCharacteristics_->AddColor( wxT("COLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); textCharacteristics_->AddFont( wxT("FONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); textCharacteristics_->AddSize( wxT("HEIGHT"), 3.0, true, yl, yu ); textCharacteristics_->AddBool( wxT("INTERACTIVE"), true ); textCharacteristics_->AddDistance( wxT("XLOCATION"), 50.0, true, xl, xu ); textCharacteristics_->AddDistance( wxT("YLOCATION"), 50.0, true, yl, yu ); } void GRA_window::SetTextDefaults() { static_cast(textCharacteristics_->Get(wxT("ALIGNMENT")))->Set( 1 ); static_cast(textCharacteristics_->Get(wxT("ANGLE")))->Set( 0.0 ); static_cast(textCharacteristics_->Get(wxT("COLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(textCharacteristics_->Get(wxT("FONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(textCharacteristics_->Get(wxT("HEIGHT")))->SetAsPercent( 3.0 ); static_cast(textCharacteristics_->Get(wxT("INTERACTIVE")))->Set( true ); static_cast(textCharacteristics_->Get(wxT("XLOCATION")))->SetAsPercent( 50.0 ); static_cast(textCharacteristics_->Get(wxT("YLOCATION")))->SetAsPercent( 50.0 ); } void GRA_window::CreatePolarCharacteristics( double xl, double yl, double xu, double yu ) { polarCharacteristics_ = new GRA_setOfCharacteristics(); // polarCharacteristics_->AddDistance( wxT("XORIGIN"), 50.0, true, xl, xu ); polarCharacteristics_->AddDistance( wxT("YORIGIN"), 50.0, true, yl, yu ); polarCharacteristics_->AddSize( wxT("AXISLENGTH"), 30.0, true, xl, xu ); polarCharacteristics_->AddNumber( wxT("NAXES"), 4 ); polarCharacteristics_->AddBool( wxT("AXISON"), true ); polarCharacteristics_->AddColor( wxT("AXISCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); polarCharacteristics_->AddBool( wxT("CLOCKWISE"), false ); polarCharacteristics_->AddBool( wxT("COMPASSLABELS"), false ); polarCharacteristics_->AddNumber( wxT("LINEWIDTH"), 1 ); polarCharacteristics_->AddAngle( wxT("AXISANGLE"), 0.0 ); polarCharacteristics_->AddNumber( wxT("MIN"), 0.0 ); polarCharacteristics_->AddNumber( wxT("MAX"), 1.0 ); polarCharacteristics_->AddNumber( wxT("VIRTUALMIN"), 0.0 ); polarCharacteristics_->AddNumber( wxT("VIRTUALMAX"), 1.0 ); polarCharacteristics_->AddNumber( wxT("LOGBASE"), 0.0 ); polarCharacteristics_->AddBool( wxT("LOGSTYLE"), true ); polarCharacteristics_->AddNumber( wxT("NLINCS"), 0 ); polarCharacteristics_->AddNumber( wxT("NSINCS"), 0 ); polarCharacteristics_->AddNumber( wxT("GRID"), 0 ); polarCharacteristics_->AddString( wxT("LABEL"), wxString(wxT("")) ); polarCharacteristics_->AddBool( wxT("LABELON"), false ); polarCharacteristics_->AddColor( wxT("LABELCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); polarCharacteristics_->AddFont( wxT("LABELFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); polarCharacteristics_->AddSize( wxT("LABELHEIGHT"), 3.0, true, yl, yu ); polarCharacteristics_->AddBool( wxT("NUMBERSON"), true ); polarCharacteristics_->AddColor( wxT("NUMBERSCOLOR"), GRA_colorControl::GetColor(wxT("BLACK")) ); polarCharacteristics_->AddFont( wxT("NUMBERSFONT"), GRA_fontControl::GetFont(wxT("SWISS")) ); polarCharacteristics_->AddSize( wxT("NUMBERSHEIGHT"), 3.0, true, yl, yu ); polarCharacteristics_->AddAngle( wxT("NUMBERSANGLE"), 0.0 ); polarCharacteristics_->AddNumber( wxT("NUMBEROFDIGITS"), 5 ); polarCharacteristics_->AddNumber( wxT("NUMBEROFDECIMALS"), -1 ); polarCharacteristics_->AddNumber( wxT("MOD"), 0.0 ); polarCharacteristics_->AddBool( wxT("LEADINGZEROS"), false ); polarCharacteristics_->AddNumber( wxT("OFFSET"), 0.0 ); polarCharacteristics_->AddBool( wxT("DROPFIRSTNUMBER"), false ); polarCharacteristics_->AddBool( wxT("DROPLASTNUMBER"), false ); polarCharacteristics_->AddBool( wxT("TICSON"), true ); polarCharacteristics_->AddBool( wxT("TICSBOTHSIDES"), false ); polarCharacteristics_->AddAngle( wxT("TICANGLE"), 90.0 ); polarCharacteristics_->AddSize( wxT("LARGETICLENGTH"), 2.0, true, yl, yu ); polarCharacteristics_->AddSize( wxT("SMALLTICLENGTH"), 1.0, true, yl, yu ); polarCharacteristics_->AddAngle( wxT("IMAGTICANGLE"), 270.0 ); polarCharacteristics_->AddSize( wxT("IMAGTICLENGTH"), 1.0, true, yl, yu ); polarCharacteristics_->AddNumber( wxT("POWER"), 0.0 ); polarCharacteristics_->AddNumber( wxT("POWERAUTO"), 1 ); } void GRA_window::SetPolarDefaults() { static_cast(polarCharacteristics_->Get(wxT("XORIGIN")))->SetAsPercent( 50.0 ); static_cast(polarCharacteristics_->Get(wxT("YORIGIN")))->SetAsPercent( 50.0 ); static_cast(polarCharacteristics_->Get(wxT("AXISLENGTH")))->SetAsPercent( 30.0 ); static_cast(polarCharacteristics_->Get(wxT("NAXES")))->Set( 4 ); static_cast(polarCharacteristics_->Get(wxT("AXISON")))->Set( true ); static_cast(polarCharacteristics_->Get(wxT("AXISCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(polarCharacteristics_->Get(wxT("CLOCKWISE")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("COMPASSLABELS")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("LINEWIDTH")))->Set( 1 ); static_cast(polarCharacteristics_->Get(wxT("AXISANGLE")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("MIN")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("MAX")))->Set( 1.0 ); static_cast(polarCharacteristics_->Get(wxT("VIRTUALMIN")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("VIRTUALMAX")))->Set( 1.0 ); static_cast(polarCharacteristics_->Get(wxT("LOGBASE")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("LOGSTYLE")))->Set( true ); static_cast(polarCharacteristics_->Get(wxT("NLINCS")))->Set( 0 ); static_cast(polarCharacteristics_->Get(wxT("NSINCS")))->Set( 0 ); static_cast(polarCharacteristics_->Get(wxT("GRID")))->Set( 0 ); static_cast(polarCharacteristics_->Get(wxT("LABELON")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("LABEL")))->Set( wxString(wxT("")) ); static_cast(polarCharacteristics_->Get(wxT("LABELCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(polarCharacteristics_->Get(wxT("LABELFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(polarCharacteristics_->Get(wxT("LABELHEIGHT")))->SetAsPercent( 3.0 ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSON")))->Set( true ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSFONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( 3.0 ); static_cast(polarCharacteristics_->Get(wxT("NUMBERSANGLE")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( 5 ); static_cast(polarCharacteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); static_cast(polarCharacteristics_->Get(wxT("MOD")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("LEADINGZEROS")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("OFFSET")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("DROPFIRSTNUMBER")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("DROPLASTNUMBER")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("TICSON")))->Set( true ); static_cast(polarCharacteristics_->Get(wxT("TICSBOTHSIDES")))->Set( false ); static_cast(polarCharacteristics_->Get(wxT("TICANGLE")))->Set( 90.0 ); static_cast(polarCharacteristics_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( 2.0 ); static_cast(polarCharacteristics_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( 1.0 ); static_cast(polarCharacteristics_->Get(wxT("IMAGTICANGLE")))->Set( 270.0 ); static_cast(polarCharacteristics_->Get(wxT("IMAGTICLENGTH")))->SetAsPercent( 1.0 ); static_cast(polarCharacteristics_->Get(wxT("POWER")))->Set( 0.0 ); static_cast(polarCharacteristics_->Get(wxT("POWERAUTO")))->Set( 1 ); } void GRA_window::WorldToPercent( double x, double y, double &xout, double &yout ) const { // convert x and y from world units to percentages of the window // double xlwind = static_cast(generalCharacteristics_->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalCharacteristics_->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double ylwind = static_cast(generalCharacteristics_->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double yuwind = static_cast(generalCharacteristics_->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); xout = 100.*(x-xlwind)/(xuwind-xlwind); yout = 100.*(y-ylwind)/(yuwind-ylwind); } void GRA_window::PercentToWorld( double x, double y, double &xout, double &yout ) const { // convert x and y from percentages of the window to world // double xlwind = static_cast(generalCharacteristics_->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalCharacteristics_->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double ylwind = static_cast(generalCharacteristics_->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double yuwind = static_cast(generalCharacteristics_->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); xout = x*(xuwind-xlwind)/100. + xlwind; yout = y*(yuwind-ylwind)/100. + ylwind; } void GRA_window::GraphToWorld( double xg, double yg, double &xw, double &yw, bool reset ) const { // convert from graph units to world units // static double xlog, ylog, xlaxis, ylaxis, cosx, sinx, cosy, siny, ax, bx, ay, by, xmin, ymin; if( reset )GetValues( xlog, ylog, xlaxis, ylaxis, cosx, sinx, cosy, siny, ax, bx, ay, by, xmin, ymin ); if( static_cast(xlog) > 1 ) { if( xg <= 0.0 )xg = std::numeric_limits::min(); xg = log(xg)/log(xlog); // linearize } if( static_cast(ylog) > 1 ) { if( yg <= 0.0 )yg = std::numeric_limits::min(); yg = log(yg)/log(ylog); // linearize } xw = xlaxis + cosx*(ax*xg+bx) + cosy*(ay*yg+by); yw = ylaxis + sinx*(ax*xg+bx) + siny*(ay*yg+by); } void GRA_window::GraphToWorld( std::vector const &xg, std::vector const &yg, std::vector &xw, std::vector &yw ) const { std::size_t const size = xg.size(); xw.resize( size ); yw.resize( size ); GraphToWorld( xg[0], yg[0], xw[0], yw[0], true ); for( std::size_t i=1; i(polarCharacteristics_->Get(wxT("AXISANGLE")))->Get(); xorigin = static_cast(polarCharacteristics_->Get(wxT("XORIGIN")))->GetAsWorld(); yorigin = static_cast(polarCharacteristics_->Get(wxT("YORIGIN")))->GetAsWorld(); double const length = static_cast(polarCharacteristics_->Get(wxT("AXISLENGTH")))->GetAsWorld(); double const max = static_cast(polarCharacteristics_->Get(wxT("MAX")))->Get(); a = max!=0.0 ? length/max : 1.0; clockwise = static_cast(polarCharacteristics_->Get(wxT("CLOCKWISE")))->Get(); } if( clockwise )theta *= -1.0; double angle = (theta+axisa)*M_PI/180.0; xw = xorigin + a*r*cos(angle); yw = yorigin + a*r*sin(angle); } void GRA_window::PolarToWorld( std::vector const &r, std::vector const &theta, std::vector &xw, std::vector &yw ) const { std::size_t const size = r.size(); xw.resize( size ); yw.resize( size ); for( std::size_t i=0; i(xlog) > 1 ) { if( xg*log(xlog) > log(std::numeric_limits::max()) ) throw EGraphicsError(wxT("problem with x-axis log scales")); xg = exp(xg*log(xlog)); } if( static_cast(ylog) > 1 ) { if( yg*log(ylog) > log(std::numeric_limits::max()) ) throw EGraphicsError(wxT("problem with y-axis log scales")); yg = exp(yg*log(ylog)); } } void GRA_window::GetValues( double &xlog, double &ylog, double &xlaxis, double &ylaxis, double &cosx, double &sinx, double &cosy, double &siny, double &ax, double &bx, double &ay, double &by, double &xmin, double &ymin ) const { xlog = static_cast(xAxisCharacteristics_->Get(wxT("LOGBASE")))->Get(); ylog = static_cast(yAxisCharacteristics_->Get(wxT("LOGBASE")))->Get(); xmin = static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Get(); double const xmax = static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Get(); ymin = static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Get(); double const ymax = static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Get(); double const xuaxis = static_cast(xAxisCharacteristics_->Get(wxT("UPPERAXIS")))->GetAsWorld(); xlaxis = static_cast(xAxisCharacteristics_->Get(wxT("LOWERAXIS")))->GetAsWorld(); double const yuaxis = static_cast(yAxisCharacteristics_->Get(wxT("UPPERAXIS")))->GetAsWorld(); ylaxis = static_cast(yAxisCharacteristics_->Get(wxT("LOWERAXIS")))->GetAsWorld(); double const degreesToRadians = M_PI/180.; double const xaxisa = static_cast(xAxisCharacteristics_->Get(wxT("AXISANGLE")))->Get(); double const yaxisa = static_cast(yAxisCharacteristics_->Get(wxT("AXISANGLE")))->Get(); cosx = cos( xaxisa*degreesToRadians ); cosy = cos( yaxisa*degreesToRadians ); sinx = sin( xaxisa*degreesToRadians ); siny = sin( yaxisa*degreesToRadians ); double const eps = 0.000001; if( fabs(cosx) < eps )cosx = 0.0; if( fabs(cosy) < eps )cosy = 0.0; if( fabs(sinx) < eps )sinx = 0.0; if( fabs(siny) < eps )siny = 0.0; ax = xmax!=xmin ? (xuaxis-xlaxis)/(xmax-xmin) : 1.0; ay = ymax!=ymin ? (yuaxis-ylaxis)/(ymax-ymin) : 1.0; bx = -ax*xmin; by = -ay*ymin; } bool GRA_window::InsideWindow( double x, double y ) const { if( !drawableObjects_.empty() ) { double xlw = static_cast(generalCharacteristics_->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double ylw = static_cast(generalCharacteristics_->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double xuw = static_cast(generalCharacteristics_->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double yuw = static_cast(generalCharacteristics_->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); std::vector xv, yv; xv.push_back(xlw); yv.push_back(ylw); xv.push_back(xuw); yv.push_back(ylw); xv.push_back(xuw); yv.push_back(yuw); xv.push_back(xlw); yv.push_back(yuw); if( UsefulFunctions::InsidePolygon(x,y,xv,yv) )return true; } return false; } void GRA_window::StartLine( double x, double y, double &xw, double &yw ) { // x, y are in graph units, returns xw, yw in world units // // must call StartLine before calling ContinueLine // double xmin = static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Get(); bool clip = static_cast(dataCurveCharacteristics_->Get(wxT("CLIP")))->Get(); // if( !clip || ((x-xmin)*(xmax-x)>=0.0 && (y-ymin)*(ymax-y)>=0.0) )GraphToWorld(x,y,xw,yw); xPrevious_ = x; yPrevious_ = y; } void GRA_window::ContinueLine( double x, double y, double *xw, double *yw, int &ndraw ) { // x, y are in graph units, xw, yw are in world units // xw, yw are arrays with 2 elements, ndraw returns the number of elements used // // must call StartLine before calling ContinueLine // since xPrevious_, yPrevious_ are assumed here to have appropriate values // double xmin = static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Get(); bool clip = static_cast(dataCurveCharacteristics_->Get(wxT("CLIP")))->Get(); // double xdraw[2], ydraw[2]; if( clip ) { UsefulFunctions::WindowClip( xPrevious_, yPrevious_, x, y, xmin, xmax, ymin, ymax, xdraw, ydraw, ndraw ); if( ndraw == 1 ) { GraphToWorld( xdraw[0], ydraw[0], xw[0], yw[0] ); } else if( ndraw==2 || ndraw==3 ) { GraphToWorld( xdraw[0], ydraw[0], xw[0], yw[0] ); GraphToWorld( xdraw[1], ydraw[1], xw[1], yw[1] ); } } else // not clip { ndraw = 1; GraphToWorld( x, y, xw[0], yw[0] ); } xPrevious_ = x; yPrevious_ = y; } void GRA_window::DisplayBackground( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { double xminw, yminw, xmaxw, ymaxw; ExGlobals::GetWorldLimits( xminw, yminw, xmaxw, ymaxw ); double xl = xminw+xLoP_*(xmaxw-xminw)/100.0; double yl = yminw+yLoP_*(ymaxw-yminw)/100.0; double xu = xminw+xHiP_*(xmaxw-xminw)/100.0; double yu = yminw+yHiP_*(ymaxw-yminw)/100.0; GRA_color *bgcolor = static_cast(generalCharacteristics_->Get(wxT("BACKGROUNDCOLOR")))->Get(); wxString bgfile( static_cast(generalCharacteristics_->Get(wxT("BACKGROUNDFILE")))->Get() ); ExGlobals::SetClippingBoundary( xl, yl, xu, yu ); if( bgcolor ) { std::auto_ptr rect( new GRA_rectangle(xl,yl,xu,yu,0.0,false,bgcolor,bgcolor) ); rect->Draw( graphicsOutput, dc ); } else if( !bgfile.empty() ) { wxImage image( bgfile, wxBITMAP_TYPE_PNG ); // int xl1, yl1, xu1, yu1; graphicsOutput->WorldToOutputType( xl, yl, xl1, yl1 ); graphicsOutput->WorldToOutputType( xu, yu, xu1, yu1 ); // int dx = abs(xu1-xl1); int dy = abs(yu1-yl1); image.Rescale( dx, dy ); wxBitmap *bitmap = new wxBitmap( image ); // dc.DrawBitmap( *bitmap, xl1, std::min(yl1,yu1) ); delete bitmap; } ExGlobals::ResetClippingBoundary(); } void GRA_window::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { DisplayBackground( graphicsOutput, dc ); try { drawableVecIter end = drawableObjects_.end(); for( drawableVecIter i=drawableObjects_.begin(); i!=end; ++i ) (*i)->Draw( graphicsOutput, dc ); } catch( EGraphicsError const &e ) { throw; } } void GRA_window::RemoveLastTextString() { wxWindow *wx = ExGlobals::GetwxWindow(); wxClientDC dc( wx ); for( int i=static_cast(drawableObjects_.size())-1; i>=0; --i ) { if( drawableObjects_[i]->IsaDrawableText() ) { static_cast(drawableObjects_[i])->Erase( ExGlobals::GetGraphicsOutput(), dc ); drawableObjects_.erase( drawableObjects_.begin()+i ); break; } } } void GRA_window::RemoveLastArrow() { for( int i=static_cast(drawableObjects_.size())-1; i>=0; --i ) { if( drawableObjects_[i]->IsaPolygon() ) { GRA_polygon *polygon = reinterpret_cast(drawableObjects_[i]); if( polygon->IsaArrow1() || polygon->IsaArrow2() ) { drawableObjects_.erase( drawableObjects_.begin()+i ); break; } } else if( drawableObjects_[i]->IsaMultilineFigure() ) { GRA_multiLineFigure *multiline = reinterpret_cast(drawableObjects_[i]); if( multiline->IsaArrow3() ) { drawableObjects_.erase( drawableObjects_.begin()+i ); break; } } } } void GRA_window::RemoveLastPolygon() { for( int i=static_cast(drawableObjects_.size())-1; i>=0; --i ) { if( drawableObjects_[i]->IsaPolygon() ) { GRA_polygon *polygon = reinterpret_cast(drawableObjects_[i]); if( polygon->IsaRectangle() || polygon->IsaRegular() || polygon->Isa5PtStar() ) { drawableObjects_.erase( drawableObjects_.begin()+i ); break; } } } } void GRA_window::RemoveLastEllipse() { for( int i=static_cast(drawableObjects_.size())-1; i>=0; --i ) { if( drawableObjects_[i]->IsaEllipse() ) { drawableObjects_.erase( drawableObjects_.begin()+i ); break; } } } void GRA_window::DrawZerolines( bool horizontal, bool vertical ) { GRA_wxWidgets *monitor = ExGlobals::GetGraphicsOutput(); double xmin = static_cast(xAxisCharacteristics_->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisCharacteristics_->Get(wxT("MAX")))->Get(); double xlog = static_cast(xAxisCharacteristics_->Get(wxT("LOGBASE")))->Get(); double ymin = static_cast(yAxisCharacteristics_->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisCharacteristics_->Get(wxT("MAX")))->Get(); double ylog = static_cast(yAxisCharacteristics_->Get(wxT("LOGBASE")))->Get(); // if( xlog > 1.0 ) { if( xmin*log(xlog) > log(std::numeric_limits::max()) ) throw EGraphicsError( wxT("problem with x-axis log scales min") ); if( xmax*log(xlog) > log(std::numeric_limits::max()) ) throw EGraphicsError( wxT("problem with x-axis log scales max")); xmin = pow(xlog,xmin); xmax = pow(xlog,xmax); } if( ylog > 1.0 ) { if( ymin*log(ylog) > log(std::numeric_limits::max()) ) throw EGraphicsError( wxT("problem with y-axis log scales min")); if( ymax*log(ylog) > log(std::numeric_limits::max()) ) throw EGraphicsError( wxT("problem with y-axis log scales max")); ymin = pow(ylog,ymin); ymax = pow(ylog,ymax); } std::vector xTmp, yTmp, zTmp, xe1, ye1, xe2, ye2; xTmp.push_back( xmin ); xTmp.push_back( xmax ); yTmp.push_back( ymin ); yTmp.push_back( ymax ); zTmp.push_back( 0.0 ); zTmp.push_back( 0.0 ); // wxClientDC dc( ExGlobals::GetwxWindow() ); if( horizontal ) { GRA_intCharacteristic plotsymbolSave( *static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL"))) ); GRA_colorCharacteristic curveColorSave( *static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR"))) ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL")))->Set( 0 ); GRA_color *axisColor = static_cast(xAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Get(); static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR")))->Set( axisColor ); GRA_cartesianCurve *cartesianCurve = new GRA_cartesianCurve( xTmp, zTmp, xe1, ye1, xe2, ye2 ); if( !cartesianCurve )throw EGraphicsError( wxT("could not make new horizontal zero line") ); try { cartesianCurve->Make(); } catch (EGraphicsError &e) { *static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL"))) = plotsymbolSave; *static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR"))) = curveColorSave; delete cartesianCurve; throw; } cartesianCurve->Draw( monitor, dc ); AddDrawableObject( cartesianCurve ); *static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL"))) = plotsymbolSave; *static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR"))) = curveColorSave; } if( vertical ) { GRA_intCharacteristic plotsymbolSave( *static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL"))) ); GRA_colorCharacteristic curveColorSave( *static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR"))) ); static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL")))->Set( 0 ); GRA_color *axisColor = static_cast(yAxisCharacteristics_->Get(wxT("AXISCOLOR")))->Get(); static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR")))->Set( axisColor ); GRA_cartesianCurve *cartesianCurve = new GRA_cartesianCurve( zTmp, yTmp, xe1, ye1, xe2, ye2 ); if( !cartesianCurve )throw EGraphicsError( wxT("could not make new vertical zero line") ); try { cartesianCurve->Make(); } catch (EGraphicsError &e) { *static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL"))) = plotsymbolSave; *static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR"))) = curveColorSave; delete cartesianCurve; throw; } cartesianCurve->Draw( monitor, dc ); AddDrawableObject( cartesianCurve ); *static_cast(dataCurveCharacteristics_->Get(wxT("PLOTSYMBOL"))) = plotsymbolSave; *static_cast(dataCurveCharacteristics_->Get(wxT("CURVECOLOR"))) = curveColorSave; } } std::ostream &operator<<( std::ostream &out, GRA_window const &gw ) { out << "\n" << "\n" << *gw.xAxisCharacteristics_ << "\n" << "\n" << *gw.yAxisCharacteristics_ << "\n" << "\n" << *gw.generalCharacteristics_ << "\n" << "\n" << *gw.textCharacteristics_ << "\n" << "\n" << *gw.graphLegendCharacteristics_ << "\n" << "\n" << *gw.dataCurveCharacteristics_ << "\n" << "\n" << *gw.polarCharacteristics_ << "\n" << "\n"; GRA_window::drawableVecIter end = gw.drawableObjects_.end(); for( GRA_window::drawableVecIter i=gw.drawableObjects_.begin(); i!=end; ++i ) { if( (*i)->IsaPolyline() )out << *(static_cast(*i)); else if( (*i)->IsaDrawableText() )out << *(static_cast(*i)); else if( (*i)->IsaCartesianAxes() )out << *(static_cast(*i)); else if( (*i)->IsaCartesianCurve() )out << *(static_cast(*i)); else if( (*i)->IsaGraphLegend() )out << *(static_cast(*i)); else if( (*i)->IsaPoint() )out << *(static_cast(*i)); else if( (*i)->IsaEllipse() )out << *(static_cast(*i)); else if( (*i)->IsaPolygon() )out << *(static_cast(*i)); else if( (*i)->IsaMultilineFigure() )out << *(static_cast(*i)); else if( (*i)->IsaPlotsymbol() )out << *(static_cast(*i)); else if( (*i)->IsaContour() )out << *(static_cast(*i)); else if( (*i)->IsaBoxPlot() )out << *(static_cast(*i)); else if( (*i)->IsaDitheringPlot() )out << *(static_cast(*i)); else if( (*i)->IsaDiffusionPlot() )out << *(static_cast(*i)); else if( (*i)->IsaGradientPlot() )out << *(static_cast(*i)); //else if( (*i)->IsaThreeDFigure() )out << *(static_cast(*i)); } return out << "\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_ellipse.cpp0000644012702201742730000000654211333106653017400 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_ellipse.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" GRA_ellipse::GRA_ellipse( double xmin, double ymin, double xmax, double ymax, bool circle, GRA_color *lineColor, GRA_color *fillColor, int lineWidth, int lineType ) : GRA_shape(lineColor,fillColor,lineWidth,lineType,wxT("ELLIPSE")) { xmin_ = xmin; ymin_ = ymin; xmax_ = xmax; ymax_ = ymax; circle_ = circle; if( xmin > xmax ) { xmin_ = xmax; xmax_ = xmin; } if( ymin > ymax ) { ymax_ = ymin; ymin_ = ymax; } double dx = xmax_ - xmin_; double dy = ymax_ - ymin_; if( circle_ ) { if( dy > dx ) { ymax_ = ymin_ + dx; dy = dx; } else if( dy < dx ) { xmax_ = xmin_ + dy; dx = dy; } majorAxis_ = dx; minorAxis_ = dx; } else { majorAxis_ = std::max(dx,dy); minorAxis_ = std::min(dx,dy); } xc_ = 0.5*(xmax_+xmin_); yc_ = 0.5*(ymax_+ymin_); } void GRA_ellipse::CopyStuff( GRA_ellipse const &rhs ) { xmin_ = rhs.xmin_; ymin_ = rhs.ymin_; xmax_ = rhs.xmax_; ymax_ = rhs.ymax_; circle_ = rhs.circle_; minorAxis_ = rhs.minorAxis_; majorAxis_ = rhs.majorAxis_; } void GRA_ellipse::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { int xll, yll, xur, yur; graphicsOutput->WorldToOutputType( xmin_, ymin_, xll, yll ); graphicsOutput->WorldToOutputType( xmax_, ymax_, xur, yur ); int width = xur - xll; int height = yur - yll; wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(lineColor_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); wxBrush wxbrush( dc.GetBrush() ); if( fillColor_ ) { wxbrush.SetColour( ExGlobals::GetwxColor(fillColor_) ); wxbrush.SetStyle( wxSOLID ); dc.SetBrush( wxbrush ); dc.DrawEllipse( static_cast(xll+0.5), static_cast(yll+0.5), width, height ); } wxbrush.SetStyle( wxTRANSPARENT ); dc.SetBrush( wxbrush ); dc.DrawEllipse( static_cast(xll+0.5), static_cast(yll+0.5), width, height ); } std::ostream &operator<<( std::ostream &out, GRA_ellipse const &ellipse ) { return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_ellipse.h0000644012702201742730000000332511274636605017052 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_ELLIPSE #define GRA_ELLIPSE #include #include "wx/wx.h" #include "GRA_shape.h" class GRA_color; class GRA_wxWidgets; class GRA_ellipse : public GRA_shape { public: GRA_ellipse( double, double, double, double, bool, GRA_color * =0, GRA_color * =0, int =1, int =1 ); GRA_ellipse( GRA_ellipse const &rhs ) : GRA_shape(rhs) { CopyStuff(rhs); } GRA_ellipse &operator=( GRA_ellipse const &rhs ) { if( this != &rhs ) { GRA_shape::CopyStuff(rhs); CopyStuff(rhs); } return *this; } ~GRA_ellipse() {} void SetCircle( bool b ) { circle_ = b; } bool IsaCircle() const { return circle_; } double GetMajorAxis() const { return majorAxis_; } double GetMinorAxis() const { return minorAxis_; } void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_ellipse const & ); protected: void CopyStuff( GRA_ellipse const & ); // bool circle_; double minorAxis_, majorAxis_; }; #endif extrema-4.4.5/src/Graphics/GRA_polyline.h0000644012702201742730000000511311274636605017245 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_POLYLINE #define GRA_POLYLINE #include #include #include "GRA_drawableObject.h" class GRA_wxWidgets; class GRA_color; class GRA_polyline : public GRA_drawableObject { public: GRA_polyline( double x, double y, int lw, int lt, GRA_color *color ) : GRA_drawableObject(wxT("POLYLINE")), lineWidth_(lw), lineType_(lt), color_(color) { x_.push_back( x ); y_.push_back( y ); pen_.push_back( 3 ); } GRA_polyline( std::vector const &x, std::vector const &y, std::vector const &pen, int lw, int lt, GRA_color *color ) : GRA_drawableObject(wxT("POLYLINE")), lineWidth_(lw), lineType_(lt), color_(color) { x_.assign( x.begin(), x.end() ); y_.assign( y.begin(), y.end() ); pen_.assign( pen.begin(), pen.end() ); } ~GRA_polyline() {} GRA_polyline( GRA_polyline const &rhs ) : GRA_drawableObject(rhs) { CopyStuff( rhs ); } GRA_polyline &operator=( GRA_polyline const &rhs ) { if( this != &rhs ) { type_ = rhs.type_; CopyStuff( rhs ); } return *this; } std::vector const &GetX() const { return x_; } std::vector const &GetY() const { return y_; } std::vector const &GetPen() const { return pen_; } int GetLineWidth() const { return lineWidth_; } int GetLineType() const { return lineType_; } GRA_color *GetColor() const { return color_; } void SetColor( GRA_color *c ) { color_ = c; } void Add( double x, double y, int p ) { x_.push_back( x ); y_.push_back( y ); pen_.push_back( p ); } void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_polyline const & ); private: void CopyStuff( GRA_polyline const & ); // std::vector x_, y_; std::vector pen_; int lineWidth_, lineType_; GRA_color *color_; }; #endif extrema-4.4.5/src/Graphics/GRA_thiessenTriangulation.h0000644012702201742730000000630411274636605022000 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_THIESSENTRIANGULATION #define GRA_THIESSENTRIANGULATION #include class GRA_thiessenTriangulation { public: GRA_thiessenTriangulation( std::vector, std::vector, std::vector ); ~GRA_thiessenTriangulation(); GRA_thiessenTriangulation( GRA_thiessenTriangulation const & ); GRA_thiessenTriangulation & operator=( GRA_thiessenTriangulation const & ); void CreateMesh(); void Gradients( double, size_t & ); void Interpolate( size_t, size_t, std::vector &, std::vector &, std::vector & ); double Volume(); private: void QuickSort( std::vector & ); void Permute( std::vector &, std::vector & ); void AddNode( size_t ); void AddBoundaryNode( size_t, size_t, size_t ); void AddInteriorNode( size_t, size_t, size_t, size_t ); size_t Index( size_t, size_t ); void Shift( size_t, size_t, int, std::vector & ); void Swap( size_t, size_t, size_t, size_t ); bool SwapTest( size_t, size_t, size_t, size_t ); void Find( size_t, double, double, size_t &, size_t &, size_t & ); void InterpolateSub( double, double, double &, size_t & ); double TriangleVolume( double, double, double, double, double, double, double, double, double ); double tval( double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double ); // std::vector theX, theY, theZ; size_t theNumberOfNodes; // std::vector iadj; // length = 6*theNumberOfNodes - 9 // Adjacency lists of neighbors in counterclockwise order. // The list for node i+1 follows that for node i where theX and theY define the order. // The value 0 denotes the boundary (or a pseudo-node at infinity) and is always the // last neighbor of a boundary node. // std::vector iend; // length = theNumberOfNodes // Pointers to the ends of adjacency lists (sets of neighbors) in iadj. // The neighbors of node 1 begin in iadj[0]. For k > 1, the neighbors of node k begin // in iadj[iend[k-2]] and k has iend[k-1] - iend[k-2] neighbors including // (possibly) the boundary. iadj[iend[k-1]-1] == 0 iff node k is on the boundary. // If nodes are collinear, iend contains the indices of a sequence of nodes ordered // from left to right where left and right are defined by assuming node 1 is to the left // of node 2. // std::vector xPartials, yPartials; // arrays which contain estimates of the partial derivatives }; #endif extrema-4.4.5/src/Graphics/GRA_bitmap.h0000644012702201742730000000371611274636605016675 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_BITMAP #define GRA_BITMAP #include #include "wx/wx.h" class GRA_color; class GRA_wxWidgets; class GRA_bitmap { protected: typedef std::vector colorVec; public: GRA_bitmap( double, double, double, double, GRA_color *, GRA_wxWidgets * ); virtual ~GRA_bitmap() {} GRA_bitmap( GRA_bitmap const &rhs ) { CopyStuff( rhs ); } GRA_bitmap &operator=( GRA_bitmap const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } colorVec &GetBitmap() { return bitmap_; } void SetBorder( GRA_color * ); void SetPixelColor( int i, int j, GRA_color *color ) { bitmap_[i+j*width_] = color; } void GetLimits( double &xlo, double &ylo, double &xhi, double &yhi ) const { xlo = xLo_; ylo = yLo_; xhi = xHi_; yhi = yHi_; } void GetLimits( int &xlo, int &ylo, int &xhi, int &yhi ) const { xlo = ixLo_; ylo = iyLo_; xhi = ixHi_; yhi = iyHi_; } int GetWidth() const { return width_; } int GetHeight() const { return height_; } void Draw( GRA_wxWidgets *, wxDC & ); protected: double xLo_, xHi_, yLo_, yHi_, xInc_, yInc_; int ixLo_, ixHi_, iyLo_, iyHi_, width_, height_; colorVec bitmap_; void CopyStuff( GRA_bitmap const & ); }; #endif extrema-4.4.5/src/Graphics/GRA_plotSymbol.cpp0000644012702201742730000001202211274636605020106 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_plotSymbol.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_rectangle.h" #include "GRA_cross.h" #include "GRA_crossPlus.h" #include "GRA_plus.h" #include "GRA_diamond.h" #include "GRA_diamondPlus.h" #include "GRA_asterisk.h" #include "GRA_triangle.h" #include "GRA_ellipse.h" #include "GRA_star5pt.h" #include "GRA_arrow3.h" #include "GRA_wxWidgets.h" int GRA_plotSymbol::numberOfShapes_ = 18; GRA_plotSymbol::GRA_plotSymbol( int code, double size, double angle, GRA_color *color, int width ) : GRA_drawableObject(), code_(code), size_(size), angle_(angle), lineWidth_(width), x_(0.0), y_(0.0) { color ? color_=color : color_=GRA_colorControl::GetColor(wxT("BLACK")); int c = abs(code_); shapeCode_ = (c-1)%numberOfShapes_ + 1; connectToPrevious_ = (code_>=0); } void GRA_plotSymbol::CopyStuff( GRA_plotSymbol const &rhs ) { x_ = rhs.x_; y_ = rhs.y_; shapeCode_ = rhs.shapeCode_; angle_ = rhs.angle_; size_ = rhs.size_; color_ = rhs.color_; lineWidth_ = rhs.lineWidth_; connectToPrevious_ = rhs.connectToPrevious_; } void GRA_plotSymbol::Draw( GRA_wxWidgets *outputType, wxDC &dc ) { if( shapeCode_==0 || shapeCode_==32 )return; switch( shapeCode_ ) { case 1: // square { GRA_rectangle r(x_,y_,size_,size_,angle_,color_,0,lineWidth_); r.Draw( outputType, dc ); break; } case 2: // cross { GRA_cross c(x_,y_,size_,angle_,color_,lineWidth_); c.Draw( outputType, dc ); break; } case 3: // square with cross { GRA_crossPlus cp(x_,y_,size_,angle_,color_,lineWidth_); cp.Draw( outputType, dc ); break; } case 4: // plus { GRA_plus p(x_,y_,size_,angle_,color_,lineWidth_); p.Draw( outputType, dc ); break; } case 5: // diamond { GRA_diamond d(x_,y_,size_,angle_,color_,0,lineWidth_); d.Draw( outputType, dc ); break; } case 6: // diamond + { GRA_diamondPlus dp(x_,y_,size_,angle_,color_,lineWidth_); dp.Draw( outputType, dc ); break; } case 7: // asterisk { GRA_asterisk a(x_,y_,size_,angle_,color_,lineWidth_); a.Draw( outputType, dc ); break; } case 8: // triangle { GRA_triangle t(x_,y_,size_,angle_,color_,0,lineWidth_); t.Draw( outputType, dc ); break; } case 9: // circle { double radius = size_*0.5; GRA_ellipse e(x_-radius,y_-radius,x_+radius,y_+radius,true,color_,0,lineWidth_,1); e.Draw( outputType, dc ); break; } case 10: // star { GRA_star5pt s5(x_,y_,size_,angle_,color_,0,lineWidth_); s5.Draw( outputType, dc ); break; } case 11: // point { outputType->PlotPoint( x_, y_, dc ); break; } case 12: // arrow with foot at (x_,y_) { GRA_arrow3 a3(x_,y_,size_,0.0,angle_,color_,lineWidth_); a3.Draw( outputType, dc ); break; } case 13: // arrow centred at (x_,y_) { GRA_arrow3 a3(x_,y_,size_,0.5*size_,angle_,color_,lineWidth_); a3.Draw( outputType, dc ); break; } case 14: // filled square { GRA_rectangle r(x_,y_,size_,size_,angle_,color_,color_,lineWidth_); r.Draw( outputType, dc ); break; } case 15: // filled diamond { GRA_diamond d(x_,y_,size_,angle_,color_,color_,lineWidth_); d.Draw( outputType, dc ); break; } case 16: // filled triangle { GRA_triangle t(x_,y_,size_,angle_,color_,color_,lineWidth_); t.Draw( outputType, dc ); break; } case 17: // filled circle { double radius = size_*0.5; GRA_ellipse e(x_-radius,y_-radius,x_+radius,y_+radius,true,color_,color_,lineWidth_,1); e.Draw( outputType, dc ); break; } case 18: // filled star { GRA_star5pt s5(x_,y_,size_,angle_,color_,color_,lineWidth_); s5.Draw( outputType, dc ); break; } } } std::ostream &operator<<( std::ostream &out, GRA_plotSymbol const &ps ) { return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_ditheringPlot.cpp0000644012702201742730000003025311274636605020564 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "GRA_ditheringPlot.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_distanceCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_color.h" #include "GRA_colorMap.h" #include "GRA_colorControl.h" #include "GRA_drawableText.h" #include "GRA_cartesianAxes.h" #include "GRA_wxWidgets.h" #include "GRA_bitmap.h" #include "UsefulFunctions.h" #include "ExGlobals.h" void GRA_ditheringPlot::CopyStuff( GRA_ditheringPlot const &rhs ) { GRA_densityPlot::CopyStuff( rhs ); equallySpaced_ = rhs.equallySpaced_; areas_ = rhs.areas_; volumes_ = rhs.volumes_; lines_ = rhs.lines_; std::vector().swap( contourLevels_ ); contourLevels_.assign( rhs.contourLevels_.begin(), rhs.contourLevels_.end() ); std::vector().swap( dither_ ); dither_.assign( rhs.dither_.begin(), rhs.dither_.end() ); } void GRA_ditheringPlot::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_cartesianAxes *axes =0; try { DrawBitmap( graphicsOutput, dc ); DrawAxes( graphicsOutput, dc, axes ); } catch (EGraphicsError &e) { throw; } DrawAxes2( graphicsOutput, dc, axes ); } void GRA_ditheringPlot::DrawBitmap( GRA_wxWidgets *outputType, wxDC &dc ) { double amin, amax; UsefulFunctions::MinMax( z_, nrow_, 0, x_.size(), 0, y_.size(), amin, amax ); // alo_ = amin + fmin_*(amax-amin); ahi_ = amin + fmax_*(amax-amin); if( ahi_-alo_ < std::numeric_limits::epsilon() ) throw EGraphicsError( wxT("region is flat") ); double amean = (amin + amax) / 2.0; if( amean == 0.0 )amean = 1.e-10; if( fabs((amax-amin)/amean) < 1.0e-5 ) throw EGraphicsError( wxT("region is flat") ); // SetUp(); // std::size_t const nLevels = dither_.size()/2; if( areas_ )areaVec_.resize( nLevels, 0.0 ); if( volumes_ )volumeVec_.resize( nLevels, 0.0 ); // contourVec_.resize( nLevels+1, 0.0 ); contourVec_[0] = alo_; if( contourLevels_.empty() ) { for( std::size_t i=1; i= amax ) throw EGraphicsError( wxT("last contour level >= data maximum") ); for( std::size_t i=2; i<=nLevels; ++i )contourVec_[i-1] = contourLevels_[i-2]; } contourVec_[nLevels] = ahi_; // if( legend_ )DrawLegend( outputType, dc ); // GRA_bitmap bitmap( xlo_, ylo_, xhi_, yhi_, GRA_colorControl::GetColor(wxT("WHITE")), outputType ); FillBitmap( &bitmap ); bitmap.Draw( outputType, dc ); } void GRA_ditheringPlot::FillBitmap( GRA_bitmap *bitmap ) { int w = bitmap->GetWidth(); int h = bitmap->GetHeight(); // // now, for each print dot location, determine the corresponding // effective index of the a(m,n) array and evaluate the // appropriate density by 2-d linear (4 pt.) interpolation // std::size_t const nLevels = dither_.size()/2; std::vector iicc( h*w, 0 ); double totalVolume = 0.0; double totalArea = w*h; for( int i=0; i(ei); if( il < nlo_ )il = nlo_; if( il > nhi_-1 )il = nhi_-1; int ih = il+1; double fi = ei-il; for( int j=0; j(ej); if( jl < mlo_ )jl = mlo_; if( jl > mhi_-1 )jl = mhi_-1; int jh = jl+1; double fj = ej-jl; // // interpolate array to find value at (ei,ej) location // double fij = (1.0-fi)*(1.0-fj)*z_[il-1+(jl-1)*nrow_] + fi*(1.0-fj)*z_[ih-1+(jl-1)*nrow_] + (1.0-fi)*fj*z_[il-1+(jh-1)*nrow_] + fi*fj*z_[ih-1+(jh-1)*nrow_]; int icc; if( fij <= alo_ ) { fij = ahi_; icc = 1; } else if( fij > ahi_ ) { fij = ahi_; icc = nLevels; } else { for( std::size_t ii=1; ii<=nLevels; ++ii ) { if( fij > contourVec_[ii-1] ) { if( fij <= contourVec_[ii] ) { icc = ii; break; } } } } if( areas_ )areaVec_[icc-1] += 1.0; if( volumes_ ) { totalVolume += fabs(fij); volumeVec_[icc-1] += fabs(fij); } iicc[j+i*w] = icc; std::size_t ndx = nLevels-icc+1; std::size_t indx = 2*ndx-1; std::size_t jndx = 2*ndx; int ilv = dither_[indx-1]; int jlv = dither_[jndx-1]; bool plot = false; if( ilv > 0 ) { if( jlv > 0 ) { if( (i+1)%ilv==0 && (j+1)%jlv==0 )plot = true; } else if( jlv < 0 ) { if( (i+1)%ilv==0 && (j+1)%(-jlv)!=0 )plot = true; } } else if( ilv < 0 ) { if( jlv > 0 ) { if( (i+1)%(-ilv)!=0 && (j+1)%jlv==0 )plot = true; } else if( jlv < 0 ) { if( (i+1)%(-ilv)!=0 && (j+1)%(-jlv)!=0 )plot = true; } } if( plot )iicc[j+i*w] *= -1; } } if( areas_ ) { for( std::size_t i=0; iSetPixelColor( j, i, GRA_colorControl::GetColor(wxT("BLACK")) ); } } if( lines_ ) // draw the contour lines processed vertically { int iccold = 0; for( int j=0; j0 && icc!=iccold )bitmap->SetPixelColor( j, i, GRA_colorControl::GetColor(wxT("BLACK")) ); iccold = icc; } } // // draw the contour lines processed horizontally // iccold = 0; for( int i=0; i0 && icc!=iccold )bitmap->SetPixelColor( j, i, GRA_colorControl::GetColor(wxT("BLACK")) ); iccold = icc; } } } } void GRA_ditheringPlot::DrawLegend( GRA_wxWidgets *outputType, wxDC &dc ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double yticl = static_cast(yAxisC->Get(wxT("LARGETICLENGTH")))->GetAsWorld(); double xlo = yProfile_ ? xuaxis+0.1*(xuwind-xlwind)+1.5*yticl : xuaxis+1.5*yticl; double xhi = xlo + (xuwind-xlo)/3.0; // double height = static_cast(generalC->Get(wxT("LEGENDSIZE")))->GetAsWorld(); std::size_t nLevels = dither_.size()/2; double yi = (yuaxis-ylaxis)/nLevels; // if( height > 0.0 ) { for( std::size_t i=0; i<=nLevels; ++i ) { double yp = ylaxis + i*yi; wxChar c[50]; ::wxSnprintf( c, 50, wxT("%9.2le"), contourVec_[i] ); double angle = 0.0; GRA_font *font = static_cast(generalC->Get(wxT("FONT")))->Get(); wxString stmp(c); GRA_drawableText dt( stmp, height, angle, xhi+0.1, yp-height/2., 1, font, GRA_colorControl::GetColor(wxT("BLACK")) ); try { dt.Parse(); } catch ( EGraphicsError &e ) { throw; } dt.Draw( outputType, dc ); } } GRA_bitmap bitmap( xlo, ylaxis, xhi, yuaxis, GRA_colorControl::GetColor(wxT("WHITE")), outputType ); FillLegendBitmap( &bitmap ); bitmap.SetBorder( GRA_colorControl::GetColor(wxT("BLACK")) ); bitmap.Draw( outputType, dc ); } void GRA_ditheringPlot::FillLegendBitmap( GRA_bitmap *bitmap ) { int w = bitmap->GetWidth(); int h = bitmap->GetHeight(); // std::size_t const nLevels = dither_.size()/2; std::vector leg( nLevels ); int sum = 0; for( std::size_t i=0; i(static_cast(h)/nLevels+0.5); else leg[i] = static_cast(h*(contourVec_[i+1]-contourVec_[i])/(ahi_-alo_)+0.5); sum += leg[i]; } if( sum > h )leg[nLevels-1] -= sum-h; if( sum < h )leg[nLevels-1] += h-sum; int ny = 0; for( std::size_t icc=1; icc<=nLevels; ++icc ) { std::size_t ndx = nLevels-icc+1; std::size_t indx = 2*ndx-1; std::size_t jndx = 2*ndx; int ilv = dither_[indx-1]; int jlv = dither_[jndx-1]; for( int i=0; i 0 ) { if( jlv > 0 ) { if( (i+1)%ilv==0 && (j+1)%jlv==0 )plot = true; } else if( ilv < 0 ) { if( (i+1)%ilv==0 && (j+1)%(-jlv)!=0 )plot = true; } } else if( ilv < 0 ) { if( jlv > 0 ) { if( (i+1)%(-ilv)!=0 && (j+1)%jlv==0 )plot = true; } else if( ilv < 0 ) { if( (i+1)%(-ilv)!=0 && (j+1)%(-jlv)!=0 )plot = true; } } if( plot )bitmap->SetPixelColor( j, ny, GRA_colorControl::GetColor(wxT("BLACK")) ); } if( ++ny == h-1 )break; } for( int j=0; jSetPixelColor( j, ny, GRA_colorControl::GetColor(wxT("BLACK")) ); } } std::ostream &operator<<( std::ostream &out, GRA_ditheringPlot const &dp ) { out << "\n"; int size = dp.dither_.size(); out << ""; for( int i=0; i\n"; size = dp.contourLevels_.size(); out << ""; for( int i=0; i\n"; size = dp.x_.size(); out << ""; for( int i=0; i\n"; size = dp.y_.size(); out << ""; for( int i=0; i\n"; size = dp.z_.size(); out << ""; for( int i=0; i\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_polarAxes.cpp0000644012702201742730000003555211274636605017715 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "GRA_polarAxes.h" #include "EGraphicsError.h" #include "GRA_axis.h" #include "GRA_window.h" #include "GRA_wxWidgets.h" #include "GRA_distanceCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "GRA_color.h" #include "GRA_font.h" #include "GRA_polyline.h" #include "GRA_drawableText.h" GRA_polarAxes::GRA_polarAxes( std::vector const &r, std::vector const &theta, bool radar ) : GRA_drawableObject(wxT("POLARAXES")), r0_(r[0]), theta0_(theta[0]) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *polarC = gw->GetPolarCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); // GRA_setOfCharacteristics axisC( *polarC ); // gridLineType_ = static_cast(generalC->Get(wxT("GRIDLINETYPE")))->Get(); clockwise_ = static_cast(axisC.Get(wxT("CLOCKWISE")))->Get(); compassLabels_ = static_cast(axisC.Get(wxT("COMPASSLABELS")))->Get(); // static_cast(axisC.Get(wxT("NUMBEROFDIGITS")))->Set(7); static_cast(axisC.Get(wxT("NUMBEROFDECIMALS")))->Set(-1); double const minValue = 0.0; std::size_t size = r.size(); double maxValue = 0.0; for( std::size_t i=0; i( (vmax-vmin)/inc + 0.5 ); static_cast(axisC.Get(wxT("NLINCS")))->Set( nlinc ); double const xorigin = static_cast(axisC.Get(wxT("XORIGIN")))->GetAsWorld(); double const yorigin = static_cast(axisC.Get(wxT("YORIGIN")))->GetAsWorld(); double const length = static_cast(axisC.Get(wxT("AXISLENGTH")))->GetAsWorld(); // static_cast(axisC.Get(wxT("MIN")))->Set( 0.0 ); static_cast(axisC.Get(wxT("MAX")))->Set( vmax ); static_cast(axisC.Get(wxT("VIRTUALMIN")))->Set( 0.0 ); static_cast(axisC.Get(wxT("VIRTUALMAX")))->Set( vmax ); static_cast(polarC->Get(wxT("MAX")))->Set( vmax ); static_cast(polarC->Get(wxT("VIRTUALMAX")))->Set( vmax ); // // if radar is true then theta=0 is vertical and up from the origin // otherwise, theta=0 is horizontal and to the right from the origin // if( radar ) { static_cast(axisC.Get(wxT("AXISANGLE")))->Set( 90.0 ); compassLabels_ = true; clockwise_ = true; } double startAngle = static_cast(axisC.Get(wxT("AXISANGLE")))->Get(); axis_ = new GRA_axis( xorigin, yorigin, length, &axisC ); // // fix the axis values for conversion to world coordinates // so the other axes can be made without confusing the conversion // double xw, yw; gw->PolarToWorld( r0_, theta0_, xw, yw, true ); // int nAxes = static_cast(axisC.Get(wxT("NAXES")))->Get(); static_cast(axisC.Get(wxT("NUMBERSON")))->Set( false ); for( int i=1; i(axisC.Get(wxT("AXISANGLE")))->Set( startAngle+i*360.0/nAxes ); static_cast(axisC.Get(wxT("NLINCS")))->Set( nlinc ); otherAxes_.push_back( new GRA_axis(xorigin,yorigin,length,&axisC) ); } } void GRA_polarAxes::DeleteStuff() { delete axis_; axis_ = 0; while( !otherAxes_.empty() ) { delete otherAxes_.back(); otherAxes_.pop_back(); } } void GRA_polarAxes::CopyStuff( GRA_polarAxes const &rhs ) { if( rhs.axis_ )axis_ = new GRA_axis( *rhs.axis_ ); std::size_t size = rhs.otherAxes_.size(); for( std::size_t i=0; iMake(); std::size_t size = otherAxes_.size(); for( std::size_t i=0; iMake(); } void GRA_polarAxes::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { // draw the 0 degree radial axis // axis_->Draw( graphicsOutput, dc ); DrawLabel( graphicsOutput, dc ); // // draw the other axes // int nAxes = static_cast(otherAxes_.size()); for( int i=0; iDraw( graphicsOutput, dc ); // // draw the grid lines // if nxgrid is zero, no tic coordinates are recorded, so no grid lines will be drawn // GRA_setOfCharacteristics *axisC = axis_->GetCharacteristics(); // GRA_color *lineColor = static_cast(axisC->Get(wxT("AXISCOLOR")))->Get(); double xorigin, yorigin; axis_->GetOrigin( xorigin, yorigin ); // // grid circles are drawn at tic marks on the x-axis // std::vector ticX, ticY; axis_->GetTicCoordinates( ticX, ticY ); double axisAngle = axis_->GetAngle(); double cosAngle = cos(axisAngle*M_PI/180.0); double sinAngle = sin(axisAngle*M_PI/180.0); if( fabs(cosAngle) < 0.0001 )cosAngle = 0.0; if( fabs(sinAngle) < 0.0001 )sinAngle = 0.0; std::size_t ticSize = ticX.size(); std::vector x, y; std::vector pen; int ngrid = abs(axis_->GetGrid()); for( std::size_t i=0; i(axisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); if( height > 0.0 ) { GRA_color *color = static_cast(axisC->Get(wxT("LABELCOLOR")))->Get(); GRA_font *font = static_cast(axisC->Get(wxT("LABELFONT")))->Get(); double xend, yend, angle; wxString label; if( compassLabels_ && (nAxes==0||nAxes==1||nAxes==3||nAxes==7||nAxes==15) ) { axis_->GetEndPoint( xend, yend ); DrawAngle( label<GetEndPoint( xend, yend ); angle = otherAxes_[0]->GetAngle(); DrawAngle( label< labels(3); labels[0] = wxT("E"); labels[1] = wxT("S"); labels[2] = wxT("W"); for( int i=0; i<3; ++i ) { otherAxes_[i]->GetEndPoint( xend, yend ); angle = otherAxes_[i]->GetAngle(); if( clockwise_ ) DrawAngle( labels[2-i], xend, yend, angle, height, color, font, graphicsOutput, dc ); else DrawAngle( labels[i], xend, yend, angle, height, color, font, graphicsOutput, dc ); } break; } case 7: // N, NE, E, SE, S, SW, W, NW { std::vector labels(7); labels[0] = wxT("NE"); labels[1] = wxT("E"); labels[2] = wxT("SE"); labels[3] = wxT("S"); labels[4] = wxT("SW"); labels[5] = wxT("W"); labels[6] = wxT("NW"); for( int i=0; i<7; ++i ) { otherAxes_[i]->GetEndPoint( xend, yend ); angle = otherAxes_[i]->GetAngle(); if( clockwise_ ) DrawAngle( labels[6-i], xend, yend, angle, height, color, font, graphicsOutput, dc ); else DrawAngle( labels[i], xend, yend, angle, height, color, font, graphicsOutput, dc ); } break; } case 15: { std::vector labels(15); labels[0] = wxT("NNE"); labels[1] = wxT("NE"); labels[2] = wxT("ENE"); labels[3] = wxT("E"); labels[4] = wxT("ESE"); labels[5] = wxT("SE"); labels[6] = wxT("SSE"); labels[7] = wxT("S"); labels[8] = wxT("SSW"); labels[9] = wxT("SW"); labels[10] = wxT("WSW"); labels[11] = wxT("W"); labels[12] = wxT("WNW"); labels[13] = wxT("NW"); labels[14] = wxT("NNW"); for( int i=0; i<15; ++i ) { otherAxes_[i]->GetEndPoint( xend, yend ); angle = otherAxes_[i]->GetAngle(); if( clockwise_ ) DrawAngle( labels[14-i], xend, yend, angle, height, color, font, graphicsOutput, dc ); else DrawAngle( labels[i], xend, yend, angle, height, color, font, graphicsOutput, dc ); } break; } } } else { axis_->GetEndPoint( xend, yend ); DrawAngle( label<"), xend, yend, axisAngle, height, color, font, graphicsOutput, dc ); label.clear(); for( int i=0; iGetAngle(); otherAxes_[i]->GetEndPoint( xend, yend ); double drawAngle = angle - axisAngle; while( drawAngle < 0.0 )drawAngle += 360.0; if( clockwise_ )drawAngle = 360.0 - drawAngle; DrawAngle( label<"), xend, yend, angle, height, color, font, graphicsOutput, dc ); label.clear(); } } } } void GRA_polarAxes::DrawAngle( wxString &label, double xend, double yend, double angle, double height, GRA_color *color, GRA_font *font, GRA_wxWidgets *graphicsOutput, wxDC &dc ) { int align = 4; if( 45 < angle && angle < 135 ) align = 2; else if( 135 <= angle && angle < 225 )align = 6; else if( 225 <= angle && angle < 315 )align = 8; // double xoff = 0.2*cos(angle*M_PI/180.); double yoff = 0.2*sin(angle*M_PI/180.); GRA_drawableText dt( label, height, 0.0, xend+xoff, yend+yoff, align, font, color ); dt.Parse(); dt.Draw( graphicsOutput, dc ); } void GRA_polarAxes::DrawLabel( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_setOfCharacteristics *axisC = axis_->GetCharacteristics(); // wxString label; bool labelIsOn = static_cast(axisC->Get(wxT("LABELON")))->Get(); if( labelIsOn )label = static_cast(axisC->Get(wxT("LABEL")))->Get(); if( label.empty() )labelIsOn = false; // // if powerAuto_ = 2, calculate the power but do not draw it // double power = static_cast(axisC->Get(wxT("POWER")))->Get(); if( static_cast(axisC->Get(wxT("POWERAUTO")))->Get()!=2 && static_cast(axisC->Get(wxT("NUMBERSON")))->Get() && power!=0.0 ) { wxString powLabel(wxT("(x10<^>")); label << power << wxT("<_>)"); label = label.empty() ? powLabel : label+wxT(" ")+powLabel; labelIsOn = true; } // // the axis label is composed of two parts: // a) the string found in the label // b) the factor by which all the numbers // labelling the axis should be multiplied to get the graph axis units // if( labelIsOn ) { double sizlab = static_cast(axisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); double imagTicAngle = static_cast(axisC->Get(wxT("IMAGTICANGLE")))->Get(); double imagTicLen = static_cast(axisC->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); double numHeight = static_cast(axisC->Get(wxT("NUMBERSHEIGHT")))->GetAsWorld(); GRA_font *labelFont = static_cast(axisC->Get(wxT("LABELFONT")))->Get(); GRA_color *labelColor = static_cast(axisC->Get(wxT("LABELCOLOR")))->Get(); double xOrigin, yOrigin; axis_->GetOrigin( xOrigin, yOrigin ); double length = axis_->GetLength(); double axisAngle = axis_->GetAngle(); double x1, y1, angle; int align; // // draw the label horizontally and centered on the axis if( axisAngle == 0.0 ) { x1 = xOrigin + 0.5*length; y1 = yOrigin - 1.05*(imagTicLen+numHeight); angle = 0.0; align = 8; // 8=top centre } else { x1 = xOrigin + 1.1*(imagTicLen+axis_->GetMaxWidth()); y1 = yOrigin + 0.5*length; angle = 270.0; align = 2; // bottom centre } GRA_drawableText dt(label,sizlab,angle,x1,y1,align,labelFont,labelColor); try { dt.Parse(); } catch ( EGraphicsError const &e ) { throw; } dt.Draw( graphicsOutput, dc ); } } int GRA_polarAxes::NumberOfDigits( double mins, double maxs, double logBase ) { int ndig1p = 1; if( fabs(mins) > 0.0 )ndig1p = static_cast(log10(fabs(mins)))+1; if( mins < 0.0 )++ndig1p; int ndig1b = static_cast(log10(logBase))+1; int ndig1 = ndig1p + ndig1b; int ndig2p = 1; if( fabs(maxs) > 0.0 )ndig2p = static_cast(log10(fabs(maxs)))+1; if( maxs < 0.0 )++ndig2p; int ndig2 = ndig2p + ndig1b; return std::max(ndig1,ndig2); } std::ostream &operator<<( std::ostream &out, GRA_polarAxes const &ca ) { return out << "\n" << *ca.axis_ << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_intCharacteristic.h0000644012702201742730000000402011274636605021051 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_INTCHARACTERISTIC #define GRA_INTCHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_intCharacteristic : public GRA_characteristic { public: GRA_intCharacteristic( wxChar const *name, int value ) : GRA_characteristic(name,INT,false), value_(value), default_(value) {} GRA_intCharacteristic( wxChar const *name, std::vector const &values ) : GRA_characteristic(name,INT,true), value_(0) { values_.assign( values.begin(), values.end() ); } ~GRA_intCharacteristic() {} GRA_intCharacteristic( GRA_intCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_intCharacteristic &operator=( GRA_intCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void Set( int value ) { value_ = value; isAVector_ = false; } void Set( std::vector const &values ) { values_.assign( values.begin(), values.end() ); isAVector_ = true; } int Get() const { return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_intCharacteristic const & ); private: void CopyStuff( GRA_intCharacteristic const &rhs ); // int value_, default_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_gradientPlot.h0000644012702201742730000000362411274636605020053 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_GRADIENTPLOT #define GRA_GRADIENTPLOT #include "wx/wx.h" #include "GRA_densityPlot.h" class GRA_colorMap; class GRA_bitmap; class GRA_wxWidgets; class GRA_gradientPlot : public GRA_densityPlot { public: GRA_gradientPlot( std::vector &, std::vector &, std::vector &, int, double, double, double, double, bool, bool, bool, bool, bool, bool, bool, bool ); ~GRA_gradientPlot() {} GRA_gradientPlot( GRA_gradientPlot const &rhs ) { CopyStuff(rhs); } GRA_gradientPlot & operator=( GRA_gradientPlot const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Draw( GRA_wxWidgets *, wxDC & ); void FillBitmap( GRA_bitmap * ); void FillLegendBitmap( GRA_bitmap * ); GRA_colorMap *GetColorMap() const { return colorMap_; } friend std::ostream &operator<<( std::ostream &, GRA_gradientPlot const & ); private: void CopyStuff( GRA_gradientPlot const &rhs ) { GRA_densityPlot::CopyStuff( rhs ); linear_ = rhs.linear_; } void DrawBitmap( GRA_wxWidgets *, wxDC & ); void DrawLegend( GRA_wxWidgets *, wxDC & ); bool linear_; GRA_colorMap *colorMap_; }; #endif extrema-4.4.5/src/Graphics/GRA_diamondPlus.h0000644012702201742730000000213011274636605017665 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DIAMONDPLUS #define GRA_DIAMONDPLUS #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_diamondPlus : public GRA_multiLineFigure { public: GRA_diamondPlus( double, double, double, double, GRA_color * =0, int =1 ); virtual ~GRA_diamondPlus(); friend std::ostream &operator<<( std::ostream &, GRA_diamondPlus const & ); }; #endif extrema-4.4.5/src/Graphics/GRA_plotSymbol.h0000644012702201742730000000521211274636605017556 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_PLOTSYMBOL #define GRA_PLOTSYMBOL #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_color; class GRA_wxWidgets; class GRA_plotSymbol : public GRA_drawableObject { public: GRA_plotSymbol( int, double, double =0.0, GRA_color * =0, int =1 ); ~GRA_plotSymbol() {} GRA_plotSymbol( GRA_plotSymbol const &rhs ) : GRA_drawableObject(rhs) { CopyStuff( rhs ); } GRA_plotSymbol &operator=( GRA_plotSymbol const &rhs ) { if( this != &rhs ) { type_ = rhs.type_; CopyStuff( rhs ); } return *this; } void SetLocation( double x, double y ) { x_ = x; y_ = y; } void GetLocation( double &x, double &y ) const { x = x_; y = y_; } int GetCode() const { return code_; } void SetShapeCode( int c ) { connectToPrevious_ = (c>=0); shapeCode_ = (abs(c)-1)%numberOfShapes_ + 1; } int GetShapeCode() const { return shapeCode_; } void SetSize( double size ) { size_ = size; } double GetSize() const { return size_; } void SetAngle( double angle ) { angle_ = angle; } double GetAngle() const { return angle_; } void SetColor( GRA_color *c ) { color_ = c; } GRA_color *GetColor() const { return color_; } void SetLineWidth( int w ) { lineWidth_ = w; } int GetLineWidth() const { return lineWidth_; } void SetConnectToPrevious( bool b ) { connectToPrevious_ = b; } bool GetConnectToPrevious() const { return connectToPrevious_; } void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_plotSymbol const & ); private: void CopyStuff( GRA_plotSymbol const & ); // static int numberOfShapes_; // double x_, y_; // location in world units int code_, shapeCode_; double angle_; double size_; // size in world units GRA_color *color_; int lineWidth_; bool connectToPrevious_; }; #endif extrema-4.4.5/src/Graphics/GRA_boolCharacteristic.cpp0000644012702201742730000000330511274636605021552 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_boolCharacteristic.h" std::ostream &operator<<( std::ostream &out, GRA_boolCharacteristic const &c ) { if( c.isAVector_ ) { std::size_t size = c.values_.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_boolCharacteristic::CopyStuff( GRA_boolCharacteristic const &rhs ) { value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_font.cpp0000644012702201742730000000302111274636605016707 0ustar spangspang/* Copyright (C) 2005,...,2008 Joseph L. Chuma, TRIUMF 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. */ #include "wx/fontutil.h" #include "GRA_font.h" GRA_font::GRA_font( wxString const &name ) : name_( name.Upper() ) { //neither of the following works to set the font //wxfont_ = wxFont( 12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, name ); //wxfont_.SetFaceName( name ); // wxNativeFontInfo nfi; nfi.FromString( name_ ); wxfont_ = wxFont( nfi ); wxfont_.SetFamily( wxFONTFAMILY_DEFAULT ); wxfont_.SetStyle( wxFONTSTYLE_NORMAL ); wxfont_.SetWeight( wxFONTWEIGHT_NORMAL ); wxfont_.SetPointSize( 12 ); // 12 seems to fit the most number of fonts (using xfontsel) } std::ostream &operator<<( std::ostream &out, GRA_font const &font ) { return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_window.h0000644012702201742730000001337611332454530016721 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_WINDOW #define GRA_WINDOW #include #include #include "wx/wx.h" class GRA_setOfCharacteristics; class GRA_drawableObject; class GRA_wxWidgets; class GRA_legend; class GRA_window { private: typedef std::vector drawableVec; typedef drawableVec::const_iterator drawableVecIter; typedef drawableVec::const_reverse_iterator drawableVecRIter; public: GRA_window( int number ) : number_(number), xLoP_(0.0), yLoP_(0.0), xHiP_(100.0), yHiP_(100.0) { SetUp(); } GRA_window( int number, double xl, double yl, double xu, double yu ) : number_(number), xLoP_(xl), yLoP_(yl), xHiP_(xu), yHiP_(yu) { SetUp(); } ~GRA_window() { Clear(); DeleteCharacteristics(); } GRA_window( GRA_window const &rhs ) { CopyStuff( rhs ); } GRA_window &operator=( GRA_window const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void SetNumber( int n ) { number_ = n; } int GetNumber() const { return number_; } void GetDimensions( double &xlo, double &ylo, double &xhi, double &yhi ) { xlo = xLoP_; ylo = yLoP_; xhi = xHiP_; yhi = yHiP_; } void Reset(); void Clear(); void Erase(); void DisplayBackground( GRA_wxWidgets *, wxDC & ); GRA_setOfCharacteristics *GetXAxisCharacteristics(); GRA_setOfCharacteristics *GetYAxisCharacteristics(); GRA_setOfCharacteristics *GetGeneralCharacteristics(); GRA_setOfCharacteristics *GetTextCharacteristics(); GRA_setOfCharacteristics *GetGraphLegendCharacteristics(); GRA_setOfCharacteristics *GetDataCurveCharacteristics(); GRA_setOfCharacteristics *GetPolarCharacteristics(); void SetXAxisCharacteristics( GRA_setOfCharacteristics const & ); void SetYAxisCharacteristics( GRA_setOfCharacteristics const & ); void SetDefaults() { SetGeneralDefaults(); SetXAxisDefaults(); SetYAxisDefaults(); SetTextDefaults(); SetGraphLegendDefaults(); SetDataCurveDefaults(); SetPolarDefaults(); } void SetGeneralDefaults(); void SetXAxisDefaults(); void SetYAxisDefaults(); void SetTextDefaults(); void SetGraphLegendDefaults(); void SetDataCurveDefaults(); void SetPolarDefaults(); void InheritFrom( GRA_window const * ); void GraphToWorld( double, double, double &, double &, bool =false ) const; void GraphToWorld( std::vector const &, std::vector const &, std::vector &, std::vector & ) const; void PolarToWorld( double, double, double &, double &, bool =false ) const; void PolarToWorld( std::vector const &, std::vector const &, std::vector &, std::vector & ) const; void WorldToGraph( double, double, double &, double &, bool =false ) const; void WorldToPercent( double, double, double &, double & ) const; void PercentToWorld( double, double, double &, double & ) const; // void StartLine( double, double, double &, double & ); void ContinueLine( double, double, double *, double *, int & ); // void DrawZerolines( bool, bool ); void AddDrawableObject( GRA_drawableObject *object ) { drawableObjects_.push_back(object); } void RemoveDrawableObject( GRA_drawableObject * ); GRA_drawableObject *GetDrawableObject( int i ) const { if( i>=0 && i(drawableObjects_.size()) )return drawableObjects_[i]; else return 0; } std::vector &GetDrawableObjects() { return drawableObjects_; } void Draw( GRA_wxWidgets *, wxDC & ); void RemoveLastTextString(); void RemoveLastArrow(); void RemoveLastPolygon(); void RemoveLastEllipse(); bool InsideWindow( double, double ) const; GRA_legend *GetGraphLegend(); void Replot(); friend std::ostream &operator<<( std::ostream &, GRA_window const & ); private: void CopyStuff( GRA_window const & ); void SetUp(); void DeleteCharacteristics(); // void CreateGeneralCharacteristics( double, double, double, double ); void CreateXAxisCharacteristics( double, double, double, double ); void CreateYAxisCharacteristics( double, double, double, double ); void CreateGraphLegendCharacteristics( double, double, double, double ); void CreateDataCurveCharacteristics( double, double ); void CreateTextCharacteristics( double, double, double, double ); void CreatePolarCharacteristics( double, double, double, double ); // void GetValues( double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double & ) const; // GRA_setOfCharacteristics *xAxisCharacteristics_; GRA_setOfCharacteristics *yAxisCharacteristics_; GRA_setOfCharacteristics *generalCharacteristics_; GRA_setOfCharacteristics *textCharacteristics_; GRA_setOfCharacteristics *graphLegendCharacteristics_; GRA_setOfCharacteristics *dataCurveCharacteristics_; GRA_setOfCharacteristics *polarCharacteristics_; // double xLoP_, yLoP_, xHiP_, yHiP_; double xPrevious_, yPrevious_; int number_; // drawableVec drawableObjects_; }; #endif extrema-4.4.5/src/Graphics/GRA_arrow1.cpp0000644012702201742730000001035511332164601017147 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include #include "GRA_arrow1.h" #include "GRA_color.h" GRA_arrow1::GRA_arrow1( double x1, double y1, double x2, double y2, bool heads, GRA_color *lineColor, GRA_color *fillColor, int lineWidth, double widthFactor, double lengthFactor ) : GRA_polygon(lineColor,fillColor,lineWidth), headsBothEnds_(heads) { SetArrow1(); double const dx = x2 - x1; double const dy = y2 - y1; double const angle = atan2(dy,dx)+0.5*M_PI; double const cosang = cos(angle); double const sinang = sin(angle); double const length = sqrt(dx*dx+dy*dy); //double const stemWidth = 0.02*length; double const stemWidth = 0.03; //double const headWidth = 0.1*length; double const temp = length - 15.; double headLength = 0.2+(temp/5.)*(temp/5.)*exp(-temp*temp/25.); double headWidth = 0.75*headLength; headWidth *= widthFactor; headLength *= lengthFactor; //double const headWidth = 0.3; //double const headLength = 0.3; double xc = 0.5*(x1+x2); double yc = 0.5*(y1+y2); double const tan30 = tan(30.*M_PI/180.); std::vector x, y; if( headsBothEnds_ ) { x.push_back(xc+RotX(0.,-0.5*length,sinang,cosang)); y.push_back(yc+RotY(0.,-0.5*length,sinang,cosang)); x.push_back(xc+RotX(-headWidth*tan30,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(-headWidth*tan30,-0.5*length+headLength,sinang,cosang)); x.push_back(xc+RotX(-stemWidth,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,-0.5*length+headLength,sinang,cosang)); x.push_back(xc+RotX(-stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(0.,0.5*length,sinang,cosang)); y.push_back(yc+RotY(0.,0.5*length,sinang,cosang)); x.push_back(xc+RotX(headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(stemWidth,-0.5*length+headLength,sinang,cosang)); x.push_back(xc+RotX(headWidth*tan30,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(headWidth*tan30,-0.5*length+headLength,sinang,cosang)); } else { x.push_back(xc+RotX(-stemWidth,-0.5*length,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,-0.5*length,sinang,cosang)); x.push_back(xc+RotX(-stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(0.,0.5*length,sinang,cosang)); y.push_back(yc+RotY(0.,0.5*length,sinang,cosang)); x.push_back(xc+RotX(headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,-0.5*length,sinang,cosang)); y.push_back(yc+RotY(stemWidth,-0.5*length,sinang,cosang)); } SetUp( x, y ); } // end of file extrema-4.4.5/src/Graphics/GRA_star5pt.h0000644012702201742730000000220011332435701016773 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #ifndef GRA_STAR5PT #define GRA_STAR5PT #include "GRA_polygon.h" class GRA_color; class GRA_star5pt : public GRA_polygon { public: GRA_star5pt( double, double, double, double, GRA_color * =0, GRA_color * =0, int =1 ); GRA_star5pt( double, double, double, double, double, GRA_color * =0, GRA_color * =0, int =1 ); private: void MakeStar( double const, double const, double const, double const ); }; #endif extrema-4.4.5/src/Graphics/GRA_gradientPlot.cpp0000644012702201742730000002055211274636605020405 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "GRA_gradientPlot.h" #include "EGraphicsError.h" #include "GRA_bitmap.h" #include "GRA_window.h" #include "GRA_distanceCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_color.h" #include "GRA_colorMap.h" #include "GRA_colorControl.h" #include "GRA_drawableText.h" #include "GRA_cartesianAxes.h" #include "GRA_wxWidgets.h" #include "UsefulFunctions.h" #include "ExGlobals.h" GRA_gradientPlot::GRA_gradientPlot( std::vector &x, std::vector &y, std::vector &z, int nrow, double fmin, double fmax, double gmin, double gmax, bool xProfile, bool yProfile, bool border, bool zoom, bool axes, bool reset, bool legend, bool linear ) : GRA_densityPlot(wxT("GRADIENTPLOT"), x, y, z, nrow, fmin, fmax, gmin, gmax, xProfile, yProfile, border, zoom, axes, reset, legend ), linear_(linear) { if( xProfile_ || yProfile_ )MakeProfiles( 0, x_.size(), 0, y_.size() ); colorMap_ = GRA_colorControl::GetColorMap(); } void GRA_gradientPlot::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_cartesianAxes *axes =0; GRA_colorMap *colorMapSave = GRA_colorControl::GetColorMap(); GRA_colorControl::SetColorMap( colorMap_ ); try { DrawBitmap( graphicsOutput, dc ); DrawAxes( graphicsOutput, dc, axes ); } catch (EGraphicsError &e) { GRA_colorControl::SetColorMap( colorMapSave ); throw; } DrawAxes2( graphicsOutput, dc, axes ); GRA_colorControl::SetColorMap( colorMapSave ); } void GRA_gradientPlot::DrawBitmap( GRA_wxWidgets *outputType, wxDC &dc ) { double amin, amax; UsefulFunctions::MinMax( z_, nrow_, 0, x_.size(), 0, y_.size(), amin, amax ); // alo_ = amin + fmin_*(amax-amin); ahi_ = amin + fmax_*(amax-amin); if( ahi_-alo_ < std::numeric_limits::epsilon() ) throw EGraphicsError( wxT("region is flat") ); double amean = (amin + amax) / 2.0; if( amean == 0.0 )amean = 1.e-10; if( fabs((amax-amin)/amean) < 1.0e-5 ) throw EGraphicsError( wxT("region is flat") ); // SetUp(); // if( legend_ )DrawLegend( outputType, dc ); // GRA_bitmap bitmap( xlo_, ylo_, xhi_, yhi_, GRA_colorControl::GetColor(wxT("WHITE")), outputType ); FillBitmap( &bitmap ); bitmap.Draw( outputType, dc ); } void GRA_gradientPlot::FillBitmap( GRA_bitmap *bitmap ) { int w = bitmap->GetWidth(); int h = bitmap->GetHeight(); // // for each print dot location, determine the corresponding // effective index of the a(m,n) array and evaluate the // appropriate density by 2-d linear (4 pt.) interpolation // GRA_colorMap *colorMap = GRA_colorControl::GetColorMap(); int const nLevels = colorMap->GetSize(); for( int i=0; i(ei) : il=static_cast(ei+0.5); if( il < nlo_ )il = nlo_; if( il > nhi_-1 )il = nhi_-1; int ih = il+1; double fi = ei-il; for( int j=0; j(ej) : jl=static_cast(ej+0.5); if( jl < mlo_ )jl = mlo_; if( jl > mhi_-1 )jl = mhi_-1; int jh = jl+1; double fj = ej-jl; // // interpolate array a to find value at (ei,ej) location // double fij; linear_ ? fij=(1.0-fi)*(1.0-fj)*z_[il-1+(jl-1)*nrow_] + fi*(1.0-fj)*z_[ih-1+(jl-1)*nrow_] + (1.0-fi)*fj*z_[il-1+(jh-1)*nrow_] + fi*fj*z_[ih-1+(jh-1)*nrow_] : fij=z_[il-1+(jl-1)*nrow_]; int index = static_cast((fij-alo_)/(ahi_-alo_)*(nLevels-1)-.0001)%(nLevels-1)+1; bitmap->SetPixelColor( j, i, colorMap->GetColor(index) ); } } if( border_ )bitmap->SetBorder( GRA_colorControl::GetColor(wxT("BLACK")) ); } void GRA_gradientPlot::DrawLegend( GRA_wxWidgets *outputType, wxDC &dc ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double yticl = static_cast(yAxisC->Get(wxT("LARGETICLENGTH")))->GetAsWorld(); double xlo = yProfile_ ? xuaxis+0.1*(xuwind-xlwind)+1.5*yticl : xuaxis+1.5*yticl; double xhi = xlo + (xuwind-xlo)/3.0; // double height = static_cast(generalC->Get(wxT("LEGENDSIZE")))->GetAsWorld(); if( height > 0.0 ) { wxChar c[10]; ::wxSnprintf( c, 10, wxT("%9.2lg"), alo_ ); double angle = 0.0; GRA_font *font = static_cast(generalC->Get(wxT("FONT")))->Get(); wxString stmp(c); GRA_drawableText dt( stmp, height, angle, xhi+0.1, ylaxis-height/2., 1, font, GRA_colorControl::GetColor(wxT("BLACK")) ); ::wxSnprintf( c, 10, wxT("%9.2lg"), ahi_ ); stmp = wxString(c); GRA_drawableText dt2( stmp, height, angle, xhi+0.1, yuaxis-height/2., 1, font, GRA_colorControl::GetColor(wxT("BLACK")) ); try { dt.Parse(); dt2.Parse(); } catch ( EGraphicsError &e ) { throw; } dt.Draw( outputType, dc ); dt2.Draw( outputType, dc ); } GRA_bitmap bitmap( xlo, ylaxis, xhi, yuaxis, GRA_colorControl::GetColor(wxT("WHITE")), outputType ); FillLegendBitmap( &bitmap ); bitmap.SetBorder( GRA_colorControl::GetColor(wxT("BLACK")) ); bitmap.Draw( outputType, dc ); } void GRA_gradientPlot::FillLegendBitmap( GRA_bitmap *bitmap ) { int const w = bitmap->GetWidth(); int const h = bitmap->GetHeight(); // GRA_colorMap *colorMap = GRA_colorControl::GetColorMap(); int const nLevels = colorMap->GetSize(); // for( int j=0; j(j)/(h-1.0); int index = static_cast(1+frac*nLevels); for( int i=0; iSetPixelColor( i, j, colorMap->GetColor(index) ); } } std::ostream &operator<<( std::ostream &out, GRA_gradientPlot const &gp ) { out << "\n"; int size = gp.x_.size(); out << ""; for( int i=0; i\n"; size = gp.y_.size(); out << ""; for( int i=0; i\n"; size = gp.z_.size(); out << ""; for( int i=0; i\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_diffusionPlot.cpp0000644012702201742730000001225111274636605020573 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "GRA_diffusionPlot.h" #include "EGraphicsError.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_wxWidgets.h" #include "GRA_bitmap.h" #include "UsefulFunctions.h" void GRA_diffusionPlot::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_cartesianAxes *axes =0; try { DrawBitmap( graphicsOutput, dc ); DrawAxes( graphicsOutput, dc, axes ); } catch (EGraphicsError &e) { throw; } DrawAxes2( graphicsOutput, dc, axes ); } void GRA_diffusionPlot::DrawBitmap( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { // // Determine min and max values in array. The minimum value // will correspond to zero (blank) print density, the maximum // to solid black print // double amin, amax; UsefulFunctions::MinMax( z_, nrow_, 0, x_.size(), 0, y_.size(), amin, amax ); // alo_ = amin + fmin_*(amax-amin); ahi_ = amin + fmax_*(amax-amin); if( ahi_-alo_ < std::numeric_limits::epsilon() ) throw EGraphicsError( wxT("region is flat") ); double amean = (amin + amax) / 2.0; if( amean == 0.0 )amean = 1.e-10; if( fabs((amax-amin)/amean) < 1.0e-5 ) throw EGraphicsError( wxT("region is flat") ); // SetUp(); // GRA_bitmap bitmap( xlo_, ylo_, xhi_, yhi_, GRA_colorControl::GetColor(wxT("WHITE")), graphicsOutput ); FillBitmap( &bitmap ); bitmap.Draw( graphicsOutput, dc ); } void GRA_diffusionPlot::FillBitmap( GRA_bitmap *bitmap ) { GRA_color *color = GRA_colorControl::GetColor(wxT("BLACK")); // int w = bitmap->GetWidth(); int h = bitmap->GetHeight(); // // For each print dot location, determine the corresponding // effective index of the array and evaluate the // appropriate density by 2-d linear (4 pt.) interpolation. // std::vector d1( w+4, 0.0 ); std::vector d2( w+4, 0.0 ); std::vector d3( w+4, 0.0 ); // for( int i=0; i(ei); if( il < nlo_ )il = nlo_; if( il > nhi_-1 )il = nhi_-1; int ih = il + 1; double fi = ei - il; for( int j=0; j(ej); if( jl < mlo_ )jl = mlo_; if( jl > mhi_-1 )jl = mhi_-1; int jh = jl + 1; double fj = ej - jl; // // interpolate array to find value at (ei,ej) location // double fij = (1.0-fi)*(1.0-fj)*z_[il-1+(jl-1)*nrow_] + fi*(1.0-fj)*z_[ih-1+(jl-1)*nrow_] + (1.0-fi)*fj*z_[il-1+(jh-1)*nrow_] + fi*fj*z_[ih-1+(jh-1)*nrow_]; if( fij > ahi_ )fij = ahi_; double dij = (fij-alo_)/(ahi_-alo_); if( dij < 0.0 )dij = 0.0; if( dij > 1.0 )dij = 1.0; dij += d1[j+2]; double dout; if( dij >= 0.5 ) { try { bitmap->SetPixelColor( j, i, color ); } catch (EGraphicsError &e) {} dout = 1.0; } else { dout = 0.0; } double err = dij - dout; d1[j+3] += err*7.0/48.0; d1[j+4] += err*5.0/48.0; d2[j] += err*3.0/48.0; d2[j+1] += err*5.0/48.0; d2[j+2] += err*7.0/48.0; d2[j+3] += err*5.0/48.0; d2[j+4] += err*3.0/48.0; d3[j] += err*1.0/48.0; d3[j+1] += err*3.0/48.0; d3[j+2] += err*5.0/48.0; d3[j+3] += err*3.0/48.0; d3[j+4] += err*1.0/48.0; } for( int j=0; j\n"; int size = dp.x_.size(); out << ""; for( int i=0; i\n"; size = dp.y_.size(); out << ""; for( int i=0; i\n"; size = dp.z_.size(); out << ""; for( int i=0; i\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_doubleCharacteristic.cpp0000644012702201742730000000321211274636605022066 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_doubleCharacteristic.h" std::ostream &operator<<( std::ostream &out, GRA_doubleCharacteristic const &c ) { if( c.isAVector_ ) { std::size_t size = c.values_.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_doubleCharacteristic::CopyStuff( GRA_doubleCharacteristic const &rhs ) { value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_cartesianAxes.h0000644012702201742730000000546411274636605020215 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_CARTESIANAXES #define GRA_CARTESIANAXES #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_window; class GRA_axis; class GRA_wxWidgets; class GRA_setOfCharacteristics; class GRA_cartesianAxes : public GRA_drawableObject { public: GRA_cartesianAxes() : GRA_drawableObject(wxT("CARTESIANAXES")), xAxis_(0), yAxis_(0), boxXAxis_(0), boxYAxis_(0) {} GRA_cartesianAxes( std::vector const &, std::vector const &, bool, bool ); ~GRA_cartesianAxes() { DeleteStuff(); } GRA_cartesianAxes( GRA_cartesianAxes const &rhs ) : GRA_drawableObject(rhs) { CopyStuff( rhs ); } GRA_cartesianAxes &operator=( GRA_cartesianAxes const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff( rhs ); } return *this; } void Make(); void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_cartesianAxes const & ); void SetAxes( GRA_axis *x, GRA_axis *y, GRA_axis *boxX, GRA_axis *boxY ) { xAxis_ = x; yAxis_ = y; boxXAxis_ = boxX; boxYAxis_ = boxY; } void GetAxes( GRA_axis *&x, GRA_axis *&y, GRA_axis *&boxX, GRA_axis *&boxY ) const { x = xAxis_; y = yAxis_; boxX = boxXAxis_; boxY = boxYAxis_; } int GetGridLineType() const { return gridLineType_; } private: void DeleteStuff(); void CopyStuff( GRA_cartesianAxes const & ); void AutoScale( std::vector const &, std::vector const & ); void DrawXLabel( GRA_wxWidgets *, wxDC & ); void DrawYLabel( GRA_wxWidgets *, wxDC & ); void GetActualValues( double &, double &, double ); void ResetLogValue( double &, double ); void FixupScales( bool, bool, double, double, double, int &, double &, double &, double &, GRA_setOfCharacteristics *, bool ); int NumberOfDigits( double, double, double ); void SetNumberOfIncrements( int &, double, double, GRA_setOfCharacteristics * ); // int gridLineType_; bool xOnTop_, yOnRight_; GRA_axis *xAxis_, *yAxis_, *boxXAxis_, *boxYAxis_; }; #endif extrema-4.4.5/src/Graphics/GRA_arrow2.h0000644012702201742730000000204311274636605016625 0ustar spangspang/* Copyright (C) 2005,...,2009 Joseph L. Chuma 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. */ #ifndef GRA_ARROW2 #define GRA_ARROW2 #include "GRA_polygon.h" class GRA_color; class GRA_arrow2 : public GRA_polygon { public: GRA_arrow2( double, double, double, double, bool, GRA_color * =0, GRA_color * =0, int =1, double =1.0, double =1.0 ); ~GRA_arrow2() {} private: bool headsBothEnds_; }; #endif extrema-4.4.5/src/Graphics/GRA_bitmap.cpp0000644012702201742730000000705211274636605017225 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_bitmap.h" #include "EGraphicsError.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" GRA_bitmap::GRA_bitmap( double xlo, double ylo, double xhi, double yhi, GRA_color *backgroundColor, GRA_wxWidgets *outputType ) : xLo_(xlo), yLo_(ylo), xHi_(xhi), yHi_(yhi) { // find the distance between pixels in world coordinate units // double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); double const dxW = fabs(xmaxW-xminW); double const dyW = fabs(ymaxW-yminW); // double xminM, yminM, xmaxM, ymaxM; if( outputType ) { int ix1, iy1, ix2, iy2; outputType->GetLimits( ix1, iy1, ix2, iy2 ); xminM = static_cast(ix1); yminM = static_cast(iy1); xmaxM = static_cast(ix2); ymaxM = static_cast(iy2); } else { // this section is for the PostScript driver xminM = xminW*72; yminM = yminW*72; xmaxM = xmaxW*72; ymaxM = ymaxW*72; } // double const dxM = fabs(xmaxM-xminM); double const dyM = fabs(ymaxM-yminM); // xInc_ = dxW/dxM; // horizontal distance (cm/pixel) yInc_ = dyW/dyM; // vertical distance (cm/pixel) // ixLo_ = static_cast(xminM + xLo_/xInc_+0.5); // pixel number for xlo iyLo_ = static_cast(yminM + yLo_/yInc_+0.5); // pixel number for ylo ixHi_ = static_cast(xminM + xHi_/xInc_+0.5); // pixel number for xhi iyHi_ = static_cast(yminM + yHi_/yInc_+0.5); // pixel number for yhi // height_ = iyHi_ - iyLo_ + 1; width_ = ixHi_ - ixLo_ + 1; bitmap_.insert( bitmap_.begin(), height_*width_, backgroundColor ); } void GRA_bitmap::CopyStuff( GRA_bitmap const &rhs ) { colorVec().swap( bitmap_ ); // empty out bitmap_ // // now copy rhs.bitmap_ into bitmap_ // bitmap_.assign( rhs.bitmap_.begin(), rhs.bitmap_.end() ); // xLo_ = rhs.xLo_; xHi_ = rhs.xHi_; yLo_ = rhs.yLo_; yHi_ = rhs.yHi_; ixLo_ = rhs.ixLo_; ixHi_ = rhs.ixHi_; iyLo_ = rhs.iyLo_; iyHi_ = rhs.iyHi_; width_ = rhs.width_; height_ = rhs.height_; xInc_ = rhs.xInc_; yInc_ = rhs.yInc_; } void GRA_bitmap::SetBorder( GRA_color *color ) { for( int i=0; iGetLimits( xmin, ymin, xmax, ymax ); for( int x=0; x #include "GRA_star5pt.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_star5pt::GRA_star5pt( double xc, double yc, double side, double angle, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth,1) { Set5PtStar(); MakeStar( angle, side, xc, yc ); } GRA_star5pt::GRA_star5pt( double x1, double y1, double x2, double y2, double angle, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth,1) { Set5PtStar(); MakeStar( angle, sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)), x1, y1 ); } void GRA_star5pt::MakeStar( double const angle, double const side, double const xc, double const yc ) { double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const sin72 = 0.95105651630; double const cos72 = 0.30901699437; double const sin54 = 0.80901699437; double const cos54 = 0.58778525229; double const tan54 = 1.37638192047; double const sin144 = cos54; double const cos144 = -sin54; double const cos216 = cos144; double const sin216 = -sin144; double const cos288 = cos72; double const sin288 = -sin72; double const s = 2.*side*cos54/(1.+sin54); double const h = 0.5*s*tan54; double const ap = (side-h)/3.; std::vector x, y; x.push_back(xc+RotX(-0.5*s,-h,sinang,cosang)); y.push_back(yc+RotY(-0.5*s,-h,sinang,cosang)); x.push_back(xc+RotX(0.,-ap,sinang,cosang)); y.push_back(yc+RotY(0.,-ap,sinang,cosang)); x.push_back(xc+RotX(-0.5*s*cos72+h*sin72,-0.5*s*sin72-h*cos72,sinang,cosang)); y.push_back(yc+RotY(-0.5*s*cos72+h*sin72,-0.5*s*sin72-h*cos72,sinang,cosang)); x.push_back(xc+RotX(ap*sin72,-ap*cos72,sinang,cosang)); y.push_back(yc+RotY(ap*sin72,-ap*cos72,sinang,cosang)); x.push_back(xc+RotX(-0.5*s*cos144+h*sin144,-0.5*s*sin144-h*cos144,sinang,cosang)); y.push_back(yc+RotY(-0.5*s*cos144+h*sin144,-0.5*s*sin144-h*cos144,sinang,cosang)); x.push_back(xc+RotX(ap*sin144,-ap*cos144,sinang,cosang)); y.push_back(yc+RotY(ap*sin144,-ap*cos144,sinang,cosang)); x.push_back(xc+RotX(-0.5*s*cos216+h*sin216,-0.5*s*sin216-h*cos216,sinang,cosang)); y.push_back(yc+RotY(-0.5*s*cos216+h*sin216,-0.5*s*sin216-h*cos216,sinang,cosang)); x.push_back(xc+RotX(ap*sin216,-ap*cos216,sinang,cosang)); y.push_back(yc+RotY(ap*sin216,-ap*cos216,sinang,cosang)); x.push_back(xc+RotX(-0.5*s*cos288+h*sin288,-0.5*s*sin288-h*cos288,sinang,cosang)); y.push_back(yc+RotY(-0.5*s*cos288+h*sin288,-0.5*s*sin288-h*cos288,sinang,cosang)); x.push_back(xc+RotX(ap*sin288,-ap*cos288,sinang,cosang)); y.push_back(yc+RotY(ap*sin288,-ap*cos288,sinang,cosang)); // SetUp( x, y ); } /* std::ostream &operator<<( std::ostream &out, GRA_star5pt const &p ) { out << "\n"; std::size_t size = p.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } */ // end of file extrema-4.4.5/src/Graphics/GRA_multiLineFigure.cpp0000644012702201742730000000572311332173256021051 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_multiLineFigure.h" #include "GRA_wxWidgets.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "ExGlobals.h" GRA_multiLineFigure::GRA_multiLineFigure( std::vector const &x, std::vector const &y, std::vector const &pen, GRA_color *lineColor, int lineWidth, int lineType ) : GRA_shape(lineColor,0,lineWidth,lineType,wxT("MULTILINEFIGURE")) { std::size_t xSize = x.size(); std::size_t ySize = y.size(); std::size_t pSize = pen.size(); std::size_t size = std::min( std::min(xSize,ySize), pSize ); x_.assign( x.begin(), x.end() ); y_.assign( y.begin(), y.end() ); pen_.assign( pen.begin(), pen.end() ); xmin_ = x_[0]; xmax_ = x_[0]; ymin_ = y_[0]; ymax_ = y_[0]; for( std::size_t i=1; i xmax_ )xmax_ = x_[i]; if( y_[i] < ymin_ )ymin_ = y_[i]; if( y_[i] > ymax_ )ymax_ = y_[i]; } xc_ = (xmax_+xmin_)/2.0; yc_ = (ymax_+ymin_)/2.0; } void GRA_multiLineFigure::CopyStuff( GRA_multiLineFigure const &rhs ) { x_.assign( rhs.x_.begin(), rhs.x_.end() ); y_.assign( rhs.y_.begin(), rhs.y_.end() ); pen_.assign( rhs.pen_.begin(), rhs.pen_.end() ); type_ = rhs.type_; } void GRA_multiLineFigure::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { wxPen wxpen( dc.GetPen() ); wxpen.SetWidth( lineWidth_ ); wxpen.SetColour( ExGlobals::GetwxColor(lineColor_) ); dc.SetPen( wxpen ); // std::size_t size = x_.size(); for( std::size_t i=0; iPenUp(x_[i],y_[i]) : graphicsOutput->PenDown(x_[i],y_[i],dc); } } std::ostream &operator<<( std::ostream &out, GRA_multiLineFigure const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_postscript.cpp0000644012702201742730000027333111440746667020175 0ustar spangspang/* Copyright (C) 2005,...,2009 Joseph L. Chuma 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. */ #include #include #include #include "GRA_postscript.h" #include "GRA_window.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_point.h" #include "GRA_polyline.h" #include "GRA_polygon.h" #include "GRA_ellipse.h" #include "GRA_multiLineFigure.h" #include "GRA_rectangle.h" #include "GRA_cross.h" #include "GRA_crossPlus.h" #include "GRA_plus.h" #include "GRA_diamond.h" #include "GRA_diamondPlus.h" #include "GRA_asterisk.h" #include "GRA_triangle.h" #include "GRA_ellipse.h" #include "GRA_star5pt.h" #include "GRA_arrow3.h" #include "GRA_plotSymbol.h" #include "GRA_bitmap.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_simpleText.h" #include "GRA_drawableText.h" #include "GRA_axis.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "GRA_polarAxes.h" #include "GRA_polarCurve.h" #include "GRA_errorBar.h" #include "GRA_characteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_legend.h" #include "GRA_contourLine.h" #include "GRA_boxPlot.h" #include "GRA_diffusionPlot.h" #include "GRA_ditheringPlot.h" #include "GRA_gradientPlot.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "UsefulFunctions.h" double GRA_postscript::dotsPerInch_ = 72.0; GRA_postscript::~GRA_postscript() { outFile_.close(); } void GRA_postscript::Initialize( wxString const &filename ) { filename_ = filename; lineWidth_ = 0; lineType_ = 1; // double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); // SetDefaultDrawLineTable(); SetUpTransformationMatrices( xminW, yminW, xmaxW, ymaxW ); // wxString extension( ExGlobals::GetFileExtension(filename_) ); if( extension.empty() )filename_ << wxT(".eps"); outFile_.open( filename_.mb_str(wxConvUTF8), std::ios_base::out ); if( !outFile_.is_open() ) throw EGraphicsError( wxString()<(xminW*dotsPerInch_+0.5) << " " << static_cast(yminW*dotsPerInch_+0.5) << " " << static_cast(xmaxW*dotsPerInch_+0.5) << " " << static_cast(ymaxW*dotsPerInch_+0.5) << "\n" << "%%Creator: Extrema\n" << "%%DocumentData: Clean7Bit\n" << "%%LanguageLevel: 2\n" << "%%EndComments\n" << "%%BeginProlog\n" << "1 setlinecap\n" // round linecap << "1 setlinejoin\n" // round linejoin << "%%EndProlog\n" << "/SetupText {\n" << " /TotalLength 0 def\n" << " /Index 0 def\n" << " ArrayLength {\n" << " /Font TextBuffer Index get 1 get def\n" << " /Height TextBuffer Index get 2 get def\n" << " /XShift TextBuffer Index get 3 get def\n" << " /YShift TextBuffer Index get 4 get def\n" << " /String TextBuffer Index get 5 get def\n" << " Font findfont Height scalefont setfont\n" << " /TotalLength TotalLength String stringwidth pop XShift add add def\n" << " /Index Index 1 add def } repeat\n" << "} def\n" << "/DrawText {\n" << " Xloc Yloc moveto\n" << " Angle rotate\n" << " /Index 0 def\n" << " ArrayLength {\n" << " /R TextBuffer Index get 0 get 0 get def\n" << " /G TextBuffer Index get 0 get 1 get def\n" << " /B TextBuffer Index get 0 get 2 get def\n" << " /Font TextBuffer Index get 1 get def\n" << " /Height TextBuffer Index get 2 get def\n" << " /XShift TextBuffer Index get 3 get def\n" << " /YShift TextBuffer Index get 4 get def\n" << " /String TextBuffer Index get 5 get def\n" << " Font findfont Height scalefont setfont\n" << " R G B setrgbcolor\n" << " XShift YShift rmoveto\n" << " String show\n" << " /Index Index 1 add def } repeat\n" << " Angle -1 mul rotate\n" << "} def\n" << "/s {stroke} def\n" << "/m {moveto} def\n" << "/l {lineto} def\n"; counter_ = 0; } void GRA_postscript::SetUpTransformationMatrices( double xmin, double ymin, double xmax, double ymax ) { xMin_ = xmin; yMin_ = ymin; xMax_ = xmax; yMax_ = ymax; // double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); // // Calculate the world to outputType transformation // // |x| |xw| // | | = w2oMatrix_ * | | + w2oShift_ // |y| |yw| // w2oMatrix_[0][0] = (xMax_-xMin_)/(xmaxW-xminW); w2oMatrix_[0][1] = 0.0; w2oMatrix_[1][0] = 0.0; w2oMatrix_[1][1] = (yMax_-yMin_)/(ymaxW-yminW); w2oShift_[0] = xMin_-xminW*w2oMatrix_[0][0]; w2oShift_[1] = yMin_-yminW*w2oMatrix_[1][1]; // // Calculate the inverse transformation matrix o2wMatrix_ from // the outputType coordinate system to the world coordinate system: // // |xw| |x| // | | = o2wMatrix_ * | | + o2wShift_ // |yw| |y| // // o2wMatrix_ = inv(w2oMatrix_) // world <-- outputType = inv(outputType <-- world) // double const determinant = w2oMatrix_[0][0]*w2oMatrix_[1][1] - w2oMatrix_[1][0]*w2oMatrix_[0][1]; o2wMatrix_[0][0] = w2oMatrix_[1][1]/determinant; o2wMatrix_[0][1] = -w2oMatrix_[0][1]/determinant; o2wMatrix_[1][0] = -w2oMatrix_[1][0]/determinant; o2wMatrix_[1][1] = w2oMatrix_[0][0]/determinant; // // Calculate the inverse translation vector o2wShift_ from the // outputType coordinate system to the world coordinate system // // o2wShift_ = -o2wMatrix_ * w2oShift_ // o2wShift_[0] = -o2wMatrix_[0][0]*w2oShift_[0] - o2wMatrix_[0][1]*w2oShift_[1]; o2wShift_[1] = -o2wMatrix_[1][0]*w2oShift_[0] - o2wMatrix_[1][1]*w2oShift_[1]; } void GRA_postscript::EndDoc() { outFile_ << "s\n" << "showpage\n" << "%%EOF" << std::endl; } int GRA_postscript::GetLineWidth() const { return lineWidth_; } void GRA_postscript::GetLimits( double &xmin, double &ymin, double &xmax, double &ymax ) const { xmin = dotsPerInch_*xMin_; ymin = dotsPerInch_*yMin_; xmax = dotsPerInch_*xMax_; ymax = dotsPerInch_*yMax_; } void GRA_postscript::OutputTypeToWorld( int xo, int yo, double &xw, double &yw ) const { xw = o2wMatrix_[0][0]*xo + o2wMatrix_[0][1]*(yMax_-yo) + o2wShift_[0]; yw = o2wMatrix_[1][0]*xo + o2wMatrix_[1][1]*(yMax_-yo) + o2wShift_[1]; } void GRA_postscript::WorldToOutputType( double xw, double yw, double &xo, double &yo ) const { xo = dotsPerInch_*(w2oMatrix_[0][0]*xw + w2oMatrix_[0][1]*yw + w2oShift_[0]); yo = dotsPerInch_*(w2oMatrix_[1][0]*xw + w2oMatrix_[1][1]*yw + w2oShift_[1]); } GRA_color *GRA_postscript::GetColor() const { return GRA_colorControl::GetColor( GRA_colorControl::GetColorCode(r_,g_,b_) ); } void GRA_postscript::SetColor( GRA_color *c ) { if( !c )return; int r, g, b; c->GetRGB( r, g, b ); SetColor( r, g, b ); } void GRA_postscript::SetColor( int i ) { int r, g, b; GRA_colorControl::ColorCodeToRGB( i, r, g, b ); SetColor( r, g, b ); } void GRA_postscript::SetColor( int r, int g, int b ) { r_ = r; g_ = g; b_ = b; double dr = static_cast(r)/255.0; double dg = static_cast(g)/255.0; double db = static_cast(b)/255.0; outFile_ << "s\n" << dr << " " << dg << " " << db << " setrgbcolor\n"; } void GRA_postscript::SetLineWidth( int i ) { if( lineWidth_ != i ) { lineWidth_ = i; outFile_ << "s\n" << static_cast(i) << " setlinewidth\n"; } } void GRA_postscript::SetLineType( int i ) { lineType_ = std::max(1,std::min(10,i)); // illegal type defaults to solid line } int GRA_postscript::GetLineType() const { return lineType_; } void GRA_postscript::GenerateOutput( double x, double y, int pen ) { // Generates graphics output for the printer: // pen=2: move to location (x,y) // pen=3: draw to location (x,y) // pen=20: plot a point at location (x,y) // double ixd, iyd; WorldToOutputType( x, y, ixd, iyd ); int ix = static_cast(ixd+0.5); int iy = static_cast(iyd+0.5); switch (pen) { case 3: { outFile_ << "s newpath " << ix << " " << iy << " m\n"; counter_ = 0; break; } case 2: { outFile_ << ix << " " << iy << " l\n"; if( ++counter_ == 500 ) { outFile_ << "s " << ix << " " << iy << " m\n"; counter_ = 0; } break; } case 20: { outFile_ << "s newpath " << ix << " " << iy << " m " << ix << " " << iy << " l\n"; counter_ = 0; break; } } } void GRA_postscript::Plot( double x, double y, int pen ) { // (x,y) are the world coordinates to which the pen is to be moved either up // (pen=3) or down (pen=2). The plot coordinates (x,y) can have any value // positive or negative, but are clipped outside the plot windows. // switch (pen) { case 3: // move with pen up to (x,y) { PenUp( x, y ); break; } case 2: // move with pen down to (x,y) { PenDown( x, y ); break; } case 20: // plot a point at (x,y) { PlotPoint( x, y ); break; } } } void GRA_postscript::PlotPoint( double x, double y ) { double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); if( (x-xmin)*(xmax-x)>=0.0 && (y-ymin)*(ymax-y)>=0.0 )GenerateOutput( x, y, 20 ); xPrevious_ = x; // set previous coordinates to new coordinates yPrevious_ = y; penPrevious_ = 20; } void GRA_postscript::PenUp( double x, double y ) { // penUp moves with the pen up (not drawing) to the plot coordinates (x,y) // double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); if( (x-xmin)*(xmax-x) >=0.0 && (y-ymin)*(ymax-y)>=0.0 )GenerateOutput( x, y, 3 ); xPrevious_ = x; // set previous coordinates to new coordinates yPrevious_ = y; penPrevious_ = 3; } void GRA_postscript::PenDown( double x, double y ) { // PenDown draws a line to the world coordinates (x,y) // // clip the line segment (xPrevious_,yPrevious_)-->(x,y) within the clipping boundary // double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); if( x>=xmin && xPrevious_>=xmin && x<=xmax && xPrevious_<=xmax && y>=ymin && yPrevious_>=ymin && y<=ymax && yPrevious_<=ymax ) { // (x,y) and (xPrevious_,yPrevious_) are both inside the clipping boundary // GenerateOutput( x, y, 2 ); } else { int ndraw = 1; double xdraw[2], ydraw[2]; xdraw[0] = x; ydraw[0] = y; UsefulFunctions::WindowClip( xPrevious_, yPrevious_, x, y, xmin, xmax, ymin, ymax, xdraw, ydraw, ndraw ); switch (ndraw) { case 1: //(x,y) is outside but (xPrevious_,yPrevious_) is in { GenerateOutput( xdraw[0], ydraw[0], 2 ); break; } case 2: // (x,y) and (xPrevious_,yPrevious_) are both outside case 3: // (xPrevious_,yPrevious_) is outside but (x,y) is inside { GenerateOutput( xdraw[0], ydraw[0], 3 ); GenerateOutput( xdraw[1], ydraw[1], 2 ); break; } } } xPrevious_ = x; // set previous coordinates to new coordinates yPrevious_ = y; penPrevious_ = 2; } void GRA_postscript::Draw( GRA_point *p ) { SetColor( p->GetColor() ); double x, y; p->GetXY( x, y ); PlotPoint( x, y ); } void GRA_postscript::Draw( GRA_polyline *pl ) { SetColor( pl->GetColor() ); SetLineWidth( pl->GetLineWidth() ); SetLineType( pl->GetLineType() ); // std::vector const &x = pl->GetX(); std::vector const &y = pl->GetY(); std::vector const &pen = pl->GetPen(); std::size_t size = x.size(); // StartLine( x[0], y[0] ); for( std::size_t i=1; i x, y; p->DoClipping( xmin, ymin, xmax, ymax, x, y ); // if( x.empty() )return; std::size_t const size = x.size(); std::vector ix(size), iy(size); for( std::size_t i=0; i(ixtmp+0.5); iy[i] = static_cast(iytmp+0.5); } GRA_color *fillColor = p->GetFillColor(); if( fillColor ) { SetColor( fillColor ); outFile_ << "newpath " << ix[0] << " " << iy[0] << " m\n"; for( std::size_t i=1; iGetLineWidth() ); SetColor( p->GetLineColor() ); outFile_ << "newpath " << ix[0] << " " << iy[0] << " m\n"; for( std::size_t i=1; iGetLineColor() ); outFile_ << "newpath\n"; std::vector x, y; std::vector pen; m->GetCoordinates( x, y, pen ); std::size_t size = x.size(); for( std::size_t i=0; iGetLineWidth() ); outFile_ << "s\n"; } void GRA_postscript::Draw( GRA_ellipse *ellipse ) { outFile_ << "s\n"; if( ellipse->IsaCircle() ) { double xp1, yp1, xp2, yp2; WorldToOutputType( 0.0, 0.0, xp1, yp1 ); WorldToOutputType( 0.5*ellipse->GetMajorAxis(), 0.0, xp2, yp2 ); int iradius = static_cast(sqrt((xp1-xp2)*(xp1-xp2)+(yp1-yp2)*(yp1-yp2))+0.5); double xc, yc; ellipse->GetCenter( xc, yc ); double icx, icy; WorldToOutputType( xc, yc, icx, icy ); int ir, ig, ib; double dr, dg, db; // GRA_color *fillColor = ellipse->GetFillColor(); if( fillColor ) { SetColor( fillColor ); outFile_ << "newpath " << static_cast(icx+0.5) << " " << static_cast(icy+0.5) << " " << iradius << " 0 360 arc fill\n"; } SetColor( ellipse->GetLineColor() ); outFile_ << "newpath " << static_cast(icx+0.5) << " " << static_cast(icy+0.5) << " " << iradius << " 0 360 arc s\n"; } else { double majorAxis = ellipse->GetMajorAxis(); double frac = ellipse->GetMinorAxis()/majorAxis; double xp1, yp1, xp2, yp2; WorldToOutputType( 0.0, 0.0, xp1, yp1 ); WorldToOutputType( 0.5*majorAxis, 0.0, xp2, yp2 ); int iradius = static_cast(sqrt((xp1-xp2)*(xp1-xp2)+(yp1-yp2)*(yp1-yp2))+0.5); double xc, yc; ellipse->GetCenter( xc, yc ); double cxp, cyp; WorldToOutputType( xc, yc, cxp, cyp ); double s1, s2, s3, s4; int icx, icy; double xul, yul, xlr, ylr; ellipse->GetLimits( xul, yul, xlr, ylr ); if( xlr-xul >= yul-ylr ) { s1 = frac; s2 = 1.0; s3 = 1.0/frac; s4 = 1.0; icx = static_cast(cxp/frac+0.5); icy = static_cast(dotsPerInch_*cyp+0.5); } else { s1 = 1.0; s2 = frac; s3 = 1.0; s4 = 1.0/frac; icx = static_cast(dotsPerInch_*cxp+0.5); icy = static_cast(cyp/frac+0.5); } outFile_ << s1 << " " << s2 << " scale\n"; int ir, ig, ib; double dr, dg, db; // GRA_color *fillColor = ellipse->GetFillColor(); if( fillColor ) { SetColor( fillColor ); outFile_ << "newpath " << icx << " " << icy << " " << iradius << " 0 360 arc fill\n"; } SetColor( ellipse->GetLineColor() ); outFile_ << "newpath " << icx << " " << icy << " " << iradius << " 0 360 arc s\n" << s3 << " " << s4 << " scale\n"; } } void GRA_postscript::Draw( GRA_plotSymbol *p ) { int shapeCode = p->GetShapeCode(); if( shapeCode==0 || shapeCode==32 )return; double x, y; p->GetLocation( x, y ); double size = p->GetSize(); double angle = p->GetAngle(); GRA_color *color = p->GetColor(); int lineWidth = p->GetLineWidth(); switch( shapeCode ) { case 1: // square { GRA_rectangle r(x,y,size,size,angle,color,0,lineWidth); Draw( static_cast(&r) ); break; } case 2: // cross { GRA_cross c(x,y,size,angle,color,lineWidth); Draw( static_cast(&c) ); break; } case 3: // square with cross { GRA_crossPlus cp(x,y,size,angle,color,lineWidth); Draw( static_cast(&cp) ); break; } case 4: // plus { GRA_plus p(x,y,size,angle,color,lineWidth); Draw( static_cast(&p) ); break; } case 5: // diamond { GRA_diamond d(x,y,size,angle,color,0,lineWidth); Draw( static_cast(&d) ); break; } case 6: // diamond + { GRA_diamondPlus dp(x,y,size,angle,color,lineWidth); Draw( static_cast(&dp) ); break; } case 7: // asterisk { GRA_asterisk a(x,y,size,angle,color,lineWidth); Draw( static_cast(&a) ); break; } case 8: // triangle { GRA_triangle t(x,y,size,angle,color,0,lineWidth); Draw( static_cast(&t) ); break; } case 9: // circle { double radius = size*0.5; GRA_ellipse e(x-radius,y-radius,x+radius,y+radius,true,color,0,lineWidth,1); Draw( &e ); break; } case 10: // star { GRA_star5pt s5(x,y,size,angle,color,0,lineWidth); Draw( static_cast(&s5) ); break; } case 11: // point { PlotPoint( x, y ); break; } case 12: // arrow with foot at (x,y) { GRA_arrow3 a3(x,y,size,0.0,angle,color,lineWidth); Draw( static_cast(&a3) ); break; } case 13: // arrow centred at (x,y) { GRA_arrow3 a3(x,y,size,0.5*size,angle,color,lineWidth); Draw( static_cast(&a3) ); break; } case 14: // filled square { GRA_rectangle r(x,y,size,size,angle,color,color,lineWidth); Draw( static_cast(&r) ); break; } case 15: // filled diamond { GRA_diamond d(x,y,size,angle,color,color,lineWidth); Draw( static_cast(&d) ); break; } case 16: // filled triangle { GRA_triangle t(x,y,size,angle,color,color,lineWidth); Draw( static_cast(&t) ); break; } case 17: // filled circle { double radius = size*0.5; GRA_ellipse e(x-radius,y-radius,x+radius,y+radius,true,color,color,lineWidth,1); Draw( &e ); break; } case 18: // filled star { GRA_star5pt s5(x,y,size,angle,color,color,lineWidth); Draw( static_cast(&s5) ); break; } } } void GRA_postscript::Draw( GRA_axis *axis ) { std::vector &polylines( axis->GetPolylines() ); std::vector::const_iterator pEnd = polylines.end(); for( std::vector::const_iterator i=polylines.begin(); i!=pEnd; ++i )Draw( *i ); std::vector &textVec( axis->GetDrawableText() ); std::vector::const_iterator tEnd = textVec.end(); for( std::vector::const_iterator i=textVec.begin(); i!=tEnd; ++i )Draw( *i ); } void GRA_postscript::Draw( GRA_cartesianAxes *cartesianAxes ) { GRA_axis *xAxis, *yAxis, *boxXAxis, *boxYAxis; cartesianAxes->GetAxes( xAxis, yAxis, boxXAxis, boxYAxis ); Draw( xAxis ); Draw( yAxis ); if( boxXAxis )Draw( boxXAxis ); if( boxYAxis )Draw( boxYAxis ); // GRA_setOfCharacteristics *xAxisC = xAxis->GetCharacteristics(); GRA_setOfCharacteristics *yAxisC = yAxis->GetCharacteristics(); // // draw the x-axis grid lines, if requested // lineType_ = cartesianAxes->GetGridLineType(); SetColor( static_cast(xAxisC->Get(wxT("AXISCOLOR")))->Get() ); double xlaxis, ylaxis, xuaxis, yuaxis; xAxis->GetOrigin( xlaxis, ylaxis ); xAxis->GetEndPoint( xuaxis, yuaxis ); int nGrid = xAxis->GetGrid(); double axisAngle = xAxis->GetAngle(); // std::vector xTicCoordinates, yTicCoordinates; xAxis->GetTicCoordinates( xTicCoordinates, yTicCoordinates ); std::size_t size = xTicCoordinates.size(); double const eps = 0.001; // // grid lines are drawn on every nxgrid_th (sic) long tic mark on the x-axis // for( std::size_t i=0; ieps && fabs(x-xlaxis)>eps ) // don't draw on top of y-axis { StartLine( x, y ); ContinueLine( x, y+(yuaxis-ylaxis) ); } } // // draw the y-axis grid lines, if requested // SetColor( static_cast(yAxisC->Get(wxT("AXISCOLOR")))->Get() ); yAxis->GetOrigin( xlaxis, ylaxis ); yAxis->GetEndPoint( xuaxis, yuaxis ); nGrid = yAxis->GetGrid(); axisAngle = yAxis->GetAngle(); // xTicCoordinates.clear(); yTicCoordinates.clear(); yAxis->GetTicCoordinates( xTicCoordinates, yTicCoordinates ); size = xTicCoordinates.size(); // // grid lines are drawn on every nxgrid_th (sic) long tic mark on the x-axis // for( std::size_t i=0; ieps && fabs(y-ylaxis)>eps ) // don't draw on top of x-axis { StartLine( x, y ); ContinueLine( x+(xuaxis-xlaxis), y ); } } // draw the x-axis automatic label // wxString label; bool labelIsOn = static_cast(xAxisC->Get(wxT("LABELON")))->Get(); if( labelIsOn )label = static_cast(xAxisC->Get(wxT("LABEL")))->Get(); if( label.empty() )labelIsOn = false; double power = static_cast(xAxisC->Get(wxT("POWER")))->Get(); if( static_cast(xAxisC->Get(wxT("LOGBASE")))->Get()<=1.0 && power != 0.0 && static_cast(xAxisC->Get(wxT("POWERAUTO")))->Get()!=2 && static_cast(xAxisC->Get(wxT("NUMBERSON")))->Get() ) { wxString powLabel(wxT("(x10<^>")); powLabel << power << wxT("<_>)"); label.empty() ? label=powLabel : label << wxT(" ") << powLabel; labelIsOn = true; } // // the axis label is composed of two parts: // a) the string found in the label // b) the factor by which all the numbers // labelling the axis should be multiplied to get the graph axis units // // if powerAuto_ = 2, calculate the power but do not draw it // if( labelIsOn ) { double sizlab = static_cast(xAxisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); double imagTicAngle = static_cast(xAxisC->Get(wxT("IMAGTICANGLE")))->Get(); double imagTicLen = static_cast(xAxisC->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); double numHeight = static_cast(xAxisC->Get(wxT("NUMBERSHEIGHT")))->GetAsWorld(); GRA_font *labelFont = static_cast(xAxisC->Get(wxT("LABELFONT")))->Get(); GRA_color *labelColor = static_cast(xAxisC->Get(wxT("LABELCOLOR")))->Get(); double x1, y1, angle=0.0; int align = 2; double xOrigin, yOrigin; xAxis->GetOrigin( xOrigin, yOrigin ); // // draw the label horizontally and centered on the x-axis x1 = xOrigin + 0.5*xAxis->GetLength(); if( imagTicAngle > 180.0 ) { align = 8; // 8=top centre y1 = yOrigin - 1.05*(imagTicLen+numHeight); } else { align = 2; // 2=bottom centre y1 = yOrigin + 1.05*(imagTicLen+numHeight); } GRA_drawableText *dt = new GRA_drawableText(label,sizlab,angle,x1,y1,align,labelFont,labelColor); try { dt->Parse(); } catch( EGraphicsError const &e ) { delete dt; throw; } Draw( dt ); } // // draw the y-axis automatic label // labelIsOn = static_cast(yAxisC->Get(wxT("LABELON")))->Get(); label.clear(); if( labelIsOn )label = static_cast(yAxisC->Get(wxT("LABEL")))->Get(); if( label.empty() )labelIsOn = false; power = static_cast(yAxisC->Get(wxT("POWER")))->Get(); if( static_cast(yAxisC->Get(wxT("LOGBASE")))->Get()<=1.0 && power != 0.0 && static_cast(yAxisC->Get(wxT("POWERAUTO")))->Get()!=2 && static_cast(yAxisC->Get(wxT("NUMBERSON")))->Get() ) { wxString powLabel(wxT("(x10<^>")); powLabel << power << wxT("<_>)"); label.empty() ? label=powLabel : label << wxT(" ") << powLabel; labelIsOn = true; } // // the axis label is composed of two parts: // a) the string found in the label // b) the factor by which all the numbers // labelling the axis should be multiplied to get the graph axis units // // if powerAuto_ = 2, calculate the power but do not draw it // if( labelIsOn ) { double sizlab = static_cast(yAxisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); double imagTicAngle = static_cast(yAxisC->Get(wxT("IMAGTICANGLE")))->Get(); double imagTicLen = static_cast(yAxisC->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); GRA_font *labelFont = static_cast(yAxisC->Get(wxT("LABELFONT")))->Get(); GRA_color *labelColor = static_cast(yAxisC->Get(wxT("LABELCOLOR")))->Get(); double x1, y1, angle=0.0; int align = 2; double xOrigin, yOrigin; yAxis->GetOrigin( xOrigin, yOrigin ); double numWidth = yAxis->GetMaxWidth(); // // draw the label vertically and centered on the y-axis // y1 = yOrigin + 0.5*yAxis->GetLength(); if( imagTicAngle > 180.0 ) { x1 = xOrigin + 1.05*(imagTicLen+numWidth); angle = 270.0; } else { x1 = xOrigin - 1.05*(imagTicLen+numWidth); angle = 90.0; } GRA_drawableText *dt = new GRA_drawableText(label,sizlab,angle,x1,y1,align,labelFont,labelColor); try { dt->Parse(); } catch( EGraphicsError const &e ) { delete dt; throw; } Draw( dt ); } } void GRA_postscript::Draw( GRA_cartesianCurve *cartesianCurve ) { double xlaxis, ylaxis, xuaxis, yuaxis; cartesianCurve->GetClippingBoundary( xlaxis, ylaxis, xuaxis, yuaxis ); ExGlobals::SetClippingBoundary( xlaxis, ylaxis, xuaxis, yuaxis ); GRA_color *areaFillColor = cartesianCurve->GetAreaFillColor(); GRA_color *color = cartesianCurve->GetColor(); int lineWidth = cartesianCurve->GetLineWidth(); int lineType = cartesianCurve->GetLineType(); std::vector xCurve, yCurve; cartesianCurve->GetXYcurve( xCurve, yCurve ); switch ( cartesianCurve->GetHistogramType() ) { case 1: case 3: { // draw histogram with no tails // std::size_t size = xCurve.size(); if( areaFillColor && size>1 ) { // draw the filled region // make sure polygon is closed, add last point set to first point // xCurve.push_back( xCurve.front() ); yCurve.push_back( yCurve.front() ); GRA_polygon p( xCurve, yCurve, color, areaFillColor, lineWidth ); Draw( &p ); xCurve.erase( xCurve.end()-1 ); yCurve.erase( yCurve.end()-1 ); } SetColor( color ); SetLineWidth( lineWidth ); PenUp( xCurve[0], yCurve[0] ); for( std::size_t i=1; iGetXData().size(); if( npt > 1 ) { std::vector xp, yp; std::vector areaFillColors( cartesianCurve->GetAreaFillColors() ); bool areaFillColorVector = !areaFillColors.empty(); for( std::size_t i=0; i().swap( xp ); std::vector().swap( yp ); } } } SetColor( color ); SetLineWidth( lineWidth ); if( npt == 1 ) { PenUp( xCurve[0], yCurve[0] ); PenDown( xCurve[1], yCurve[1] ); } else { for( std::size_t i=0; i pen( cartesianCurve->GetPen() ); for( std::size_t i=0; i plotsymbols( cartesianCurve->GetPlotSymbols() ); for( std::size_t i=0; iSetLocation( xCurve[i], yCurve[i] ); Draw( plotsymbols[i] ); } } } } // draw error bars // std::vector errorBars( cartesianCurve->GetErrorBars() ); if( !errorBars.empty() ) { std::vector::const_iterator end = errorBars.end(); for( std::vector::const_iterator i=errorBars.begin(); i!=end; ++i ) Draw( static_cast(*i) ); } ExGlobals::ResetClippingBoundary(); } void GRA_postscript::Draw( GRA_polarAxes *polarAxes ) { // draw the 0 degree radial axis // GRA_axis *axis = polarAxes->GetAxis(); Draw( axis ); // // draw the automatic axis label // GRA_setOfCharacteristics *axisC = axis->GetCharacteristics(); // wxString label; bool labelIsOn = static_cast(axisC->Get(wxT("LABELON")))->Get(); if( labelIsOn )label = static_cast(axisC->Get(wxT("LABEL")))->Get(); if( label.empty() )labelIsOn = false; // // if powerAuto_ = 2, calculate the power but do not draw it // double power = static_cast(axisC->Get(wxT("POWER")))->Get(); if( static_cast(axisC->Get(wxT("POWERAUTO")))->Get()!=2 && static_cast(axisC->Get(wxT("NUMBERSON")))->Get() && power!=0.0 ) { wxString powLabel(wxT("(x10<^>")); label << power << wxT("<_>)"); label = label.empty() ? powLabel : label+wxT(" ")+powLabel; labelIsOn = true; } // // the axis label is composed of two parts: // a) the string found in the label // b) the factor by which all the numbers // labelling the axis should be multiplied to get the graph axis units // if( labelIsOn ) { double sizlab = static_cast(axisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); double imagTicAngle = static_cast(axisC->Get(wxT("IMAGTICANGLE")))->Get(); double imagTicLen = static_cast(axisC->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); double numHeight = static_cast(axisC->Get(wxT("NUMBERSHEIGHT")))->GetAsWorld(); GRA_font *labelFont = static_cast(axisC->Get(wxT("LABELFONT")))->Get(); GRA_color *labelColor = static_cast(axisC->Get(wxT("LABELCOLOR")))->Get(); double xOrigin, yOrigin; axis->GetOrigin( xOrigin, yOrigin ); double length = axis->GetLength(); double axisAngle = axis->GetAngle(); double x1, y1, angle; int align; // // draw the label horizontally and centered on the axis if( axisAngle == 0.0 ) { x1 = xOrigin + 0.5*length; y1 = yOrigin - 1.05*(imagTicLen+numHeight); angle = 0.0; align = 8; // 8=top centre } else { x1 = xOrigin + 1.1*(imagTicLen+axis->GetMaxWidth()); y1 = yOrigin + 0.5*length; angle = 270.0; align = 2; // bottom centre } GRA_drawableText dt(label,sizlab,angle,x1,y1,align,labelFont,labelColor); try { dt.Parse(); } catch( EGraphicsError const &e ) { throw; } Draw( &dt ); } // // draw the other axes // std::vector otherAxes( polarAxes->GetOtherAxes() ); std::size_t nAxes = otherAxes.size(); for( std::size_t i=0; i(axisC->Get(wxT("AXISCOLOR")))->Get(); double xorigin, yorigin; axis->GetOrigin( xorigin, yorigin ); int gridLineType = polarAxes->GetGridLineType(); // // grid circles are drawn at tic marks on the x-axis // std::vector ticX, ticY; axis->GetTicCoordinates( ticX, ticY ); double axisAngle = axis->GetAngle(); double cosAngle = cos(axisAngle*M_PI/180.0); double sinAngle = sin(axisAngle*M_PI/180.0); if( fabs(cosAngle) < 0.0001 )cosAngle = 0.0; if( fabs(sinAngle) < 0.0001 )sinAngle = 0.0; std::size_t ticSize = ticX.size(); std::vector x, y; std::vector pen; int ngrid = abs(axis->GetGrid()); for( std::size_t i=0; i(axisC->Get(wxT("LABELHEIGHT")))->GetAsWorld(); if( height > 0.0 ) { GRA_color *color = static_cast(axisC->Get(wxT("LABELCOLOR")))->Get(); GRA_font *font = static_cast(axisC->Get(wxT("LABELFONT")))->Get(); bool clockwise = polarAxes->GetClockwise(); double xend, yend, angle; wxString label; if( polarAxes->GetCompassLabels() && (nAxes==0||nAxes==1||nAxes==3||nAxes==7||nAxes==15) ) { axis->GetEndPoint( xend, yend ); DrawAngle( label<GetEndPoint( xend, yend ); angle = otherAxes[0]->GetAngle(); DrawAngle( label< labels(3); labels[0] = wxT("E"); labels[1] = wxT("S"); labels[2] = wxT("W"); for( int i=0; i<3; ++i ) { otherAxes[i]->GetEndPoint( xend, yend ); angle = otherAxes[i]->GetAngle(); if( clockwise ) DrawAngle( labels[2-i], xend, yend, angle, height, color, font ); else DrawAngle( labels[i], xend, yend, angle, height, color, font ); } break; } case 7: // N, NE, E, SE, S, SW, W, NW { std::vector labels(7); labels[0] = wxT("NE"); labels[1] = wxT("E"); labels[2] = wxT("SE"); labels[3] = wxT("S"); labels[4] = wxT("SW"); labels[5] = wxT("W"); labels[6] = wxT("NW"); for( int i=0; i<7; ++i ) { otherAxes[i]->GetEndPoint( xend, yend ); angle = otherAxes[i]->GetAngle(); if( clockwise ) DrawAngle( labels[6-i], xend, yend, angle, height, color, font ); else DrawAngle( labels[i], xend, yend, angle, height, color, font ); } break; } case 15: { std::vector labels(15); labels[0] = wxT("NNE"); labels[1] = wxT("NE"); labels[2] = wxT("ENE"); labels[3] = wxT("E"); labels[4] = wxT("ESE"); labels[5] = wxT("SE"); labels[6] = wxT("SSE"); labels[7] = wxT("S"); labels[8] = wxT("SSW"); labels[9] = wxT("SW"); labels[10] = wxT("WSW"); labels[11] = wxT("W"); labels[12] = wxT("WNW"); labels[13] = wxT("NW"); labels[14] = wxT("NNW"); for( int i=0; i<15; ++i ) { otherAxes[i]->GetEndPoint( xend, yend ); angle = otherAxes[i]->GetAngle(); if( clockwise ) DrawAngle( labels[14-i], xend, yend, angle, height, color, font ); else DrawAngle( labels[i], xend, yend, angle, height, color, font ); } break; } } } else { axis->GetEndPoint( xend, yend ); DrawAngle( label<"), xend, yend, axisAngle, height, color, font ); label.clear(); for( std::size_t i=0; iGetAngle(); double drawAngle = angle - axisAngle; while( drawAngle < 0.0 )drawAngle += 360.0; if( clockwise )drawAngle = 360.0 - drawAngle; otherAxes[i]->GetEndPoint( xend, yend ); DrawAngle( label<"), xend, yend, angle, height, color, font ); label.clear(); } } } } void GRA_postscript::DrawAngle( wxString &label, double xend, double yend, double angle, double height, GRA_color *color, GRA_font *font ) { int align = 4; if( 45 < angle && angle < 135 ) align = 2; else if( 135 <= angle && angle < 225 )align = 6; else if( 225 <= angle && angle < 315 )align = 8; // double xoff = 0.2*cos(angle*M_PI/180.); double yoff = 0.2*sin(angle*M_PI/180.); GRA_drawableText dt( label, height, 0.0, xend+xoff, yend+yoff, align, font, color ); dt.Parse(); Draw( &dt ); } void GRA_postscript::Draw( GRA_polarCurve *polarCurve ) { std::vector xCurve, yCurve; polarCurve->GetXYcurve( xCurve, yCurve ); GRA_color *areaFillColor = polarCurve->GetAreaFillColor(); if( areaFillColor ) { // draw the filled region // make sure polygon is closed, may have to add last point set to first point // bool test = false; if( xCurve.front()!=xCurve.back() || yCurve.front()!=yCurve.back() ) { test = true; xCurve.push_back( xCurve.front() ); yCurve.push_back( yCurve.front() ); } GRA_polygon p( xCurve, yCurve, polarCurve->GetColor(), areaFillColor, polarCurve->GetLineWidth() ); Draw( &p ); if( test ) { xCurve.erase( xCurve.end()-1 ); yCurve.erase( yCurve.end()-1 ); } } // draw the data curve itself // SetLineType( polarCurve->GetLineType() ); SetColor( polarCurve->GetColor() ); SetLineWidth( polarCurve->GetLineWidth() ); std::vector pen( polarCurve->GetPen() ); std::size_t size = xCurve.size(); for( std::size_t i=0; i plotsymbols( polarCurve->GetPlotSymbols() ); for( std::size_t i=0; iGetGraphWindow(); GRA_setOfCharacteristics *legendC = gw->GetGraphLegendCharacteristics(); // if( static_cast(legendC->Get(wxT("FRAMEON")))->Get() && legend->GetFrame() ) Draw( legend->GetFrame() ); if( static_cast(legendC->Get(wxT("TITLEON")))->Get() && legend->GetTitle() ) Draw( legend->GetTitle() ); // double xStart = legend->GetLineStart(); double xEnd = legend->GetLineEnd(); double xLabel = legend->GetXLabel(); std::vector entries( legend->GetEntries() ); std::vector::const_iterator end = entries.end(); for( std::vector::const_iterator i=entries.begin(); i!=end; ++i ) { double labelHeight = (*i)->GetLabelHeight(); double y0 = legend->GetYHi() - 1.5*labelHeight*((*i)->GetEntryNumber()+1); // first draw the line segment // double y = y0 + labelHeight*0.5; if( (*i)->GetDrawLineSegment() ) { SetLineType( (*i)->GetLineType() ); SetLineWidth( (*i)->GetLineWidth() ); SetColor( (*i)->GetLineColor() ); StartLine( xStart, y ); ContinueLine( xEnd, y ); } // draw the symbols on the line segment // int nSymbols = (*i)->GetNSymbols(); GRA_plotSymbol plotSymbol( *(*i)->GetPlotSymbol() ); if( nSymbols > 0 ) { if( nSymbols > 1 ) { double xinc = (xEnd-xStart)/(nSymbols-1.); for( int i=0; iGetLabel() ); label.SetX( xLabel ); label.SetY( y0 ); Draw( &label ); } } void GRA_postscript::Draw( GRA_contourLine *contour ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); double const xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double const xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double const yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double const ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); ExGlobals::SetClippingBoundary( xlaxis, ylaxis, xuaxis, yuaxis ); // // draw the contour line // SetLineType( contour->GetLineType() ); SetColor( contour->GetColor() ); SetLineWidth( contour->GetLineWidth() ); double labelHeight = static_cast(generalC->Get(wxT("CONTOURLABELHEIGHT")))->GetAsWorld(); double labelAngle = 0.0; int labelAlignment = 5; GRA_font *labelFont = GRA_fontControl::GetFont(wxT("ARIAL")); GRA_color *labelColor = contour->GetColor(); std::vector< std::vector > xCurve( contour->GetXCurve() ); std::vector< std::vector > yCurve( contour->GetYCurve() ); std::size_t size = xCurve.size(); double const pp[5] = {0.2,0.333,0.5,0.667,0.8}; srand(time(0)); std::size_t ix = (rand()%5) + 1; for( std::size_t i=0; i 10 ) { ++ix; double xloc = xCurve[i][int(pp[ix%5]*np)]; double yloc = yCurve[i][int(pp[ix%5]*np)]; GRA_drawableText dt( wxString()<GetLevel(), labelHeight, labelAngle, xloc, yloc, labelAlignment, labelFont, labelColor ); dt.Parse(); Draw( &dt ); } } ExGlobals::ResetClippingBoundary(); } void GRA_postscript::Draw( GRA_boxPlot *boxPlot ) { double dataXmin, dataYmin, dataXmax, dataYmax; boxPlot->GetDataLimits( dataXmin, dataYmin, dataXmax, dataYmax ); GRA_cartesianAxes *axes =0; if( boxPlot->GetDrawAxes() ) { std::vector xt, yt; xt.push_back( dataXmin ); xt.push_back( dataXmax ); xt.push_back( dataXmax ); xt.push_back( dataXmin ); xt.push_back( dataXmin ); yt.push_back( dataYmax ); yt.push_back( dataYmax ); yt.push_back( dataYmin ); yt.push_back( dataYmin ); yt.push_back( dataYmax ); axes = new GRA_cartesianAxes(xt,yt,false,false); try { axes->Make(); } catch( EGraphicsError const &e ) { delete axes; throw; } Draw( axes ); } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); double xtmp, ytmp; gw->GraphToWorld( 0.0, 0.0, xtmp, ytmp, true ); double xmin = static_cast(xAxisC->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisC->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisC->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisC->Get(wxT("MAX")))->Get(); GRA_color *fillColor = static_cast(generalC->Get(wxT("AREAFILLCOLOR")))->Get(); GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); int mlo, nlo, mhi, nhi; boxPlot->GetMNLimits( mlo, nlo, mhi, nhi ); std::vector x, y, z; boxPlot->GetXYZ( x, y, z ); double xside, yside; boxPlot->GetSides( xside, yside ); std::size_t nrow = boxPlot->GetNRow(); double amin = boxPlot->GetAmin(); double da = boxPlot->GetDa(); double fmin, fmax; boxPlot->GetFminmax( fmin, fmax ); if( nrow > 0 ) // using the matrix and not x y z data { for( int i=mlo-1; ixmax || x[i]ymax || y[j]fmax )return; // double xw, yw; ExGlobals::GetGraphWindow()->GraphToWorld( x[i], y[j], xw, yw ); // GRA_rectangle r( xw, yw, xside*frac, yside*frac, 0.0, lineColor, fillColor, 1 ); Draw( &r ); } } } else // using x y z data and not the matrix { int ny = y.size(); for( int j=0; j=0.0 && (y[j]-ymin)*(ymax-y[j])>=0.0 ) { if( x[j]>xmax || x[j]ymax || y[j]fmax )return; // double xw, yw; ExGlobals::GetGraphWindow()->GraphToWorld( x[j], y[j], xw, yw ); // GRA_rectangle r( xw, yw, xside*frac, yside*frac, 0.0, lineColor, fillColor, 1 ); Draw( &r ); } } } if( boxPlot->GetBorder() ) { GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); double x1, y1, x2, y2; gw->GraphToWorld( dataXmin, dataYmin, x1, y1, true ); gw->GraphToWorld( dataXmax, dataYmax, x2, y2 ); GRA_rectangle r( x1, y1, x2, y2, 0.0, false, lineColor, 0, 1 ); Draw( &r ); } DrawProfiles( boxPlot ); if( boxPlot->GetDrawAxes() ) { Draw( axes ); delete axes; } if( boxPlot->GetResetAxes() ) { double xuaxisp, yuaxisp; boxPlot->GetUpperAxis( xuaxisp, yuaxisp ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( xuaxisp ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( yuaxisp ); } } void GRA_postscript::Draw( GRA_diffusionPlot *diffPlot ) { double dataXmin, dataYmin, dataXmax, dataYmax; diffPlot->GetDataLimits( dataXmin, dataYmin, dataXmax, dataYmax ); GRA_cartesianAxes *axes =0; // // Determine min and max values in array. The minimum value // will correspond to zero (blank) print density, the maximum // to solid black print // std::vector x, y, z; diffPlot->GetXYZ( x, y, z ); std::size_t nrow = diffPlot->GetNRow(); double amin, amax; UsefulFunctions::MinMax( z, nrow, 0, x.size(), 0, y.size(), amin, amax ); // double fmin, fmax; diffPlot->GetFminmax( fmin, fmax ); // double alo = amin + fmin*(amax-amin); double ahi = amin + fmax*(amax-amin); if( ahi-alo < std::numeric_limits::epsilon() ) throw EGraphicsError( wxT("region is flat") ); diffPlot->SetAlohi( alo, ahi ); double amean = (amin + amax) / 2.0; if( amean == 0.0 )amean = 1.e-10; if( fabs((amax-amin)/amean) < 1.0e-5 ) throw EGraphicsError( wxT("region is flat") ); try { diffPlot->SetUp(); } catch( EGraphicsError const &e ) { throw; } double xlo, ylo, xhi, yhi; diffPlot->GetXYLimits( xlo, ylo, xhi, yhi ); GRA_bitmap bitmap( xlo, ylo, xhi, yhi, GRA_colorControl::GetColor(wxT("WHITE")), (GRA_wxWidgets*)0 ); diffPlot->FillBitmap( &bitmap ); try { Draw( &bitmap ); } catch( EGraphicsError const &e ) { throw; } if( diffPlot->GetDrawAxes() ) { std::vector xt, yt; xt.push_back( dataXmin ); xt.push_back( dataXmax ); xt.push_back( dataXmax ); xt.push_back( dataXmin ); xt.push_back( dataXmin ); yt.push_back( dataYmax ); yt.push_back( dataYmax ); yt.push_back( dataYmin ); yt.push_back( dataYmin ); yt.push_back( dataYmax ); axes = new GRA_cartesianAxes(xt,yt,false,false); try { axes->Make(); } catch( EGraphicsError const &e ) { delete axes; throw; } Draw( axes ); } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); if( diffPlot->GetBorder() ) { GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); double x1, y1, x2, y2; gw->GraphToWorld( dataXmin, dataYmin, x1, y1, true ); gw->GraphToWorld( dataXmax, dataYmax, x2, y2 ); GRA_rectangle r( x1, y1, x2, y2, 0.0, false, lineColor, 0, 1 ); Draw( &r ); } DrawProfiles( diffPlot ); if( diffPlot->GetDrawAxes() ) { Draw( axes ); delete axes; } if( diffPlot->GetResetAxes() ) { double xuaxisp, yuaxisp; diffPlot->GetUpperAxis( xuaxisp, yuaxisp ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( xuaxisp ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( yuaxisp ); } } void GRA_postscript::Draw( GRA_ditheringPlot *dithPlot ) { double dataXmin, dataYmin, dataXmax, dataYmax; dithPlot->GetDataLimits( dataXmin, dataYmin, dataXmax, dataYmax ); GRA_cartesianAxes *axes =0; std::vector x, y, z; dithPlot->GetXYZ( x, y, z ); std::size_t nrow = dithPlot->GetNRow(); double amin, amax; UsefulFunctions::MinMax( z, nrow, 0, x.size(), 0, y.size(), amin, amax ); // double fmin, fmax; dithPlot->GetFminmax( fmin, fmax ); // double alo = amin + fmin*(amax-amin); double ahi = amin + fmax*(amax-amin); if( ahi-alo < std::numeric_limits::epsilon() )throw EGraphicsError( wxT("region is flat") ); dithPlot->SetAlohi( alo, ahi ); double amean = (amin + amax) / 2.0; if( amean == 0.0 )amean = 1.e-10; if( fabs((amax-amin)/amean) < 1.0e-5 )throw EGraphicsError( wxT("region is flat") ); // try { dithPlot->SetUp(); } catch( EGraphicsError const &e ) { throw; } std::size_t const nLevels = dithPlot->GetDither().size()/2; if( dithPlot->GetAreas() )dithPlot->GetAreaVec().resize( nLevels, 0.0 ); if( dithPlot->GetVolumes() )dithPlot->GetVolumeVec().resize( nLevels, 0.0 ); // dithPlot->GetContourVec().resize( nLevels+1, 0.0 ); dithPlot->GetContourVec().at(0) = alo; if( dithPlot->GetContourLevels().empty() ) { for( std::size_t i=1; iGetContourVec().at(i) = alo+i*(ahi-alo)/nLevels ; } else { if( dithPlot->GetContourLevels().at(0) <= amin ) throw EGraphicsError( wxT("first contour level <= data minimum") ); if( dithPlot->GetContourLevels().at(nLevels-2) >= amax ) throw EGraphicsError( wxT("last contour level >= data maximum") ); for( std::size_t i=2; i<=nLevels; ++i )dithPlot->GetContourVec().at(i-1) = dithPlot->GetContourLevels().at(i-2); } dithPlot->GetContourVec().at(nLevels) = ahi; // if( dithPlot->GetLegend() ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double yticl = static_cast(yAxisC->Get(wxT("LARGETICLENGTH")))->GetAsWorld(); bool xProfile, yProfile; dithPlot->GetProfiles( xProfile, yProfile ); double xlo = yProfile ? xuaxis+0.1*(xuwind-xlwind)+1.5*yticl : xuaxis+1.5*yticl; double xhi = xlo + (xuwind-xlo)/3.0; // double height = static_cast(generalC->Get(wxT("LEGENDSIZE")))->GetAsWorld(); std::size_t nLevels = dithPlot->GetDither().size()/2; double yi = (yuaxis-ylaxis)/nLevels; // if( height > 0.0 ) { for( std::size_t i=0; i<=nLevels; ++i ) { double yp = ylaxis + i*yi; wxChar c[50]; ::wxSnprintf( c, 50, wxT("%9.2le"), dithPlot->GetContourVec().at(i) ); double angle = 0.0; GRA_font *font = static_cast(generalC->Get(wxT("FONT")))->Get(); wxString stmp(c); GRA_drawableText dt( stmp, height, angle, xhi+0.1, yp-height/2., 1, font, GRA_colorControl::GetColor(wxT("BLACK")) ); try { dt.Parse(); } catch( EGraphicsError const &e ) { throw; } Draw( &dt ); } } GRA_bitmap bitmap( xlo, ylaxis, xhi, yuaxis, GRA_colorControl::GetColor(wxT("WHITE")), (GRA_wxWidgets*)0 ); dithPlot->FillLegendBitmap( &bitmap ); bitmap.SetBorder( GRA_colorControl::GetColor(wxT("BLACK")) ); Draw( &bitmap ); } double xlo, ylo, xhi, yhi; dithPlot->GetXYLimits( xlo, ylo, xhi, yhi ); GRA_bitmap bitmap( xlo, ylo, xhi, yhi, GRA_colorControl::GetColor(wxT("WHITE")), (GRA_wxWidgets*)0 ); dithPlot->FillBitmap( &bitmap ); try { Draw( &bitmap ); } catch( EGraphicsError const &e ) { throw; } if( dithPlot->GetDrawAxes() ) { std::vector xt, yt; xt.push_back( dataXmin ); xt.push_back( dataXmax ); xt.push_back( dataXmax ); xt.push_back( dataXmin ); xt.push_back( dataXmin ); yt.push_back( dataYmax ); yt.push_back( dataYmax ); yt.push_back( dataYmin ); yt.push_back( dataYmin ); yt.push_back( dataYmax ); axes = new GRA_cartesianAxes(xt,yt,false,false); try { axes->Make(); } catch( EGraphicsError const &e ) { delete axes; throw; } Draw( axes ); } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); if( dithPlot->GetBorder() ) { GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); double x1, y1, x2, y2; gw->GraphToWorld( dataXmin, dataYmin, x1, y1, true ); gw->GraphToWorld( dataXmax, dataYmax, x2, y2 ); GRA_rectangle r( x1, y1, x2, y2, 0.0, false, lineColor, 0, 1 ); Draw( &r ); } DrawProfiles( dithPlot ); if( dithPlot->GetDrawAxes() ) { Draw( axes ); delete axes; } if( dithPlot->GetResetAxes() ) { double xuaxisp, yuaxisp; dithPlot->GetUpperAxis( xuaxisp, yuaxisp ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( xuaxisp ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( yuaxisp ); } } void GRA_postscript::Draw( GRA_gradientPlot *gradPlot ) { double dataXmin, dataYmin, dataXmax, dataYmax; gradPlot->GetDataLimits( dataXmin, dataYmin, dataXmax, dataYmax ); GRA_cartesianAxes *axes =0; GRA_colorMap *colorMapSave = GRA_colorControl::GetColorMap(); GRA_colorControl::SetColorMap( gradPlot->GetColorMap() ); std::vector x, y, z; gradPlot->GetXYZ( x, y, z ); std::size_t nrow = gradPlot->GetNRow(); double amin, amax; UsefulFunctions::MinMax( z, nrow, 0, x.size(), 0, y.size(), amin, amax ); // double fmin, fmax; gradPlot->GetFminmax( fmin, fmax ); // double alo = amin + fmin*(amax-amin); double ahi = amin + fmax*(amax-amin); if( ahi-alo < std::numeric_limits::epsilon() )throw EGraphicsError( wxT("region is flat") ); gradPlot->SetAlohi( alo, ahi ); double amean = (amin + amax) / 2.0; if( amean == 0.0 )amean = 1.e-10; if( fabs((amax-amin)/amean) < 1.0e-5 )throw EGraphicsError( wxT("region is flat") ); try { gradPlot->SetUp(); } catch( EGraphicsError const &e ) { throw; } if( gradPlot->GetLegend() ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double yticl = static_cast(yAxisC->Get(wxT("LARGETICLENGTH")))->GetAsWorld(); bool xProfile, yProfile; gradPlot->GetProfiles( xProfile, yProfile ); double xlo = yProfile ? xuaxis+0.1*(xuwind-xlwind)+1.5*yticl : xuaxis+1.5*yticl; double xhi = xlo + (xuwind-xlo)/3.0; // double height = static_cast(generalC->Get(wxT("LEGENDSIZE")))->GetAsWorld(); // if( height > 0.0 ) { wxChar c[10]; ::wxSnprintf( c, 10, wxT("%9.2lg"), alo ); double angle = 0.0; GRA_font *font = static_cast(generalC->Get(wxT("FONT")))->Get(); wxString stmp(c); GRA_drawableText dt( stmp, height, angle, xhi+0.1, ylaxis-height/2., 1, font, GRA_colorControl::GetColor(wxT("BLACK")) ); ::wxSnprintf( c, 10, wxT("%9.2lg"), ahi ); stmp = wxString(c); GRA_drawableText dt2( stmp, height, angle, xhi+0.1, yuaxis-height/2., 1, font, GRA_colorControl::GetColor(wxT("BLACK")) ); try { dt.Parse(); dt2.Parse(); } catch( EGraphicsError const &e ) { throw; } Draw( &dt ); Draw( &dt2 ); } GRA_bitmap bitmap( xlo, ylaxis, xhi, yuaxis, GRA_colorControl::GetColor(wxT("WHITE")), (GRA_wxWidgets*)0 ); gradPlot->FillLegendBitmap( &bitmap ); bitmap.SetBorder( GRA_colorControl::GetColor(wxT("BLACK")) ); Draw( &bitmap ); } double xlo, ylo, xhi, yhi; gradPlot->GetXYLimits( xlo, ylo, xhi, yhi ); GRA_bitmap bitmap( xlo, ylo, xhi, yhi, GRA_colorControl::GetColor(wxT("WHITE")), (GRA_wxWidgets*)0 ); gradPlot->FillBitmap( &bitmap ); try { Draw( &bitmap ); } catch( EGraphicsError const &e ) { throw; } if( gradPlot->GetDrawAxes() ) { std::vector xt, yt; xt.push_back( dataXmin ); xt.push_back( dataXmax ); xt.push_back( dataXmax ); xt.push_back( dataXmin ); xt.push_back( dataXmin ); yt.push_back( dataYmax ); yt.push_back( dataYmax ); yt.push_back( dataYmin ); yt.push_back( dataYmin ); yt.push_back( dataYmax ); axes = new GRA_cartesianAxes(xt,yt,false,false); try { axes->Make(); } catch( EGraphicsError const &e ) { delete axes; throw; } Draw( axes ); } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); if( gradPlot->GetBorder() ) { GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); double x1, y1, x2, y2; gw->GraphToWorld( dataXmin, dataYmin, x1, y1, true ); gw->GraphToWorld( dataXmax, dataYmax, x2, y2 ); GRA_rectangle r( x1, y1, x2, y2, 0.0, false, lineColor, 0, 1 ); Draw( &r ); } DrawProfiles( gradPlot ); if( gradPlot->GetDrawAxes() ) { Draw( axes ); delete axes; } if( gradPlot->GetResetAxes() ) { double xuaxisp, yuaxisp; gradPlot->GetUpperAxis( xuaxisp, yuaxisp ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( xuaxisp ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsPercent( yuaxisp ); } GRA_colorControl::SetColorMap( colorMapSave ); } void GRA_postscript::DrawProfiles( GRA_densityPlot *densPlot ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); bool xProfile, yProfile; densPlot->GetProfiles( xProfile, yProfile ); if( xProfile || yProfile ) { bool xlabel = static_cast(xAxisC->Get(wxT("LABELON")))->Get(); bool ylabel = static_cast(yAxisC->Get(wxT("LABELON")))->Get(); static_cast(xAxisC->Get(wxT("LABELON")))->Set( false ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( false ); int histyp = static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Get(); bool xaxison = static_cast(xAxisC->Get(wxT("AXISON")))->Get(); bool yaxison = static_cast(yAxisC->Get(wxT("AXISON")))->Get(); int xlinc = static_cast(xAxisC->Get(wxT("NLINCS")))->Get(); int ylinc = static_cast(yAxisC->Get(wxT("NLINCS")))->Get(); bool box = static_cast(generalC->Get(wxT("GRAPHBOX")))->Get(); bool xnumbers = static_cast(xAxisC->Get(wxT("NUMBERSON")))->Get(); bool ynumbers = static_cast(yAxisC->Get(wxT("NUMBERSON")))->Get(); int xndig = static_cast(xAxisC->Get(wxT("NUMBEROFDIGITS")))->Get(); int yndig = static_cast(yAxisC->Get(wxT("NUMBEROFDIGITS")))->Get(); int xndec = static_cast(xAxisC->Get(wxT("NUMBEROFDECIMALS")))->Get(); int yndec = static_cast(yAxisC->Get(wxT("NUMBEROFDECIMALS")))->Get(); // double xlwind = static_cast(generalC->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(generalC->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double ylwind = static_cast(generalC->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double yuwind = static_cast(generalC->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); double xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double xmin = static_cast(xAxisC->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisC->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisC->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisC->Get(wxT("MAX")))->Get(); double xvmin = static_cast(xAxisC->Get(wxT("VIRTUALMIN")))->Get(); double xvmax = static_cast(xAxisC->Get(wxT("VIRTUALMAX")))->Get(); double yvmin = static_cast(yAxisC->Get(wxT("VIRTUALMIN")))->Get(); double yvmax = static_cast(yAxisC->Get(wxT("VIRTUALMAX")))->Get(); bool ytics = static_cast(xAxisC->Get(wxT("TICSON")))->Get(); bool xtics = static_cast(yAxisC->Get(wxT("TICSON")))->Get(); wxString autoScale( static_cast(generalC->Get(wxT("AUTOSCALE")))->Get() ); std::vector *xProfileX, *xProfileY, *yProfileX, *yProfileY; densPlot->GetProfileVecs( xProfileX, xProfileY, yProfileX, yProfileY ); if( yProfile ) { static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Set( 3 ); static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( false ); static_cast(xAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(yAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(xAxisC->Get(wxT("TICSON")))->Set( true ); static_cast(yAxisC->Get(wxT("TICSON")))->Set( false ); static_cast(xAxisC->Get(wxT("MIN")))->Set( 0.0 ); static_cast(xAxisC->Get(wxT("MAX")))->Set( 1.0 ); static_cast(xAxisC->Get(wxT("NLINCS")))->Set( 1 ); static_cast(xAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(yAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(xAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( xuaxis ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( xuaxis+0.1*(xuwind-xlwind) ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( wxString(wxT("OFF")) ); std::vector xe1, ye1, xe2, ye2; GRA_cartesianAxes *cartesianAxes = new GRA_cartesianAxes( *yProfileX, *yProfileY, false, false ); GRA_cartesianCurve *cartesianCurve = new GRA_cartesianCurve( *yProfileX, *yProfileY, xe1,ye1,xe2,ye2, false ); try { cartesianAxes->Make(); cartesianCurve->Make(); } catch( EGraphicsError const &e ) { delete cartesianAxes; delete cartesianCurve; throw; } Draw( cartesianAxes ); Draw( cartesianCurve ); delete cartesianAxes; delete cartesianCurve; } if( xProfile ) { static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Set( 1 ); static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( false ); static_cast(xAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(yAxisC->Get(wxT("AXISON")))->Set( true ); static_cast(xAxisC->Get(wxT("TICSON")))->Set( false ); static_cast(yAxisC->Get(wxT("TICSON")))->Set( true ); static_cast(xAxisC->Get(wxT("MIN")))->Set( xmin ); static_cast(xAxisC->Get(wxT("MAX")))->Set( xmax ); static_cast(yAxisC->Get(wxT("MIN")))->Set( 0.0 ); static_cast(yAxisC->Get(wxT("MAX")))->Set( 1.0 ); static_cast(yAxisC->Get(wxT("NLINCS")))->Set( 1 ); static_cast(xAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(yAxisC->Get(wxT("NUMBERSON")))->Set( false ); static_cast(xAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( xlaxis ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( xuaxis ); static_cast(yAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( yuaxis ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( yuaxis+0.1*(yuwind-ylwind) ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( wxString(wxT("OFF")) ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( wxString(wxT("OFF")) ); std::vector xe1, ye1, xe2, ye2; GRA_cartesianAxes *cartesianAxes = new GRA_cartesianAxes( *xProfileX, *xProfileY, false, false ); GRA_cartesianCurve *cartesianCurve = new GRA_cartesianCurve( *xProfileX, *xProfileY, xe1,ye1,xe2,ye2, false ); try { cartesianAxes->Make(); cartesianCurve->Make(); } catch( EGraphicsError const &e ) { delete cartesianAxes; delete cartesianCurve; throw; } Draw( cartesianAxes ); Draw( cartesianCurve ); delete cartesianAxes; delete cartesianCurve; } static_cast(xAxisC->Get(wxT("LABELON")))->Set( xlabel ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( ylabel ); static_cast(dataC->Get(wxT("HISTOGRAMTYPE")))->Set( histyp ); static_cast(xAxisC->Get(wxT("AXISON")))->Set( xaxison ); static_cast(yAxisC->Get(wxT("AXISON")))->Set( yaxison ); static_cast(xAxisC->Get(wxT("NLINCS")))->Set( xlinc ); static_cast(yAxisC->Get(wxT("NLINCS")))->Set( ylinc ); static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( box ); static_cast(xAxisC->Get(wxT("NUMBERSON")))->Set( xnumbers ); static_cast(yAxisC->Get(wxT("NUMBERSON")))->Set( ynumbers ); static_cast(xAxisC->Get(wxT("NUMBEROFDIGITS")))->Set( xndig ); static_cast(yAxisC->Get(wxT("NUMBEROFDIGITS")))->Set( yndig ); static_cast(xAxisC->Get(wxT("NUMBEROFDECIMALS")))->Set( xndec ); static_cast(yAxisC->Get(wxT("NUMBEROFDECIMALS")))->Set( yndec ); static_cast(xAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( xlaxis ); static_cast(xAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( xuaxis ); static_cast(yAxisC->Get(wxT("LOWERAXIS")))->SetAsWorld( ylaxis ); static_cast(yAxisC->Get(wxT("UPPERAXIS")))->SetAsWorld( yuaxis ); static_cast(xAxisC->Get(wxT("MIN")))->Set( xmin ); static_cast(xAxisC->Get(wxT("MAX")))->Set( xmax ); static_cast(yAxisC->Get(wxT("MIN")))->Set( ymin ); static_cast(yAxisC->Get(wxT("MAX")))->Set( ymax ); static_cast(xAxisC->Get(wxT("VIRTUALMIN")))->Set( xvmin ); static_cast(xAxisC->Get(wxT("VIRTUALMAX")))->Set( xvmax ); static_cast(yAxisC->Get(wxT("VIRTUALMIN")))->Set( yvmin ); static_cast(yAxisC->Get(wxT("VIRTUALMAX")))->Set( yvmax ); static_cast(xAxisC->Get(wxT("TICSON")))->Set( xtics ); static_cast(yAxisC->Get(wxT("TICSON")))->Set( ytics ); static_cast(generalC->Get(wxT("AUTOSCALE")))->Set( autoScale ); } } void GRA_postscript::DisplayBackground( GRA_window *gw ) { double xminw, yminw, xmaxw, ymaxw; ExGlobals::GetWorldLimits( xminw, yminw, xmaxw, ymaxw ); double xlo, ylo, xhi, yhi; gw->GetDimensions( xlo, ylo, xhi, yhi ); // // calculate window coordinates in world units // double xl = xminw+xlo*(xmaxw-xminw)/100.0; double yl = yminw+ylo*(ymaxw-yminw)/100.0; double xu = xminw+xhi*(xmaxw-xminw)/100.0; double yu = yminw+yhi*(ymaxw-yminw)/100.0; // GRA_color *bgcolor = static_cast(gw->GetGeneralCharacteristics()-> Get(wxT("BACKGROUNDCOLOR")))->Get(); wxString bgfile( static_cast(gw->GetGeneralCharacteristics()-> Get(wxT("BACKGROUNDFILE")))->Get() ); ExGlobals::SetClippingBoundary( xl, yl, xu, yu ); if( bgcolor ) { std::auto_ptr rect( new GRA_rectangle(xl,yl,xu,yu,0.0,false,bgcolor,bgcolor) ); Draw( rect.get() ); } else if( !bgfile.empty() ) { wxImage image( bgfile, wxBITMAP_TYPE_PNG ); // double xl1, yl1, xu1, yu1; WorldToOutputType( xl, yl, xl1, yl1 ); WorldToOutputType( xu, yu, xu1, yu1 ); // int dx = int(fabs(xu1-xl1)); int dy = int(fabs(yu1-yl1)); image.Rescale( dx, dy ); // GRA_bitmap *bitmap = new GRA_bitmap( xl, yl, xu, yu, GRA_colorControl::GetColor(wxT("WHITE")), 0 ); int width = bitmap->GetWidth(); int height = bitmap->GetHeight(); std::vector tempColors( width*height ); for( int i=0; iSetPixelColor( i, j, color ); tempColors[i+j*width] = color; } } Draw( bitmap ); delete bitmap; for( int i=0; iGetLimits( xlo, ylo, xhi, yhi ); double xlod, ylod, xhid, yhid; WorldToOutputType( xlo, ylo, xlod, ylod ); WorldToOutputType( xhi, yhi, xhid, yhid ); // int bwidth = b->GetWidth(); int bheight = b->GetHeight(); double xscale = bwidth; double yscale = bheight; // outFile_ << "gsave\n" << static_cast(xlod+0.5) << " " << static_cast(ylod+0.5) << " translate\n" << xscale << " " << yscale << " scale\n" << bwidth << " " << bheight << " 8 [" << bwidth << " 0 0 -" << bheight << " 0 " << bheight << "]\n" << "{currentfile " << 3*bwidth << " string readhexstring pop} bind\n" << "false 3 colorimage\n"; // unsigned int count = 0; std::vector bitmap( b->GetBitmap() ); for( int j=bheight-1; j>=0; --j ) { for( int i=0; iGetRGB( r, g, b ); try { outFile_ << ExGlobals::IntToHex(r).mb_str(wxConvUTF8) << ExGlobals::IntToHex(g).mb_str(wxConvUTF8) << ExGlobals::IntToHex(b).mb_str(wxConvUTF8); //outFile_ << std::setfill('0') << std::setw(2) << std::hex << r << g << b << std::dec << std::setw(0); } catch( std::runtime_error const &e ) { throw EGraphicsError( wxT("invalid RGB codes in bitmap") ); } if( ++count == 12 ) { outFile_ << "\n"; count = 0; } } } if( count > 0 )outFile_ << "\n"; outFile_ << "grestore\n"; } void GRA_postscript::Draw( GRA_drawableText *dt ) { std::vector textVec( dt->GetStrings() ); outFile_ << "s\n" << "/ArrayLength " << textVec.size() << " def\n" << "/TextBuffer ArrayLength array def\n"; double maxHeight = 0.0; std::size_t counter = 0; std::vector::const_iterator textVecEnd( textVec.end() ); for( std::vector::const_iterator i=textVec.begin(); i!=textVecEnd; ++i, ++counter ) { wxString text( (*i)->GetString() ); if( text.empty() )continue; // int r, g, b; (*i)->GetColor()->GetRGB( r, g, b ); double dr = static_cast(r)/255.0; double dg = static_cast(g)/255.0; double db = static_cast(b)/255.0; // wxString fontName( (*i)->GetFont()->GetFontName() ); wxString psFontName; try { psFontName = GRA_fontControl::GetPostScriptFontName( (*i)->GetFont()->GetFontName() ); } catch( EGraphicsError const &e ) { throw; } //std::cout << "fontName = |" << fontName.mb_str(wxConvUTF8) << "|\n"; ExGlobals::RemoveBlanks( fontName ); ExGlobals::ToCapitalize( fontName ); double height = dotsPerInch_*(*i)->GetHeight(); double xshift = dotsPerInch_*(*i)->GetXShift(); double yshift = dotsPerInch_*(*i)->GetYShift(); maxHeight = std::max( height, maxHeight ); outFile_ << "TextBuffer " << counter << " [[" << dr << " " << dg << " " << db << "] /" << psFontName.mb_str(wxConvUTF8) << " " << height << " " << xshift << " " << yshift << " ("; std::size_t tEnd = text.size(); for( size_t i=0; i(text[i]); if( j < 0 )j += 256; //std::cout << "j = " << j << "\n"; outFile_ << "\\" << std::setfill('0') << std::setw(3) << std::oct << j << std::dec << std::setw(0); } outFile_ << ")] put\n"; } outFile_ << "SetupText\n"; double xLoc = dt->GetX(); double yLoc = dt->GetY(); // apply fudge factor double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); //yLoc += 0.01*(ymaxW-yminW); if( dt->GetGraphUnits() ) // convert to world units { double xg=xLoc, yg=yLoc; ExGlobals::GetGraphWindow()->GraphToWorld( xg, yg, xLoc, yLoc, true ); } double angle = dt->GetAngle(); // this is in degrees double cosx = cos( angle*M_PI/180.0 ); double sinx = sin( angle*M_PI/180.0 ); double const eps = 0.0001; if( fabs(cosx) <= eps )cosx = 0.0; if( fabs(sinx) <= eps )sinx = 0.0; if( fabs(cosx-1.0) <= eps )cosx = 1.0; if( fabs(sinx-1.0) <= eps )sinx = 1.0; switch ( dt->GetAlignment() ) { case 1: // lower left outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " def\n"; break; case 2: // lower center outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " TotalLength 2 div Cosx mul sub def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength 2 div Sinx mul sub def\n"; break; case 3: // lower right outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " TotalLength Cosx mul sub def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength Sinx mul sub def\n"; break; case 4: // center left outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " MaxHeight 2 div Sinx mul add def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " MaxHeight 2 div Cosx mul sub def\n"; break; case 5: // center center outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " TotalLength 2 div Cosx mul sub MaxHeight 2 div Sinx mul add def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength 2 div Sinx mul sub MaxHeight 2 div Cosx mul sub def\n"; break; case 6: // center right outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " TotalLength Cosx mul sub MaxHeight 2 div Sinx mul add def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength Sinx mul sub MaxHeight 2 div Cosx mul sub def\n"; break; case 7: // upper left outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " MaxHeight Sinx mul add def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " MaxHeight Cosx mul sub def\n"; break; case 8: // upper center outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " TotalLength 2 div Cosx mul sub MaxHeight Sinx mul add def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength 2 div Sinx mul sub MaxHeight Cosx mul sub def\n"; break; case 9: // upper right outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle " << angle << " def\n" << "/Cosx " << cosx << " def\n" << "/Sinx " << sinx << " def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " TotalLength Cosx mul sub MaxHeight Sinx mul add def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength Sinx mul sub MaxHeight Cosx mul sub def\n"; break; case 10: // lower left at 90deg outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle 90.0 def\n" << "/Cosx 0.0 def\n" << "/Sinx 1.0 def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " def\n"; break; case 11: // lower left at 270deg outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle 270.0 def\n" << "/Cosx 0.0 def\n" << "/Sinx -1.0 def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " def\n"; break; case 12: // lower center at 90deg outFile_ << "/MaxHeight " << static_cast(maxHeight+0.5) << " def\n" << "/Angle 90.0 def\n" << "/Cosx 0.0 def\n" << "/Sinx 1.0 def\n" << "/Xloc " << static_cast(xLoc*dotsPerInch_+0.5) << " def\n" << "/Yloc " << static_cast(yLoc*dotsPerInch_+0.5) << " TotalLength 2 div sub def\n"; } outFile_ << "DrawText\n"; } void GRA_postscript::StartLine( double x, double y ) { PenUp( x, y ); newLine_ = true; } void GRA_postscript::ContinueLine( double x, double y ) { // This routine draws a line of specified line type from the // current location to location (x,y) in world coordinates // // The line types are in four different styles: // 1) Ordinary solid line // 2) Double line of specified width // 3) Dashed line with specified dash and space lengths // 4) Dashed line with two different dash lengths // // Input: // x,y point coordinates in world units // // For each line type type, the appearance of the line is determined // by three parameters p1,p2,p3 that are stored in an internal table // // If p1 = 0, the line is an ordinary solid line // If p1 > 0 and p2 = 0, the line is a double line of width p1 // If p1 > 0 and p2 > 0, the line is a dashed line, with dash // length p1 and space length p2 // If p1 > 0 and p2 > 0 and p3 > 0, the line is a dashed line, // with first dash length p1, space length p2, and second dash // length p3 // // NOTE: p1, p2 and p3 should be in world units // // The user may define his own line types, or he may use the default // types established in this routine, which are suitable for the // default 640 x 480 coordinate system. Line types are user-defined // by calling DrawLineSet( type, p1, p2, p3 ) // where type is a line type number between 1 and 10 and p1-p3 // are the desired parameters. Alternatively, the default line types // can be scaled to fit a user coordinate system by calling // DrawLineScale( type, sf ) where sf is the desired scale factor. // For example, if the user coordinate system is 10 units in x by // 7.5 units in y, the scale factor sf=10/640 would be appropriate // // This routine always plots from the current location. // Thus a call to StartLine must precede a series of calls // to ContinueLine. In order to plot a continuous dashed line through // a series of points, ContinueLine "remembers" where it's at between // calls. As long as the current location is the same as that // where ContinueLine left off on the previous call, // ContinueLine will continue dashing from where it // left off. Thus the dashing may be interrupted, a symbol or other // items plotted, and the dashing can be continued by calling StartLine // to the old location before calling ContinueLine. // static int op = 0; static double xOld = 0.0; static double yOld = 0.0; static double distanceTraveled = 0.0; // if( x==xPrevious_ && y==yPrevious_ )return; // draw nothing if going nowhere // // get parameters // double p1 = drawLineTable_[0][lineType_-1]; double p2 = drawLineTable_[1][lineType_-1]; double p3 = drawLineTable_[2][lineType_-1]; // if( p1 == 0. ) // draw an ordinary vector { PenDown( x, y ); } else { double const deltx = x-xPrevious_; double const delty = y-yPrevious_; double const distanceToTravel = sqrt(deltx*deltx + delty*delty); // double sinth = delty/distanceToTravel; // sine of orientation angle double costh = deltx/distanceToTravel; // cosine of orientation angle // if( p2 == 0. ) // double line { double hwid = p1/2.0; double dx = hwid*sinth; double dy = hwid*costh; double xloc = xPrevious_; double yloc = yPrevious_; PenUp( xloc-dx, yloc+dy ); PenDown( x-dx, y+dy ); PenUp( xloc+dx, yloc-dy ); PenDown( x+dx, y-dy ); } else // dashed line { if( p3 == 0. )p3 = p1; // double dd[4]; // distance increments for operation loop dd[0] = p1; dd[1] = p2; dd[2] = p3; dd[3] = p2; // double const x0 = xPrevious_; // start point double const y0 = yPrevious_; // // continuing previous line? // double const eps = 0.0001; if( !newLine_ && fabs(x0-xOld) 0. )goto L210; // continuing dash or space goto L200; } // // begin dashing sequence // op = 0; // operation number distanceTraveled = 0.0; // distance travelled L200: // operation loop begins if( ++op == 5 )op = 1; distanceTraveled += dd[op-1]; L210: double xloc = x0 + distanceTraveled*costh; double yloc = y0 + distanceTraveled*sinth; bool drawTo = (op==1||op==3); // // last operation // if( distanceTraveled >= distanceToTravel ) { xloc = x; yloc = y; //drawTo = true; } drawTo ? PenDown(xloc,yloc) : PenUp(xloc,yloc); if( distanceTraveled < distanceToTravel )goto L200; // do next operation } xOld = x; // save end point yOld = y; distanceTraveled -= distanceToTravel; // portion of dash or space to be continued } newLine_ = false; } void GRA_postscript::DrawLineSet( int type, double p1, double p2, double p3 ) { // set up line type characteristics for DrawLine // if( type>10 || type<1 )return; drawLineTable_[0][type-1] = p1; drawLineTable_[1][type-1] = p2; drawLineTable_[2][type-1] = p3; } void GRA_postscript::DrawLineGet( int type, double &p1, double &p2, double &p3 ) { if( type>10 || type<1 )return; p1 = drawLineTable_[0][type-1]; p2 = drawLineTable_[1][type-1]; p3 = drawLineTable_[2][type-1]; } void GRA_postscript::SetDefaultDrawLineTable() { double const defaultTable[3][10] = { {0.00,0.02,0.30,0.30,0.40,0.40,0.02,0.02,0.06,0.10}, // p1 {0.00,0.00,0.15,0.15,0.20,0.16,0.12,0.12,0.20,0.30}, // p2 {0.00,0.00,0.00,0.10,0.00,0.12,0.00,0.08,0.00,0.00} // p3 }; for( std::size_t i=0; i<10; ++i ) { for( std::size_t j=0; j<3; ++j )drawLineTable_[j][i] = defaultTable[j][i]; } } void GRA_postscript::DrawLineScale( int type, double sf ) { // scale the line table parameters by factor sf // for specified type only // if( type<1 || type>10 )return; for( std::size_t j=0; j<3; ++j )drawLineTable_[j][type-1] *= sf; } void GRA_postscript::DrawLineScale( double sf ) { // scale all of the line table parameters by factor sf // for( std::size_t i=0; i<10; ++i ) { for( std::size_t j=0; j<3; ++j )drawLineTable_[j][i] *= sf; } } // end of file extrema-4.4.5/src/Graphics/GRA_wxWidgets.cpp0000644012702201742730000003144711274636605017743 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "GRA_wxWidgets.h" #include "ExGlobals.h" #include "UsefulFunctions.h" GRA_wxWidgets::GRA_wxWidgets( int xmin, int ymin, int xmax, int ymax ) : xMin_(xmin), yMin_(ymin), xMax_(xmax), yMax_(ymax), currentLineType_(1), newLine_(true) { SetDefaultDrawLineTable(); SetUpTransformationMatrices(); } void GRA_wxWidgets::SetUpTransformationMatrices() { double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); // // Calculate the world to outputType transformation // // |x| |xw| // | | = w2oMatrix_ * | | + w2oShift_ // |y| |yw| // w2oMatrix_[0][0] = (xMax_-xMin_)/(xmaxW-xminW); w2oMatrix_[0][1] = 0.0; w2oMatrix_[1][0] = 0.0; w2oMatrix_[1][1] = (yMax_-yMin_)/(ymaxW-yminW); w2oShift_[0] = xMin_-xminW*w2oMatrix_[0][0]; w2oShift_[1] = yMin_-yminW*w2oMatrix_[1][1]; // // Calculate the inverse transformation matrix o2wMatrix_ from // the outputType coordinate system to the world coordinate system: // // |xw| |x| // | | = o2wMatrix_ * | | + o2wShift_ // |yw| |y| // // o2wMatrix_ = inv(w2oMatrix_) // world <-- outputType = inv(outputType <-- world) // double const determinant = w2oMatrix_[0][0]*w2oMatrix_[1][1] - w2oMatrix_[1][0]*w2oMatrix_[0][1]; o2wMatrix_[0][0] = w2oMatrix_[1][1]/determinant; o2wMatrix_[0][1] = -w2oMatrix_[0][1]/determinant; o2wMatrix_[1][0] = -w2oMatrix_[1][0]/determinant; o2wMatrix_[1][1] = w2oMatrix_[0][0]/determinant; // // Calculate the inverse translation vector o2wShift_ from the // outputType coordinate system to the world coordinate system // // o2wShift_ = -o2wMatrix_ * w2oShift_ // o2wShift_[0] = -o2wMatrix_[0][0]*w2oShift_[0] - o2wMatrix_[0][1]*w2oShift_[1]; o2wShift_[1] = -o2wMatrix_[1][0]*w2oShift_[0] - o2wMatrix_[1][1]*w2oShift_[1]; } void GRA_wxWidgets::OutputTypeToWorld( int xo, int yo, double &xw, double &yw ) const { xw = o2wMatrix_[0][0]*xo + o2wMatrix_[0][1]*(yMax_-yo) + o2wShift_[0]; yw = o2wMatrix_[1][0]*xo + o2wMatrix_[1][1]*(yMax_-yo) + o2wShift_[1]; } void GRA_wxWidgets::WorldToOutputType( double xw, double yw, int &xo, int &yo ) const { xo = static_cast(w2oMatrix_[0][0]*xw + w2oMatrix_[0][1]*yw + w2oShift_[0] + 0.5); yo = yMax_ - static_cast(w2oMatrix_[1][0]*xw + w2oMatrix_[1][1]*yw + w2oShift_[1] + 0.5); } void GRA_wxWidgets::GetLimits( int &xmin, int &ymin, int &xmax, int &ymax ) const { xmin = xMin_; ymin = yMin_; xmax = xMax_; ymax = yMax_; } void GRA_wxWidgets::SetLineType( int i ) { currentLineType_ = std::max(1,std::min(10,i)); // illegal type defaults to solid line } int GRA_wxWidgets::GetLineType() const { return currentLineType_; } void GRA_wxWidgets::Plot( double x, double y, int pen, wxDC &dc ) { // (x,y) are the world coordinates to which the pen is to be moved either up // (pen=3) or down (pen=2). The plot coordinates (x,y) can have any value // positive or negative, but are clipped outside the plot windows. // switch (pen) { case 3: // move with pen up to (x,y) { PenUp( x, y ); break; } case 2: // move with pen down to (x,y) { PenDown( x, y, dc ); break; } case 20: // plot a point at (x,y) { PlotPoint( x, y, dc ); break; } } } void GRA_wxWidgets::PlotPoint( double x, double y, wxDC &dc ) { double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); if( (x-xmin)*(xmax-x)>=0.0 && (y-ymin)*(ymax-y)>=0.0 ) { int ix, iy; WorldToOutputType( x, y, ix, iy ); dc.DrawPoint( ix, iy ); } xPrevious_ = x; // set previous coordinates to new coordinates yPrevious_ = y; penPrevious_ = 20; } void GRA_wxWidgets::PenUp( double x, double y ) { // penUp moves with the pen up (not drawing) to the plot coordinates (x,y) // xPrevious_ = x; // set previous coordinates to new coordinates yPrevious_ = y; penPrevious_ = 3; } void GRA_wxWidgets::PenDown( double x, double y, wxDC &dc ) { // PenDown draws a line to the world coordinates (x,y) // // clip the line segment (xPrevious_,yPrevious_)-->(x,y) within the clipping boundary // double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); if( x>=xmin && xPrevious_>=xmin && x<=xmax && xPrevious_<=xmax && y>=ymin && yPrevious_>=ymin && y<=ymax && yPrevious_<=ymax ) { // (x,y) and (xPrevious_,yPrevious_) are both inside the clipping boundary // int ix, iy, ixp, iyp; WorldToOutputType( x, y, ix, iy ); WorldToOutputType( xPrevious_, yPrevious_, ixp, iyp ); dc.DrawLine( ixp, iyp, ix, iy ); } else { int ndraw = 1; double xdraw[2], ydraw[2]; xdraw[0] = x; ydraw[0] = y; UsefulFunctions::WindowClip( xPrevious_, yPrevious_, x, y, xmin, xmax, ymin, ymax, xdraw, ydraw, ndraw ); switch (ndraw) { case 1: //(x,y) is outside but (xPrevious_,yPrevious_) is in { int ix, iy, ixp, iyp; WorldToOutputType( xPrevious_, yPrevious_, ixp, iyp ); WorldToOutputType( xdraw[0], ydraw[0], ix, iy ); dc.DrawLine( ixp, iyp, ix, iy ); break; } case 2: // (x,y) and (xPrevious_,yPrevious_) are both outside case 3: // (xPrevious_,yPrevious_) is outside but (x,y) is inside { int ix, iy, ixp, iyp; WorldToOutputType( xdraw[0], ydraw[0], ixp, iyp ); WorldToOutputType( xdraw[1], ydraw[1], ix, iy ); dc.DrawLine( ixp, iyp, ix, iy ); break; } } } xPrevious_ = x; // set previous coordinates to new coordinates yPrevious_ = y; penPrevious_ = 2; } void GRA_wxWidgets::StartLine( double x, double y ) { PenUp( x, y ); newLine_ = true; } void GRA_wxWidgets::ContinueLine( double x, double y, wxDC &dc ) { // This routine draws a line of specified line type from the // current location to location (x,y) in world coordinates // // The line types are in four different styles: // 1) Ordinary solid line // 2) Double line of specified width // 3) Dashed line with specified dash and space lengths // 4) Dashed line with two different dash lengths // // Input: // x,y point coordinates in world units // // For each line type type, the appearance of the line is determined // by three parameters p1,p2,p3 that are stored in an internal table // // If p1 = 0, the line is an ordinary solid line // If p1 > 0 and p2 = 0, the line is a double line of width p1 // If p1 > 0 and p2 > 0, the line is a dashed line, with dash // length p1 and space length p2 // If p1 > 0 and p2 > 0 and p3 > 0, the line is a dashed line, // with first dash length p1, space length p2, and second dash // length p3 // // NOTE: p1, p2 and p3 should be in world units // // The user may define his own line types, or he may use the default // types established in this routine, which are suitable for the // default 640 x 480 coordinate system. Line types are user-defined // by calling DrawLineSet( type, p1, p2, p3 ) // where type is a line type number between 1 and 10 and p1-p3 // are the desired parameters. Alternatively, the default line types // can be scaled to fit a user coordinate system by calling // DrawLineScale( type, sf ) where sf is the desired scale factor. // For example, if the user coordinate system is 10 units in x by // 7.5 units in y, the scale factor sf=10/640 would be appropriate // // This routine always plots from the current location. // Thus a call to StartLine must precede a series of calls // to ContinueLine. In order to plot a continuous dashed line through // a series of points, ContinueLine "remembers" where it's at between // calls. As long as the current location is the same as that // where ContinueLine left off on the previous call, // ContinueLine will continue dashing from where it // left off. Thus the dashing may be interrupted, a symbol or other // items plotted, and the dashing can be continued by calling StartLine // to the old location before calling ContinueLine. // static int op = 0; static double xOld = 0.0; static double yOld = 0.0; static double distanceTraveled = 0.0; // if( x==xPrevious_ && y==yPrevious_ )return; // draw nothing if going nowhere // // get parameters // double p1 = drawLineTable_[0][currentLineType_-1]; double p2 = drawLineTable_[1][currentLineType_-1]; double p3 = drawLineTable_[2][currentLineType_-1]; // if( p1 == 0. ) // draw an ordinary vector { PenDown( x, y, dc ); } else { double const deltx = x-xPrevious_; double const delty = y-yPrevious_; double const distanceToTravel = sqrt(deltx*deltx + delty*delty); // double sinth = delty/distanceToTravel; // sine of orientation angle double costh = deltx/distanceToTravel; // cosine of orientation angle // if( p2 == 0. ) // double line { double hwid = p1/2.0; double dx = hwid*sinth; double dy = hwid*costh; double xloc = xPrevious_; double yloc = yPrevious_; PenUp( xloc-dx, yloc+dy ); PenDown( x-dx, y+dy, dc ); PenUp( xloc+dx, yloc-dy ); PenDown( x+dx, y-dy, dc ); } else // dashed line { if( p3 == 0. )p3 = p1; // double dd[4]; // distance increments for operation loop dd[0] = p1; dd[1] = p2; dd[2] = p3; dd[3] = p2; // double const x0 = xPrevious_; // start point double const y0 = yPrevious_; // // continuing previous line? // double const eps = 0.0001; if( !newLine_ && fabs(x0-xOld) 0. )goto L210; // continuing dash or space goto L200; } // // begin dashing sequence // op = 0; // operation number distanceTraveled = 0.0; // distance travelled L200: // operation loop begins if( ++op == 5 )op = 1; distanceTraveled += dd[op-1]; L210: double xloc = x0 + distanceTraveled*costh; double yloc = y0 + distanceTraveled*sinth; bool drawTo = (op==1||op==3); // // last operation // if( distanceTraveled >= distanceToTravel ) { xloc = x; yloc = y; //drawTo = true; } drawTo ? PenDown(xloc,yloc,dc) : PenUp(xloc,yloc); if( distanceTraveled < distanceToTravel )goto L200; // do next operation } xOld = x; // save end point yOld = y; distanceTraveled -= distanceToTravel; // portion of dash or space to be continued } newLine_ = false; } void GRA_wxWidgets::DrawLineSet( int type, double p1, double p2, double p3 ) { // set up line type characteristics for DrawLine // if( type>10 || type<1 )return; drawLineTable_[0][type-1] = p1; drawLineTable_[1][type-1] = p2; drawLineTable_[2][type-1] = p3; } void GRA_wxWidgets::DrawLineGet( int type, double &p1, double &p2, double &p3 ) { if( type>10 || type<1 )return; p1 = drawLineTable_[0][type-1]; p2 = drawLineTable_[1][type-1]; p3 = drawLineTable_[2][type-1]; } void GRA_wxWidgets::SetDefaultDrawLineTable() { double const defaultTable[3][10] = { {0.00,0.02,0.30,0.30,0.40,0.40,0.02,0.02,0.06,0.10}, // p1 {0.00,0.00,0.15,0.15,0.20,0.16,0.12,0.12,0.20,0.30}, // p2 {0.00,0.00,0.00,0.10,0.00,0.12,0.00,0.08,0.00,0.00} // p3 }; for( std::size_t i=0; i<10; ++i ) { for( std::size_t j=0; j<3; ++j )drawLineTable_[j][i] = defaultTable[j][i]; } } void GRA_wxWidgets::DrawLineScale( int type, double sf ) { // scale the line table parameters by factor sf // for specified type only // if( type<1 || type>10 )return; for( std::size_t j=0; j<3; ++j )drawLineTable_[j][type-1] *= sf; } void GRA_wxWidgets::DrawLineScale( double sf ) { // scale all of the line table parameters by factor sf // for( std::size_t i=0; i<10; ++i ) { for( std::size_t j=0; j<3; ++j )drawLineTable_[j][i] *= sf; } } // end of file extrema-4.4.5/src/Graphics/GRA_polygon.h0000644012702201742730000000660111332437274017100 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #ifndef GRA_POLYGON #define GRA_POLYGON #include #include #include "wx/wx.h" #include "GRA_shape.h" class GRA_wxWidgets; class GRA_color; class GRA_polygon : public GRA_shape { protected: enum PolygonType { UNKNOWN, ARROW1, ARROW2, RECTANGLE, REGULAR, STAR5 }; public: GRA_polygon( GRA_color *lineColor =0, GRA_color *fillColor =0, int lineWidth =1, int lineType =1 ) : GRA_shape(lineColor,fillColor,lineWidth,lineType,wxT("POLYGON")), type_(UNKNOWN) {} GRA_polygon( std::vector const &x, std::vector const &y, GRA_color *lineColor =0, GRA_color *fillColor =0, int lineWidth =1, int lineType =1 ) : GRA_shape(lineColor,fillColor,lineWidth,lineType,wxT("POLYGON")), type_(UNKNOWN) { SetUp(x,y); } GRA_polygon( double xc, double yc, double angle, double radius, int vertices, GRA_color *lineColor =0, GRA_color *fillColor =0, int lineWidth =1, int lineType =1 ) : GRA_shape(lineColor,fillColor,lineWidth,lineType,wxT("POLYGON")), type_(REGULAR) { SetUp(xc,yc,angle,radius,vertices); } virtual ~GRA_polygon() {} GRA_polygon( GRA_polygon const &rhs ) : GRA_shape(rhs) { CopyStuff( rhs ); } GRA_polygon &operator=( GRA_polygon const &rhs ) { if( this != &rhs ) { GRA_shape::CopyStuff(rhs); CopyStuff(rhs); } return *this; } void SetUp( std::vector const &, std::vector const & ); void SetUp( double, double, double, double, int ); void GetCoordinates( std::vector &x, std::vector &y ) const { x.assign( x_.begin(), x_.end() ); y.assign( y_.begin(), y_.end() ); } void DoClipping( double, double, double, double, std::vector &, std::vector & ); virtual void Draw( GRA_wxWidgets *, wxDC & ); bool IsaArrow1() const { return (type_ == ARROW1); } bool IsaArrow2() const { return (type_ == ARROW2); } bool Isa5PtStar() const { return (type_ == STAR5); } bool IsaRectangle() const { return (type_ == RECTANGLE); } bool IsaRegular() const { return (type_ == REGULAR); } void SetArrow1() { type_ = ARROW1; } void SetArrow2() { type_ = ARROW2; } void Set5PtStar() { type_ = STAR5; } void SetRectangle() { type_ = RECTANGLE; } void SetRegular() { type_ = REGULAR; } friend std::ostream &operator<<( std::ostream &, GRA_polygon const & ); protected: void CopyStuff( GRA_polygon const &rhs ); // int GetQuadrant( double, double, double, double, double, double ); int GetEdge( double, double, double, double, double, double ); // std::vector x_, y_; PolygonType type_; }; #endif extrema-4.4.5/src/Graphics/GRA_setOfCharacteristics.h0000644012702201742730000000527111274636605021533 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_SETOFCHARACTERISTICS #define GRA_SETOFCHARACTERISTICS #include #include #include "wx/wx.h" class GRA_font; class GRA_color; class GRA_characteristic; class GRA_setOfCharacteristics { private: typedef std::vector cVec; typedef cVec::const_iterator cVecIter; public: GRA_setOfCharacteristics() {} virtual ~GRA_setOfCharacteristics() { DeleteStuff(); } GRA_setOfCharacteristics( GRA_setOfCharacteristics const &rhs ) { CopyStuff( rhs ); } GRA_setOfCharacteristics &operator=( GRA_setOfCharacteristics const &rhs ) { if( this != &rhs ) { DeleteStuff(); CopyStuff( rhs ); } return *this; } void Clear() { DeleteStuff(); } void AddSize( wxChar const *, double, bool, double, double ); void AddSize( wxChar const *, std::vector, bool, double, double ); void AddDistance( wxChar const *, double, bool, double, double ); void AddDistance( wxChar const *, std::vector, bool, double, double ); void AddNumber( wxChar const *, double ); void AddNumber( wxChar const *, std::vector ); void AddNumber( wxChar const *, int ); void AddNumber( wxChar const *, std::vector ); void AddBool( wxChar const *, bool ); void AddBool( wxChar const *, std::vector ); void AddAngle( wxChar const *, double ); void AddAngle( wxChar const *, std::vector ); void AddFont( wxChar const *, GRA_font * ); void AddFont( wxChar const *, std::vector ); void AddColor( wxChar const *, GRA_color * ); void AddColor( wxChar const *, std::vector ); void AddString( wxChar const *, wxString const & ); GRA_characteristic *Get( wxString const & ) const; GRA_characteristic *Get( wxChar const * ) const; friend std::ostream &operator<<( std::ostream &, GRA_setOfCharacteristics const & ); private: void DeleteStuff(); void CopyStuff( GRA_setOfCharacteristics const & ); // cVec characteristics_; }; #endif extrema-4.4.5/src/Graphics/GRA_point.cpp0000644012702201742730000000263311274636605017102 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "GRA_point.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" void GRA_point::CopyStuff( GRA_point const &rhs ) { x_ = rhs.x_; y_ = rhs.y_; color_ = rhs.color_; } void GRA_point::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); dc.SetPen( wxpen ); graphicsOutput->PlotPoint( x_, y_, dc ); } std::ostream &operator<<( std::ostream &out, GRA_point const &p ) { return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_axis.cpp0000644012702201742730000013323511274636605016720 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "GRA_axis.h" #include "EGraphicsError.h" #include "GRA_drawableText.h" #include "GRA_wxWidgets.h" #include "GRA_colorControl.h" #include "GRA_color.h" #include "GRA_font.h" #include "GRA_polyline.h" #include "GRA_characteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_window.h" #include "UsefulFunctions.h" #include "ExGlobals.h" GRA_axis::GRA_axis( double xOrigin, double yOrigin, double length, GRA_setOfCharacteristics const *characteristics ) : GRA_drawableObject(wxT("AXIS")), xOrigin_(xOrigin), yOrigin_(yOrigin), length_(length), characteristics_( new GRA_setOfCharacteristics(*characteristics) ) { nGrid_ = static_cast(characteristics_->Get(wxT("GRID")))->Get(); } void GRA_axis::CopyStuff( GRA_axis const &rhs ) { if( rhs.characteristics_ )characteristics_ = new GRA_setOfCharacteristics(*rhs.characteristics_); // std::vector::const_iterator pEnd = rhs.polylines_.end(); for( std::vector::const_iterator i=rhs.polylines_.begin(); i!=pEnd; ++i ) { polylines_.push_back( new GRA_polyline(**i) ); } // std::vector::const_iterator tEnd = rhs.textVec_.end(); for( std::vector::const_iterator i=textVec_.begin(); i!=tEnd; ++i ) textVec_.push_back( new GRA_drawableText(**i) ); // xTicCoordinates_.assign( rhs.xTicCoordinates_.begin(), rhs.xTicCoordinates_.end() ); yTicCoordinates_.assign( rhs.yTicCoordinates_.begin(), rhs.yTicCoordinates_.end() ); xOrigin_ = rhs.xOrigin_; yOrigin_ = rhs.yOrigin_; length_ = rhs.length_; nGrid_ = rhs.nGrid_; maxWidth_ = rhs.maxWidth_; } void GRA_axis::DeleteStuff() { delete characteristics_; characteristics_ = 0; while( !polylines_.empty() ) { delete polylines_.back(); polylines_.pop_back(); } while( !textVec_.empty() ) { delete textVec_.back(); textVec_.pop_back(); } } void GRA_axis::InheritFrom( GRA_axis *inherit ) { delete characteristics_; inherit->characteristics_ ? characteristics_ = 0 : characteristics_ = new GRA_setOfCharacteristics(*inherit->characteristics_); } bool GRA_axis::Inside( double xloc, double yloc ) { double const degToRad = M_PI/180.; double const eps = 0.0001; double axisAngle = static_cast(characteristics_->Get(wxT("AXISANGLE")))->Get(); NormalizeAngle( axisAngle ); double cosA = cos(axisAngle*degToRad); double sinA = sin(axisAngle*degToRad); if( fabs(cosA) <= eps )cosA = 0.0; if( fabs(sinA) <= eps )sinA = 0.0; // double const uAxis = static_cast(characteristics_->Get(wxT("UPPERAXIS")))->GetAsWorld(); double const lAxis = static_cast(characteristics_->Get(wxT("LOWERAXIS")))->GetAsWorld(); double const dx = uAxis - lAxis; // double const fudge = 0.05; double xlo = xOrigin_ - fudge*cosA - 2*fudge*sinA; double ylo = yOrigin_ - 2*fudge*cosA - fudge*sinA; double xup = xOrigin_ + (dx+fudge)*cosA + 2*fudge*sinA; double yup = yOrigin_ + 2*fudge*cosA + (dx+fudge)*sinA; return (xup-xloc)*(xloc-xlo)>0.0 && (yup-yloc)*(yloc-ylo)>0.0; } void GRA_axis::Make() { if( static_cast(characteristics_->Get(wxT("AXISON")))->Get() ) { try { static_cast(characteristics_->Get(wxT("LOGBASE")))->Get()<=1.0 ? MakeLinearAxis() : MakeLogAxis(); } catch (EGraphicsError const &e) { throw; } } } void GRA_axis::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { std::vector::const_iterator pEnd = polylines_.end(); for( std::vector::const_iterator i=polylines_.begin(); i!=pEnd; ++i ) (*i)->Draw( graphicsOutput, dc ); std::vector::const_iterator tEnd = textVec_.end(); maxWidth_ = 0.0; for( std::vector::const_iterator i=textVec_.begin(); i!=tEnd; ++i ) { (*i)->Draw( graphicsOutput, dc ); double width = (*i)->GetWidth(); if( maxWidth_ < width )maxWidth_ = width; } } void GRA_axis::MakeLinearAxis() { // Plot a general linear axis with equally spaced tic marks. // The axis both starts and ends with a large tic mark, i.e., // it is subdivided into a whole number of equally spaced // large tic marks which are in turn subdivided into a whole // number of small tic marks. // double const degToRad = M_PI/180.; double const eps = 0.0001; // double const axisMax = static_cast(characteristics_->Get(wxT("MAX")))->Get(); double const axisMin = static_cast(characteristics_->Get(wxT("MIN")))->Get(); if( fabs(axisMax-axisMin) < std::numeric_limits::epsilon() )return; // double const virtualMax = static_cast(characteristics_->Get(wxT("VIRTUALMAX")))->Get(); double const virtualMin = static_cast(characteristics_->Get(wxT("VIRTUALMIN")))->Get(); // int const powerAuto = static_cast(characteristics_->Get(wxT("POWERAUTO")))->Get(); double base = static_cast(characteristics_->Get(wxT("LOGBASE")))->Get(); if( powerAuto!=0 && base<=1.0 )Fnice(); // // angle of the axis in degrees relative to the horizontal // double axisAngle = static_cast(characteristics_->Get(wxT("AXISANGLE")))->Get(); NormalizeAngle( axisAngle ); double cosAxisAngle = cos(axisAngle*degToRad); double sinAxisAngle = sin(axisAngle*degToRad); if( fabs(cosAxisAngle) <= eps )cosAxisAngle = 0.0; if( fabs(sinAxisAngle) <= eps )sinAxisAngle = 0.0; // // angle of the axis numbers in degrees, w.r.t. the horizontal // The virtual pointers are vectors whose starting points are on the axis // at the large tic mark locations and whose end points determine the positions // of the axis number labels // double numberAngle = static_cast(characteristics_->Get(wxT("NUMBERSANGLE")))->Get(); NormalizeAngle( numberAngle ); numberAngle -= axisAngle; double coslab = cos(numberAngle*degToRad); double sinlab = sin(numberAngle*degToRad); if( fabs(coslab) < eps )coslab = 0.0; if( fabs(sinlab) < eps )sinlab = 0.0; // bool tics = static_cast(characteristics_->Get(wxT("TICSON")))->Get(); bool ticsBothSides = static_cast(characteristics_->Get(wxT("TICSBOTHSIDES")))->Get(); // double ticAngle = static_cast(characteristics_->Get(wxT("TICANGLE")))->Get(); NormalizeAngle( ticAngle ); double costic = cos(ticAngle*degToRad); double sintic = sin(ticAngle*degToRad); if( fabs(costic) <= eps )costic = 0.0; if( fabs(sintic) <= eps )sintic = 0.0; // // length of the virtual pointer (tic mark), which points to the location where the axis // number will be centered on its perimeter at the large tic mark locations // double imagTicAngle = static_cast(characteristics_->Get(wxT("IMAGTICANGLE")))->Get(); NormalizeAngle( imagTicAngle ); double imagTicLength = static_cast(characteristics_->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); double costn = cos(imagTicAngle*degToRad); double sintn = sin(imagTicAngle*degToRad); if( fabs(costn) < eps )costn = 0.0; if( fabs(sintn) < eps )sintn = 0.0; // // The number of large tic marks plotted on the axis which // delineate the large increments will be exactly numberOfLargeIncrements+1 // int numberOfLargeIncrements = static_cast(characteristics_->Get(wxT("NLINCS")))->Get(); numberOfLargeIncrements = std::max(1,numberOfLargeIncrements); double largeTicLength = static_cast(characteristics_->Get(wxT("LARGETICLENGTH")))->GetAsWorld(); // // number of small increments into which each of the large increments will be // subdivided. The number of small tic marks plotted between each large // increment will be exactly numberOfSmallIncrements-1 // int numberOfSmallIncrements = static_cast(characteristics_->Get(wxT("NSINCS")))->Get(); numberOfSmallIncrements = std::max(1,numberOfSmallIncrements); double smallTicLength = static_cast(characteristics_->Get(wxT("SMALLTICLENGTH")))->GetAsWorld(); // // (xticl,yticl) are the coordinates of the end of the virtual pointer (tic mark) // which points to the location where the axis number will be centered on its perimeter // double xticl = costn*imagTicLength; double yticl = sintn*imagTicLength; if( !tics ) { largeTicLength = 0.0; smallTicLength = 0.0; } // bool numbers = static_cast(characteristics_->Get(wxT("NUMBERSON")))->Get(); // // width in characters of the axis number format // Maximum value is 20. If <= 0 then no axis numbers will be plotted // int numberOfDigits = static_cast(characteristics_->Get(wxT("NUMBEROFDIGITS")))->Get(); numberOfDigits = std::min(20,std::max(numberOfDigits,0)); // // number of decimal places in the axis number format // if numberOfDecimals < 0 then the decimal point is suppressed // int numberOfDecimals = static_cast(characteristics_->Get(wxT("NUMBEROFDECIMALS")))->Get(); // // height of the axis number labels, if numberHeight <= 0, no numbers will be plotted // double numberHeight = static_cast(characteristics_->Get(wxT("NUMBERSHEIGHT")))->GetAsWorld(); if( numberHeight <= 0.0 )numbers = false; // // If "X" is an axis number value at a large tic mark location then the number // plotted will have value "C" with format %numberOfDigits.numberOfDecimals f) // where "X" = "C" * 10^power // // ticSpacing = the spacing between the small tic marks of the axis // double xinc = (virtualMax-virtualMin)/numberOfLargeIncrements/numberOfSmallIncrements; double slen = length_*(1+(axisMin-virtualMin + virtualMax-axisMax)/(axisMax-axisMin)); double ticSpacing = slen/numberOfLargeIncrements/numberOfSmallIncrements; // int const lineWidth = static_cast(characteristics_->Get(wxT("LINEWIDTH")))->Get(); int const lineType = 1; GRA_color *color = static_cast(characteristics_->Get(wxT("AXISCOLOR")))->Get(); // bool dropFirstNumber = static_cast(characteristics_->Get(wxT("DROPFIRSTNUMBER")))->Get(); bool dropLastNumber = static_cast(characteristics_->Get(wxT("DROPLASTNUMBER")))->Get(); double axisModulo = static_cast(characteristics_->Get(wxT("MOD")))->Get(); double offSet = static_cast(characteristics_->Get(wxT("OFFSET")))->Get(); double power = static_cast(characteristics_->Get(wxT("POWER")))->Get(); bool leadingZeros = static_cast(characteristics_->Get(wxT("LEADINGZEROS")))->Get(); GRA_font *numbersFont = static_cast(characteristics_->Get(wxT("NUMBERSFONT")))->Get(); GRA_color *numbersColor = static_cast(characteristics_->Get(wxT("NUMBERSCOLOR")))->Get(); // // draw the axis line // GRA_polyline *tmp = new GRA_polyline(xOrigin_,yOrigin_,lineWidth,lineType,color); xEnd_ = xOrigin_+length_*cosAxisAngle; yEnd_ = yOrigin_+length_*sinAxisAngle; tmp->Add( xEnd_, yEnd_, 2 ); polylines_.push_back( tmp ); // double x0 = xOrigin_ - (axisMin-virtualMin)/(axisMax-axisMin)*length_*cosAxisAngle; double y0 = yOrigin_ - (axisMin-virtualMin)/(axisMax-axisMin)*length_*sinAxisAngle; // int alignment; if( fabs(axisAngle) <= 45.0 ) { alignment = imagTicAngle>180.0 ? 8 : 2; // 8=top centre, 2=bottom centre } else { alignment = imagTicAngle>180.0 ? 4 : 6; // 4=centre left, 6=centre right } // int ntics = numberOfLargeIncrements*numberOfSmallIncrements + 1; int i = 1; while( virtualMin-i*xinc >= axisMin ) { double xs = x0 - cosAxisAngle*i*ticSpacing; double ys = y0 + sinAxisAngle*i*ticSpacing; int modinc = static_cast(fmod(i++,numberOfSmallIncrements)); double ticlen = modinc==0 ? largeTicLength : smallTicLength; if( modinc == 0 ) { if( nGrid_ != 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } } else { if( nGrid_ < 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } } if( !tics )continue; // // (xt,yt) are the unrotated coordinates of the end of the // tic mark relative to the location "stic" // double xt = costic*ticlen; double yt = sintic*ticlen; // // (xts,yts) are rotated screen coordinates of end of the tic mark // double xts = xs + cosAxisAngle*xt - sinAxisAngle*yt; double yts = ys + sinAxisAngle*xt + cosAxisAngle*yt; // // Plot the tic mark by moving the pen from the tic mark location // (xs,ys) to the end of the tic mark (xts,yts) with the pen down // if( ticsBothSides ) { // Plot the tic mark symmetrically on both sides of the // axis as a straight line segment crossing the axis at // an angle of ticAngle degrees // double xtsn = xs - cosAxisAngle*xt + sinAxisAngle*yt; double ytsn = ys - sinAxisAngle*xt - cosAxisAngle*yt; // GRA_polyline *tmp = new GRA_polyline(xts,yts,lineWidth,lineType,color); tmp->Add( xtsn, ytsn, 2 ); polylines_.push_back( tmp ); } else { GRA_polyline *tmp = new GRA_polyline(xs,ys,lineWidth,lineType,color); tmp->Add( xts, yts, 2 ); polylines_.push_back( tmp ); } } for( int i=0; i axisMin )xm1 = axisMin; double xm2 = axisMin; if( xm2 < axisMax )xm2 = axisMax; if( xdum < xm1 || xdum > xm2 )continue; double stic = i*ticSpacing; double xs = x0 + cosAxisAngle*stic; double ys = y0 + sinAxisAngle*stic; // // Determine whether the tic length ticlen is long or short // int modinc = static_cast(fmod(i,numberOfSmallIncrements)); double ticlen = modinc==0 ? largeTicLength : smallTicLength; if( modinc == 0 ) { if( nGrid_ != 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } } else { if( nGrid_ < 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } } if( tics ) { // (xt,yt) are the unrotated coordinates of the end of the // tic mark relative to the location "stic" // double xt = costic*ticlen; double yt = sintic*ticlen; // // (xts,yts) are rotated screen coordinates of end of the tic mark // double xts = xs + cosAxisAngle*xt - sinAxisAngle*yt; double yts = ys + sinAxisAngle*xt + cosAxisAngle*yt; // // Plot the tic mark by moving the pen from the tic mark location // (xs,ys) to the end of the tic mark (xts,yts) with the pen down // if( ticsBothSides ) { // Plot the tic mark symmetrically on both sides of the // axis as a straight line segment crossing the axis at // an angle of ticAngle degrees // double xtsn = xs - cosAxisAngle*xt + sinAxisAngle*yt; double ytsn = ys - sinAxisAngle*xt - cosAxisAngle*yt; // GRA_polyline *tmp = new GRA_polyline(xts,yts,lineWidth,lineType,color); tmp->Add( xtsn, ytsn, 2 ); polylines_.push_back( tmp ); } else { GRA_polyline *tmp = new GRA_polyline(xs,ys,lineWidth,lineType,color); tmp->Add( xts, yts, 2 ); polylines_.push_back( tmp ); } } // Check to see if a number is to be plotted // if( modinc==0 && numberOfDigits!=0 && numbers && (!dropFirstNumber || i!=0) && (!dropLastNumber || i!=ntics-1) ) { // A number is to be plotted // Store the characters for the real number in String number // nlabch is the number of non-blank characters in number // double xdum2 = xdum; if( axisModulo < 0.0 ) { xdum2 = fmod(xdum2,fabs(axisModulo)); } else if( axisModulo > 0.0 ) { xdum2 = fmod(xdum2,axisModulo); if( xdum2 < 0.0 )xdum2 = xdum2 + axisModulo; } xdum2 += offSet; // wxString number = DoubleToString( xdum2, static_cast(power), numberOfDigits, numberOfDecimals ); // // left justify // std::size_t i = number.find_first_not_of( wxT(' '), 0 ); if( i > 0 )number.erase( 0, i ); // std::size_t nSize = number.size(); if( leadingZeros>0 && number.at(0)==wxT('.') ) { number.resize( nSize+1 ); for( std::size_t j=0; jParse(); } catch ( EGraphicsError &e ) { throw; } textVec_.push_back( tb ); } } i = 1; while( virtualMax+i*xinc <= axisMax ) { double xs = x0+cosAxisAngle*(ntics-1+i)*ticSpacing; double ys = y0+sinAxisAngle*i*ticSpacing; int modinc = static_cast(fmod(i++,numberOfSmallIncrements)); double ticlen = modinc==0 ? largeTicLength : smallTicLength; if( modinc == 0 ) { if( nGrid_ != 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } } else { if( nGrid_ < 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } } if( !tics )continue; // // (xt,yt) are the unrotated coordinates of the end of the // tic mark relative to the location "stic" // double xt = costic*ticlen; double yt = sintic*ticlen; // // (xts,yts) are rotated coordinates of end of the tic mark // double xts = xs + cosAxisAngle*xt - sinAxisAngle*yt; double yts = ys + sinAxisAngle*xt + cosAxisAngle*yt; // // Plot the tic mark by moving the pen from the tic mark location // (xs,ys) to the end of the tic mark (xts,yts) with the pen down // if( ticsBothSides ) { // Plot the tic mark symmetrically on both sides of the // axis as a straight line segment crossing the axis at // an angle of ticAngle degrees // double xtsn = xs - cosAxisAngle*xt + sinAxisAngle*yt; double ytsn = ys - sinAxisAngle*xt - cosAxisAngle*yt; // GRA_polyline *tmp = new GRA_polyline(xts,yts,lineWidth,lineType,color); tmp->Add( xtsn, ytsn, 2 ); polylines_.push_back( tmp ); } else { GRA_polyline *tmp = new GRA_polyline(xs,ys,lineWidth,lineType,color); tmp->Add( xts, yts, 2 ); polylines_.push_back( tmp ); } } } void GRA_axis::MakeLogAxis() { // Plot a general logarithmic axis with tic marks // double const degToRad = M_PI/180.; double const eps = 0.0001; // double const axisMax = static_cast(characteristics_->Get(wxT("MAX")))->Get(); double const axisMin = static_cast(characteristics_->Get(wxT("MIN")))->Get(); // if( fabs(axisMax-axisMin)::epsilon() )return; // double const base = static_cast(characteristics_->Get(wxT("LOGBASE")))->Get(); int const intBase = static_cast(base); double const logBase = log(base); double const actualMin = exp(axisMin*logBase); double const actualMax = exp(axisMax*logBase); // // if logStyle_ = false, write the axis labels as decimal numbers // instead of as powers, e.g., 0.1 1 10 100 1000 instead of // // -1 0 2 3 // 10 10 10 10 // bool logStyle = static_cast(characteristics_->Get(wxT("LOGSTYLE")))->Get(); if( !logStyle && fabs(base-exp(1.0))<0.02 )logStyle = true; // // axisAngle = angle of the axis in degrees relative to the horizontal // double axisAngle = static_cast(characteristics_->Get(wxT("AXISANGLE")))->Get(); NormalizeAngle( axisAngle ); double cosAxisAngle = cos(axisAngle*degToRad); double sinAxisAngle = sin(axisAngle*degToRad); if( fabs(cosAxisAngle) <= eps )cosAxisAngle = 0.0; if( fabs(sinAxisAngle) <= eps )sinAxisAngle = 0.0; // int const lineWidth = static_cast(characteristics_->Get(wxT("LINEWIDTH")))->Get(); int const lineType = 1; GRA_color *color = static_cast(characteristics_->Get(wxT("AXISCOLOR")))->Get(); // double numberAngle = static_cast(characteristics_->Get(wxT("NUMBERSANGLE")))->Get(); NormalizeAngle( numberAngle ); numberAngle -= axisAngle; // angle of the axis numbers in degrees, w.r.t. the horizontal // double ticAngle = static_cast(characteristics_->Get(wxT("TICANGLE")))->Get(); NormalizeAngle( ticAngle ); double cosTicAngle = cos(ticAngle*degToRad); double sinTicAngle = sin(ticAngle*degToRad); if( fabs(cosTicAngle) <= eps )cosTicAngle = 0.0; if( fabs(sinTicAngle) <= eps )sinTicAngle = 0.0; // // nlinc = number of large increments into which the axis is // to be subdivided. The number of large tic marks plotted on the axis which // delineate the large increments will be exactly nlinc+1 // int numberOfLargeIncrements = static_cast(characteristics_->Get(wxT("NLINCS")))->Get(); std::size_t nlinc = std::max(1,numberOfLargeIncrements); double largeTicLength = static_cast(characteristics_->Get(wxT("LARGETICLENGTH")))->GetAsWorld(); double smallTicLength = static_cast(characteristics_->Get(wxT("SMALLTICLENGTH")))->GetAsWorld(); // bool tics = static_cast(characteristics_->Get(wxT("TICSON")))->Get(); if( !tics ) { largeTicLength = 0.0; smallTicLength = 0.0; } bool ticsBothSides = static_cast(characteristics_->Get(wxT("TICSBOTHSIDES")))->Get(); double imagTicLength = static_cast(characteristics_->Get(wxT("IMAGTICLENGTH")))->GetAsWorld(); // // length of the virtual pointer, which points to the location where the axis // number will be centered on its perimeter at the large tic mark locations // double imagTicAngle = static_cast(characteristics_->Get(wxT("IMAGTICANGLE")))->Get(); NormalizeAngle( imagTicAngle ); double cosImagTicAngle = cos(imagTicAngle*degToRad); double sinImagTicAngle = sin(imagTicAngle*degToRad); if( fabs(cosImagTicAngle) < eps )cosImagTicAngle = 0.0; if( fabs(sinImagTicAngle) < eps )sinImagTicAngle = 0.0; // // (xticl,yticl) are the coordinates of the end of the virtual pointer which points // to the location where the axis number will be centered on its perimeter // double xticl = cosImagTicAngle*imagTicLength; double yticl = sinImagTicAngle*imagTicLength; if( logStyle && axisAngle==0.0 ) // move exponential style numbers on x-axis further away { xticl *= 2.0; yticl *= 2.0; } // bool numbers = static_cast(characteristics_->Get(wxT("NUMBERSON")))->Get(); double numberHeight = static_cast(characteristics_->Get(wxT("NUMBERSHEIGHT")))->GetAsWorld(); if( numberHeight <= 0.0 )numbers = false; // bool dropFirstNumber = static_cast(characteristics_->Get(wxT("DROPFIRSTNUMBER")))->Get(); bool dropLastNumber = static_cast(characteristics_->Get(wxT("DROPLASTNUMBER")))->Get(); GRA_font *numbersFont = static_cast(characteristics_->Get(wxT("NUMBERSFONT")))->Get(); GRA_color *numbersColor = static_cast(characteristics_->Get(wxT("NUMBERSCOLOR")))->Get(); // double const gapLength = length_/(axisMax-axisMin); // // draw the axis line // GRA_polyline *tmp = new GRA_polyline(xOrigin_,yOrigin_,lineWidth,lineType,color); xEnd_ = xOrigin_+length_*cosAxisAngle; yEnd_ = yOrigin_+length_*sinAxisAngle; tmp->Add( xEnd_, yEnd_, 2 ); polylines_.push_back( tmp ); // double xs, ys; int numberOfSmallTics = intBase-2; std::vector fractionOfGap( numberOfSmallTics ); for( int i=0; i=0.0 ? static_cast(axisMin) : static_cast(axisMin-0.9999); double const actualPowMin = exp(powMin*logBase); // // convert the base into the string label with nsig1 characters // put the up code (<^>) at the end of the string // this signifies that an exponent is to follow and therefore // to be shifted up as well as reduced in size // bool leadingZeros = static_cast(characteristics_->Get(wxT("LEADINGZEROS")))->Get(); wxString label; fabs(base-exp(1.0)) < 0.02 ? label=wxT('e') : label<180.0 ? 8 : 2; // 8=top centre, 2=bottom centre else alignment = imagTicAngle>180.0 ? 4 : 6; // 4=centre left, 6=centre right // // number small tic marks when no major tics will be visible // bool numberSmallTics = numbers && ((static_cast(axisMax)-static_cast(axisMin))==0); if( powMin < axisMin ) { double const vminLoc = (axisMin-powMin)*gapLength; for( int i=0; i9999999.0 || actualValue<0.0000001 ) // too many digits, use log style { wxChar s[25]; ::wxSnprintf( s, 25, wxT("%024u"), i+2 ); std::size_t idc1; for( idc1=0; idc1") << powMin; } else { wxChar s[25]; if( actualValue >= 1.0 )::wxSnprintf( s, 25, wxT("%024u"), static_cast(actualValue+0.5) ); else ::wxSnprintf( s, 25, wxT("%024.7g"), actualValue ); std::size_t idc1; for( idc1=0; idc1Parse(); } catch ( EGraphicsError &e ) { throw; } textVec_.push_back( tb ); } } } } // // find first major tic mark >= axis minimum // and last major tic mark <= axis maximum // powMin = axisMin>=0.0 ? static_cast(axisMin+0.9999) : static_cast(axisMin); int powMax = axisMax>=0.0 ? static_cast(axisMax) : static_cast(axisMax-0.9999); // double const offset = (powMin-axisMin)*gapLength; for( int ipow=powMin; ipow<=powMax; ++ipow ) { // draw large (labeled) tic mark // double const ltic = offset + (ipow-powMin)*gapLength; // distance from lAxis to large tic mark MakeATic( ltic, cosAxisAngle, sinAxisAngle, cosTicAngle, sinTicAngle, largeTicLength, xs, ys ); if( nGrid_ != 0 ) { xTicCoordinates_.push_back(xs); yTicCoordinates_.push_back(ys); } // plot number labels at the large tic marks // if( numbers ) { // a label is to be plotted // ipow is the power of the label being plotted // append the characters of the power to the base + <^> // std::size_t idc1; wxString lab2; lab2.clear(); if( logStyle ) { lab2 << label << wxT("<^>") << ipow; idc1 = 1; } else // draw decimal style numbers, e.g., 0.001, 0.01 { if( ipow*logBase > log(std::numeric_limits::max()) ) throw EGraphicsError(wxT("problem with log scales")); double xout = pow(base,static_cast(ipow)); if( xout>9999999.0 || xout<0.0000001 ) // too many digits, use log style { lab2 << label << wxT("<^>") << ipow; idc1 = 1; } else { wxChar s[25]; ::wxSnprintf( s, 25, wxT("%024.7f"), xout ); for( idc1=0; idc1=0; --idc2 ) { if( s[idc2] != wxT('0') )break; } if( s[idc1] == '.' )--idc1; if( s[idc2] == '.' )--idc2; for( int i=idc1; i<=idc2; ++i )lab2 += wxString( s[i] ); } } // plot the label at an angle relative to the horizontal of angle degrees // GRA_drawableText *tb = new GRA_drawableText( lab2, numberHeight, numberAngle+axisAngle, xs+cosAxisAngle*xticl-sinAxisAngle*yticl, ys+sinAxisAngle*xticl+cosAxisAngle*yticl, alignment, numbersFont, numbersColor ); try { tb->Parse(); } catch ( EGraphicsError &e ) { throw; } textVec_.push_back( tb ); } double const largeTicValue = exp(ipow*logBase); for( int j=0; jAdd( xs, ys, 2 ); // // (xt,yt) are the unrotated coordinates of the end of the tic mark // relative to the location stic // double xt = costic*ticLength; double yt = sintic*ticLength; // // (xts,yts) are the rotated screen coordinates of the end of the tic mark // double xts = xs + costh*xt - sinth*yt; double yts = ys + sinth*xt + costh*yt; // // plot the tic mark by moving the pen from the tic mark location // (xs,ys) to the end of the tic mark (xts,yts) with the pen down // polylines_.back()->Add( xts, yts, 2 ); // bool ticsBothSides = static_cast(characteristics_->Get(wxT("TICSBOTHSIDES")))->Get(); if( ticsBothSides ) { // plot the tic mark symmetrically on both sides of the axis as a // straight line segment crossing the axis at an angle of ticAngle degrees // double xtsn = xs - costh*xt + sinth*yt; double ytsn = ys - sinth*xt - costh*yt; // polylines_.back()->Add( xtsn, ytsn, 2 ); } polylines_.back()->Add( xs, ys, 2 ); } void GRA_axis::Fnice() { // This method calculates exactly the number of digits required to display "XMIN" and // "XMAX" such that they can be displayed in f-format, and such that they include enough // decimal places so that the effect of the first two (one if it has only one) significant // digits of "XINC" can be observed. // - If NDEC < 0, the "." is suppressed // although NWID still includes a position for it. // - If NWID < 0 then FNICE will try to fit XMIN and // XMAX into ABS(NWID) --without loosing the // significance from XINC-- by returning a factor // (10**IPOW) by which XMIN and XMAX should be multiplied. // - Primarily used for labelling axis on plots nicely. // // XMIN & XMAX -- ends of range // XINC -- increment // NWID -- < 0 --> fit in XMIN & XMAX into ABS(NWID)by returning IPOW // width of field includes "." (& "-" if needed) // NDEC -- < 0 --> if inc is an integer then supress "." // >= 0 --> include "." // #no. of digs after "." // IPOW -- 10^IPOW is a multiplication factor used to fit XMIN & XMAX into -NWID. // Note 1 - NWID ALWAYS INCLUDES the "." // Note 2 - the numbers are rounded off before the calculations // are carried out so that there are always enough digits included. // Example - // fnice(-12.0135,5.,.15,nwid,ndec,ipow) // returns // nwid=6, ndec=2, ipow=0 // Examples (cont) - // // input | output // xmin xmax xinc nwid ndec | nwid ndec ipow // -12.0135 5. .15 0 0 | 6 2 0 // 9.9 9.99 .01 0 0 | 4 2 0 // 1.0 9.9 1.0 0 0 | 3 0 0 // 1.0 9.9 1.0 0 -1 | 3 -1 0 // 2.5 122.5 12.5 0 0 | 4 0 0 // 100.1 100.6 .1 -5 0 | 5 1 0 // 100.1 100.6 .1 -1 0 | 5 1 0 // 1000. 5000. 100. -5 0 | 5 0 0 // 1000. 5000. 100. -3 0 | 3 -1 2 // 1000. 5000. 100. -4 0 | 3 -1 2 // .1234 .1239 .00015 -3 0 | 6 5 0 // .115 .145 .015 -3 0 | 4 3 0 // .0045 .0090 .0015 -3 0 | 3 -1 -4 // double virtualMax = static_cast(characteristics_->Get(wxT("VIRTUALMAX")))->Get(); double virtualMin = static_cast(characteristics_->Get(wxT("VIRTUALMIN")))->Get(); double vmin = fabs(virtualMin); double vmax = fabs(virtualMax); int numberOfLargeIncrements = static_cast(characteristics_->Get(wxT("NLINCS")))->Get(); double inc = fabs((virtualMax-virtualMin)/numberOfLargeIncrements); if( inc == 0.0 )inc = 1.0; // int numberOfDigits = static_cast(characteristics_->Get(wxT("NUMBEROFDIGITS")))->Get(); numberOfDigits *= -1; int nwidor = numberOfDigits; // original int numberOfDecimals = static_cast(characteristics_->Get(wxT("NUMBEROFDECIMALS")))->Get(); int ndecor = numberOfDecimals; // original numberOfDecimals = 0; double power = 0.0; // // shift the decimal place left or right until we get; // 10 <= inc < 100, and keep track of the number of shifts; // so that we know how many decimal places we need; // // section for shifting decimal right for everything. // while( inc < 10.0 ) { vmin *= 10.0; vmax *= 10.0; inc *= 10.0; ++numberOfDecimals; } // section for shifting decimal left for everything // while( inc >= 100.0 ) { vmin /= 10.0; vmax /= 10.0; inc /= 10.0; --numberOfDecimals; } inc = floor(inc+0.5); double eps = 0.0001; if( fabs(fmod(inc,10.0))= 1.0 )nsigmin = static_cast(log10(vmin)) + 1; // // determine nwidmin (numberOfDigits for virtualMin) and include a position for the decimal '.' // int nwidmin = 0; if( numberOfDecimals > nsigmin ) nwidmin = numberOfDecimals+1; else if ( numberOfDecimals <= 0 ) nwidmin = nsigmin-numberOfDecimals+1; else nwidmin = nsigmin+1; if( virtualMin < 0.0 )++nwidmin; // include '-' // // determine number of significant digits of virtualMax ; // vmax = ceil(vmax); int nsigmax = 0; if( vmax < 1.0 ) nsigmax = 1; else nsigmax = static_cast(log10(vmax))+1; // // determine nwidmax (numberOfDigits for virtualMax) and include a position for the decimal '.' // int nwidmax = 0; if( numberOfDecimals > nsigmax )nwidmax = numberOfDecimals+1; else if( numberOfDecimals <= 0 )nwidmax = nsigmax-numberOfDecimals+1; else nwidmax = nsigmax+1; if( virtualMax < 0.0 )++nwidmax; // include '-' // // numberOfDigits is the larger of the nwidmin and nwidmax // nwidmin=0 || numberOfDigits<=-nwidor ) { if( numberOfDecimals <= 0 ) { numberOfDecimals = 0; if( ndecor < 0 )numberOfDecimals = -1; } } else { // if we returned above, then there was nothing to check for // problems fitting numberOfDigits, but if we continue on // to here, we find that we must use power_ to fit numberOfDigits. we also // check to make sure that the new numberOfDigits is really an improvement // over the old numberOfDigits // if( virtualMin < 0.0 )++nsigmin; // include '-' if( virtualMax < 0.0 )++nsigmax; // include '-' int nwidtemp = std::max(nsigmin,nsigmax); // if( numberOfDigits <= nwidtemp ) // not improved { if( numberOfDecimals <= 0 ) { numberOfDecimals = 0; if( ndecor < 0 )numberOfDecimals = -1; } } else // improvement { numberOfDigits = nwidtemp; power = static_cast(-numberOfDecimals); numberOfDecimals = -1; } } static_cast(characteristics_->Get(wxT("NUMBEROFDIGITS")))->Set( numberOfDigits ); static_cast(characteristics_->Get(wxT("NUMBEROFDECIMALS")))->Set( numberOfDecimals ); static_cast(characteristics_->Get(wxT("POWER")))->Set( power ); } wxString GRA_axis::DoubleToString( double r, int power, int nPos, int nDec ) const { // DoubleToString converts the double r into a string s, with format // f(nPos).(nDec) such that: r = s*pow(10,power), and the string s is // right-justified in the field width of nPos characters. // // convert the scaled number r/pow(10,power) into s // // if the number of decimal places, nDec < 0, then the decimal point // in the character representation of r will be suppressed, i.e., it // is assumed to be on the far right of the nPos characters of s. // if( nPos <= 0 )return wxString(wxT(" ")); wxChar digit[] = wxT("0123456789"); wxChar minus=wxT('-'), dec=wxT('.'), blank=wxT(' '), star=wxT('*'); // // determine nint, the number of digits to the left of the // decimal point, and ndec2, the number of decimal places, // allowed by the format specification and the sign of r. // ndig=ndec2+nint = number of digits allowed by the format. // if nint < 0 or ndig <= 0 then an format overflow // has occured, hence fill s with "*"s // int nDec1 = std::max(nDec,-1); int nDec2 = std::max(nDec, 0); int nint = nPos-nDec1-1; if( r < 0.0 )--nint; if( nint<0 || nint+nDec2<=0 )return wxString(nPos,star); // // if flag = false, determine power so that r/pow(10,power) will fit // exactly in the format specification (even when the number is rounded) // double powdec = pow(10.0,nDec2); double ra = fabs(r); // // scale ra = |r| down by pow(10,power) // // exp10(r,power) = r/pow(10.0,power) // exp10 is used instead of "pow" because |power| may be too large // example: if r=1.e-70 and power = -100 then pow(10.0,power) is // undefined (underflow) but r/pow(10.0,power) = // 1.e-70/pow(10,-100) = 1.e30 is defined // ra = UsefulFunctions::exp10(ra,power); // // extract the required number of digits from ra, // and convert them to characters // wxString s( nPos, blank ); double realn = powdec*ra + 0.5; for( int i=0; i(fmod(realn,10.0)); if( index<0 || index>9 )index = 0; s.at(nPos-i-1) = digit[index]; realn /= 10.0; } else { s.at(nPos-i-1) = dec; } } // if realn >= 1 then realn has overflowed the format, because there are // still non-zero leading digits which do not fit into the nPos positions of s // if( realn >= 1.0 )return wxString(nPos,star); // // determine the first non-zero character // std::size_t i = s.find_first_not_of( digit[0], 0 ); if( i == s.npos )i = nPos-1; s.replace( 0, i, i, blank ); // if( r >= 0.0 ) { // if the decimal point is the first non-zero character, // then put a leading zero in front if there is room // if( s.at(i) == wxT('.') && i > 0 )s.at(i-1) = digit[0]; } else // r < 0, so put a minus sign { if( i == 0 ) { s.insert( static_cast(0), nPos, star ); } else { if( s.at(i) == wxT('.') ) // first non-zero character is a '.' { if( i == 1 ) { s.at(0) = minus; } else { s.at(i-1) = digit[0]; s.at(i-2) = minus; } } else { s.at(i-1) = minus; } } } // // strip off leading blanks, i.e.,left justify // i = s.find_first_not_of( wxT(' '), 0 ); if( i > 0 )s.erase( 0, i ); // return s; } double GRA_axis::GetLowerAxis() const { return static_cast(characteristics_->Get(wxT("LOWERAXIS")))->GetAsWorld(); } double GRA_axis::GetUpperAxis() const { return static_cast(characteristics_->Get(wxT("UPPERAXIS")))->GetAsWorld(); } double GRA_axis::GetAngle() const { return static_cast(characteristics_->Get(wxT("AXISANGLE")))->Get(); } std::ostream &operator<<( std::ostream &out, GRA_axis const &axis ) { out << "\n"; std::size_t size = axis.xTicCoordinates_.size(); out << ""; for( std::size_t i=0; i\n"; out << "\n" << *axis.characteristics_ << "\n"; size = axis.polylines_.size(); out << "\n"; std::vector::const_iterator pend = axis.polylines_.end(); for( std::vector::const_iterator i=axis.polylines_.begin(); i!=pend; ++i )out << **i; out << "\n"; size = axis.textVec_.size(); out << "\n"; std::vector::const_iterator tend = axis.textVec_.end(); for( std::vector::const_iterator i=axis.textVec_.begin(); i!=tend; ++i )out << **i; return out << "\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_polarAxes.h0000644012702201742730000000457511274636605017363 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_POLARAXES #define GRA_POLARAXES #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_axis; class GRA_wxWidgets; class GRA_setOfCharacteristics; class GRA_color; class GRA_font; class GRA_polarAxes : public GRA_drawableObject { public: GRA_polarAxes() : GRA_drawableObject(wxT("POLARAXES")), axis_(0) {} GRA_polarAxes( std::vector const &, std::vector const &, bool ); ~GRA_polarAxes() { DeleteStuff(); } GRA_polarAxes( GRA_polarAxes const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_polarAxes &operator=( GRA_polarAxes const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff( rhs ); } return *this; } void Make(); void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_polarAxes const & ); void SetAxis( GRA_axis *axis ) { axis_ = axis; } GRA_axis *GetAxis() const { return axis_; } std::vector &GetOtherAxes() { return otherAxes_; } int GetGridLineType() const { return gridLineType_; } bool GetClockwise() const { return clockwise_; } bool GetCompassLabels() const { return compassLabels_; } private: void DeleteStuff(); void CopyStuff( GRA_polarAxes const & ); void DrawLabel( GRA_wxWidgets *, wxDC & ); int NumberOfDigits( double, double, double ); void DrawAngle( wxString &, double, double, double, double, GRA_color *, GRA_font *, GRA_wxWidgets *, wxDC & ); // GRA_axis *axis_; std::vector otherAxes_; double r0_, theta0_; int gridLineType_; bool clockwise_, compassLabels_; }; #endif extrema-4.4.5/src/Graphics/GRA_simpleText.h0000644012702201742730000000441411274636605017553 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_SIMPLETEXT #define GRA_SIMPLETEXT #include #include "wx/wx.h" class GRA_color; class GRA_font; class GRA_simpleText { // this class encompasses simple strings (without embedded commands) // and is only used by GRA_drawableText // public: GRA_simpleText( wxString string, double height, GRA_color *color, GRA_font *font, double xShift, double yShift ) : string_(string), height_(height), color_(color), font_(font), xShift_(xShift), yShift_(yShift) {} GRA_simpleText( wxString, double, GRA_color *, wxChar const *, double, double ); ~GRA_simpleText() {} GRA_simpleText( GRA_simpleText const &rhs ) { CopyStuff(rhs); } GRA_simpleText &operator=( GRA_simpleText const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } bool operator==( GRA_simpleText const & ) const; wxString GetString() const { return string_; } GRA_color *GetColor() const { return color_; } GRA_font *GetFont() const { return font_; } double GetHeight() const { return height_; } double GetXShift() const { return xShift_; } double GetYShift() const { return yShift_; } void SetBoundary( int, int, int, int ); void GetBoundary( int &, int &, int &, int & ); friend std::ostream &operator<<( std::ostream &, GRA_simpleText const & ); private: void CopyStuff( GRA_simpleText const & ); // double height_; wxString string_; GRA_color *color_; GRA_font *font_; // double xShift_, yShift_; // int xLo_, yLo_, xHi_, yHi_; }; #endif extrema-4.4.5/src/Graphics/GRA_colorCharacteristic.cpp0000644012702201742730000000404311274636605021735 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_colorCharacteristic.h" #include "GRA_colorControl.h" std::ostream &operator<<( std::ostream &out, GRA_colorCharacteristic const &c ) { if( c.isAVector_ ) { std::size_t size = c.values_.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_colorCharacteristic::Set( std::vector const &values ) { std::vector().swap( values_ ); std::size_t size = values.size(); for( std::size_t i=0; i\n"; } // end of code extrema-4.4.5/src/Graphics/GRA_fontControl.cpp0000644012702201742730000001016311274636605020255 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_fontControl.h" #include "GRA_font.h" #include "EGraphicsError.h" namespace GRA_fontControl { std::vector fonts_; std::map psFontNames_; void Initialize() { fonts_.push_back( new GRA_font(wxT("ARIAL")) ); fonts_.push_back( new GRA_font(wxT("ARIAL BLACK")) ); fonts_.push_back( new GRA_font(wxT("ARIAL NARROW")) ); fonts_.push_back( new GRA_font(wxT("BOOK ANTIQUA")) ); fonts_.push_back( new GRA_font(wxT("BOOKMAN OLD STYLE")) ); fonts_.push_back( new GRA_font(wxT("CENTURY")) ); fonts_.push_back( new GRA_font(wxT("COURIER NEW")) ); fonts_.push_back( new GRA_font(wxT("GARAMOND")) ); fonts_.push_back( new GRA_font(wxT("SYMBOL")) ); fonts_.push_back( new GRA_font(wxT("TIMES NEW ROMAN")) ); fonts_.push_back( new GRA_font(wxT("WINGDINGS")) ); psFontNames_.insert( std::map::value_type(wxString(wxT("ARIAL")),wxString(wxT("ArialMT"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("ARIAL BLACK")),wxString(wxT("Arial-Black"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("ARIAL NARROW")),wxString(wxT("ArialNarrow"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("BOOK ANTIQUA")),wxString(wxT("BookAntiqua"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("BOOKMAN OLD STYLE")),wxString(wxT("BookmanOldStyle"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("CENTURY")),wxString(wxT("Century"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("COURIER NEW")),wxString(wxT("CourierNewPSMT"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("GARAMOND")),wxString(wxT("Garamond"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("SYMBOL")),wxString(wxT("SymbolMT"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("TIMES NEW ROMAN")),wxString(wxT("TimesNewRomanPSMT"))) ); psFontNames_.insert( std::map::value_type(wxString(wxT("WINGDINGS")),wxString(wxT("Wingdings-Regular"))) ); } void DeleteStuff() { while( !fonts_.empty() ) { delete fonts_.back(); fonts_.pop_back(); } } int GetFontCode( wxString const &nameIn ) { std::size_t size = fonts_.size(); wxString name( nameIn.Upper() ); for( std::size_t i=0; iGetFontName() )return static_cast(i); } return 0; } int GetFontCode( GRA_font *font ) { int code = 0; if( !font )return code; std::size_t size = fonts_.size(); for( std::size_t i=0; i(i); break; } } return code; } GRA_font *GetFont( wxString const &nameIn ) { return fonts_[ GetFontCode(nameIn) ]; } GRA_font *GetFont( int i ) { return fonts_[abs(i)%fonts_.size()]; } int GetCount() { return fonts_.size(); } wxString GetPostScriptFontName( wxString const &name ) { std::map::iterator i = psFontNames_.find( name ); if( i == psFontNames_.end() ) throw EGraphicsError( wxString()<\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_angleCharacteristic::CopyStuff( GRA_angleCharacteristic const &rhs ) { value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_triangle.h0000644012702201742730000000215611274636605017223 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_TRIANGLE #define GRA_TRIANGLE #include "GRA_polygon.h" class GRA_color; class GRA_triangle : public GRA_polygon { public: GRA_triangle( double, double, double, double, GRA_color * =0, GRA_color * =0, int =1 ); GRA_triangle( double, double, double, double, double, double, GRA_color * =0, GRA_color * =0, int =1 ); ~GRA_triangle() {} }; #endif extrema-4.4.5/src/Graphics/GRA_colorCharacteristic.h0000644012702201742730000000430311274636605021401 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_COLORCHARACTERISTIC #define GRA_COLORCHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_color; class GRA_colorCharacteristic : public GRA_characteristic { public: GRA_colorCharacteristic( wxChar const *name, GRA_color *value ) : GRA_characteristic(name,COLOR,false), value_(value), default_(value) {} GRA_colorCharacteristic( wxChar const *name, std::vector const &values ) : GRA_characteristic(name,COLOR,true), value_(0) { values_.assign( values.begin(), values.end() ); } ~GRA_colorCharacteristic() {} GRA_colorCharacteristic( GRA_colorCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff(rhs); } GRA_colorCharacteristic &operator=( GRA_colorCharacteristic const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Set( GRA_color *value ) { value_ = value; isAVector_ = false; } void Set( std::vector const &values ) { values_.assign( values.begin(), values.end() ); isAVector_ = true; } void Set( std::vector const & ); GRA_color *Get() const { if( isAVector_ )return values_.front(); return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_colorCharacteristic const & ); private: void CopyStuff( GRA_colorCharacteristic const & ); // GRA_color *value_, *default_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_polyline.cpp0000644012702201742730000000425711274636605017610 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_polyline.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" void GRA_polyline::CopyStuff( GRA_polyline const &rhs ) { x_.assign( rhs.x_.begin(), rhs.x_.end() ); y_.assign( rhs.y_.begin(), rhs.y_.end() ); pen_.assign( rhs.pen_.begin(), rhs.pen_.end() ); lineWidth_ = rhs.lineWidth_; lineType_ = rhs.lineType_; color_ = rhs.color_; } void GRA_polyline::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); graphicsOutput->SetLineType( lineType_ ); // std::size_t size = x_.size(); graphicsOutput->StartLine( x_[0], y_[0] ); for( std::size_t i=1; iStartLine(x_[i],y_[i]) : graphicsOutput->ContinueLine(x_[i],y_[i],dc); } } std::ostream &operator<<( std::ostream &out, GRA_polyline const &p ) { std::size_t size = p.x_.size(); out << "\n" << ""; for( std::size_t i=0; i\n"; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_threeDPlot.h0000644012702201742730000000614711322763262017466 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #ifndef GRA_THREEDPLOT #define GRA_THREEDPLOT #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_plotSymbol; class GRA_wxWidgets; class ThreeDPlotForm; class GRA_threeDPlot : public GRA_drawableObject { public: GRA_threeDPlot( ThreeDPlotForm *form ) : GRA_drawableObject(wxT("THREEDPLOT")), threeDForm_(form), eye2object_(100.), screenHalfSize_(2.), ds_(15.), angleIncrement_(5.), xAxisAngle_(90.), yAxisAngle_(30.) {} GRA_threeDPlot( ThreeDPlotForm *form, std::vector const &x, std::vector const &y, std::vector const &z ) : GRA_drawableObject(wxT("THREEDPLOT")), threeDForm_(form), eye2object_(100.), screenHalfSize_(2.), ds_(15.), angleIncrement_(5.), xAxisAngle_(90.), yAxisAngle_(30.) { x_.assign( x.begin(), x.end() ); y_.assign( y.begin(), y.end() ); z_.assign( z.begin(), z.end() ); SetupData(); SetupPlotVectors(); SetupPlotSymbols(); } ~GRA_threeDPlot() { DeleteStuff(); } GRA_threeDPlot( GRA_threeDPlot const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_threeDPlot &operator=( GRA_threeDPlot const &rhs ) { if( this != &rhs ) { DeleteStuff(); CopyStuff(rhs); } return *this; } ThreeDPlotForm *GetForm() { return threeDForm_; } void Draw( GRA_wxWidgets *, wxDC & ); void RotateX( double const ); void RotateY( double const ); void ScaleDS( double const ); void SetEye2Object( double const ); private: void DeleteStuff(); void CopyStuff( GRA_threeDPlot const & ); void SetupData(); void SetupPlotVectors(); void SetupPlotSymbols(); void ScaleXY( double const, double const, double const, double &, double & ); void DrawCurve( GRA_wxWidgets *, wxDC & ); void DrawSymbols( GRA_wxWidgets *, wxDC & ); void DrawAxes( GRA_wxWidgets *, wxDC & ); ThreeDPlotForm *threeDForm_; std::vector x_, y_, z_; double xmin_, xmax_, ymin_, ymax_, zmin_, zmax_; double xmn_, xmx_, xinc_, ymn_, ymx_, yinc_, zmn_, zmx_, zinc_; int nlxinc_, nlyinc_, nlzinc_; double xc_, yc_, zc_; std::vector plotSymbols_; std::vector x2_, y2_, z2_, xn_, yn_, zn_; std::vector p2_; double eye2object_; double screenHalfSize_; double ds_; double angleIncrement_; double xAxisAngle_, yAxisAngle_; }; #endif extrema-4.4.5/src/Graphics/GRA_boxPlot.cpp0000644012702201742730000001435011274636605017377 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_boxPlot.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_rectangle.h" #include "GRA_cartesianCurve.h" #include "GRA_cartesianAxes.h" #include "GRA_setOfCharacteristics.h" #include "GRA_doubleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" #include "UsefulFunctions.h" void GRA_boxPlot::CopyStuff( GRA_boxPlot const &rhs ) { GRA_densityPlot::CopyStuff( rhs ); amin_ = rhs.amin_; da_ = rhs.da_; xside_ = rhs.xside_; yside_ = rhs.yside_; bscale_ = rhs.bscale_; } void GRA_boxPlot::Make() { int nx = x_.size(); int ny = y_.size(); int i1, i2, j1, j2; if( zoom_ ) { j1 = nlo_; j2 = nhi_; i1 = mlo_; i2 = mhi_; } else { j1 = 1; j2 = ny; i1 = 1; i2 = nx; } // // Determine min and max values in array. The minimum value will // correspond to zero box size, the maximum to the largest box size. // // use linear density scale // double amax; if( nrow_ > 0 ) // a matrix and not x,y,z data { UsefulFunctions::MinMax( z_, nrow_, i1-1, i2, j1-1, j2, amin_, amax ); } else // x,y,z data and not a matrix { UsefulFunctions::MinMax( z_, i1-1, i2, amin_, amax ); } if( fmin_ < 0.0 )fmin_ = 0.0; amax += 0.05*(amax - amin_); // std::vector xt( x_ ), yt( y_ ); UsefulFunctions::QuickSort( xt, true ); // sort increasing double dx = xt[nx-1] - xt[0]; UsefulFunctions::QuickSort( yt, true ); // sort increasing double dy = yt[ny-1] - yt[0]; // double xdum = xt[0] - 1.0; int nxs = 0; for( int i=0; i 0.001*dx ) { ++nxs; xdum = xt[i]; } } double ydum = yt[0] - 1.0; int nys = 0; for( int j=0; j 0.001*dy ) { ++nys; ydum = yt[j]; } } // xside_ = (xhi_-xlo_)/std::max(1,nxs)*bscale_; yside_ = (yhi_-ylo_)/std::max(1,nys)*bscale_; // da_ = amax - amin_; double amaxx = amin_ + gmax_*da_; amin_ += gmin_*da_; amax = amaxx; da_ = amax==amin_ ? 1.0 : amax-amin_; // if( nrow_>0 && (xProfile_||yProfile_) )MakeProfiles( i1, i2, j1, j2 ); } void GRA_boxPlot::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_cartesianAxes *axes =0; try { DrawAxes( graphicsOutput, dc, axes ); } catch (EGraphicsError &e) { throw; } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); double xtmp, ytmp; gw->GraphToWorld( 0.0, 0.0, xtmp, ytmp, true ); double xmin = static_cast(xAxisC->Get(wxT("MIN")))->Get(); double xmax = static_cast(xAxisC->Get(wxT("MAX")))->Get(); double ymin = static_cast(yAxisC->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisC->Get(wxT("MAX")))->Get(); GRA_color *fillColor = static_cast(generalC->Get(wxT("AREAFILLCOLOR")))->Get(); GRA_color *lineColor = static_cast(dataC->Get(wxT("CURVECOLOR")))->Get(); if( nrow_ > 0 ) // using the matrix and not x y z data { for( int i=mlo_-1; i=0.0 && (y_[j]-ymin)*(ymax-y_[j])>=0.0 ) DrawABox( x_[j], y_[j], z_[j], xmin, xmax, ymin, ymax, lineColor, fillColor, graphicsOutput, dc ); } } DrawAxes2( graphicsOutput, dc, axes ); } void GRA_boxPlot::DrawABox( double xi, double yj, double z, double xmin, double xmax, double ymin, double ymax, GRA_color *lineColor, GRA_color *fillColor, GRA_wxWidgets *graphicsOutput, wxDC &dc ) { if( xi>xmax || xiymax || yjfmax_ )return; // double x, y; ExGlobals::GetGraphWindow()->GraphToWorld( xi, yj, x, y ); // GRA_rectangle r( x, y, xside_*frac, yside_*frac, 0.0, lineColor, fillColor, 1 ); r.Draw( graphicsOutput, dc ); } std::ostream &operator<<( std::ostream &out, GRA_boxPlot const &bp ) { out << "\n"; int size = bp.x_.size(); out << ""; for( int i=0; i\n"; size = bp.y_.size(); out << ""; for( int i=0; i\n"; size = bp.z_.size(); out << ""; for( int i=0; i\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_setOfCharacteristics.cpp0000644012702201742730000001740211274636605022065 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_setOfCharacteristics.h" #include "GRA_characteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "ExGlobals.h" void GRA_setOfCharacteristics::DeleteStuff() { while( !characteristics_.empty() ) { delete characteristics_.back(); characteristics_.pop_back(); } } void GRA_setOfCharacteristics::CopyStuff( GRA_setOfCharacteristics const &rhs ) { cVecIter end = rhs.characteristics_.end(); for( cVecIter i=rhs.characteristics_.begin(); i!=end; ++i ) { GRA_characteristic *c = 0; if( (*i)->IsSize() ) { c = new GRA_sizeCharacteristic(*static_cast(*i)); } else if( (*i)->IsDistance() ) { c = new GRA_distanceCharacteristic(*static_cast(*i)); } else if( (*i)->IsInt() ) { c = new GRA_intCharacteristic(*static_cast(*i)); } else if( (*i)->IsDouble() ) { c = new GRA_doubleCharacteristic(*static_cast(*i)); } else if( (*i)->IsBool() ) { c = new GRA_boolCharacteristic(*static_cast(*i)); } else if( (*i)->IsAngle() ) { c = new GRA_angleCharacteristic(*static_cast(*i)); } else if( (*i)->IsFont() ) { c = new GRA_fontCharacteristic(*static_cast(*i)); } else if( (*i)->IsColor() ) { c = new GRA_colorCharacteristic(*static_cast(*i)); } else if( (*i)->IsString() ) { c = new GRA_stringCharacteristic(*static_cast(*i)); } else assert( 0 ); characteristics_.push_back( c ); } } void GRA_setOfCharacteristics::AddString( wxChar const *name, wxString const &s ) { GRA_stringCharacteristic *sc = new GRA_stringCharacteristic(name,s); characteristics_.push_back( sc ); } void GRA_setOfCharacteristics::AddDistance( wxChar const *name, double distance, bool setAsPercent, double min, double max ) { GRA_distanceCharacteristic *dc = new GRA_distanceCharacteristic(name,distance,setAsPercent,min,max); characteristics_.push_back( dc ); } void GRA_setOfCharacteristics::AddDistance( wxChar const *name, std::vector d, bool setAsPercent, double min, double max ) { GRA_distanceCharacteristic *dc = new GRA_distanceCharacteristic(name,d,setAsPercent,min,max); characteristics_.push_back( dc ); } void GRA_setOfCharacteristics::AddNumber( wxChar const *name, double number ) { GRA_doubleCharacteristic *dc = new GRA_doubleCharacteristic(name,number); characteristics_.push_back( dc ); } void GRA_setOfCharacteristics::AddNumber( wxChar const *name, std::vector numbers ) { GRA_doubleCharacteristic *dc = new GRA_doubleCharacteristic(name,numbers); characteristics_.push_back( dc ); } void GRA_setOfCharacteristics::AddNumber( wxChar const *name, int number ) { GRA_intCharacteristic *ic = new GRA_intCharacteristic(name,number); characteristics_.push_back( ic ); } void GRA_setOfCharacteristics::AddNumber( wxChar const *name, std::vector numbers ) { GRA_intCharacteristic *ic = new GRA_intCharacteristic(name,numbers); characteristics_.push_back( ic ); } void GRA_setOfCharacteristics::AddBool( wxChar const *name, bool b ) { GRA_boolCharacteristic *bc = new GRA_boolCharacteristic(name,b); characteristics_.push_back( bc ); } void GRA_setOfCharacteristics::AddBool( wxChar const *name, std::vector bs ) { GRA_boolCharacteristic *bc = new GRA_boolCharacteristic(name,bs); characteristics_.push_back( bc ); } void GRA_setOfCharacteristics::AddAngle( wxChar const *name, double angle ) { GRA_angleCharacteristic *dc = new GRA_angleCharacteristic(name,angle); characteristics_.push_back( dc ); } void GRA_setOfCharacteristics::AddAngle( wxChar const *name, std::vector angles ) { GRA_angleCharacteristic *dc = new GRA_angleCharacteristic(name,angles); characteristics_.push_back( dc ); } void GRA_setOfCharacteristics::AddFont( wxChar const *name, GRA_font *font ) { GRA_fontCharacteristic *fc = new GRA_fontCharacteristic(name,font); characteristics_.push_back( fc ); } void GRA_setOfCharacteristics::AddFont( wxChar const *name, std::vector fonts ) { GRA_fontCharacteristic *fc = new GRA_fontCharacteristic(name,fonts); characteristics_.push_back( fc ); } void GRA_setOfCharacteristics::AddColor( wxChar const *name, GRA_color *color ) { GRA_colorCharacteristic *cc = new GRA_colorCharacteristic(name,color); characteristics_.push_back( cc ); } void GRA_setOfCharacteristics::AddColor( wxChar const *name, std::vector colors ) { GRA_colorCharacteristic *cc = new GRA_colorCharacteristic(name,colors); characteristics_.push_back( cc ); } void GRA_setOfCharacteristics::AddSize( wxChar const *name, double size, bool setAsPercent, double min, double max ) { GRA_sizeCharacteristic *sc = new GRA_sizeCharacteristic(name,size,setAsPercent,min,max); characteristics_.push_back( sc ); } void GRA_setOfCharacteristics::AddSize( wxChar const *name, std::vector s, bool setAsPercent, double min, double max ) { GRA_sizeCharacteristic *sc = new GRA_sizeCharacteristic(name,s,setAsPercent,min,max); characteristics_.push_back( sc ); } GRA_characteristic *GRA_setOfCharacteristics::Get( wxString const &name ) const { return Get( name.c_str() ); } GRA_characteristic *GRA_setOfCharacteristics::Get( wxChar const *name ) const { cVecIter end = characteristics_.end(); for( cVecIter i=characteristics_.begin(); i!=end; ++i ) { if( (*i)->GetName() == name )return *i; } return 0; } std::ostream &operator<<( std::ostream &out, GRA_setOfCharacteristics const &sc ) { GRA_setOfCharacteristics::cVecIter end = sc.characteristics_.end(); for( GRA_setOfCharacteristics::cVecIter i=sc.characteristics_.begin(); i!=end; ++i ) { if( (*i)->IsSize() ) out << *static_cast(*i); else if( (*i)->IsDistance() ) out << *static_cast(*i); else if( (*i)->IsInt() ) out << *static_cast(*i); else if( (*i)->IsDouble() ) out << *static_cast(*i); else if( (*i)->IsBool() ) out << *static_cast(*i); else if( (*i)->IsAngle() ) out << *static_cast(*i); else if( (*i)->IsFont() ) out << *static_cast(*i); else if( (*i)->IsColor() ) out << *static_cast(*i); else if( (*i)->IsString() ) out << *static_cast(*i); } return out; } // end of file extrema-4.4.5/src/Graphics/GRA_rectangle.h0000644012702201742730000000213611332401372017342 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #ifndef GRA_RECTANGLE #define GRA_RECTANGLE #include "GRA_polygon.h" class GRA_color; class GRA_rectangle : public GRA_polygon { public: GRA_rectangle( double, double, double, double, double, GRA_color * =0, GRA_color * =0, int =1 ); GRA_rectangle( double, double, double, double, double, bool, GRA_color * =0, GRA_color * =0, int =1 ); ~GRA_rectangle() {} }; #endif extrema-4.4.5/src/Graphics/GRA_contourLine.cpp0000644012702201742730000001625111435773753020260 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include #include #include #include #include "GRA_contourLine.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "UsefulFunctions.h" #include "GRA_wxWidgets.h" #include "GRA_color.h" #include "GRA_distanceCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_window.h" #include "GRA_drawableText.h" #include "GRA_colorControl.h" #include "GRA_fontControl.h" void GRA_contourLine::CopyStuff( GRA_contourLine const &rhs ) { lineType_ = rhs.lineType_; lineWidth_ = rhs.lineWidth_; color_ = rhs.color_; // level_ = rhs.level_; xData_.assign( rhs.xData_.begin(), rhs.xData_.end() ); yData_.assign( rhs.yData_.begin(), rhs.yData_.end() ); xCurve_.clear(); yCurve_.clear(); for( std::size_t i=0; i (rhs.xCurve_[i].begin(), rhs.xCurve_[i].end()) ); yCurve_.push_back( std::vector (rhs.yCurve_[i].begin(), rhs.yCurve_[i].end()) ); } } void GRA_contourLine::Make() { GRA_window *gw = ExGlobals::GetGraphWindow(); int const xlog = static_cast( static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LOGBASE")))->Get()); int const ylog = static_cast( static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LOGBASE")))->Get()); // // turn the line segments into a polyline // std::vector x, y; x.assign( xData_.begin(), xData_.end() ); y.assign( yData_.begin(), yData_.end() ); std::vector xpoly, ypoly; std::vector::iterator ix, iy; while( !x.empty() ) { ix = x.begin(); iy = y.begin(); xpoly.push_back( *ix ); ypoly.push_back( *iy ); xpoly.push_back( *(ix+1) ); ypoly.push_back( *(iy+1) ); x.erase( ix, ix+2 ); y.erase( iy, iy+2 ); ix = x.begin(); iy = y.begin(); while( ix != x.end() ) { if( *ix==xpoly.back() && *iy==ypoly.back() ) { xpoly.push_back( *(ix+1) ); ypoly.push_back( *(iy+1) ); x.erase( ix, ix+2 ); y.erase( iy, iy+2 ); ix = x.begin(); iy = y.begin(); } else if( *(ix+1)==xpoly.back() && *(iy+1)==ypoly.back() ) { xpoly.push_back( *ix ); ypoly.push_back( *iy ); x.erase( ix, ix+2 ); y.erase( iy, iy+2 ); ix = x.begin(); iy = y.begin(); } else { ix += 2; iy += 2; } } std::size_t size = xpoly.size(); if( xlog>1 || ylog>1 ) { for( std::size_t i=0; i1 && ypoly[i]<=0.0 )ypoly[i] = std::numeric_limits::min(); if( xlog>1 && xpoly[i]<=0.0 )xpoly[i] = std::numeric_limits::min(); } } std::vector xc( size ), yc( size ); gw->GraphToWorld( xpoly, ypoly, xc, yc ); xCurve_.push_back( xc ); yCurve_.push_back( yc ); xpoly.clear(); ypoly.clear(); } } void GRA_contourLine::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); double xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); double ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); ExGlobals::SetClippingBoundary( xlaxis, ylaxis, xuaxis, yuaxis ); // // draw the contour line // int lineTypeSave = graphicsOutput->GetLineType(); graphicsOutput->SetLineType( lineType_ ); wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); double labelHeight = static_cast(generalC->Get(wxT("CONTOURLABELHEIGHT")))->GetAsWorld(); double labelAngle = 0.0; int labelAlignment = 5; GRA_font *labelFont = GRA_fontControl::GetFont(wxT("ARIAL")); GRA_color *labelColor = color_; std::size_t size = xCurve_.size(); double const pp[5] = {0.2,0.333,0.5,0.667,0.8}; srand(time(0)); std::size_t ix = (rand()%5) + 1; for( std::size_t i=0; iStartLine( xCurve_[i][0], yCurve_[i][0] ); for( std::size_t j=1; jContinueLine( xCurve_[i][j], yCurve_[i][j], dc ); if( np > 10 ) { ++ix; double xloc = xCurve_[i][int(pp[ix%5]*np)]; double yloc = yCurve_[i][int(pp[ix%5]*np)]; GRA_drawableText dt( wxString()<SetLineType( lineTypeSave ); ExGlobals::ResetClippingBoundary(); } std::ostream &operator<<( std::ostream &out, GRA_contourLine const &cc ) { out << "\n"; std::size_t size = cc.xData_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.xCurve_.size(); out << ""; for( std::size_t i=0; i"; for( std::size_t j=0; j\n"; } out << "\n"; return out << "\n"; } void GRA_contourLine::SetValues( int linetype, int linewidth, GRA_color* linecolor, double level, std::vector< std::vector > &xcurve, std::vector< std::vector > &ycurve ) { lineType_ = linetype; lineWidth_ = linewidth; color_ = linecolor; level_ = level; xCurve_.assign( xcurve.begin(), xcurve.end() ); yCurve_.assign( ycurve.begin(), ycurve.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_crossPlus.cpp0000644012702201742730000000601511274636605017744 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_crossPlus.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_crossPlus::~GRA_crossPlus() {} GRA_crossPlus::GRA_crossPlus( double xc, double yc, double side, double angle, GRA_color *lineColor, int lineWidth ) : GRA_multiLineFigure() { SetLineColor( lineColor ); SetLineWidth( lineWidth ); xc_ = xc; yc_ = yc; double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const temp = side*0.5; x_.push_back(xc+RotX(temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(temp,-temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(temp,temp,sinang,cosang)); y_.push_back(yc+RotY(temp,temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-temp,temp,sinang,cosang)); y_.push_back(yc+RotY(-temp,temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(-temp,-temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(temp,-temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(temp,-temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(-temp,temp,sinang,cosang)); y_.push_back(yc+RotY(-temp,temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(-temp,-temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(temp,temp,sinang,cosang)); y_.push_back(yc+RotY(temp,temp,sinang,cosang)); pen_.push_back(2); } std::ostream &operator<<( std::ostream &out, GRA_crossPlus const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_arrow1.h0000644012702201742730000000204311274636605016624 0ustar spangspang/* Copyright (C) 2005,...,2009 Joseph L. Chuma 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. */ #ifndef GRA_ARROW1 #define GRA_ARROW1 #include "GRA_polygon.h" class GRA_color; class GRA_arrow1 : public GRA_polygon { public: GRA_arrow1( double, double, double, double, bool, GRA_color * =0, GRA_color * =0, int =1, double =1.0, double =1.0 ); ~GRA_arrow1() {} private: bool headsBothEnds_; }; #endif extrema-4.4.5/src/Graphics/GRA_drawableText.h0000644012702201742730000000732411274636605020046 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DRAWABLETEXT #define GRA_DRAWABLETEXT #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_color; class GRA_font; class GRA_simpleText; class GRA_window; class GRA_wxWidgets; class GRA_drawableText : public GRA_drawableObject { private: typedef std::vector textVec; typedef textVec::const_iterator textVecIter; // this class has a vector of pointers to GRA_simpleText objects (simple strings) public: GRA_drawableText( wxString const &, bool =false ); GRA_drawableText( wxString const &, double, double, double, double, int, GRA_font *, GRA_color * ); ~GRA_drawableText(); GRA_drawableText( GRA_drawableText const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_drawableText &operator=( GRA_drawableText const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff( rhs ); } return *this; } bool operator==( GRA_drawableText const & ) const; void SetString( wxString const &s ) { inputString_ = s; } wxString GetString() const { return inputString_; } textVec const &GetStrings() const { return strings_; } bool GetGraphUnits() const { return graphUnits_; } void SetX( double x ) { x_ = x; } double GetX() const { return x_; } void SetY( double y ) { y_ = y; } double GetY() const { return y_; } void SetHeight( double h ) { height_ = h; } double GetHeight() const { return height_; } void SetAngle( double a ) { angle_ = a; } double GetAngle() const { double result = angle_ - static_cast(angle_/360.)*360.; if( result < 0.0 )result += 360.; return result; } int GetAlignment() const { return alignment_; } void SetFont( GRA_font *f ) { font_ = f; } GRA_font *GetFont() const { return font_; } void SetColor( GRA_color *c ) { color_ = c; } GRA_color *GetColor() const { return color_; } void Parse(); void Draw( GRA_wxWidgets *, wxDC & ); void Erase( GRA_wxWidgets *, wxDC & ); bool Inside( double, double ); void SetPopup() { popup_ = true; } void Disconnect() { popup_ = false; } double GetWidth() const; friend std::ostream &operator<<( std::ostream &, GRA_drawableText const & ); private: wxString inputString_; textVec strings_; bool graphUnits_; double x_, y_, height_, angle_; int alignment_; GRA_font *font_; GRA_color *color_; // double subsupFactor_; // bool popup_; // void CopyStuff( GRA_drawableText const & ); void DeleteStuff(); // void GetStringStuff( std::size_t &, double &, double &, double &, double &, double &, std::vector &, double, double, GRA_wxWidgets *, wxDC & ); void AlignXY( double, double, double &, double &, double &, double &, double & ); void DetermineCommand( wxString &, double &, double &, double &, bool &, bool &, int &, int & ); wxChar Special( wxString const &, wxString & ); }; #endif extrema-4.4.5/src/Graphics/GRA_distanceCharacteristic.h0000644012702201742730000000665611274636605022072 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DISTANCECHARACTERISTIC #define GRA_DISTANCECHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_distanceCharacteristic : public GRA_characteristic { public: GRA_distanceCharacteristic( wxChar const *name, double value, bool percent, double min, double max ) : GRA_characteristic(name,DISTANCE,false), min_(min), max_(max), value_(value), setAsPercent_(percent), default_(value) {} GRA_distanceCharacteristic( wxChar const *name, std::vector const &values, bool percent, double min, double max ) : GRA_characteristic(name,DISTANCE,true), min_(min), max_(max), value_(0.0), setAsPercent_(percent) { values_.assign( values.begin(), values.end() ); } ~GRA_distanceCharacteristic() {} GRA_distanceCharacteristic( GRA_distanceCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_distanceCharacteristic &operator=( GRA_distanceCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } double GetMin() const { return min_; } double GetMax() const { return max_; } void SetAsPercent( double value ) { value_ = value; setAsPercent_ = true; isAVector_ = false; } void SetAsPercent( std::vector const &values ) { values_.assign( values.begin(), values.end() ); setAsPercent_ = true; isAVector_ = true; } void SetAsWorld( double value ) { value_ = value; setAsPercent_ = false; isAVector_ = false; } void SetAsWorld( std::vector const &values ) { values_.assign( values.begin(), values.end() ); setAsPercent_ = false; isAVector_ = true; } void Set( double value, bool setAsPercent ) { value_ = value; setAsPercent_ = setAsPercent; isAVector_ = false; } void Set( std::vector const &values, bool setAsPercent ) { values_.assign( values.begin(), values.end() ); setAsPercent_ = setAsPercent; isAVector_ = true; } double Get( bool percent ) const { if( percent )return GetAsPercent(); else return GetAsWorld(); } std::vector Gets( bool percent ) const { if( percent )return GetAsPercents(); else return GetAsWorlds(); } double GetAsPercent() const; std::vector GetAsPercents() const; double GetAsWorld() const; std::vector GetAsWorlds() const; friend std::ostream &operator<<( std::ostream &, GRA_distanceCharacteristic const & ); private: void CopyStuff( GRA_distanceCharacteristic const & ); // double min_, max_; // dimension size double value_, default_; std::vector values_; bool setAsPercent_; }; #endif extrema-4.4.5/src/Graphics/GRA_color.h0000644012702201742730000000351111274636605016530 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_COLOR #define GRA_COLOR #include #include "wx/wx.h" class GRA_color { public: GRA_color( int r, int g, int b ) : r_(r), g_(g), b_(b) {} GRA_color( wxString &name, int r, int g, int b ) : name_(name), r_(r), g_(g), b_(b) {} GRA_color( wxChar const *name, int r, int g, int b ) : name_(name), r_(r), g_(g), b_(b) {} virtual ~GRA_color() {} GRA_color( GRA_color const &rhs ) { CopyStuff( rhs ); } GRA_color &operator=( GRA_color const &rhs ) { if( &rhs != this )CopyStuff( rhs ); return *this; } bool operator==( GRA_color const &rhs ) const { return ( r_==rhs.r_ && g_==rhs.g_ && b_==rhs.b_ ); } void GetRGB( int &r, int &g, int &b ) const { r = r_; g = g_; b = b_; } wxString GetName() const { return name_; } bool IsNamed() const { return !name_.empty(); } friend std::ostream &operator<<( std::ostream &, GRA_color const & ); protected: int r_, g_, b_; wxString name_; void CopyStuff( GRA_color const &rhs ) { r_ = rhs.r_; g_ = rhs.g_; b_ = rhs.b_; name_ = rhs.name_; } }; #endif extrema-4.4.5/src/Graphics/GRA_errorBar.cpp0000644012702201742730000000543511274636605017532 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_errorBar.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_errorBar::GRA_errorBar( double xc, double yc, double bottom, double top, bool vertical, double footSize, GRA_color *color, int width ) : GRA_multiLineFigure(), bottom_(bottom), top_(top), vertical_(vertical), footSize_(footSize) { SetLineColor( color ); SetLineWidth( width ); xc_ = xc; yc_ = yc; if( vertical ) { if( footSize > 0.0001 ) { x_.push_back( xc-footSize ); y_.push_back( yc-bottom ); pen_.push_back( 3 ); x_.push_back( xc+footSize ); y_.push_back( yc-bottom ); pen_.push_back( 2 ); x_.push_back( xc-footSize ); y_.push_back( yc+top ); pen_.push_back( 3 ); x_.push_back( xc+footSize ); y_.push_back( yc+top ); pen_.push_back( 2 ); } x_.push_back( xc ); y_.push_back( yc-bottom ); pen_.push_back( 3 ); x_.push_back( xc ); y_.push_back( yc+top ); pen_.push_back( 2 ); } else { if( footSize > 0.0001 ) { x_.push_back( xc-bottom ); y_.push_back( yc-footSize ); pen_.push_back( 3 ); x_.push_back( xc-bottom ); y_.push_back( yc+footSize ); pen_.push_back( 2 ); x_.push_back( xc+top ); y_.push_back( yc-footSize ); pen_.push_back( 3 ); x_.push_back( xc+top ); y_.push_back( yc+footSize ); pen_.push_back( 2 ); } x_.push_back( xc-bottom ); y_.push_back( yc ); pen_.push_back( 3 ); x_.push_back( xc+top ); y_.push_back( yc ); pen_.push_back( 2 ); } } std::ostream &operator<<( std::ostream &out, GRA_errorBar const &eb ) { return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_wxWidgets.h0000644012702201742730000000434111274636605017401 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_WXWIDGETS #define GRA_WXWIDGETS #include #include "wx/wx.h" class GRA_wxWidgets { // this class has the transformations from the world coordinate system to // the output device coordinate system, and vise versa // and knows how to do simple pen up, pen down operations // and how to draw dashed/dotted lines // public: GRA_wxWidgets( int, int, int, int ); virtual ~GRA_wxWidgets() {} void OutputTypeToWorld( int, int, double &, double & ) const; void WorldToOutputType( double, double, int &, int & ) const; void SetLineType( int ); int GetLineType() const; void GetLimits( int &, int &, int &, int & ) const; void Plot( double, double, int, wxDC & ); void PlotPoint( double, double, wxDC & ); void PenUp( double, double ); void PenDown( double, double, wxDC & ); void StartLine( double, double ); void ContinueLine( double, double, wxDC & ); void DrawLineSet( int, double, double, double ); void DrawLineGet( int, double &, double &, double & ); void SetDefaultDrawLineTable(); void DrawLineScale( int, double ); void DrawLineScale( double ); protected: void SetUpTransformationMatrices(); int xMin_, yMin_, xMax_, yMax_; double w2oMatrix_[2][2], w2oShift_[2]; // world to output transformation matrix double o2wMatrix_[2][2], o2wShift_[2]; // output to world transformation matrix double xPrevious_, yPrevious_; // world units int penPrevious_; int currentLineType_; bool newLine_; double drawLineTable_[3][10]; }; #endif extrema-4.4.5/src/Graphics/GRA_drawableObject.h0000644012702201742730000000557711332164062020324 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #ifndef GRA_DRAWABLEOBJECT #define GRA_DRAWABLEOBJECT #include "wx/wx.h" class GRA_wxWidgets; class GRA_drawableObject { protected: enum Type {UNKNOWN, POINT, POLYLINE, ELLIPSE, POLYGON, MULTILINEFIGURE, PLOTSYMBOL, DRAWABLETEXT, AXIS, CARTESIANCURVE, CARTESIANAXES, GRAPHLEGEND, CONTOUR, BOXPLOT, DIFFUSIONPLOT, DITHERINGPLOT, GRADIENTPLOT, THREEDFIGURE, POLARAXES, POLARCURVE, THREEDPLOT }; public: GRA_drawableObject() { type_ = UNKNOWN; } GRA_drawableObject( wxChar const * ); GRA_drawableObject( GRA_drawableObject const &rhs ) { type_ = rhs.type_; } virtual ~GRA_drawableObject() {} bool IsaUnknown() const { return (type_ == UNKNOWN); } bool IsaPoint() const { return (type_ == POINT); } bool IsaPolyline() const { return (type_ == POLYLINE); } bool IsaEllipse() const { return (type_ == ELLIPSE); } bool IsaPolygon() const { return (type_ == POLYGON); } bool IsaMultilineFigure() const { return (type_ == MULTILINEFIGURE); } bool IsaPlotsymbol() const { return (type_ == PLOTSYMBOL); } bool IsaDrawableText() const { return (type_ == DRAWABLETEXT); } bool IsaAxis() const { return (type_ == AXIS); } bool IsaCartesianCurve() const { return (type_ == CARTESIANCURVE); } bool IsaCartesianAxes() const { return (type_ == CARTESIANAXES); } bool IsaGraphLegend() const { return (type_ == GRAPHLEGEND); } bool IsaContour() const { return (type_ == CONTOUR); } bool IsaBoxPlot() const { return (type_ == BOXPLOT); } bool IsaDiffusionPlot() const { return (type_ == DIFFUSIONPLOT); } bool IsaDitheringPlot() const { return (type_ == DITHERINGPLOT); } bool IsaGradientPlot() const { return (type_ == GRADIENTPLOT); } bool IsaThreeDFigure() const { return (type_ == THREEDFIGURE); } bool IsaPolarAxes() const { return (type_ == POLARAXES); } bool IsaPolarCurve() const { return (type_ == POLARCURVE); } bool IsaThreeDPlot() const { return (type_ == THREEDPLOT); } virtual void Draw( GRA_wxWidgets *, wxDC & ) =0; virtual void Make() {} virtual bool Inside( double, double ) { return false; } protected: Type type_; }; #endif extrema-4.4.5/src/Graphics/GRA_colorControl.cpp0000644012702201742730000004767511274636605020447 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "GRA_colorControl.h" #include "GRA_color.h" #include "GRA_colorMap.h" #include "EGraphicsError.h" namespace GRA_colorControl { GRA_colorMap *current_ =0; GRA_colorMap *userdefined_ =0; GRA_colorMap *thermal_ =0; GRA_colorMap *gray256_ =0; GRA_colorMap *gray16_ =0; GRA_colorMap *rainbow_ =0; GRA_colorMap *redblue16_ =0; GRA_colorMap *classic8_ =0; GRA_colorMap *topo256_ =0; GRA_colorMap *default_ =0; std::vector namedColors_; void Initialize() { CreateThermalColorMap(); CreateGray256ColorMap(); CreateGray16ColorMap(); CreateRainbowColorMap(); CreateRedBlue16ColorMap(); CreateClassic8ColorMap(); CreateTopo256ColorMap(); // CreateDefaultColorMap(); userdefined_ = 0; // current_ = default_; // created just above // CreateNamedColors(); } void DeleteStuff() { delete thermal_; delete gray256_; delete gray16_; delete rainbow_; delete redblue16_; delete classic8_; delete topo256_; delete default_; delete userdefined_; std::vector::const_iterator end = namedColors_.end(); for( std::vector::const_iterator i=namedColors_.begin(); i!=end; ++i ) delete *i; } wxString GetColorMapName() { return current_->GetName(); } GRA_colorMap *GetColorMap() { return current_; } void SetFile( wxString const &fileName ) { std::ifstream readIn; readIn.open( fileName.mb_str(), std::ios_base::in ); if( !readIn ) { wxString s(wxT("could not open file: ")); s += fileName; throw EGraphicsError( s ); } GRA_colorMap *tmp = new GRA_colorMap( wxT("USERDEFINED") ); for( int record=0; ; ++record ) { std::string sc; sc.clear(); if( !std::getline(readIn,sc) )break; if( sc.empty() )continue; // the record is empty, nothing on the line std::string rs, gs, bs; std::string const prefix("0x"); try { rs = prefix + sc.substr(0,2).c_str(); gs = prefix + sc.substr(3,2).c_str(); bs = prefix + sc.substr(6,2).c_str(); } catch (std::exception const &e) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } long int rl, gl, bl; wxString((wxChar*)rs.c_str()).ToLong( &rl ); wxString((wxChar*)gs.c_str()).ToLong( &gl ); wxString((wxChar*)bs.c_str()).ToLong( &bl ); tmp->AddColor( new GRA_color(static_cast(rl),static_cast(gl),static_cast(bl)) ); } delete userdefined_; userdefined_ = tmp; current_ = userdefined_; } void CreateNamedColors() { namedColors_.push_back( new GRA_color(wxT("WHITE"),255,255,255) ); namedColors_.push_back( new GRA_color(wxT("BLACK"),0,0,0) ); namedColors_.push_back( new GRA_color(wxT("RED"),255,0,0) ); namedColors_.push_back( new GRA_color(wxT("GREEN"),0,255,0) ); namedColors_.push_back( new GRA_color(wxT("BLUE"),0,0,255) ); namedColors_.push_back( new GRA_color(wxT("PURPLE"),160,32,240) ); namedColors_.push_back( new GRA_color(wxT("YELLOW"),255,255,0) ); namedColors_.push_back( new GRA_color(wxT("CYAN"),0,255,255) ); namedColors_.push_back( new GRA_color(wxT("BROWN"),165,42,42) ); namedColors_.push_back( new GRA_color(wxT("CORAL"),255,127,80) ); namedColors_.push_back( new GRA_color(wxT("SALMON"),250,128,114) ); namedColors_.push_back( new GRA_color(wxT("SIENNA"),160,82,45) ); namedColors_.push_back( new GRA_color(wxT("TAN"),210,180,140) ); namedColors_.push_back( new GRA_color(wxT("FUCHSIA"),255,0,255) ); namedColors_.push_back( new GRA_color(wxT("LIME"),50,205,50) ); namedColors_.push_back( new GRA_color(wxT("MAROON"),128,0,0) ); namedColors_.push_back( new GRA_color(wxT("NAVY"),0,0,128) ); namedColors_.push_back( new GRA_color(wxT("OLIVE"),128,128,0) ); namedColors_.push_back( new GRA_color(wxT("SILVER"),192,192,192) ); namedColors_.push_back( new GRA_color(wxT("TEAL"),0,128,128) ); } void SetColorMap( wxString const &inName ) { wxString name( inName.Upper() ); if( name == wxString(wxT("THERMAL")) )current_ = thermal_; else if( name == wxString(wxT("GRAY256")) )current_ = gray256_; else if( name == wxString(wxT("GRAY16")) )current_ = gray16_; else if( name == wxString(wxT("RAINBOW")) )current_ = rainbow_; else if( name == wxString(wxT("REDBLUE16")) )current_ = redblue16_; else if( name == wxString(wxT("CLASSIC8")) )current_ = classic8_; else if( name == wxString(wxT("TOPO256")) )current_ = topo256_; else if( name == wxString(wxT("DEFAULT")) )current_ = default_; else if( name == wxString(wxT("USERDEFINED")) && userdefined_ )current_ = userdefined_; else throw EGraphicsError( wxT("unknown color map") ); } GRA_colorMap *GetColorMap( wxString const &inName ) { wxString name( inName.Upper() ); if( name == wxString(wxT("THERMAL")) )return thermal_; else if( name == wxString(wxT("GRAY256")) )return gray256_; else if( name == wxString(wxT("GRAY16")) )return gray16_; else if( name == wxString(wxT("RAINBOW")) )return rainbow_; else if( name == wxString(wxT("REDBLUE16")) )return redblue16_; else if( name == wxString(wxT("CLASSIC8")) )return classic8_; else if( name == wxString(wxT("TOPO256")) )return topo256_; else if( name == wxString(wxT("DEFAULT")) )return default_; else if( name == wxString(wxT("USERDEFINED")) && userdefined_ )return userdefined_; else throw EGraphicsError( wxT("unknown color map") ); } void SetColorMapUser( GRA_colorMap *colorMap ) { delete userdefined_; userdefined_ = colorMap; current_ = userdefined_; } void SetColorMap( GRA_colorMap *colorMap ) { current_ = colorMap; } int GetNumberOfNamedColors() { return namedColors_.size(); } int GetColorCode( wxString const &nameIn ) { // since color must be a named color, return int <= 0 // wxString name( nameIn.Upper() ); std::size_t size = namedColors_.size(); for( std::size_t i=0; iGetName() )return -1*static_cast(i); } wxString message(wxT("color ")); message += name + wxString(wxT(" not found")); throw EGraphicsError( message ); } int GetColorCode( int r, int g, int b ) { std::size_t size = namedColors_.size(); GRA_color color(r,g,b); for( std::size_t i=0; i(i); } return current_->GetCode( r, g, b ); // returns 0 if r,g,b not in color map } int GetColorCode( GRA_color *color ) { if( !color )return 0; // // if color is a named color, return int <= 0 // if color is not named, return int > 0 // std::size_t size = namedColors_.size(); for( std::size_t i=0; i(i); } try { return current_->GetCode( color ); } catch (EGraphicsError &e) { throw; } } GRA_color *GetColor( wxString const &nameIn ) { GRA_color *color = 0; wxString name( nameIn.Upper() ); int size = namedColors_.size(); for( std::size_t i=0; iGetName() ) { color = namedColors_[i]; break; } } return color; } GRA_color *GetColor( int i ) { // if i <= 0, color is a named color // if i > 0, color is not named // no need to check the size of i, since the code number will wrap // if( i > 0 )return current_->GetColor(i); return namedColors_[abs(i)%namedColors_.size()]; } int GetColorMapSize() { return current_->GetSize(); } void ColorCodeToRGB( int code, int &r, int &g, int &b ) { GRA_color *color = GetColor( code ); color->GetRGB(r,g,b); } void CreateThermalColorMap() { thermal_ = new GRA_colorMap( wxT("THERMAL") ); for( int i=0; i<=252; i+=3 )thermal_->AddColor( new GRA_color(i,0,0) ); for( int i=0; i<=252; i+=3 )thermal_->AddColor( new GRA_color(255,i,0) ); for( int i=0; i<=252; i+=3 )thermal_->AddColor( new GRA_color(255,255,i) ); thermal_->AddColor( new GRA_color(255,255,255) ); } void CreateGray256ColorMap() { gray256_ = new GRA_colorMap( wxT("GRAY256") ); for( int i=0; i<256; ++i )gray256_->AddColor( new GRA_color(i,i,i) ); } void CreateGray16ColorMap() { gray16_ = new GRA_colorMap( wxT("GRAY16") ); for( int i=0; i<=210; i+=15 )gray16_->AddColor( new GRA_color(i,i,i) ); gray16_->AddColor( new GRA_color(255,255,255) ); } void CreateRainbowColorMap() { rainbow_ = new GRA_colorMap( wxT("RAINBOW") ); for( int i=0; i<=248; i+=4 )rainbow_->AddColor( new GRA_color(255,i,0) ); rainbow_->AddColor( new GRA_color(255,255,0) ); rainbow_->AddColor( new GRA_color(253,255,0) ); for( int i=252; i>=0; i-=4 )rainbow_->AddColor( new GRA_color(i,255,0) ); for( int i=4; i<=248; i+=4 )rainbow_->AddColor( new GRA_color(0,255,i) ); rainbow_->AddColor( new GRA_color(0,255,255) ); for( int i=252; i>=0; i-=4 )rainbow_->AddColor( new GRA_color(0,i,255) ); } void CreateRedBlue16ColorMap() { redblue16_ = new GRA_colorMap( wxT("REDBLUE16") ); redblue16_->AddColor( new GRA_color(255,0,0) ); for( int i=16; i<=224; i+=16 )redblue16_->AddColor( new GRA_color(256-i,0,i) ); redblue16_->AddColor( new GRA_color(0,0,255) ); } void CreateClassic8ColorMap() { classic8_ = new GRA_colorMap( wxT("CLASSIC8") ); classic8_->AddColor( new GRA_color(0,0,0) ); classic8_->AddColor( new GRA_color(255,0,0) ); classic8_->AddColor( new GRA_color(0,0,255) ); classic8_->AddColor( new GRA_color(128,0,128) ); classic8_->AddColor( new GRA_color(0,255,0) ); classic8_->AddColor( new GRA_color(255,255,0) ); classic8_->AddColor( new GRA_color(0,255,255) ); classic8_->AddColor( new GRA_color(255,255,255) ); } void CreateTopo256ColorMap() { topo256_ = new GRA_colorMap( wxT("TOPO256") ); for( int i=0; i<=248; i+=4 )topo256_->AddColor( new GRA_color(0,0,i) ); topo256_->AddColor( new GRA_color(0,0,255) ); topo256_->AddColor( new GRA_color(4,4,255) ); topo256_->AddColor( new GRA_color(7,7,255) ); topo256_->AddColor( new GRA_color(10,10,255) ); topo256_->AddColor( new GRA_color(13,13,255) ); topo256_->AddColor( new GRA_color(16,16,255) ); topo256_->AddColor( new GRA_color(19,19,255) ); topo256_->AddColor( new GRA_color(22,22,255) ); topo256_->AddColor( new GRA_color(26,26,255) ); topo256_->AddColor( new GRA_color(29,29,255) ); topo256_->AddColor( new GRA_color(32,32,255) ); topo256_->AddColor( new GRA_color(35,35,255) ); topo256_->AddColor( new GRA_color(38,38,255) ); topo256_->AddColor( new GRA_color(41,41,255) ); topo256_->AddColor( new GRA_color(44,44,255) ); topo256_->AddColor( new GRA_color(48,48,255) ); topo256_->AddColor( new GRA_color(51,51,255) ); topo256_->AddColor( new GRA_color(54,54,255) ); topo256_->AddColor( new GRA_color(57,57,255) ); topo256_->AddColor( new GRA_color(60,60,255) ); topo256_->AddColor( new GRA_color(63,63,255) ); topo256_->AddColor( new GRA_color(66,66,255) ); topo256_->AddColor( new GRA_color(70,70,255) ); topo256_->AddColor( new GRA_color(73,73,255) ); topo256_->AddColor( new GRA_color(76,76,255) ); topo256_->AddColor( new GRA_color(79,79,255) ); topo256_->AddColor( new GRA_color(82,82,255) ); topo256_->AddColor( new GRA_color(85,85,255) ); topo256_->AddColor( new GRA_color(88,88,255) ); topo256_->AddColor( new GRA_color(92,92,255) ); topo256_->AddColor( new GRA_color(95,95,255) ); topo256_->AddColor( new GRA_color(98,98,255) ); topo256_->AddColor( new GRA_color(101,101,255) ); topo256_->AddColor( new GRA_color(104,104,255) ); topo256_->AddColor( new GRA_color(107,107,255) ); topo256_->AddColor( new GRA_color(110,110,255) ); topo256_->AddColor( new GRA_color(113,113,255) ); topo256_->AddColor( new GRA_color(117,117,255) ); topo256_->AddColor( new GRA_color(120,120,255) ); topo256_->AddColor( new GRA_color(123,123,255) ); topo256_->AddColor( new GRA_color(126,126,255) ); topo256_->AddColor( new GRA_color(129,129,255) ); topo256_->AddColor( new GRA_color(132,132,255) ); topo256_->AddColor( new GRA_color(135,135,255) ); topo256_->AddColor( new GRA_color(139,139,255) ); topo256_->AddColor( new GRA_color(142,142,255) ); topo256_->AddColor( new GRA_color(145,145,255) ); topo256_->AddColor( new GRA_color(148,148,255) ); topo256_->AddColor( new GRA_color(151,151,255) ); topo256_->AddColor( new GRA_color(154,154,255) ); topo256_->AddColor( new GRA_color(157,157,255) ); topo256_->AddColor( new GRA_color(161,161,255) ); topo256_->AddColor( new GRA_color(164,164,255) ); topo256_->AddColor( new GRA_color(167,167,255) ); topo256_->AddColor( new GRA_color(170,170,255) ); topo256_->AddColor( new GRA_color(173,173,255) ); topo256_->AddColor( new GRA_color(176,176,255) ); topo256_->AddColor( new GRA_color(179,179,255) ); topo256_->AddColor( new GRA_color(183,183,255) ); topo256_->AddColor( new GRA_color(186,186,255) ); topo256_->AddColor( new GRA_color(189,189,255) ); topo256_->AddColor( new GRA_color(192,192,255) ); topo256_->AddColor( new GRA_color(195,195,255) ); topo256_->AddColor( new GRA_color(198,198,255) ); topo256_->AddColor( new GRA_color(204,204,255) ); topo256_->AddColor( new GRA_color(0,153,0) ); topo256_->AddColor( new GRA_color(0,158,0) ); topo256_->AddColor( new GRA_color(0,162,0) ); topo256_->AddColor( new GRA_color(0,166,0) ); topo256_->AddColor( new GRA_color(0,170,0) ); topo256_->AddColor( new GRA_color(0,174,0) ); topo256_->AddColor( new GRA_color(0,178,0) ); topo256_->AddColor( new GRA_color(0,182,0) ); topo256_->AddColor( new GRA_color(0,186,0) ); topo256_->AddColor( new GRA_color(0,190,0) ); topo256_->AddColor( new GRA_color(0,194,0) ); topo256_->AddColor( new GRA_color(0,198,0) ); topo256_->AddColor( new GRA_color(0,202,0) ); topo256_->AddColor( new GRA_color(0,207,0) ); topo256_->AddColor( new GRA_color(0,211,0) ); topo256_->AddColor( new GRA_color(0,215,0) ); topo256_->AddColor( new GRA_color(0,219,0) ); topo256_->AddColor( new GRA_color(0,223,0) ); topo256_->AddColor( new GRA_color(0,227,0) ); topo256_->AddColor( new GRA_color(0,231,0) ); topo256_->AddColor( new GRA_color(0,235,0) ); topo256_->AddColor( new GRA_color(0,239,0) ); topo256_->AddColor( new GRA_color(0,243,0) ); topo256_->AddColor( new GRA_color(0,247,0) ); topo256_->AddColor( new GRA_color(0,255,0) ); topo256_->AddColor( new GRA_color(10,255,0) ); topo256_->AddColor( new GRA_color(19,255,0) ); topo256_->AddColor( new GRA_color(29,255,0) ); topo256_->AddColor( new GRA_color(38,255,0) ); topo256_->AddColor( new GRA_color(48,255,0) ); topo256_->AddColor( new GRA_color(57,255,0) ); topo256_->AddColor( new GRA_color(67,255,0) ); topo256_->AddColor( new GRA_color(76,255,0) ); topo256_->AddColor( new GRA_color(85,255,0) ); topo256_->AddColor( new GRA_color(95,255,0) ); topo256_->AddColor( new GRA_color(104,255,0) ); topo256_->AddColor( new GRA_color(114,255,0) ); topo256_->AddColor( new GRA_color(123,255,0) ); topo256_->AddColor( new GRA_color(133,255,0) ); topo256_->AddColor( new GRA_color(142,255,0) ); topo256_->AddColor( new GRA_color(152,255,0) ); topo256_->AddColor( new GRA_color(161,255,0) ); topo256_->AddColor( new GRA_color(171,255,0) ); topo256_->AddColor( new GRA_color(180,255,0) ); topo256_->AddColor( new GRA_color(189,255,0) ); topo256_->AddColor( new GRA_color(199,255,0) ); topo256_->AddColor( new GRA_color(208,255,0) ); topo256_->AddColor( new GRA_color(218,255,0) ); topo256_->AddColor( new GRA_color(227,255,0) ); topo256_->AddColor( new GRA_color(237,255,0) ); topo256_->AddColor( new GRA_color(255,255,0) ); topo256_->AddColor( new GRA_color(255,252,0) ); topo256_->AddColor( new GRA_color(255,248,0) ); topo256_->AddColor( new GRA_color(255,244,0) ); topo256_->AddColor( new GRA_color(255,240,0) ); topo256_->AddColor( new GRA_color(255,237,0) ); topo256_->AddColor( new GRA_color(255,233,0) ); topo256_->AddColor( new GRA_color(255,229,0) ); topo256_->AddColor( new GRA_color(255,225,0) ); topo256_->AddColor( new GRA_color(255,222,0) ); topo256_->AddColor( new GRA_color(255,218,0) ); topo256_->AddColor( new GRA_color(255,214,0) ); topo256_->AddColor( new GRA_color(255,210,0) ); topo256_->AddColor( new GRA_color(255,206,0) ); topo256_->AddColor( new GRA_color(255,203,0) ); topo256_->AddColor( new GRA_color(255,199,0) ); topo256_->AddColor( new GRA_color(255,195,0) ); topo256_->AddColor( new GRA_color(255,191,0) ); topo256_->AddColor( new GRA_color(255,188,0) ); topo256_->AddColor( new GRA_color(255,184,0) ); topo256_->AddColor( new GRA_color(255,180,0) ); topo256_->AddColor( new GRA_color(255,176,0) ); topo256_->AddColor( new GRA_color(255,172,0) ); topo256_->AddColor( new GRA_color(255,169,0) ); topo256_->AddColor( new GRA_color(255,165,0) ); topo256_->AddColor( new GRA_color(255,161,0) ); topo256_->AddColor( new GRA_color(255,153,0) ); topo256_->AddColor( new GRA_color(255,152,0) ); topo256_->AddColor( new GRA_color(248,150,0) ); topo256_->AddColor( new GRA_color(244,148,0) ); topo256_->AddColor( new GRA_color(240,146,0) ); topo256_->AddColor( new GRA_color(237,144,0) ); topo256_->AddColor( new GRA_color(233,142,0) ); topo256_->AddColor( new GRA_color(229,140,0) ); topo256_->AddColor( new GRA_color(225,138,0) ); topo256_->AddColor( new GRA_color(222,137,0) ); topo256_->AddColor( new GRA_color(218,135,0) ); topo256_->AddColor( new GRA_color(214,133,0) ); topo256_->AddColor( new GRA_color(210,131,0) ); topo256_->AddColor( new GRA_color(206,129,0) ); topo256_->AddColor( new GRA_color(203,127,0) ); topo256_->AddColor( new GRA_color(199,125,0) ); topo256_->AddColor( new GRA_color(195,123,0) ); topo256_->AddColor( new GRA_color(191,121,0) ); topo256_->AddColor( new GRA_color(188,120,0) ); topo256_->AddColor( new GRA_color(184,118,0) ); topo256_->AddColor( new GRA_color(180,116,0) ); topo256_->AddColor( new GRA_color(176,114,0) ); topo256_->AddColor( new GRA_color(172,112,0) ); topo256_->AddColor( new GRA_color(169,110,0) ); topo256_->AddColor( new GRA_color(165,108,0) ); topo256_->AddColor( new GRA_color(161,106,0) ); topo256_->AddColor( new GRA_color(153,102,0) ); topo256_->AddColor( new GRA_color(157,108,10) ); topo256_->AddColor( new GRA_color(161,114,20) ); topo256_->AddColor( new GRA_color(165,120,30) ); topo256_->AddColor( new GRA_color(169,126,40) ); topo256_->AddColor( new GRA_color(173,132,50) ); topo256_->AddColor( new GRA_color(177,138,59) ); topo256_->AddColor( new GRA_color(181,144,69) ); topo256_->AddColor( new GRA_color(185,150,79) ); topo256_->AddColor( new GRA_color(189,155,89) ); topo256_->AddColor( new GRA_color(193,161,99) ); topo256_->AddColor( new GRA_color(197,167,108) ); topo256_->AddColor( new GRA_color(201,173,118) ); topo256_->AddColor( new GRA_color(205,179,128) ); topo256_->AddColor( new GRA_color(208,185,138) ); topo256_->AddColor( new GRA_color(212,191,148) ); topo256_->AddColor( new GRA_color(216,197,157) ); topo256_->AddColor( new GRA_color(220,203,167) ); topo256_->AddColor( new GRA_color(224,208,177) ); topo256_->AddColor( new GRA_color(228,214,187) ); topo256_->AddColor( new GRA_color(232,220,197) ); topo256_->AddColor( new GRA_color(236,226,206) ); topo256_->AddColor( new GRA_color(240,232,216) ); topo256_->AddColor( new GRA_color(244,238,226) ); topo256_->AddColor( new GRA_color(248,244,236) ); topo256_->AddColor( new GRA_color(255,255,255) ); } void CreateDefaultColorMap() { default_ = new GRA_colorMap( wxT("DEFAULT") ); for( int i=0; i<6; ++i ) { for( int j=0; j<6; ++j ) { for( int k=0; k<6; ++k ) default_->AddColor( new GRA_color(i*0x33,j*0x33,k*0x33) ); } } } } // end of namespace // end of file extrema-4.4.5/src/Graphics/GRA_cartesianCurve.cpp0000644012702201742730000010464511274636605020735 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "GRA_cartesianCurve.h" #include "EGraphicsError.h" #include "GRA_wxWidgets.h" #include "GRA_plotSymbol.h" #include "GRA_polygon.h" #include "GRA_errorBar.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_angleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_distanceCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_window.h" #include "ExGlobals.h" #include "UsefulFunctions.h" GRA_cartesianCurve::~GRA_cartesianCurve() { DeleteStuff(); if( popup_ )ExGlobals::DisconnectCurvePopup(); } void GRA_cartesianCurve::SetUp() { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); GRA_setOfCharacteristics *curveC = gw->GetDataCurveCharacteristics(); // std::size_t xSize = xData_.size(); // GRA_intCharacteristic *psCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOL"))); std::vector symbols; if( psCharacteristic->IsVector() ) { symbols.assign( psCharacteristic->Gets().begin(), psCharacteristic->Gets().end() ); std::size_t psSize = symbols.size(); if( smooth_ ) { // make sure plot symbols are disconnected when plotting smooth data curve for( std::size_t i=0; iGet(); if( smooth_ )s = s==0 ? -11 : -1*abs(s); symbols.assign( xSize, s ); } GRA_sizeCharacteristic *pssizeCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLSIZE"))); std::vector sizes; if( pssizeCharacteristic->IsVector() ) { sizes = pssizeCharacteristic->GetAsWorlds(); std::size_t pssSize = sizes.size(); for( std::size_t i=pssSize; iGetAsWorld() ); GRA_angleCharacteristic *psangleCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLANGLE"))); std::vector angles; if( psangleCharacteristic->IsVector() ) { angles.assign( psangleCharacteristic->Gets().begin(), psangleCharacteristic->Gets().end() ); std::size_t psaSize = angles.size(); for( std::size_t i=psaSize; iGet() ); GRA_colorCharacteristic *pscolorCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLCOLOR"))); std::vector colors; if( pscolorCharacteristic->IsVector() ) { colors.assign( pscolorCharacteristic->Gets().begin(), pscolorCharacteristic->Gets().end() ); std::size_t pscSize = colors.size(); for( std::size_t i=pscSize; iGet() ); GRA_intCharacteristic *pslwCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLLINEWIDTH"))); std::vector lws; if( pslwCharacteristic->IsVector() ) { lws.assign( pslwCharacteristic->Gets().begin(), pslwCharacteristic->Gets().end() ); std::size_t pslwSize = lws.size(); for( std::size_t i=pslwSize; iGet() ); // for( std::size_t i=0; i(curveC->Get(wxT("HISTOGRAMTYPE")))->Get(); lineType_ = static_cast(curveC->Get(wxT("CURVELINETYPE")))->Get(); lineWidth_ = static_cast(curveC->Get(wxT("CURVELINEWIDTH")))->Get(); color_ = static_cast(curveC->Get(wxT("CURVECOLOR")))->Get(); GRA_colorCharacteristic *areaFillColorCharacteristic = static_cast(generalC->Get(wxT("AREAFILLCOLOR"))); if( areaFillColorCharacteristic->IsVector() ) { areaFillColor_ = 0; areaFillColors_.assign( areaFillColorCharacteristic->Gets().begin(), areaFillColorCharacteristic->Gets().end() ); std::size_t afcSize = areaFillColors_.size(); for( std::size_t i=afcSize; iGet(); // GRA_setOfCharacteristics *xAxisC = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = gw->GetYAxisCharacteristics(); // xuaxis_ = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); xlaxis_ = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); yuaxis_ = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsWorld(); ylaxis_ = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsWorld(); xmin_ = static_cast(xAxisC->Get(wxT("MIN")))->Get(); xmax_ = static_cast(xAxisC->Get(wxT("MAX")))->Get(); ymin_ = static_cast(yAxisC->Get(wxT("MIN")))->Get(); ymax_ = static_cast(yAxisC->Get(wxT("MAX")))->Get(); } void GRA_cartesianCurve::DeleteStuff() { while( !plotsymbols_.empty() ) { delete plotsymbols_.back(); plotsymbols_.pop_back(); } while( !errorBars_.empty() ) { delete errorBars_.back(); errorBars_.pop_back(); } } void GRA_cartesianCurve::CopyStuff( GRA_cartesianCurve const &rhs ) { histogramType_ = rhs.histogramType_; lineType_ = rhs.lineType_; lineWidth_ = rhs.lineWidth_; smooth_ = rhs.smooth_; color_ = rhs.color_; areaFillColor_ = rhs.areaFillColor_; areaFillColors_.assign( rhs.areaFillColors_.begin(), rhs.areaFillColors_.end() ); // xlaxis_ = rhs.xlaxis_; ylaxis_ = rhs.ylaxis_; xuaxis_ = rhs.xuaxis_; yuaxis_ = rhs.yuaxis_; xmin_ = rhs.xmin_; ymin_ = rhs.ymin_; xmax_ = rhs.xmax_; ymax_ = rhs.ymax_; xData_.assign( rhs.xData_.begin(), rhs.xData_.end() ); yData_.assign( rhs.yData_.begin(), rhs.yData_.end() ); xE1_.assign( rhs.xE1_.begin(), rhs.xE1_.end() ); xE2_.assign( rhs.xE2_.begin(), rhs.xE2_.end() ); yE1_.assign( rhs.yE1_.begin(), rhs.yE1_.end() ); yE2_.assign( rhs.yE2_.begin(), rhs.yE2_.end() ); xCurve_.assign( rhs.xCurve_.begin(), rhs.xCurve_.end() ); yCurve_.assign( rhs.yCurve_.begin(), rhs.yCurve_.end() ); pen_.assign( rhs.pen_.begin(), rhs.pen_.end() ); DeleteStuff(); std::vector::const_iterator sEnd = rhs.plotsymbols_.end(); for( std::vector::const_iterator i=rhs.plotsymbols_.begin(); i!=sEnd; ++i ) plotsymbols_.push_back( new GRA_plotSymbol(**i) ); std::vector::const_iterator eEnd = rhs.errorBars_.end(); for( std::vector::const_iterator i=rhs.errorBars_.begin(); i!=eEnd; ++i ) errorBars_.push_back( new GRA_errorBar(**i) ); // popup_ = rhs.popup_; } void GRA_cartesianCurve::Make() { switch ( histogramType_ ) { case 1: MakeHorizontalHistogramNoTails(); // profile parallel to x-axis break; case 2: MakeHorizontalHistogramWithTails(); // profile parallel to x-axis break; case 3: MakeVerticalHistogramNoTails(); // profile parallel to y-axis break; case 4: MakeVerticalHistogramWithTails(); // profile parallel to y-axis break; default: MakeNonHistogram(); } MakeErrorBars(); } void GRA_cartesianCurve::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { ExGlobals::SetClippingBoundary( xlaxis_, ylaxis_, xuaxis_, yuaxis_ ); switch ( histogramType_ ) { case 1: case 3: DrawHistogramNoTails( graphicsOutput, dc ); break; case 2: case 4: DrawHistogramWithTails( graphicsOutput, dc ); break; default: DrawNonHistogram( graphicsOutput, dc ); } DrawErrorBars( graphicsOutput, dc ); ExGlobals::ResetClippingBoundary(); } bool GRA_cartesianCurve::Inside( double x, double y ) { double const eps = 0.05; std::vector xp(4,0.0), yp(4,0.0); if( histogramType_ == 0 ) { int size = xCurve_.size(); for( int i=1; i= size )break; xp[0] = xCurve_[i+1]; yp[0] = yCurve_[i+1] - eps; xp[1] = xCurve_[i+1]; yp[1] = yCurve_[i+1] + eps; xp[2] = xCurve_[i+2]; yp[2] = yCurve_[i+2] + eps; xp[3] = xCurve_[i+2]; yp[3] = yCurve_[i+2] - eps; if( UsefulFunctions::InsidePolygon(x,y,xp,yp) )return true; } return false; } else if( histogramType_ == 2 ) { int size = xCurve_.size(); for( int i=0; i= size )break; xp[0] = xCurve_[i+1]; yp[0] = yCurve_[i+1] - eps; xp[1] = xCurve_[i+1]; yp[1] = yCurve_[i+1] + eps; xp[2] = xCurve_[i+2]; yp[2] = yCurve_[i+2] + eps; xp[3] = xCurve_[i+2]; yp[3] = yCurve_[i+2] - eps; if( UsefulFunctions::InsidePolygon(x,y,xp,yp) )return true; if( i+3 >= size )break; xp[0] = xCurve_[i+2] - eps; yp[0] = yCurve_[i+2]; xp[1] = xCurve_[i+2] + eps; yp[1] = yCurve_[i+2]; xp[2] = xCurve_[i+3] + eps; yp[2] = yCurve_[i+3]; xp[3] = xCurve_[i+3] - eps; yp[3] = yCurve_[i+3]; if( UsefulFunctions::InsidePolygon(x,y,xp,yp) )return true; } return false; } else return false; } void GRA_cartesianCurve::MakeNonHistogram() { GRA_window *gw = ExGlobals::GetGraphWindow(); int const xlog = static_cast( static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LOGBASE")))->Get()); int const ylog = static_cast( static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LOGBASE")))->Get()); std::vector x, y; if( smooth_ ) { std::size_t const nsmooth = 100; x.resize( nsmooth ); y.resize( nsmooth ); pen_.assign( nsmooth, 2 ); pen_[0] = 3; UsefulFunctions::Splinterp( xData_, yData_, x, y ); for( int i=0; i1 && y[i]<=0.0 )y[i] = std::numeric_limits::min(); if( xlog>1 && x[i]<=0.0 )x[i] = std::numeric_limits::min(); } } else { x.assign( xData_.begin(), xData_.end() ); y.assign( yData_.begin(), yData_.end() ); std::size_t size = xData_.size(); pen_.assign( size, 3 ); for( std::size_t i=0; i1 && y[i]<=0.0 )y[i] = std::numeric_limits::min(); if( xlog>1 && x[i]<=0.0 )x[i] = std::numeric_limits::min(); if( plotsymbols_[i]->GetConnectToPrevious() )pen_[i] = 2; } pen_[0] = 3; } gw->GraphToWorld( x, y, xCurve_, yCurve_ ); } void GRA_cartesianCurve::MakeHorizontalHistogramNoTails() { GRA_window *gw = ExGlobals::GetGraphWindow(); // std::vector x, y; std::size_t const npt = xData_.size(); if( npt == 1 ) { x.push_back( xData_[0] ); y.push_back( 0.0 ); x.push_back( xData_[0] ); y.push_back( yData_[0] ); } else { double dx = 0.5*fabs(xData_[1]-xData_[0]); x.push_back( xData_[0]-dx ); y.push_back( 0.0 ); // x.push_back( xData_[0]-dx ); y.push_back( yData_[0] ); // x.push_back( xData_[0]+dx ); y.push_back( yData_[0] ); // double const eps = 0.01; for( std::size_t i=1; iGraphToWorld( x, y, xCurve_, yCurve_ ); } void GRA_cartesianCurve::MakeHorizontalHistogramWithTails() { GRA_window *gw = ExGlobals::GetGraphWindow(); // std::vector x, y; std::size_t npt = xData_.size(); if( npt == 1 ) { x.push_back( xData_[0] ); y.push_back( 0.0 ); // x.push_back( xData_[0] ); y.push_back( yData_[0] ); } else { double dx = 0.5*fabs(xData_[1]-xData_[0]); x.push_back( xData_[0]-dx ); y.push_back( 0.0 ); // x.push_back( xData_[0]-dx ); y.push_back( yData_[0] ); // x.push_back( xData_[0]+dx ); y.push_back( yData_[0] ); // x.push_back( xData_[0]+dx ); y.push_back( 0.0 ); // for( std::size_t i=1; iGraphToWorld( x, y, xCurve_, yCurve_ ); } void GRA_cartesianCurve::MakeVerticalHistogramNoTails() { GRA_window *gw = ExGlobals::GetGraphWindow(); // std::vector x, y; std::size_t npt = xData_.size(); if( npt == 1 ) { x.push_back( 0.0 ); y.push_back( yData_[0] ); x.push_back( xData_[0] ); y.push_back( yData_[0] ); } else { double dy = 0.5*fabs(yData_[1]-yData_[0]); x.push_back( 0.0 ); y.push_back( yData_[0]-dy ); // x.push_back( xData_[0] ); y.push_back( yData_[0]-dy ); // x.push_back( xData_[0] ); y.push_back( yData_[0]+dy ); // double const eps = 0.01; for( std::size_t i=1; iGraphToWorld( x, y, xCurve_, yCurve_ ); } void GRA_cartesianCurve::MakeVerticalHistogramWithTails() { GRA_window *gw = ExGlobals::GetGraphWindow(); // std::vector x, y; std::size_t npt = xData_.size(); if( npt == 1 ) { x.push_back( 0.0 ); y.push_back( yData_[0] ); x.push_back( xData_[0] ); y.push_back( yData_[0] ); } else { double dy = 0.5*fabs(yData_[1]-yData_[0]); x.push_back( 0.0 ); y.push_back( yData_[0]-dy ); // x.push_back( xData_[0] ); y.push_back( yData_[0]-dy ); // x.push_back( xData_[0] ); y.push_back( yData_[0]+dy ); // x.push_back( 0.0 ); y.push_back( yData_[0]+dy ); // for( std::size_t i=1; iGraphToWorld( x, y, xCurve_, yCurve_ ); } void GRA_cartesianCurve::DrawNonHistogram( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { if( !areaFillColors_.empty() ) { areaFillColor_ = areaFillColors_[0]; std::vector().swap( areaFillColors_ ); } if( areaFillColor_ ) { // draw the filled region // make sure polygon is closed, may have to add last point set to first point // bool test = false; if( xCurve_.front()!=xCurve_.back() || yCurve_.front()!=yCurve_.back() ) { test = true; xCurve_.push_back( xCurve_.front() ); yCurve_.push_back( yCurve_.front() ); } GRA_polygon p( xCurve_, yCurve_, color_, areaFillColor_, lineWidth_ ); p.Draw( graphicsOutput, dc ); if( test ) { xCurve_.erase( xCurve_.end()-1 ); yCurve_.erase( yCurve_.end()-1 ); } } // draw the data curve itself (which may be smoothed curve) // int lineTypeSave = graphicsOutput->GetLineType(); graphicsOutput->SetLineType( lineType_ ); wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); std::size_t size = xCurve_.size(); for( std::size_t i=0; iContinueLine( xCurve_[i], yCurve_[i], dc ) : graphicsOutput->StartLine( xCurve_[i], yCurve_[i] ); } // // draw the plot symbols at the data coordinates // double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); for( std::size_t i=0; iSetLocation( xCurve_[i], yCurve_[i] ); plotsymbols_[i]->Draw( graphicsOutput, dc ); } } graphicsOutput->SetLineType( lineTypeSave ); } void GRA_cartesianCurve::DrawHistogramNoTails( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { if( !areaFillColors_.empty() ) { areaFillColor_ = areaFillColors_[0]; std::vector().swap( areaFillColors_ ); } if( areaFillColor_ && xCurve_.size()>1 ) { // draw the filled region // make sure polygon is closed, add last point set to first point // xCurve_.push_back( xCurve_.front() ); yCurve_.push_back( yCurve_.front() ); GRA_polygon p( xCurve_, yCurve_, color_, areaFillColor_, lineWidth_ ); p.Draw( graphicsOutput, dc ); xCurve_.erase( xCurve_.end()-1 ); yCurve_.erase( yCurve_.end()-1 ); } wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); std::size_t size = xCurve_.size(); graphicsOutput->PenUp( xCurve_[0], yCurve_[0] ); for( std::size_t i=1; iPenDown( xCurve_[i], yCurve_[i], dc ); } void GRA_cartesianCurve::DrawHistogramWithTails( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { std::size_t npt = xData_.size(); if( npt > 1 ) { std::vector xp, yp; bool areaFillColorVector = !areaFillColors_.empty(); for( std::size_t i=0; i().swap( xp ); std::vector().swap( yp ); } } } wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); if( npt == 1 ) { graphicsOutput->PenUp( xCurve_[0], yCurve_[0] ); graphicsOutput->PenDown( xCurve_[1], yCurve_[1], dc ); } else { for( std::size_t i=0; iPenUp( xCurve_[j], yCurve_[j] ); graphicsOutput->PenDown( xCurve_[j+1], yCurve_[j+1], dc ); graphicsOutput->PenDown( xCurve_[j+2], yCurve_[j+2], dc ); graphicsOutput->PenDown( xCurve_[j+3], yCurve_[j+3], dc ); graphicsOutput->PenDown( xCurve_[j], yCurve_[j], dc ); } } } void GRA_cartesianCurve::MakeErrorBars() { while( !errorBars_.empty() ) { delete errorBars_.back(); errorBars_.pop_back(); } if( xE1_.empty() && yE1_.empty() )return; // GRA_window *gw = ExGlobals::GetGraphWindow(); double xl=0.0, yl=0.0, xu=0.0, yu=0.0; int npt = xData_.size(); for( int i=0; i xLoc, yLoc; std::vector pen; // if( !xE1_.empty() ) { if( xmax_ > xmin_ ) { xl = xData_[i] - xE1_[i]; xu = xData_[i] + xE2_[i]; } else { xl = xData_[i] + xE1_[i]; xu = xData_[i] - xE2_[i]; } } if( !yE1_.empty() ) { if( ymax_ > ymin_ ) { yl = yData_[i] - yE1_[i]; yu = yData_[i] + yE2_[i]; } else { yl = yData_[i] + yE1_[i]; yu = yData_[i] - yE2_[i]; } } double footSize = 0.0; if( (histogramType_==0) && plotsymbols_[i] )footSize = plotsymbols_[i]->GetSize()*0.5; // double x, y, xLeft, xRight, yLower, yUpper; double xc, yc; gw->GraphToWorld( xData_[i], yData_[i], xc, yc ); GRA_color *color = plotsymbols_[i]->GetColor(); if( !xE1_.empty() ) { gw->GraphToWorld( xl, yData_[i], xLeft, y ); gw->GraphToWorld( xu, yData_[i], xRight, y ); errorBars_.push_back( new GRA_errorBar(xc,yc,xc-xLeft,xRight-xc,false,footSize,color,lineWidth_) ); } if( !yE1_.empty() ) { gw->GraphToWorld( xData_[i], yl, x, yLower ); gw->GraphToWorld( xData_[i], yu, x, yUpper ); errorBars_.push_back( new GRA_errorBar(xc,yc,yc-yLower,yUpper-yc,true,footSize,color,lineWidth_) ); } } } void GRA_cartesianCurve::DrawErrorBars( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { if( errorBars_.empty() )return; // std::vector::const_iterator end = errorBars_.end(); for( std::vector::const_iterator i=errorBars_.begin(); i!=end; ++i ) (*i)->Draw( graphicsOutput, dc ); } std::ostream &operator<<( std::ostream &out, GRA_cartesianCurve const &cc ) { out << "\n"; std::size_t size = cc.areaFillColors_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.xData_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.xE1_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.xE2_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.yE1_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.yE2_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.xCurve_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.pen_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.plotsymbols_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.errorBars_.size(); out << ""; for( std::size_t i=0; i\n\n"; } void GRA_cartesianCurve::SetValues( int histype, int linetype, int linewidth, GRA_color* linecolor, GRA_color *areafillcolor, double xlaxis, double ylaxis, double xuaxis, double yuaxis, double xmin, double ymin, double xmax, double ymax, std::vector &areaFillColors, std::vector &xcurve, std::vector &ycurve, std::vector &pen, std::vector &symbols, std::vector &errorbars ) { histogramType_ = histype; lineType_ = linetype; lineWidth_ = linewidth; color_ = linecolor; areaFillColor_ = areafillcolor; xlaxis_ = xlaxis; ylaxis_ = ylaxis; xuaxis_ = xuaxis; yuaxis_ = yuaxis; xmin_ = xmin; ymin_ = ymin; xmax_ = xmax; ymax_ = ymax; areaFillColors_.assign( areaFillColors.begin(), areaFillColors.end() ); xCurve_.assign( xcurve.begin(), xcurve.end() ); yCurve_.assign( ycurve.begin(), ycurve.end() ); pen_.assign( pen.begin(), pen.end() ); plotsymbols_.assign( symbols.begin(), symbols.end() ); errorBars_.assign( errorbars.begin(), errorbars.end() ); } void GRA_cartesianCurve::GetXYMinMax( double &xmin, double &xmax, double &ymin, double &ymax ) { std::size_t num = xData_.size(); xmin = std::numeric_limits::max(); xmax = -xmin; ymin = xmin; ymax = xmax; if( !yE1_.empty() ) { if( !yE2_.empty() ) { for( std::size_t i=0; i yData_[i]-yE1_[i] )ymin = yData_[i]-yE1_[i]; } } else { for( std::size_t i=0; i yData_[i]-yE1_[i] )ymin = yData_[i]-yE1_[i]; } } } else { for( std::size_t i=0; i yData_[i] )ymin = yData_[i]; } } if( !xE1_.empty() ) { if( !xE2_.empty() ) { for( std::size_t i=0; i xData_[i]-xE1_[i] )xmin = xData_[i]-xE1_[i]; } } else { for( std::size_t i=0; i xData_[i]-xE1_[i] )xmin = xData_[i]-xE1_[i]; } } } else { for( std::size_t i=0; i xData_[i] )xmin = xData_[i]; } } } void GRA_cartesianCurve::GetYMinMax( double const xmin, double const xmax, double &ymin, double &ymax ) { std::size_t num = xData_.size(); ymin = std::numeric_limits::max(); ymax = -ymin; bool flag = true; for( std::size_t j=0; jxData_[j] || xData_[j]>xmax )continue; if( flag ) { ymin = yData_[j]; ymax = yData_[j]; flag = false; if( !yE1_.empty() ) { if( !yE2_.empty() ) { ymax += yE2_[j]; ymin -= yE1_[j]; } else { ymax += yE1_[j]; ymin -= yE1_[j]; } } } else { if( !yE1_.empty() ) { if( !yE2_.empty() ) { if( ymax < yData_[j]+yE2_[j] )ymax = yData_[j]+yE2_[j]; if( ymin > yData_[j]-yE1_[j] )ymin = yData_[j]-yE1_[j]; } else { if( ymax < yData_[j]+yE1_[j] )ymax = yData_[j]+yE1_[j]; if( ymin > yData_[j]-yE1_[j] )ymin = yData_[j]-yE1_[j]; } } else { if( ymin > yData_[j] )ymin = yData_[j]; if( ymax < yData_[j] )ymax = yData_[j]; } } } } void GRA_cartesianCurve::GetXMinMax( double const ymin, double const ymax, double &xmin, double &xmax ) { std::size_t num = xData_.size(); xmin = std::numeric_limits::max(); xmax = -xmin; bool flag = true; for( std::size_t j=0; jyData_[j] || yData_[j]>ymax )continue; if( flag ) { xmin = xData_[j]; xmax = xData_[j]; flag = false; if( !xE1_.empty() ) { if( !xE2_.empty() ) { xmax += xE2_[j]; xmin -= xE1_[j]; } else { xmax += xE1_[j]; xmin -= xE1_[j]; } } } else { if( !xE1_.empty() ) { if( !xE2_.empty() ) { if( xmax < xData_[j]+xE2_[j] )xmax = xData_[j]+xE2_[j]; if( xmin > xData_[j]-xE1_[j] )xmin = xData_[j]-xE1_[j]; } else { if( xmax < xData_[j]+xE1_[j] )xmax = xData_[j]+xE1_[j]; if( xmin > xData_[j]-xE1_[j] )xmin = xData_[j]-xE1_[j]; } } else { if( xmin > xData_[j] )xmin = xData_[j]; if( xmax < xData_[j] )xmax = xData_[j]; } } } } int GRA_cartesianCurve::GetPlotsymbolCode() const { return plotsymbols_[0]->GetShapeCode(); } void GRA_cartesianCurve::SetPlotsymbolCode( int ps ) { int size = plotsymbols_.size(); for( int i=0; iSetShapeCode( ps ); } GRA_color *GRA_cartesianCurve::GetPlotsymbolColor() const { return plotsymbols_[0]->GetColor(); } void GRA_cartesianCurve::SetPlotsymbolColor( GRA_color *c ) { int size = plotsymbols_.size(); for( int i=0; iSetColor( c ); } double GRA_cartesianCurve::GetPlotsymbolSize() const { return plotsymbols_[0]->GetSize(); } void GRA_cartesianCurve::SetPlotsymbolSize( double s ) { int size = plotsymbols_.size(); for( int i=0; iSetSize( s ); } double GRA_cartesianCurve::GetPlotsymbolAngle() const { return plotsymbols_[0]->GetAngle(); } void GRA_cartesianCurve::SetPlotsymbolAngle( double a ) { int size = plotsymbols_.size(); for( int i=0; iSetAngle( a ); } GRA_color *GRA_cartesianCurve::GetAreaFillColor() { GRA_colorCharacteristic *areaFillColorCharacteristic = static_cast(ExGlobals::GetGraphWindow()->GetGeneralCharacteristics()-> Get(wxT("AREAFILLCOLOR"))); if( areaFillColorCharacteristic->IsVector() )return areaFillColors_[0]; else return areaFillColor_; } // end of file extrema-4.4.5/src/Graphics/GRA_plus.h0000644012702201742730000000205611274636605016400 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_PLUS #define GRA_PLUS #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_plus : public GRA_multiLineFigure { public: GRA_plus( double, double, double, double, GRA_color * =0, int =1 ); virtual ~GRA_plus(); friend std::ostream &operator<<( std::ostream &, GRA_plus const & ); }; #endif extrema-4.4.5/src/Graphics/Makefile.am0000644012702201742730000000572511423457637016617 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libgraphics.la libgraphics_la_SOURCES = \ GRA_angleCharacteristic.cpp GRA_angleCharacteristic.h \ GRA_arrow1.cpp GRA_arrow1.h \ GRA_arrow2.cpp GRA_arrow2.h \ GRA_arrow3.cpp GRA_arrow3.h \ GRA_asterisk.cpp GRA_asterisk.h \ GRA_axis.cpp GRA_axis.h \ GRA_bitmap.cpp GRA_bitmap.h \ GRA_boolCharacteristic.cpp GRA_boolCharacteristic.h \ GRA_boxPlot.cpp GRA_boxPlot.h \ GRA_cartesianAxes.cpp GRA_cartesianAxes.h \ GRA_cartesianCurve.cpp GRA_cartesianCurve.h \ GRA_colorCharacteristic.cpp GRA_colorCharacteristic.h \ GRA_colorControl.cpp GRA_colorControl.h \ GRA_color.cpp GRA_color.h \ GRA_colorMap.cpp GRA_colorMap.h \ GRA_contourLine.cpp GRA_contourLine.h \ GRA_cross.cpp GRA_cross.h \ GRA_crossPlus.cpp GRA_crossPlus.h \ GRA_densityPlot.cpp GRA_densityPlot.h \ GRA_diamond.cpp GRA_diamond.h \ GRA_diamondPlus.cpp GRA_diamondPlus.h \ GRA_diffusionPlot.cpp GRA_diffusionPlot.h \ GRA_distanceCharacteristic.cpp GRA_distanceCharacteristic.h \ GRA_ditheringPlot.cpp GRA_ditheringPlot.h \ GRA_doubleCharacteristic.cpp GRA_doubleCharacteristic.h \ GRA_drawableObject.cpp GRA_drawableObject.h \ GRA_drawableText.cpp GRA_drawableText.h \ GRA_ellipse.cpp GRA_ellipse.h \ GRA_errorBar.cpp GRA_errorBar.h \ GRA_fontCharacteristic.cpp GRA_fontCharacteristic.h \ GRA_fontControl.cpp GRA_fontControl.h \ GRA_font.cpp GRA_font.h \ GRA_gradientPlot.cpp GRA_gradientPlot.h \ GRA_intCharacteristic.cpp GRA_intCharacteristic.h \ GRA_legend.cpp GRA_legend.h \ GRA_multiLineFigure.cpp GRA_multiLineFigure.h \ GRA_plotSymbol.cpp GRA_plotSymbol.h \ GRA_plus.cpp GRA_plus.h \ GRA_point.cpp GRA_point.h \ GRA_polarAxes.cpp GRA_polarAxes.h \ GRA_polarCurve.cpp GRA_polarCurve.h \ GRA_polygon.cpp GRA_polygon.h \ GRA_polyline.cpp GRA_polyline.h \ GRA_postscript.cpp GRA_postscript.h \ GRA_rectangle.cpp GRA_rectangle.h \ GRA_setOfCharacteristics.cpp GRA_setOfCharacteristics.h \ GRA_simpleText.cpp GRA_simpleText.h \ GRA_sizeCharacteristic.cpp GRA_sizeCharacteristic.h \ GRA_star5pt.cpp GRA_star5pt.h \ GRA_stringCharacteristic.cpp GRA_stringCharacteristic.h \ GRA_thiessenTriangulation.cpp GRA_thiessenTriangulation.h \ GRA_threeDPlot.cpp GRA_threeDPlot.h \ GRA_triangle.cpp GRA_triangle.h \ GRA_window.cpp GRA_window.h \ GRA_wxWidgets.cpp GRA_wxWidgets.h \ GRA_characteristic.h EGraphicsError.h GRA_shape.h extrema-4.4.5/src/Graphics/GRA_cross.h0000644012702201742730000000206411274636605016545 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_CROSS #define GRA_CROSS #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_cross : public GRA_multiLineFigure { public: GRA_cross( double, double, double, double, GRA_color * =0, int =1 ); virtual ~GRA_cross(); friend std::ostream &operator<<( std::ostream &, GRA_cross const & ); }; #endif extrema-4.4.5/src/Graphics/GRA_asterisk.h0000644012702201742730000000205511274636605017241 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_ASTERISK #define GRA_ASTERISK #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_asterisk : public GRA_multiLineFigure { public: GRA_asterisk( double, double, double, double, GRA_color * =0, int =1 ); friend std::ostream &operator<<( std::ostream &, GRA_asterisk const & ); }; #endif extrema-4.4.5/src/Graphics/GRA_point.h0000644012702201742730000000335711274636605016553 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_POINT #define GRA_POINT #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_wxWidgets; class GRA_color; class GRA_point : public GRA_drawableObject { public: GRA_point( double x, double y, GRA_color *color ) : GRA_drawableObject(wxT("POINT")), x_(x), y_(y), color_(color) {} ~GRA_point() {} GRA_point( GRA_point const &rhs ) : GRA_drawableObject(rhs) { CopyStuff( rhs ); } GRA_point &operator=( GRA_point const &rhs ) { if( this != &rhs ) { type_ = rhs.type_; CopyStuff( rhs ); } return *this; } void GetXY( double &x, double &y ) const { x=x_; y=y_; } GRA_color *GetColor() const { return color_; } void GetLimits( double &xll, double &yll, double &xur, double &yur ) const { xll=x_; yll=y_; xur=x_; yur=y_; } void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_point const & ); private: void CopyStuff( GRA_point const & ); // double x_, y_; GRA_color *color_; }; #endif extrema-4.4.5/src/Graphics/GRA_colorControl.h0000644012702201742730000000400211274636605020065 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_COLORCONTROL #define GRA_COLORCONTROL #include #include "wx/wx.h" class GRA_color; class GRA_colorMap; namespace GRA_colorControl { extern GRA_colorMap *current_; extern GRA_colorMap *userdefined_; extern GRA_colorMap *thermal_, *gray256_, *gray16_, *rainbow_, *redblue16_; extern GRA_colorMap *classic8_, *topo256_, *default_; extern std::vector namedColors_; void Initialize(); void CreateThermalColorMap(); void CreateGray256ColorMap(); void CreateGray16ColorMap(); void CreateRainbowColorMap(); void CreateRedBlue16ColorMap(); void CreateClassic8ColorMap(); void CreateTopo256ColorMap(); void CreateDefaultColorMap(); void DeleteStuff(); wxString GetColorMapName(); GRA_colorMap *GetColorMap(); GRA_colorMap *GetColorMap( wxString const & ); void SetFile( wxString const & ); void SetColorMap( wxString const & ); void SetColorMapUser( GRA_colorMap * ); void SetColorMap( GRA_colorMap * ); int GetNumberOfNamedColors(); int GetColorCode( wxString const & ); int GetColorCode( GRA_color * ); int GetColorCode( int, int, int ); GRA_color *GetColor( wxString const & ); GRA_color *GetColor( int ); int GetColorMapSize(); void ColorCodeToRGB( int, int &, int &, int & ); void CreateNamedColors(); }; #endif extrema-4.4.5/src/Graphics/GRA_densityPlot.h0000644012702201742730000001056711274636605017741 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DENSITYPLOT #define GRA_DENSITYPLOT #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_color; class GRA_window; class GRA_wxWidgets; class GRA_cartesianAxes; class GRA_densityPlot : public GRA_drawableObject { protected: enum DensityType { UNKNOWN, BOX, DIFFUSION, DITHERING, GRADIENT }; public: GRA_densityPlot() : GRA_drawableObject(wxT("UNKNOWN")) { densityType_ = UNKNOWN; } GRA_densityPlot( wxChar const *, std::vector &, std::vector &, std::vector &, int =0, double =0.0, double =0.0, double =0.0, double =0.0, bool =false, bool =false, bool =false, bool =false, bool =true, bool =true, bool =false ); virtual ~GRA_densityPlot() {} GRA_densityPlot( GRA_densityPlot const &rhs ) { CopyStuff(rhs); } GRA_densityPlot &operator=( GRA_densityPlot const &rhs ) { if( &rhs != this )CopyStuff(rhs); return *this; } void GetLimits( double &xlo, double &ylo, double &xhi, double &yhi ) const { xlo=xlo_; ylo=ylo_; xhi=xhi_; yhi=yhi_; } bool IsaUnknown() const { return (densityType_==UNKNOWN); } bool IsaBoxPlot() const { return (densityType_==BOX); } bool IsaDiffusionPlot() const { return (densityType_==DIFFUSION); } bool IsaDitheringPlot() const { return (densityType_==DITHERING); } bool IsaGradientPlot() const { return (densityType_==GRADIENT); } void DrawAxes( GRA_wxWidgets *, wxDC &, GRA_cartesianAxes *& ); void DrawAxes2( GRA_wxWidgets *, wxDC &, GRA_cartesianAxes * ); bool GetDrawAxes() const { return drawAxes_; } void GetDataLimits( double &xmin, double &ymin, double &xmax, double &ymax ) { xmin = dataXmin_; ymin = dataYmin_; xmax = dataXmax_; ymax = dataYmax_; } std::size_t GetNRow() const { return nrow_; } void GetMNLimits( int &mlo, int &nlo, int &mhi, int &nhi ) const { mlo = mlo_; nlo = nlo_; mhi = mhi_; nhi = nhi_; } void GetXYZ( std::vector &x, std::vector &y, std::vector &z ) const { x = x_; y = y_; z = z_; } void GetFminmax( double &fmin, double &fmax ) const { fmin = fmin_; fmax = fmax_; } bool GetBorder() const { return border_; } void GetUpperAxis( double &xuaxisp, double &yuaxisp ) const { xuaxisp = xuaxisp_; yuaxisp = yuaxisp_; } void GetProfiles( bool &x, bool &y ) const { x = xProfile_; y = yProfile_; } void GetProfileVecs( std::vector *&xX, std::vector *&xY, std::vector *&yX, std::vector *&yY ) { xX = &xProfileX_; xY = &xProfileY_; yX = &yProfileX_; yY = &yProfileY_; } bool GetResetAxes() const { return resetAxes_; } void GetXYLimits( double &xlo, double &ylo, double &xhi, double &yhi ) const { xlo = xlo_; ylo = ylo_; xhi = xhi_; yhi = yhi_; } void SetAlohi( double alo, double ahi ) { alo_ = alo; ahi_ = ahi; } bool GetLegend() const { return legend_; } void SetUp(); protected: void CopyStuff( GRA_densityPlot const & ); void MakeProfiles( int, int, int, int ); void DrawProfiles( GRA_wxWidgets *, wxDC & ); DensityType densityType_; double dataXmin_, dataXmax_, dataYmin_, dataYmax_; double alo_, ahi_, fmin_, fmax_, gmin_, gmax_; int mlo_, mhi_, nlo_, nhi_; double rmlo_, rmhi_, rnlo_, rnhi_; std::size_t nrow_; std::vector x_, y_, z_, xProfileX_, xProfileY_, yProfileX_, yProfileY_; double xlo_, ylo_, xhi_, yhi_, xuaxisp_, yuaxisp_; bool border_, xProfile_, yProfile_, zoom_, drawAxes_, resetAxes_, legend_; }; #endif extrema-4.4.5/src/Graphics/GRA_simpleText.cpp0000644012702201742730000000461111274636605020105 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_simpleText.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_font.h" #include "GRA_fontControl.h" GRA_simpleText::GRA_simpleText( wxString string, double height, GRA_color *color, wxChar const *fontName, double xShift, double yShift ) : string_(string), height_(height), color_(color), xShift_(xShift), yShift_(yShift), font_( GRA_fontControl::GetFont(fontName) ) {} void GRA_simpleText::CopyStuff( GRA_simpleText const &rhs ) { string_ = rhs.string_; color_ = rhs.color_; height_ = rhs.height_; font_ = rhs.font_; xShift_ = rhs.xShift_; yShift_ = rhs.yShift_; } bool GRA_simpleText::operator==( GRA_simpleText const &rhs ) const { if( string_ != rhs.string_ || height_ != rhs.height_ || color_ != rhs.color_ || font_ != rhs.font_ || xShift_ != rhs.xShift_ || yShift_ != rhs.yShift_ )return false; return true; } void GRA_simpleText::SetBoundary( int x, int y, int width, int height ) { xLo_ = x; yLo_ = y; xHi_ = x+width; yHi_ = y+height; } void GRA_simpleText::GetBoundary( int &xLo, int &yLo, int &xHi, int &yHi ) { xLo = xLo_; yLo = yLo_; xHi = xHi_; yHi = yHi_; } std::ostream &operator<<( std::ostream &out, GRA_simpleText const &st ) { return out << "\n" << "\n" << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_sizeCharacteristic.cpp0000644012702201742730000000575411274636605021603 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_sizeCharacteristic.h" double GRA_sizeCharacteristic::GetAsPercent() const { double result; result = setAsPercent_ ? value_ : value_/(max_-min_)*100.0; return std::min(100.0,std::max(0.0,result)); } std::vector GRA_sizeCharacteristic::GetAsPercents() const { double result; std::vector results; std::vector::const_iterator end = values_.end(); for( std::vector::const_iterator i=values_.begin(); i!=end; ++i ) { result = setAsPercent_ ? (*i) : (*i)/(max_-min_)*100.0; results.push_back(std::min(100.0,std::max(0.0,result))); } return results; } double GRA_sizeCharacteristic::GetAsWorld() const { double result; result = setAsPercent_ ? value_*(max_-min_)/100.0 : value_; return std::min(fabs(max_-min_),std::max(0.0,result)); } std::vector GRA_sizeCharacteristic::GetAsWorlds() const { double result; std::vector results; std::vector::const_iterator end = values_.end(); for( std::vector::const_iterator i=values_.begin(); i!=end; ++i ) { result = setAsPercent_ ? (*i)*(max_-min_)/100.0 : (*i); results.push_back(std::min(fabs(max_-min_),std::max(0.0,result))); } return results; } std::ostream &operator<<( std::ostream &out, GRA_sizeCharacteristic const &c ) { if( c.isAVector_ ) { std::vector values( c.GetAsPercents() ); std::size_t size = values.size(); out << "\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) out << "\n"; } return out; } void GRA_sizeCharacteristic::CopyStuff( GRA_sizeCharacteristic const &rhs ) { name_ = rhs.name_; type_ = rhs.type_; isAVector_ = rhs.isAVector_; min_ = rhs.min_; max_ = rhs.max_; value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); setAsPercent_ = rhs.setAsPercent_; } // end of file extrema-4.4.5/src/Graphics/GRA_drawableObject.cpp0000644012702201742730000000421711322545514020651 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include "wx/wx.h" #include "GRA_drawableObject.h" GRA_drawableObject::GRA_drawableObject( wxChar const *type ) { type_ = UNKNOWN; wxString stype( type ); if( stype == wxT("POINT") ) type_ = POINT; else if( stype == wxT("POLYLINE") ) type_ = POLYLINE; else if( stype == wxT("ELLIPSE") ) type_ = ELLIPSE; else if( stype == wxT("POLYGON") ) type_ = POLYGON; else if( stype == wxT("MULTILINEFIGURE") )type_ = MULTILINEFIGURE; else if( stype == wxT("PLOTSYMBOL") ) type_ = PLOTSYMBOL; else if( stype == wxT("DRAWABLETEXT") ) type_ = DRAWABLETEXT; else if( stype == wxT("AXIS") ) type_ = AXIS; else if( stype == wxT("CARTESIANCURVE") ) type_ = CARTESIANCURVE; else if( stype == wxT("CARTESIANAXES") ) type_ = CARTESIANAXES; else if( stype == wxT("GRAPHLEGEND") ) type_ = GRAPHLEGEND; else if( stype == wxT("CONTOUR") ) type_ = CONTOUR; else if( stype == wxT("BOXPLOT") ) type_ = BOXPLOT; else if( stype == wxT("DIFFUSIONPLOT") ) type_ = DIFFUSIONPLOT; else if( stype == wxT("DITHERINGPLOT") ) type_ = DITHERINGPLOT; else if( stype == wxT("GRADIENTPLOT") ) type_ = GRADIENTPLOT; else if( stype == wxT("THREEDFIGURE") ) type_ = THREEDFIGURE; else if( stype == wxT("POLARAXES") ) type_ = POLARAXES; else if( stype == wxT("POLARCURVE") ) type_ = POLARCURVE; else if( stype == wxT("THREEDPLOT") ) type_ = THREEDPLOT; } // end of file extrema-4.4.5/src/Graphics/GRA_angleCharacteristic.h0000644012702201742730000000461511274636605021357 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_ANGLECHARACTERISTIC #define GRA_ANGLECHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_angleCharacteristic : public GRA_characteristic { public: GRA_angleCharacteristic( wxChar const *name, double angle ) : GRA_characteristic(name,ANGLE,false), default_(angle) { Set(angle); } GRA_angleCharacteristic( wxChar const *name, std::vector const &angles ) : GRA_characteristic(name,ANGLE,true), value_(0.0) { Set(angles); } ~GRA_angleCharacteristic() {} GRA_angleCharacteristic( GRA_angleCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_angleCharacteristic &operator=( GRA_angleCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void Set( double angle ) { value_ = angle - static_cast(angle/360.)*360.; if( value_ < 0.0 )value_ += 360.0; isAVector_ = false; } void Set( std::vector const &angles ) { std::vector().swap( values_ ); // empty the values_ vector std::vector::const_iterator end = angles.end(); for( std::vector::const_iterator i=angles.begin(); i!=end; ++i ) { double angle = (*i) - static_cast((*i)/360.)*360.; if( angle < 0.0 )angle += 360.0; values_.push_back( angle ); } isAVector_ = true; } double Get() const { return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_angleCharacteristic const & ); private: void CopyStuff( GRA_angleCharacteristic const &rhs ); // double default_, value_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_drawableText.cpp0000644012702201742730000005661411331466717020406 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "GRA_drawableText.h" #include "EGraphicsError.h" #include "GRA_distanceCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_window.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_simpleText.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" #include "EVariableError.h" #include "UsefulFunctions.h" #include "TextPopup.h" GRA_drawableText::GRA_drawableText( wxString const &inputString, double height, double angle, double x, double y, int alignment, GRA_font *font, GRA_color *color ) : GRA_drawableObject(wxT("DRAWABLETEXT")), inputString_(inputString), height_(height), angle_(angle), x_(x), y_(y), alignment_(alignment), color_(color), font_(font), graphUnits_(false), subsupFactor_(0.75), popup_(false) {} GRA_drawableText::GRA_drawableText( wxString const &inputString, bool graphUnits ) : GRA_drawableObject(wxT("DRAWABLETEXT")), inputString_(inputString), graphUnits_(graphUnits), subsupFactor_(0.75), popup_(false) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *textCharacteristics = gw->GetTextCharacteristics(); x_ = static_cast(textCharacteristics->Get(wxT("XLOCATION")))->GetAsWorld(); y_ = static_cast(textCharacteristics->Get(wxT("YLOCATION")))->GetAsWorld(); if( graphUnits_ ) { double xg=x_, yg=y_; ExGlobals::GetGraphWindow()->WorldToGraph( xg, yg, x_, y_ ); } angle_ = static_cast(textCharacteristics->Get(wxT("ANGLE")))->Get(); alignment_ = static_cast(textCharacteristics->Get(wxT("ALIGNMENT")))->Get(); font_ = static_cast(textCharacteristics->Get(wxT("FONT")))->Get(); color_ = static_cast(textCharacteristics->Get(wxT("COLOR")))->Get(); height_ = static_cast(textCharacteristics->Get(wxT("HEIGHT")))->GetAsWorld(); } GRA_drawableText::~GRA_drawableText() { DeleteStuff(); if( popup_ )ExGlobals::DisconnectTextPopup(); } void GRA_drawableText::DeleteStuff() { while ( !strings_.empty() ) { delete strings_.back(); strings_.pop_back(); } } void GRA_drawableText::CopyStuff( GRA_drawableText const &rhs ) { x_ = rhs.x_; y_ = rhs.y_; graphUnits_ = rhs.graphUnits_; angle_ = rhs.angle_; alignment_ = rhs.alignment_; height_ = rhs.height_; font_ = rhs.font_; color_ = rhs.color_; inputString_ = rhs.inputString_; textVec().swap( strings_ ); textVecIter end = rhs.strings_.end(); for( textVecIter i=rhs.strings_.begin(); i!=end; ++i ) strings_.push_back( new GRA_simpleText(**i) ); popup_ = rhs.popup_; } bool GRA_drawableText::operator==( GRA_drawableText const &rhs ) const { if( inputString_ != rhs.inputString_ || x_ != rhs.x_ || y_ != rhs.y_ || graphUnits_ != rhs.graphUnits_ || angle_ != rhs.angle_ || height_ != rhs.height_ || alignment_ != rhs.alignment_ || font_ != rhs.font_ || color_ != rhs.color_ )return false; return true; } std::ostream &operator<<( std::ostream &out, GRA_drawableText const &dt ) { return out << "\n" << "\n\n"; } void GRA_drawableText::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { int xminM, yminM, xmaxM, ymaxM; graphicsOutput->GetLimits( xminM, yminM, xmaxM, ymaxM ); double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); double yConvert = (ymaxW-yminW)/(ymaxM-yminM); double xConvert = (xmaxW-xminW)/(xmaxM-xminM); // std::size_t size; double angle, cosx, sinx, xLoc, yLoc; std::vector wv; GetStringStuff( size, angle, cosx, sinx, xLoc, yLoc, wv, xConvert, yConvert, graphicsOutput, dc ); double width = 0.0; int ppi = dc.GetPPI().GetWidth(); for( std::size_t i=0; iGetYShift()*sinx + strings_[i]->GetXShift()*cosx; yLoc += width*sinx + strings_[i]->GetYShift()*cosx + strings_[i]->GetXShift()*sinx; width = wv[i]*xConvert; double height = strings_[i]->GetHeight(); int xo, yo1, yo2; graphicsOutput->WorldToOutputType( 0.0, 0.0, xo, yo1 ); graphicsOutput->WorldToOutputType( 0.0, height, xo, yo2 ); int h = yo1 - yo2; int x, y; graphicsOutput->WorldToOutputType( xLoc, yLoc, x, y ); // wxFont font( strings_[i]->GetFont()->GetwxFont() ); font.SetPointSize( h ); dc.SetFont( font ); dc.SetTextForeground( ExGlobals::GetwxColor(strings_[i]->GetColor()) ); dc.DrawRotatedText( strings_[i]->GetString(), x, y, angle ); // int w, descent, externalLeading; dc.GetTextExtent( strings_[i]->GetString(), &w, &h, &descent, &externalLeading ); strings_[i]->SetBoundary( x, y, w, h ); } } void GRA_drawableText::Erase( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { int xminM, yminM, xmaxM, ymaxM; graphicsOutput->GetLimits( xminM, yminM, xmaxM, ymaxM ); double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); double yConvert = (ymaxW-yminW)/(ymaxM-yminM); double xConvert = (xmaxW-xminW)/(xmaxM-xminM); // std::size_t size; double angle, cosx, sinx, xLoc, yLoc; std::vector wv; GetStringStuff( size, angle, cosx, sinx, xLoc, yLoc, wv, xConvert, yConvert, graphicsOutput, dc ); double width = 0.0; int ppi = dc.GetPPI().GetWidth(); for( std::size_t i=0; iGetYShift()*sinx + strings_[i]->GetXShift()*cosx; yLoc += width*sinx + strings_[i]->GetYShift()*cosx + strings_[i]->GetXShift()*sinx; width = wv[i]*xConvert; double height = strings_[i]->GetHeight(); int xo, yo1, yo2; graphicsOutput->WorldToOutputType( 0.0, 0.0, xo, yo1 ); graphicsOutput->WorldToOutputType( 0.0, height, xo, yo2 ); int h = yo2 - yo1; int x, y; graphicsOutput->WorldToOutputType( xLoc, yLoc, x, y ); // wxFont font( strings_[i]->GetFont()->GetwxFont() ); font.SetPointSize( h ); dc.SetFont( font ); dc.SetTextForeground( dc.GetBackground().GetColour() ); dc.DrawRotatedText( strings_[i]->GetString(), x, y, angle ); } } void GRA_drawableText::GetStringStuff( std::size_t &size, double &angle, double &cosx, double &sinx, double &xLoc, double &yLoc, std::vector &wv, double xConvert, double yConvert, GRA_wxWidgets *graphicsOutput, wxDC &dc ) { int length = 0; int maxHeight = 0; size = strings_.size(); int ppi = dc.GetPPI().GetWidth(); for( std::size_t i=0; iGetHeight(); int xo, yo1, yo2; graphicsOutput->WorldToOutputType( 0.0, 0.0, xo, yo1 ); graphicsOutput->WorldToOutputType( 0.0, height, xo, yo2 ); int h = yo1 - yo2; wxFont font( strings_[i]->GetFont()->GetwxFont() ); //font.SetPointSize( static_cast(height*ppi+0.5) ); font.SetPointSize( h ); dc.SetFont( font ); int w, descent, extLead; dc.GetTextExtent( strings_[i]->GetString(), &w, &h, &descent, &extLead ); wv.push_back( w ); maxHeight = std::max( maxHeight, h ); length += w; } double width = length*xConvert; double height = maxHeight*yConvert; AlignXY( width, height, angle, xLoc, yLoc, sinx, cosx ); } void GRA_drawableText::AlignXY( double width, double height, double &angle, double &xLoc, double &yLoc, double &sinx, double &cosx ) { angle = angle_; xLoc = x_; yLoc = y_; if( graphUnits_ ) { double xg=xLoc, yg=yLoc; ExGlobals::GetGraphWindow()->GraphToWorld( xg, yg, xLoc, yLoc ); } cosx = cos( angle*M_PI/180.0 ); sinx = sin( angle*M_PI/180.0 ); double const eps = 0.0001; if( fabs(cosx) <= eps )cosx = 0.0; if( fabs(sinx) <= eps )sinx = 0.0; if( fabs(cosx-1.0) <= eps )cosx = 1.0; if( fabs(sinx-1.0) <= eps )sinx = 1.0; // switch (alignment_) { case 1: // lower left xLoc -= height*sinx; yLoc += height*cosx; break; case 2: // lower center xLoc -= 0.5*width*cosx + height*sinx; yLoc -= 0.5*width*sinx - height*cosx; break; case 3: // lower right xLoc -= width*cosx + height*sinx; yLoc -= width*sinx - height*cosx; break; case 4: // center left xLoc -= 0.5*height*sinx; yLoc += 0.5*height*cosx; break; case 5: // center center xLoc -= 0.5*width*cosx + 0.5*height*sinx; yLoc -= 0.5*width*sinx - 0.5*height*cosx; break; case 6: // center right xLoc -= width*cosx + 0.5*height*sinx; yLoc -= width*sinx - 0.5*height*cosx; break; case 7: // upper left break; case 8: // upper center xLoc -= 0.5*width*cosx; yLoc -= 0.5*width*sinx; break; case 9: // upper right xLoc -= width*cosx; yLoc -= width*sinx; break; case 10: // lower left at 90deg angle = 90.0; cosx = 0.0; sinx = 1.0; xLoc -= height; break; case 11: // lower left at 270deg angle = 270.0; cosx = 0.0; sinx = -1.0; xLoc += height; break; case 12: // lower center at 90deg angle = 90.0; cosx = 0.0; sinx = 1.0; xLoc -= height; yLoc -= 0.5*width; break; } } void GRA_drawableText::Parse() { textVec().swap( strings_ ); // // multiple adjacent commands can entered as or // double xShift=0.0, yShift=0.0; bool italics = false; bool bold = false; int upCounter = 0; int downCounter = 0; double height = height_; // int const classes[128] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; // // < > , othr int const stateTable[5][4] = { { 1, 0, 0, 0 }, {-1, -2, -3, 2 }, {-1, 3, 4, 2 }, { 1, -2, 0, 0 }, {-1, -2, -3, 2 } }; wxString text, command; int currentState, newState=0; std::size_t length = inputString_.size(); for( std::size_t i=0; i (end of command) case 4: // found , (end of command) { try { DetermineCommand( command, height, xShift, yShift, italics, bold, upCounter, downCounter ); } catch ( std::runtime_error &e ) { throw EGraphicsError( wxString(e.what(),wxConvUTF8) ); } command.erase(); break; } case -1: { wxString s(wxT("invalid < found at location ")); s << i+1 << wxT(" in ") << inputString_; throw EGraphicsError( s ); } case -2: { wxString s(wxT("invalid > found at location ")); s << i+1 << wxT(" in ") << inputString_; throw EGraphicsError( s ); } case -3: { wxString s(wxT("invalid comma found at location ")); s << i+1 << wxT(" in ") << inputString_; throw EGraphicsError( s ); } } } if( !text.empty() ) { GRA_simpleText *tmp = new GRA_simpleText(text,height,color_,font_,xShift,yShift); strings_.push_back( tmp ); } } void GRA_drawableText::DetermineCommand( wxString &command, double &height, double &xShift, double &yShift, bool &italics, bool &bold, int &upCounter, int &downCounter ) { wxString fontName; wxChar c = Special( command, fontName ); if( c ) { GRA_simpleText *tmp = new GRA_simpleText(c,height,color_,fontName.c_str(),xShift,yShift); strings_.push_back( tmp ); xShift = 0.0; yShift = 0.0; return; } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *general = gw->GetGeneralCharacteristics(); double const xlowerw = static_cast(general->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double const xupperw = static_cast(general->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double const ylowerw = static_cast(general->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double const yupperw = static_cast(general->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); double const dx = xupperw-xlowerw; double const dy = yupperw-ylowerw; // std::size_t len = command.size(); command.UpperCase(); // convert to upper case // if( command[0] == wxT('F') ) // set the font { font_ = GRA_fontControl::GetFont( command.substr(1,len-1) ); } else if( command[0] == wxT('H') ) // set the height { bool percent = (command[len-1]==wxT('%')); std::size_t end = percent ? len-2 : len-1; wxString s( command.substr(1,end) ); if( !s.ToDouble(&height) )throw std::runtime_error( "invalid value for height" ); if( percent )height = std::min( dy, std::max(0.0,height*dy/100.) ); } else if( command[0] == wxT('Z') ) // include a horizontal space { bool percent = (command[len-1]==wxT('%')); std::size_t end = percent ? len-2 : len-1; wxString s( command.substr(1,end) ); if( !s.ToDouble(&xShift) )throw std::runtime_error( "invalid value for horizontal space" ); if( percent )xShift *= dx/100.; } else if( command[0] == wxT('V') ) // include a vertical space { bool percent = (command[len-1]==wxT('%')); std::size_t end = percent ? len-2 : len-1; wxString s( command.substr(1,end) ); if( !s.ToDouble(&yShift) )throw std::runtime_error( "invalid value for vertical space" ); if( percent )yShift *= dy/100.; } else if( command[0] == wxT('^') ) // super-script flag { if( downCounter > 0 ) { --downCounter; height /= subsupFactor_; yShift += 0.6*height; } else { ++upCounter; yShift += 0.6*height; height *= subsupFactor_; } } else if( command[0] == wxT('_') ) // sub-script flag { if( upCounter > 0 ) { --upCounter; height /= subsupFactor_; yShift -= 0.6*height; } else { ++downCounter; yShift -= 0.6*height; height *= subsupFactor_; } } else if( command[0] == wxT('C') ) // colour { long int tmp; wxString s( command.substr(1,len-1) ); s.ToLong( &tmp ); GRA_color *c = GRA_colorControl::GetColor( static_cast(tmp) ); if( !c )throw std::runtime_error( "invalid color" ); color_ = c; } else { wxString s( wxT("invalid text formatting command: ") ); s += command; throw std::runtime_error( std::string(s.mb_str(wxConvUTF8)) ); } } wxChar GRA_drawableText::Special( wxString const &command, wxString &fontName ) { wxString s( command.Upper() ); // bool upperCase = (const_cast(command)[0]==s[0]); // struct specialCharacter { wxChar const *name; // special character name wxChar const uName; // upper case character wxChar const lName; // lower case character wxChar const *fName; // font name }; std::size_t const nNames = 93; specialCharacter spc[] = { {wxT("ALPHA"),0x41,0x61,wxT("Symbol")}, {wxT("BETA"),0x42,0x62,wxT("Symbol")}, {wxT("GAMMA"),0x47,0x67,wxT("Symbol")}, {wxT("DELTA"),0x44,0x64,wxT("Symbol")}, {wxT("EPSILON"),0x45,0x152,wxT("Symbol")}, {wxT("ZETA"),0x5a,0x7a,wxT("Symbol")}, {wxT("ETA"),0x48,0x68,wxT("Symbol")}, {wxT("THETA"),0x51,0x71,wxT("Symbol")}, {wxT("IOTA"),0x49,0x69,wxT("Symbol")}, {wxT("KAPPA"),0x4b,0x6b,wxT("Symbol")}, {wxT("LAMBDA"),0x4c,0x6c,wxT("Symbol")}, {wxT("MU"),0x4d,0x6d,wxT("Symbol")}, {wxT("NU"),0x4e,0x6e,wxT("Symbol")}, {wxT("XI"),0x58,0x78,wxT("Symbol")}, {wxT("OMICRON"),0x4f,0x6f,wxT("Symbol")}, {wxT("PI"),0x50,0x70,wxT("Symbol")}, {wxT("RHO"),0x52,0x72,wxT("Symbol")}, {wxT("SIGMA"),0x53,0x73,wxT("Symbol")}, {wxT("TAU"),0x54,0x74,wxT("Symbol")}, {wxT("UPSILON"),0x55,0x75,wxT("Symbol")}, {wxT("PHI"),0x46,0x66,wxT("Symbol")}, {wxT("CHI"),0x43,0x63,wxT("Symbol")}, {wxT("PSI"),0x59,0x79,wxT("Symbol")}, {wxT("OMEGA"),0x57,0x77,wxT("Symbol")}, {wxT("VARTHETA"),0x4a,0x4a,wxT("Symbol")}, {wxT("VARPHI"),0x6a,0x6a,wxT("Symbol")}, {wxT("VAREPSILON"),0x65,0x65,wxT("Symbol")}, {wxT("ALEPH"),0xbf,0xbf,wxT("Symbol")}, {wxT("NABLA"),0x2014,0x2014,wxT("Symbol")}, {wxT("PARTIAL"),0x2202,0x2202,wxT("Symbol")}, {wxT("LEFTARROW"),0x2039,0xa8,wxT("Symbol")}, {wxT("UPARROW"),0x203a,0x2260,wxT("Symbol")}, {wxT("DOWNARROW"),0xfb02,0xd8,wxT("Symbol")}, {wxT("RIGHTARROW"),0xfb01,0xc6,wxT("Symbol")}, {wxT("PERP"),0x5e,0x5e,wxT("Symbol")}, {wxT("MID"),0x2d9,0x2d9,wxT("Symbol")}, {wxT("BULLET"),0x2211,0x2211,wxT("Symbol")}, {wxT("SUM"),0xc2,0xc2,wxT("Symbol")}, {wxT("PROD"),0x2019,0x2019,wxT("Symbol")}, {wxT("INT"),0xda,0xda,wxT("Symbol")}, {wxT("SURD"),0xf7,0xf7,wxT("Symbol")}, {wxT("PLUS"),0x2b,0x2b,wxT("Symbol")}, {wxT("MINUS"),0x2d,0x2d,wxT("Symbol")}, {wxT("PM"),0xb1,0xb1,wxT("Symbol")}, {wxT("TIMES"),0xa5,0xa5,wxT("Symbol")}, {wxT("DIV"),0x220f,0x220f,wxT("Symbol")}, {wxT("OPLUS"),0x2248,0x2248,wxT("Symbol")}, {wxT("OTIMES"),0x192,0x192,wxT("Symbol")}, {wxT("CAP"),0xab,0xab,wxT("Symbol")}, {wxT("SUBSET"),0xc3,0xc3,wxT("Symbol")}, {wxT("CUP"),0xbb,0xbb,wxT("Symbol")}, {wxT("SUPSET"),0x2026,0x2026,wxT("Symbol")}, {wxT("DEGREE"),0x221e,0x221e,wxT("Symbol")}, {wxT("LANGLE"),0xb7,0xb7,wxT("Symbol")}, {wxT("RANGLE"),0xd2,0xd2,wxT("Symbol")}, {wxT("NEG"),0xff,0xff,wxT("Symbol")}, {wxT("THEREFORE"),0x5c,0x5c,wxT("Symbol")}, {wxT("ANGLE"),0x2013,0x2013,wxT("Symbol")}, {wxT("VEE"),0x2044,0x2044,wxT("Symbol")}, {wxT("WEDGE"),0x2044,0x2044,wxT("Symbol")}, {wxT("CDOT"),0x2e,0x2e,wxT("Symbol")}, {wxT("INFTY"),0x2022,0x2022,wxT("Symbol")}, {wxT("IN"),0x152,0x152,wxT("Symbol")}, {wxT("NI"),0x153,0x153,wxT("Symbol")}, {wxT("PROPTO"),0xb5,0xb5,wxT("Symbol")}, {wxT("EXISTS"),0x24,0x24,wxT("Symbol")}, {wxT("FORALL"),0x22,0x22,wxT("Symbol")}, {wxT("NEQ"),0x3c0,0x3c0,wxT("Symbol")}, {wxT("EQUIV"),0x222b,0x222b,wxT("Symbol")}, {wxT("APPROX"),0xaa,0xaa,wxT("Symbol")}, {wxT("SIM"),0x7e,0x7e,wxT("Symbol")}, {wxT("LT"),0x3c,0x3c,wxT("Symbol")}, {wxT("GT"),0x3e,0x3e,wxT("Symbol")}, {wxT("LEQ"),0xa3,0xa3,wxT("Symbol")}, {wxT("GEQ"),0x2265,0x2265,wxT("Symbol")}, {wxT("VARPI"),0x76,0x76,wxT("Symbol")}, {wxT("CLUBSUIT"),0xdf,0xdf,wxT("Symbol")}, {wxT("DIAMONDSUIT"),0xae,0xae,wxT("Symbol")}, {wxT("HEARTSUIT"),0xa9,0xa9,wxT("Symbol")}, {wxT("SPADESUIT"),0x2122,0x2122,wxT("Symbol")}, {wxT("SUBSETEQ"),0xd5,0xd5,wxT("Symbol")}, {wxT("SUPSETEQ"),0xa0,0xa0,wxT("Symbol")}, {wxT("LDOTS"),0xba,0xba,wxT("Symbol")}, {wxT("LEFTRIGHTARROW"),0x20ac,0xb4,wxT("Symbol")}, {wxT("EMPTYSET"),0x2206,0x2206,wxT("Symbol")}, {wxT("WP"),0x221a,0x221a,wxT("Symbol")}, {wxT("RE"),0xac,0xac,wxT("Symbol")}, {wxT("IM"),0xa1,0xa1,wxT("Symbol")}, {wxT("HOOKLEFTARROW"),0xf8,0xf8,wxT("Symbol")}, {wxT("COPYRIGHT"),0x201d,0x201d,wxT("Symbol")}, {wxT("REGISTERED"),0x201c,0x201c,wxT("Symbol")}, {wxT("TM"),0x2030,0x2030,wxT("Symbol")}, {wxT("DIAMOND"),0x2021,0x2021,wxT("Symbol")} }; for( std::size_t i=0; i xp(4,0.0), yp(4,0.0); std::vector::const_iterator end = strings_.end(); for( std::vector::const_iterator i=strings_.begin(); i!=end; ++i ) { int xlo, ylo, xhi, yhi; (*i)->GetBoundary( xlo, ylo, xhi, yhi ); ExGlobals::GetGraphicsOutput()->OutputTypeToWorld( xlo, ylo, xp[0], yp[0] ); ExGlobals::GetGraphicsOutput()->OutputTypeToWorld( xhi, yhi, xp[2], yp[2] ); xp[1] = xp[2]; yp[1] = yp[0]; xp[3] = xp[0]; yp[3] = yp[2]; if( UsefulFunctions::InsidePolygon(x,y,xp,yp) )return true; } return false; } double GRA_drawableText::GetWidth() const { std::vector::const_iterator end = strings_.end(); double width = 0.0; for( std::vector::const_iterator i=strings_.begin(); i!=end; ++i ) { int xlo, ylo, xhi, yhi; (*i)->GetBoundary( xlo, ylo, xhi, yhi ); double xlow, ylow, xhiw, yhiw; ExGlobals::GetGraphicsOutput()->OutputTypeToWorld( xlo, ylo, xlow, ylow ); ExGlobals::GetGraphicsOutput()->OutputTypeToWorld( xhi, yhi, xhiw, yhiw ); width += xhiw-xlow; } return width; } // end of file extrema-4.4.5/src/Graphics/GRA_arrow2.cpp0000644012702201742730000001132411332164567017160 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include #include "GRA_arrow2.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_arrow2::GRA_arrow2( double x1, double y1, double x2, double y2, bool heads, GRA_color *lineColor, GRA_color *fillColor, int lineWidth, double widthFactor, double lengthFactor ) : GRA_polygon(lineColor,fillColor,lineWidth), headsBothEnds_(heads) { SetArrow2(); double const dx = x2 - x1; double const dy = y2 - y1; double const angle = atan2(dy,dx)+0.5*M_PI; double const cosang = cos(angle); double const sinang = sin(angle); double const length = sqrt(dx*dx+dy*dy); double const stemWidth = 0.01; //double const headWidth = 0.3; //double const headLength = 0.3; double const temp = length - 15.; double headLength = 0.2+(temp/5.)*(temp/5.)*exp(-temp*temp/25.); double headWidth = 0.75*headLength; headWidth *= widthFactor; headLength *= lengthFactor; double const xc = 0.5*(x1+x2); double const yc = 0.5*(y1+y2); double const tan30 = tan(30.*M_PI/180.); std::vector x, y; if( headsBothEnds_ ) { x.push_back(xc+RotX(0.,-0.5*length,sinang,cosang)); y.push_back(yc+RotY(0.,-0.5*length,sinang,cosang)); x.push_back(xc+RotX(-headWidth*tan30,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(-headWidth*tan30,-0.5*length+headLength,sinang,cosang)); x.push_back(xc+RotX(-stemWidth,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,-0.5*length+headLength,sinang,cosang)); x.push_back(xc+RotX(-stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(0.,0.5*length,sinang,cosang)); y.push_back(yc+RotY(0.,0.5*length,sinang,cosang)); x.push_back(xc+RotX(headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(stemWidth,-0.5*length+headLength,sinang,cosang)); x.push_back(xc+RotX(headWidth*tan30,-0.5*length+headLength,sinang,cosang)); y.push_back(yc+RotY(headWidth*tan30,-0.5*length+headLength,sinang,cosang)); } else { x.push_back(xc+RotX(-stemWidth,-0.5*length,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,-0.5*length,sinang,cosang)); x.push_back(xc+RotX(-stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(0.,0.5*length,sinang,cosang)); y.push_back(yc+RotY(0.,0.5*length,sinang,cosang)); x.push_back(xc+RotX(headWidth*tan30,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(headWidth*tan30,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,0.5*length-headLength,sinang,cosang)); y.push_back(yc+RotY(stemWidth,0.5*length-headLength,sinang,cosang)); x.push_back(xc+RotX(stemWidth,-0.5*length,sinang,cosang)); y.push_back(yc+RotY(stemWidth,-0.5*length,sinang,cosang)); } SetUp( x, y ); } /* std::ostream &operator<<( std::ostream &out, GRA_arrow2 const &p ) { out << "\n"; std::size_t size = p.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } */ // end of file extrema-4.4.5/src/Graphics/EGraphicsError.h0000644012702201742730000000200311274636605017573 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_GRAPHICSERROR #define EX_GRAPHICSERROR #include #include "wx/wx.h" class EGraphicsError : public std::runtime_error { public: EGraphicsError( wxString const &errorMessage ) : std::runtime_error( (char const *)errorMessage.mb_str(wxConvUTF8) ) {} }; #endif extrema-4.4.5/src/Graphics/GRA_diamondPlus.cpp0000644012702201742730000000603511274636605020230 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_diamondPlus.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_diamondPlus::~GRA_diamondPlus() {} GRA_diamondPlus::GRA_diamondPlus( double xc, double yc, double side, double angle, GRA_color *lineColor, int lineWidth ) : GRA_multiLineFigure() { SetLineColor( lineColor ); SetLineWidth( lineWidth ); xc_ = xc; yc_ = yc; double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const temp = side*0.5; double const temp2 = side*0.4; x_.push_back(xc+RotX(temp2,0.,sinang,cosang)); y_.push_back(yc+RotY(temp2,0.,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(0.,temp,sinang,cosang)); y_.push_back(yc+RotY(0.,temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-temp2,0.,sinang,cosang)); y_.push_back(yc+RotY(-temp2,0.,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(0.,-temp,sinang,cosang)); y_.push_back(yc+RotY(0.,-temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(temp2,0.,sinang,cosang)); y_.push_back(yc+RotY(temp2,0.,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(temp2,0.,sinang,cosang)); y_.push_back(yc+RotY(temp2,0.,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(-temp2,0.,sinang,cosang)); y_.push_back(yc+RotY(-temp2,0.,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(0.,temp,sinang,cosang)); y_.push_back(yc+RotY(0.,temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(0.,-temp,sinang,cosang)); y_.push_back(yc+RotY(0.,-temp,sinang,cosang)); pen_.push_back(2); } std::ostream &operator<<( std::ostream &out, GRA_diamondPlus const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_diamond.cpp0000644012702201742730000000420211274636605017356 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_diamond.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_diamond::GRA_diamond( double xc, double yc, double side, double angle, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth) { double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const xs = side*0.4; double const ys = side*0.5; std::vector x, y; x.push_back(xc+RotX( xs, 0.,sinang,cosang)); y.push_back(yc+RotY( xs, 0.,sinang,cosang)); x.push_back(xc+RotX( 0., ys, sinang,cosang)); y.push_back(yc+RotY( 0., ys, sinang,cosang)); x.push_back(xc+RotX(-xs, 0.,sinang,cosang)); y.push_back(yc+RotY(-xs, 0.,sinang,cosang)); x.push_back(xc+RotX( 0., -ys, sinang,cosang)); y.push_back(yc+RotY( 0., -ys, sinang,cosang)); // SetUp( x, y ); } /* std::ostream &operator<<( std::ostream &out, GRA_diamond const &p ) { out << "\n"; std::size_t size = p.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } */ // end of file extrema-4.4.5/src/Graphics/GRA_axis.h0000644012702201742730000000750711274636605016367 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_AXIS #define GRA_AXIS #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_setOfCharacteristics; class GRA_wxWidgets; class GRA_font; class GRA_polyline; class GRA_drawableText; class GRA_axis : public GRA_drawableObject { public: GRA_axis( double, double, double, GRA_setOfCharacteristics const * ); ~GRA_axis() { DeleteStuff(); } GRA_axis( GRA_axis const &rhs ) : GRA_drawableObject(rhs) { CopyStuff( rhs ); } GRA_axis &operator=( GRA_axis const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff( rhs ); } return *this; } GRA_setOfCharacteristics *GetCharacteristics() { return characteristics_; } void GetOrigin( double &xOrigin, double &yOrigin ) const { xOrigin=xOrigin_; yOrigin=yOrigin_; } double GetMaxWidth() const { return maxWidth_; } double GetLowerAxis() const; double GetUpperAxis() const; double GetAngle() const; void GetEndPoint( double &x, double &y ) const { x=xEnd_; y=yEnd_; } bool Inside( double, double ); void Make(); void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_axis const & ); void SetTicCoordinates( std::vector const &x, std::vector const &y ) { xTicCoordinates_.assign( x.begin(), x.end() ); yTicCoordinates_.assign( y.begin(), y.end() ); } void GetTicCoordinates( std::vector &x, std::vector &y ) { x.assign( xTicCoordinates_.begin(), xTicCoordinates_.end() ); y.assign( yTicCoordinates_.begin(), yTicCoordinates_.end() ); } void SetPolylines( std::vector const &polylines ) { polylines_.assign( polylines.begin(), polylines.end() ); } std::vector &GetPolylines() { return polylines_; } void SetDrawableText( std::vector const &textVec ) { textVec_.assign( textVec.begin(), textVec.end() ); } std::vector &GetDrawableText() { return textVec_; } std::size_t GetNPoly() { return polylines_.size(); } int GetGrid() const { return nGrid_; } double GetLength() const { return length_; } private: void CopyStuff( GRA_axis const & ); void DeleteStuff(); void InheritFrom( GRA_axis * ); void Fnice(); wxString DoubleToString( double, int, int, int ) const; void MakeLinearAxis(); void MakeLogAxis(); void MakeATic( double, double, double, double, double, double, double &, double & ); void NormalizeAngle( double &angle ) { angle -= static_cast(angle/360.)*360.; while( angle < 0.0 )angle += 360.; } GRA_setOfCharacteristics *characteristics_; std::vector polylines_; std::vector textVec_; double xOrigin_, yOrigin_, length_; // origin coordinates of the axis and its length double xEnd_, yEnd_; // coordinates of axis end point std::vector xTicCoordinates_, yTicCoordinates_; double maxWidth_; // max width of axis numbers (world coordinates) // available only after the axis is drawn int nGrid_; }; #endif extrema-4.4.5/src/Graphics/GRA_colorMap.cpp0000644012702201742730000000402011274636605017515 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_colorMap.h" #include "GRA_color.h" #include "EGraphicsError.h" void GRA_colorMap::DeleteStuff() { while( !colors_.empty() ) { delete colors_.back(); colors_.pop_back(); } } GRA_color *GRA_colorMap::GetColor( int i ) const { GRA_color *color = i>0 ? colors_[(i-1)%colors_.size()] : 0; return color; } int GRA_colorMap::GetCode( GRA_color *color ) const { std::size_t size = colors_.size(); for( std::size_t i=0; i(i+1); } return -1; // entered an invalid color pointer, return black } int GRA_colorMap::GetCode( int r, int g, int b ) const { std::size_t size = colors_.size(); GRA_color color(r,g,b); for( std::size_t i=0; i(i+1); } return 0; // r, g, b values not found in color map } std::ostream &operator<<( std::ostream &out, GRA_colorMap const &cmap ) { if( cmap.name_ == wxT("USERDEFINED") ) { int cmapSize = cmap.colors_.size(); out << "\n"; for( int i=0; i\n"; } else { out << "\n"; } return out; } // end of file extrema-4.4.5/src/Graphics/GRA_boxPlot.h0000644012702201742730000000421611274636605017044 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_BOXPLOT #define GRA_BOXPLOT #include #include #include "wx/wx.h" #include "GRA_densityPlot.h" class GRA_wxWidgets; class GRA_boxPlot : public GRA_densityPlot { public: GRA_boxPlot( std::vector &x, std::vector &y, std::vector &z, int nrow, double fmin, double fmax, double gmin, double gmax, bool xProfile, bool yProfile, bool border, bool zoom, bool axes, bool reset, double bscale ) : GRA_densityPlot(wxT("BOXPLOT"), x, y, z, nrow, fmin, fmax, gmin, gmax, xProfile, yProfile, border, zoom, axes, reset, false), bscale_(bscale) { SetUp(); } ~GRA_boxPlot() {} GRA_boxPlot( GRA_boxPlot const &rhs ) { CopyStuff(rhs); } GRA_boxPlot &operator=( GRA_boxPlot const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Make(); void Draw( GRA_wxWidgets *, wxDC & ); void GetSides( double &xside, double &yside ) { xside = xside_; yside = yside_; } double GetAmin() const { return amin_; } double GetDa() const { return da_; } friend std::ostream &operator<<( std::ostream &, GRA_boxPlot const & ); private: void DrawABox( double, double, double, double, double, double, double, GRA_color *, GRA_color *, GRA_wxWidgets *, wxDC & ); void CopyStuff( GRA_boxPlot const & ); double amin_, da_, xside_, yside_, bscale_; }; #endif extrema-4.4.5/src/Graphics/GRA_plus.cpp0000644012702201742730000000453711274636605016741 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_plus.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_plus::~GRA_plus() {} GRA_plus::GRA_plus( double xc, double yc, double side, double angle, GRA_color *lineColor, int lineWidth ) : GRA_multiLineFigure() { SetLineColor( lineColor ); SetLineWidth( lineWidth ); xc_ = xc; yc_ = yc; double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const temp = side*0.5; x_.push_back(xc+RotX(temp,0.,sinang,cosang)); y_.push_back(yc+RotY(temp,0.,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(-temp,0.,sinang,cosang)); y_.push_back(yc+RotY(-temp,0.,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(0.,-temp,sinang,cosang)); y_.push_back(yc+RotY(0.,-temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(0.,temp,sinang,cosang)); y_.push_back(yc+RotY(0.,temp,sinang,cosang)); pen_.push_back(2); } std::ostream &operator<<( std::ostream &out, GRA_plus const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/Makefile.in0000644012702201742730000005464611440762625016631 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Graphics DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgraphics_la_LIBADD = am_libgraphics_la_OBJECTS = GRA_angleCharacteristic.lo GRA_arrow1.lo \ GRA_arrow2.lo GRA_arrow3.lo GRA_asterisk.lo GRA_axis.lo \ GRA_bitmap.lo GRA_boolCharacteristic.lo GRA_boxPlot.lo \ GRA_cartesianAxes.lo GRA_cartesianCurve.lo \ GRA_colorCharacteristic.lo GRA_colorControl.lo GRA_color.lo \ GRA_colorMap.lo GRA_contourLine.lo GRA_cross.lo \ GRA_crossPlus.lo GRA_densityPlot.lo GRA_diamond.lo \ GRA_diamondPlus.lo GRA_diffusionPlot.lo \ GRA_distanceCharacteristic.lo GRA_ditheringPlot.lo \ GRA_doubleCharacteristic.lo GRA_drawableObject.lo \ GRA_drawableText.lo GRA_ellipse.lo GRA_errorBar.lo \ GRA_fontCharacteristic.lo GRA_fontControl.lo GRA_font.lo \ GRA_gradientPlot.lo GRA_intCharacteristic.lo GRA_legend.lo \ GRA_multiLineFigure.lo GRA_plotSymbol.lo GRA_plus.lo \ GRA_point.lo GRA_polarAxes.lo GRA_polarCurve.lo GRA_polygon.lo \ GRA_polyline.lo GRA_postscript.lo GRA_rectangle.lo \ GRA_setOfCharacteristics.lo GRA_simpleText.lo \ GRA_sizeCharacteristic.lo GRA_star5pt.lo \ GRA_stringCharacteristic.lo GRA_thiessenTriangulation.lo \ GRA_threeDPlot.lo GRA_triangle.lo GRA_window.lo \ GRA_wxWidgets.lo libgraphics_la_OBJECTS = $(am_libgraphics_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libgraphics_la_SOURCES) DIST_SOURCES = $(libgraphics_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libgraphics.la libgraphics_la_SOURCES = \ GRA_angleCharacteristic.cpp GRA_angleCharacteristic.h \ GRA_arrow1.cpp GRA_arrow1.h \ GRA_arrow2.cpp GRA_arrow2.h \ GRA_arrow3.cpp GRA_arrow3.h \ GRA_asterisk.cpp GRA_asterisk.h \ GRA_axis.cpp GRA_axis.h \ GRA_bitmap.cpp GRA_bitmap.h \ GRA_boolCharacteristic.cpp GRA_boolCharacteristic.h \ GRA_boxPlot.cpp GRA_boxPlot.h \ GRA_cartesianAxes.cpp GRA_cartesianAxes.h \ GRA_cartesianCurve.cpp GRA_cartesianCurve.h \ GRA_colorCharacteristic.cpp GRA_colorCharacteristic.h \ GRA_colorControl.cpp GRA_colorControl.h \ GRA_color.cpp GRA_color.h \ GRA_colorMap.cpp GRA_colorMap.h \ GRA_contourLine.cpp GRA_contourLine.h \ GRA_cross.cpp GRA_cross.h \ GRA_crossPlus.cpp GRA_crossPlus.h \ GRA_densityPlot.cpp GRA_densityPlot.h \ GRA_diamond.cpp GRA_diamond.h \ GRA_diamondPlus.cpp GRA_diamondPlus.h \ GRA_diffusionPlot.cpp GRA_diffusionPlot.h \ GRA_distanceCharacteristic.cpp GRA_distanceCharacteristic.h \ GRA_ditheringPlot.cpp GRA_ditheringPlot.h \ GRA_doubleCharacteristic.cpp GRA_doubleCharacteristic.h \ GRA_drawableObject.cpp GRA_drawableObject.h \ GRA_drawableText.cpp GRA_drawableText.h \ GRA_ellipse.cpp GRA_ellipse.h \ GRA_errorBar.cpp GRA_errorBar.h \ GRA_fontCharacteristic.cpp GRA_fontCharacteristic.h \ GRA_fontControl.cpp GRA_fontControl.h \ GRA_font.cpp GRA_font.h \ GRA_gradientPlot.cpp GRA_gradientPlot.h \ GRA_intCharacteristic.cpp GRA_intCharacteristic.h \ GRA_legend.cpp GRA_legend.h \ GRA_multiLineFigure.cpp GRA_multiLineFigure.h \ GRA_plotSymbol.cpp GRA_plotSymbol.h \ GRA_plus.cpp GRA_plus.h \ GRA_point.cpp GRA_point.h \ GRA_polarAxes.cpp GRA_polarAxes.h \ GRA_polarCurve.cpp GRA_polarCurve.h \ GRA_polygon.cpp GRA_polygon.h \ GRA_polyline.cpp GRA_polyline.h \ GRA_postscript.cpp GRA_postscript.h \ GRA_rectangle.cpp GRA_rectangle.h \ GRA_setOfCharacteristics.cpp GRA_setOfCharacteristics.h \ GRA_simpleText.cpp GRA_simpleText.h \ GRA_sizeCharacteristic.cpp GRA_sizeCharacteristic.h \ GRA_star5pt.cpp GRA_star5pt.h \ GRA_stringCharacteristic.cpp GRA_stringCharacteristic.h \ GRA_thiessenTriangulation.cpp GRA_thiessenTriangulation.h \ GRA_threeDPlot.cpp GRA_threeDPlot.h \ GRA_triangle.cpp GRA_triangle.h \ GRA_window.cpp GRA_window.h \ GRA_wxWidgets.cpp GRA_wxWidgets.h \ GRA_characteristic.h EGraphicsError.h GRA_shape.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Graphics/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Graphics/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgraphics.la: $(libgraphics_la_OBJECTS) $(libgraphics_la_DEPENDENCIES) $(CXXLINK) $(libgraphics_la_OBJECTS) $(libgraphics_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_angleCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_arrow1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_arrow2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_arrow3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_asterisk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_axis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_boolCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_boxPlot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_cartesianAxes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_cartesianCurve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_colorCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_colorControl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_colorMap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_contourLine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_cross.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_crossPlus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_densityPlot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_diamond.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_diamondPlus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_diffusionPlot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_distanceCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_ditheringPlot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_doubleCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_drawableObject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_drawableText.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_ellipse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_errorBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_fontCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_fontControl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_gradientPlot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_intCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_legend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_multiLineFigure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_plotSymbol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_plus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_point.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_polarAxes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_polarCurve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_polygon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_polyline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_postscript.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_rectangle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_setOfCharacteristics.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_simpleText.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_sizeCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_star5pt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_stringCharacteristic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_thiessenTriangulation.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_threeDPlot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_triangle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GRA_wxWidgets.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Graphics/GRA_threeDPlot.cpp0000644012702201742730000004335311322762176020024 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include "GRA_threeDPlot.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "UsefulFunctions.h" #include "GRA_wxWidgets.h" #include "GRA_plotSymbol.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_setOfCharacteristics.h" #include "GRA_intCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_drawableText.h" #include "GRA_window.h" void GRA_threeDPlot::DeleteStuff() { while( !plotSymbols_.empty() ) { delete plotSymbols_.back(); plotSymbols_.pop_back(); } } void GRA_threeDPlot::CopyStuff( GRA_threeDPlot const &rhs ) { threeDForm_ = rhs.threeDForm_; x_.assign( rhs.x_.begin(), rhs.x_.end() ); y_.assign( rhs.y_.begin(), rhs.y_.end() ); z_.assign( rhs.z_.begin(), rhs.z_.end() ); xmin_ = rhs.xmin_; xmax_ = rhs.xmax_; ymin_ = rhs.ymin_; ymax_ = rhs.ymax_; zmin_ = rhs.zmin_; zmax_ = rhs.zmax_; xmn_ = rhs.xmn_; xmx_ = rhs.xmx_; xinc_ = rhs.xinc_; ymn_ = rhs.ymn_; ymx_ = rhs.ymx_; yinc_ = rhs.yinc_; zmn_ = rhs.zmn_; zmx_ = rhs.zmx_; zinc_ = rhs.zinc_; nlxinc_ = rhs.nlxinc_; nlyinc_ = rhs.nlyinc_; nlzinc_ = rhs.nlzinc_; xc_ = rhs.xc_; yc_ = rhs.yc_; zc_ = rhs.zc_; std::vector::const_iterator sEnd = rhs.plotSymbols_.end(); for( std::vector::const_iterator i=rhs.plotSymbols_.begin(); i!=sEnd; ++i ) plotSymbols_.push_back( new GRA_plotSymbol(**i) ); x2_.assign( rhs.x2_.begin(), rhs.x2_.end() ); y2_.assign( rhs.y2_.begin(), rhs.y2_.end() ); z2_.assign( rhs.z2_.begin(), rhs.z2_.end() ); xn_.assign( rhs.xn_.begin(), rhs.xn_.end() ); yn_.assign( rhs.yn_.begin(), rhs.yn_.end() ); zn_.assign( rhs.zn_.begin(), rhs.zn_.end() ); p2_.assign( rhs.p2_.begin(), rhs.p2_.end() ); eye2object_ = rhs.eye2object_; screenHalfSize_ = rhs.screenHalfSize_; ds_ = rhs.ds_; angleIncrement_ = rhs.angleIncrement_; xAxisAngle_ = rhs.xAxisAngle_; yAxisAngle_ = rhs.yAxisAngle_; } void GRA_threeDPlot::SetupData() { std::size_t npt = x_.size(); UsefulFunctions::MinMax( x_, 0, npt, xmin_, xmax_ ); UsefulFunctions::MinMax( y_, 0, npt, ymin_, ymax_ ); UsefulFunctions::MinMax( z_, 0, npt, zmin_, zmax_ ); UsefulFunctions::Scale1( xmn_, xmx_, xinc_, 5, xmin_, xmax_ ); nlxinc_ = static_cast( (xmx_-xmn_)/xinc_ + 0.5 ); xmin_ = xmn_; xmax_ = xmx_; xmn_ -= 0.1*(xmax_-xmin_); xmx_ += 0.1*(xmax_-xmin_); UsefulFunctions::Scale1( ymn_, ymx_, yinc_, 5, ymin_, ymax_ ); nlyinc_ = static_cast( (ymx_-ymn_)/yinc_ + 0.5 ); ymin_ = ymn_; ymax_ = ymx_; ymn_ -= 0.1*(ymax_-ymin_); ymx_ += 0.1*(ymax_-ymin_); UsefulFunctions::Scale1( zmn_, zmx_, zinc_, 5, zmin_, zmax_ ); nlzinc_ = static_cast( (zmx_-zmn_)/zinc_ + 0.5 ); zmin_ = zmn_; zmax_ = zmx_; zmn_ -= 0.1*(zmax_-zmin_); zmx_ += 0.1*(zmax_-zmin_); xc_ = (xmn_+xmx_)/2; // centre of object = (xc_,yc_,zc_) yc_ = (ymn_+ymx_)/2; zc_ = (zmn_+zmx_)/2; } void GRA_threeDPlot::SetupPlotVectors() { // z becomes 2*d+z in eye coordinates // std::size_t npt = x_.size(); int nxyz = 2*(nlxinc_+nlyinc_+nlzinc_) + 12; x2_.resize( nxyz ); y2_.resize( nxyz ); z2_.resize( nxyz ); p2_.resize( nxyz ); xn_.resize( 6 ); yn_.resize( 6 ); zn_.resize( 6 ); xn_[0] = xmn_-0.05*(xmx_-xmn_); // zmax_ yn_[0] = ymn_; zn_[0] = zmax_; xn_[1] = xmn_-0.05*(xmx_-xmn_); // zmin_ yn_[1] = ymn_; zn_[1] = zmin_; xn_[2] = xmn_-0.05*(xmx_-xmn_); // ymin_ yn_[2] = ymin_; zn_[2] = zmn_; xn_[3] = xmn_-0.05*(xmx_-xmn_); // ymax_ yn_[3] = ymax_; zn_[3] = zmn_; xn_[4] = xmin_; // xmin_ yn_[4] = ymx_+0.05*(ymx_-ymn_); zn_[4] = zmn_; xn_[5] = xmax_; // xmax_ yn_[5] = ymx_+0.05*(ymx_-ymn_); zn_[5] = zmn_; x2_[0] = xmn_; // z axis y2_[0] = ymn_; z2_[0] = zmx_; p2_[0] = 3; x2_[1] = xmn_; y2_[1] = ymn_; z2_[1] = zmn_; p2_[1] = 2; for( int i=1; i<=nlzinc_+1; ++i ) { x2_[2*i] = xmn_-0.05*(xmx_-xmn_); y2_[2*i] = ymn_; z2_[2*i] = zmax_-(i-1)*zinc_; p2_[2*i] = 3; x2_[2*i+1] = xmn_; y2_[2*i+1] = ymn_; z2_[2*i+1] = zmax_-(i-1)*zinc_; p2_[2*i+1] = 2; } int nn = 2*nlzinc_+4; x2_[nn] = xmn_; // y axis y2_[nn] = ymn_; z2_[nn] = zmn_; p2_[nn] = 3; x2_[nn+1] = xmn_; y2_[nn+1] = ymx_; z2_[nn+1] = zmn_; p2_[nn+1] = 2; nn += 2; for( int i=1; i<=nlyinc_+1; ++i ) { x2_[nn+2*(i-1)] = xmn_-0.05*(xmx_-xmn_); y2_[nn+2*(i-1)] = ymin_+(i-1)*yinc_; z2_[nn+2*(i-1)] = zmn_; p2_[nn+2*(i-1)] = 3; x2_[nn+2*(i-1)+1] = xmn_; y2_[nn+2*(i-1)+1] = ymin_+(i-1)*yinc_; z2_[nn+2*(i-1)+1] = zmn_; p2_[nn+2*(i-1)+1] = 2; } nn += 2*nlyinc_+2; x2_[nn] = xmn_; // x axis y2_[nn] = ymx_; z2_[nn] = zmn_; p2_[nn] = 3; x2_[nn+1] = xmx_; y2_[nn+1] = ymx_; z2_[nn+1] = zmn_; p2_[nn+1] = 2; nn += 2; for( int i=1; i<=nlxinc_+1; ++i ) { x2_[nn+2*(i-1)] = xmin_+(i-1)*xinc_; y2_[nn+2*(i-1)] = ymx_+0.05*(ymx_-ymn_); z2_[nn+2*(i-1)] = zmn_; p2_[nn+2*(i-1)] = 3; x2_[nn+2*(i-1)+1] = xmin_+(i-1)*xinc_; y2_[nn+2*(i-1)+1] = ymx_; z2_[nn+2*(i-1)+1] = zmn_; p2_[nn+2*(i-1)+1] = 2; } nn += 2*nlxinc_+2; for( std::size_t i=0; iGetDataCurveCharacteristics(); GRA_intCharacteristic *psCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOL"))); std::vector symbols; if( psCharacteristic->IsVector() ) { symbols.assign( psCharacteristic->Gets().begin(), psCharacteristic->Gets().end() ); for( std::size_t i=symbols.size(); iGet() ); } GRA_sizeCharacteristic *pssizeCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLSIZE"))); std::vector sizes; if( pssizeCharacteristic->IsVector() ) { sizes.assign( pssizeCharacteristic->GetAsWorlds().begin(), pssizeCharacteristic->GetAsWorlds().end() ); for( std::size_t i=sizes.size(); iGetAsWorld() ); } GRA_angleCharacteristic *psangleCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLANGLE"))); std::vector angles; if( psangleCharacteristic->IsVector() ) { angles.assign( psangleCharacteristic->Gets().begin(), psangleCharacteristic->Gets().end() ); for( std::size_t i=angles.size(); iGet() ); } GRA_colorCharacteristic *pscolorCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLCOLOR"))); std::vector colors; if( pscolorCharacteristic->IsVector() ) { colors.assign( pscolorCharacteristic->Gets().begin(), pscolorCharacteristic->Gets().end() ); for( std::size_t i=colors.size(); iGet() ); } GRA_intCharacteristic *pslwCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLLINEWIDTH"))); std::vector lws; if( pslwCharacteristic->IsVector() ) { lws.assign( pslwCharacteristic->Gets().begin(), pslwCharacteristic->Gets().end() ); for( std::size_t i=lws.size(); iGet() ); } for( std::size_t i=0; iGetDataCurveCharacteristics(); int lineTypeSave = graphicsOutput->GetLineType(); graphicsOutput->SetLineType( static_cast(curveC->Get(wxT("CURVELINETYPE")))->Get() ); wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor( static_cast(curveC->Get(wxT("CURVECOLOR")))->Get() )); wxpen.SetWidth( static_cast(curveC->Get(wxT("CURVELINEWIDTH")))->Get() ); dc.SetPen( wxpen ); double xs, ys; ScaleXY( x_[0], y_[0], z_[0], xs, ys ); graphicsOutput->StartLine( xs, ys ); std::size_t npt = x_.size(); for( std::size_t i=1; iGetConnectToPrevious() ? graphicsOutput->ContinueLine( xs, ys, dc ) : graphicsOutput->StartLine( xs, ys ); } wxpen.SetColour( ExGlobals::GetwxColor( GRA_colorControl::GetColor(wxT("BLACK")) ) ); dc.SetPen( wxpen ); } void GRA_threeDPlot::DrawSymbols( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { std::size_t npt = x_.size(); for( std::size_t i=0; iSetLocation( xs, ys ); plotSymbols_[i]->Draw( graphicsOutput, dc ); } } void GRA_threeDPlot::DrawAxes( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *textC = gw->GetTextCharacteristics(); GRA_setOfCharacteristics textCsave( *textC ); static_cast(textC->Get(wxT("INTERACTIVE")))->Set( false ); int nxyz = 2*(nlxinc_+nlyinc_+nlzinc_) + 12; for( int i=0; iContinueLine( xs, ys, dc ) : graphicsOutput->StartLine( xs, ys ); } double xs1, ys1; ScaleXY( xn_[0], yn_[0], zn_[0], xs1, ys1 ); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 6 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xs1 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( ys1 ); GRA_drawableText *dt = new GRA_drawableText( wxString()<Parse(); dt->Draw( graphicsOutput, dc ); double xs2, ys2; ScaleXY( xn_[1], yn_[1], zn_[1], xs2, ys2 ); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 6 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xs2 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( ys2 ); dt = new GRA_drawableText( wxString()<Parse(); dt->Draw( graphicsOutput, dc ); double xc = (xs1+xs2)/2.; double yc = (ys1+ys2)/2.; static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 6 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xc ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( yc ); dt = new GRA_drawableText( wxT("Z") ); dt->Parse(); dt->Draw( graphicsOutput, dc ); ScaleXY( xn_[2], yn_[2], zn_[2], xs1, ys1 ); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 6 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xs1 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( ys1 ); dt = new GRA_drawableText( wxString()<Parse(); dt->Draw( graphicsOutput, dc ); ScaleXY( xn_[3], yn_[3], zn_[3], xs2, ys2 ); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 6 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xs2 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( ys2 ); dt = new GRA_drawableText( wxString()<Parse(); dt->Draw( graphicsOutput, dc ); xc = (xs1+xs2)/2.; yc = (ys1+ys2)/2.; static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 6 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xc ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( yc ); dt = new GRA_drawableText( wxT("X") ); dt->Parse(); dt->Draw( graphicsOutput, dc ); ScaleXY( xn_[4], yn_[4], zn_[4], xs1, ys1 ); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 4 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xs1 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( ys1 ); dt = new GRA_drawableText( wxString()<Parse(); dt->Draw( graphicsOutput, dc ); ScaleXY( xn_[5], yn_[5], zn_[5], xs2, ys2 ); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 4 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xs2 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( ys2 ); dt = new GRA_drawableText( wxString()<Parse(); dt->Draw( graphicsOutput, dc ); xc = (xs1+xs2)/2.; yc = (ys1+ys2)/2.; static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 4 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsWorld( xc ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsWorld( yc ); dt = new GRA_drawableText( wxT("Y") ); dt->Parse(); dt->Draw( graphicsOutput, dc ); *textC = textCsave; } void GRA_threeDPlot::RotateX( double const angle ) { double sinth = sin(M_PI/180.*angle); double costh = cos(M_PI/180.*angle); std::size_t npt = x_.size(); for( std::size_t i=0; i #include "wx/wx.h" class GRA_color; class GRA_colorMap { private: typedef std::vector colorVec; public: GRA_colorMap( wxString const &name ) : name_(name) {} GRA_colorMap( wxString const &name, colorVec const &v ) : name_(name) { colors_.assign( v.begin(), v.end() ); } virtual ~GRA_colorMap() { DeleteStuff(); } GRA_colorMap( GRA_colorMap const &rhs ) { CopyStuff(rhs); } GRA_colorMap &operator=( GRA_colorMap const & rhs ) { if( &rhs != this ) { DeleteStuff(); CopyStuff(rhs); } return *this; } wxString GetName() const { return name_; } void AddColor( GRA_color *color ) { colors_.push_back(color); } GRA_color *GetColor( int ) const; int GetCode( GRA_color * ) const; int GetCode( int, int, int ) const; int GetSize() const { return colors_.size(); } friend std::ostream &operator<<( std::ostream &, GRA_colorMap const & ); private: void CopyStuff( GRA_colorMap const &rhs ) { name_ = rhs.name_; colors_.assign( rhs.colors_.begin(), rhs.colors_.end() ); } // The GRA_colors passed in the constructor are allocated elsewhere, // but are deleted by the GRA_colormap destructor void DeleteStuff(); colorVec colors_; wxString name_; }; #endif extrema-4.4.5/src/Graphics/GRA_polygon.cpp0000644012702201742730000002337111332451564017434 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include #include "GRA_polygon.h" #include "GRA_colorControl.h" #include "GRA_wxWidgets.h" #include "UsefulFunctions.h" #include "ExGlobals.h" void GRA_polygon::SetUp( std::vector const &x, std::vector const &y ) { std::size_t xSize = x.size(); std::size_t ySize = y.size(); std::size_t size = std::min( xSize, ySize ); x_.assign( x.begin(), x.end() ); y_.assign( y.begin(), y.end() ); xmin_ = x_[0]; xmax_ = x_[0]; ymin_ = y_[0]; ymax_ = y_[0]; for( std::size_t i=1; i xmax_ )xmax_ = x_[i]; if( y_[i] < ymin_ )ymin_ = y_[i]; if( y_[i] > ymax_ )ymax_ = y_[i]; } xc_ = (xmax_+xmin_)*0.5; yc_ = (ymax_+ymin_)*0.5; } void GRA_polygon::SetUp( double xc, double yc, double angle, double radius, int vertices ) { xc_ = xc; yc_ = yc; double angleInc = 360./vertices; for( int i=0; i xmax_ )xmax_ = x_[i]; if( y_[i] < ymin_ )ymin_ = y_[i]; if( y_[i] > ymax_ )ymax_ = y_[i]; } } void GRA_polygon::CopyStuff( GRA_polygon const &rhs ) { x_.assign( rhs.x_.begin(), rhs.x_.end() ); y_.assign( rhs.y_.begin(), rhs.y_.end() ); xmin_ = rhs.xmin_; xmax_ = rhs.xmax_; ymin_ = rhs.ymin_; ymax_ = rhs.ymax_; xc_ = rhs.xc_; yc_ = rhs.yc_; type_ = rhs.type_; } int GRA_polygon::GetQuadrant( double x, double y, double xmin, double ymin, double xmax, double ymax ) { // | | // 3 | 4 | 5 // | | // ------+---------+------- ymax // | | // 2 | 0 | 6 // | | // ------+---------+------- ymin // | | // 1 | 8 | 7 // | | // xmin xmax int quadrant = 8; if( x>=xmin && x<=xmax && y>=ymin && y<=ymax )quadrant=0; else if( x=ymin && y<=ymax )quadrant = 2; else if( xymax )quadrant = 3; else if( x>=xmin && x<=xmax && y>ymax )quadrant = 4; else if( x>xmax && y>ymax )quadrant = 5; else if( x>xmax && y>=ymin && y<=ymax )quadrant = 6; else if( x>xmax && y=xmin && x<=xmax && fabs(y-ymin)=ymin && y<=ymax )edge = 2; else if( x>=xmin && x<=xmax && fabs(ymax-y)=ymin && y<=ymax )edge = 4; return edge; } void GRA_polygon::DoClipping( double xmin, double ymin, double xmax, double ymax, std::vector &x, std::vector &y ) { std::size_t size = x_.size(); x.reserve( size ); y.reserve( size ); int edgeOut = 0; int quadrant = GetQuadrant( x_[0], y_[0], xmin, ymin, xmax, ymax ); if( quadrant == 0 ) { x.push_back( x_[0] ); y.push_back( y_[0] ); } else if( quadrant==1 || quadrant==8 || quadrant==7 )edgeOut = 1; else if( quadrant == 6 )edgeOut = 2; else if( quadrant==3 || quadrant==4 || quadrant==5 )edgeOut = 3; else if( quadrant == 2 )edgeOut = 4; int edgeInit = edgeOut; for( std::size_t i=1; i x, y; DoClipping( xmin, ymin, xmax, ymax, x, y ); // std::size_t const size = x.size(); wxPoint *pArray = new wxPoint[size]; for( std::size_t i=0; iWorldToOutputType( x[i], y[i], ix, iy ); pArray[i] = wxPoint( ix, iy ); } wxPen wxpen( dc.GetPen() ); wxpen.SetWidth( std::max(1,lineWidth_) ); wxpen.SetColour( ExGlobals::GetwxColor(lineColor_) ); dc.SetPen( wxpen ); wxBrush wxbrush( dc.GetBrush() ); if( fillColor_ ) { wxbrush.SetColour( ExGlobals::GetwxColor(fillColor_) ); wxbrush.SetStyle( wxSOLID ); dc.SetBrush( wxbrush ); dc.DrawPolygon( static_cast(size), pArray ); } wxbrush.SetStyle( wxTRANSPARENT ); dc.SetBrush( wxbrush ); dc.DrawPolygon( static_cast(size), pArray ); delete [] pArray; } std::ostream &operator<<( std::ostream &out, GRA_polygon const &p ) { out << "\n"; std::size_t size = p.x_.size(); out << ""; for( std::size_t i=0; i\n\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_fontControl.h0000644012702201742730000000233111274636605017720 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_FONTCONTROL #define GRA_FONTCONTROL #include #include #include "wx/wx.h" class GRA_font; namespace GRA_fontControl { extern std::vector fonts_; extern std::map psFontNames_; void Initialize(); void DeleteStuff(); int GetFontCode( wxString const & ); int GetFontCode( GRA_font * ); GRA_font *GetFont( wxString const & ); GRA_font *GetFont( int ); int GetCount(); wxString GetPostScriptFontName( wxString const & ); }; #endif extrema-4.4.5/src/Graphics/GRA_polarCurve.h0000644012702201742730000000745311274636605017545 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_POLARCURVE #define GRA_POLARCURVE #include #include #include "GRA_drawableObject.h" class GRA_plotSymbol; class GRA_errorBar; class GRA_color; class GRA_wxWidgets; class GRA_polarCurve : public GRA_drawableObject { public: GRA_polarCurve() : GRA_drawableObject(wxT("POLARCURVE")), popup_(false) {} GRA_polarCurve( std::vector const &r, std::vector const &theta ) : GRA_drawableObject(wxT("POLARCURVE")), popup_(false) { r_.assign( r.begin(), r.end() ); theta_.assign( theta.begin(), theta.end() ); SetUp(); } ~GRA_polarCurve(); GRA_polarCurve( GRA_polarCurve const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_polarCurve &operator=( GRA_polarCurve const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff(rhs); } return *this; } void Make(); void Draw( GRA_wxWidgets *, wxDC & ); bool Inside( double, double ); std::vector const &GetR() { return r_; } std::vector const &GetTheta() { return theta_; } void GetXYcurve( std::vector &x, std::vector &y ) { x.assign( xCurve_.begin(), xCurve_.end() ); y.assign( yCurve_.begin(), yCurve_.end() ); } friend std::ostream &operator<<( std::ostream &, GRA_polarCurve const & ); void SetValues( int, int, int, double, GRA_color*, GRA_color*, std::vector &, std::vector &, std::vector &, std::vector &, std::vector & ); GRA_color *GetColor() const { return color_; } void SetColor( GRA_color *c ) { color_ = c; } GRA_color *GetAreaFillColor() const { return areaFillColor_; } void SetAreaFillColor( GRA_color *c ) { areaFillColor_ = c; } int GetHistogramType() const { return histogramType_; } void SetHistogramType( int ht ) { histogramType_ = ht; } int GetLineType() const { return lineType_; } void SetLineType( int lt ) { lineType_ = lt; } int GetLineWidth() const { return lineWidth_; } void SetLineWidth( int lw ) { lineWidth_ = lw; } int GetPlotsymbolCode() const; void SetPlotsymbolCode( int ); GRA_color *GetPlotsymbolColor() const; void SetPlotsymbolColor( GRA_color * ); double GetPlotsymbolSize() const; void SetPlotsymbolSize( double ); double GetPlotsymbolAngle() const; void SetPlotsymbolAngle( double ); void SetPopup() { popup_ = true; } void Disconnect() { popup_ = false; } std::vector &GetPen() { return pen_; } std::vector &GetPlotSymbols() { return plotsymbols_; } private: void SetUp(); void DeleteStuff(); void CopyStuff( GRA_polarCurve const & ); // void MakeNonHistogram(); // void DrawNonHistogram( GRA_wxWidgets *, wxDC & ); // int histogramType_, lineType_, lineWidth_; GRA_color *color_, *areaFillColor_; std::vector areaFillColors_; // std::vector r_, theta_, xCurve_, yCurve_; std::vector pen_; std::vector plotsymbols_; // double xmax_; bool popup_; }; #endif extrema-4.4.5/src/Graphics/GRA_fontCharacteristic.cpp0000644012702201742730000000423511274636605021570 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_fontCharacteristic.h" #include "GRA_font.h" #include "GRA_fontControl.h" void GRA_fontCharacteristic::Set( int value ) { value_ = GRA_fontControl::GetFont(value); isAVector_ = false; } void GRA_fontCharacteristic::Set( std::vector const &values ) { std::vector().swap( values_ ); std::size_t size = values.size(); for( std::size_t i=0; i\n" << ""; for( std::size_t i=0; i\n\n"; } else { if( c.value_ != c.default_ ) { out << "\n"; } } return out; } void GRA_fontCharacteristic::CopyStuff( GRA_fontCharacteristic const &rhs ) { value_ = rhs.value_; default_ = rhs.default_; values_.assign( rhs.values_.begin(), rhs.values_.end() ); } // end of file extrema-4.4.5/src/Graphics/GRA_polarCurve.cpp0000644012702201742730000003050711274636605020074 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "GRA_polarCurve.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "UsefulFunctions.h" #include "GRA_wxWidgets.h" #include "GRA_polyline.h" #include "GRA_plotSymbol.h" #include "GRA_polygon.h" #include "GRA_errorBar.h" #include "GRA_color.h" #include "GRA_intCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_window.h" #include "GRA_colorControl.h" GRA_polarCurve::~GRA_polarCurve() { DeleteStuff(); if( popup_ )ExGlobals::DisconnectCurvePopup(); } void GRA_polarCurve::SetUp() { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *generalC = gw->GetGeneralCharacteristics(); GRA_setOfCharacteristics *curveC = gw->GetDataCurveCharacteristics(); // std::size_t rSize = r_.size(); // GRA_intCharacteristic *psCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOL"))); std::vector symbols; if( psCharacteristic->IsVector() ) { symbols.assign( psCharacteristic->Gets().begin(), psCharacteristic->Gets().end() ); std::size_t psSize = symbols.size(); for( std::size_t i=psSize; iGet(); symbols.assign( rSize, s ); } GRA_sizeCharacteristic *pssizeCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLSIZE"))); std::vector sizes; if( pssizeCharacteristic->IsVector() ) { sizes = pssizeCharacteristic->GetAsWorlds(); std::size_t pssSize = sizes.size(); for( std::size_t i=pssSize; iGetAsWorld() ); GRA_angleCharacteristic *psangleCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLANGLE"))); std::vector angles; if( psangleCharacteristic->IsVector() ) { angles.assign( psangleCharacteristic->Gets().begin(), psangleCharacteristic->Gets().end() ); std::size_t psaSize = angles.size(); for( std::size_t i=psaSize; iGet() ); GRA_colorCharacteristic *pscolorCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLCOLOR"))); std::vector colors; if( pscolorCharacteristic->IsVector() ) { colors.assign( pscolorCharacteristic->Gets().begin(), pscolorCharacteristic->Gets().end() ); std::size_t pscSize = colors.size(); for( std::size_t i=pscSize; iGet() ); GRA_intCharacteristic *pslwCharacteristic = static_cast(curveC->Get(wxT("PLOTSYMBOLLINEWIDTH"))); std::vector lws; if( pslwCharacteristic->IsVector() ) { lws.assign( pslwCharacteristic->Gets().begin(), pslwCharacteristic->Gets().end() ); std::size_t pslwSize = lws.size(); for( std::size_t i=pslwSize; iGet() ); // for( std::size_t i=0; i(curveC->Get(wxT("HISTOGRAMTYPE")))->Get(); lineType_ = static_cast(curveC->Get(wxT("CURVELINETYPE")))->Get(); lineWidth_ = static_cast(curveC->Get(wxT("CURVELINEWIDTH")))->Get(); color_ = static_cast(curveC->Get(wxT("CURVECOLOR")))->Get(); GRA_colorCharacteristic *areaFillColorCharacteristic = static_cast(generalC->Get(wxT("AREAFILLCOLOR"))); if( areaFillColorCharacteristic->IsVector() ) { areaFillColor_ = 0; areaFillColors_.assign( areaFillColorCharacteristic->Gets().begin(), areaFillColorCharacteristic->Gets().end() ); std::size_t afcSize = areaFillColors_.size(); for( std::size_t i=afcSize; iGet(); // GRA_setOfCharacteristics *polarC = gw->GetPolarCharacteristics(); xmax_ = static_cast(polarC->Get(wxT("MAX")))->Get(); } void GRA_polarCurve::DeleteStuff() { while( !plotsymbols_.empty() ) { delete plotsymbols_.back(); plotsymbols_.pop_back(); } } void GRA_polarCurve::CopyStuff( GRA_polarCurve const &rhs ) { histogramType_ = rhs.histogramType_; lineType_ = rhs.lineType_; lineWidth_ = rhs.lineWidth_; color_ = rhs.color_; areaFillColor_ = rhs.areaFillColor_; areaFillColors_.assign( rhs.areaFillColors_.begin(), rhs.areaFillColors_.end() ); // r_.assign( rhs.r_.begin(), rhs.r_.end() ); theta_.assign( rhs.theta_.begin(), rhs.theta_.end() ); xCurve_.assign( rhs.xCurve_.begin(), rhs.xCurve_.end() ); yCurve_.assign( rhs.yCurve_.begin(), rhs.yCurve_.end() ); pen_.assign( rhs.pen_.begin(), rhs.pen_.end() ); std::vector::const_iterator sEnd = rhs.plotsymbols_.end(); for( std::vector::const_iterator i=rhs.plotsymbols_.begin(); i!=sEnd; ++i ) plotsymbols_.push_back( new GRA_plotSymbol(**i) ); // xmax_ = rhs.xmax_; popup_ = rhs.popup_; } void GRA_polarCurve::Make() { MakeNonHistogram(); } void GRA_polarCurve::Draw( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { DrawNonHistogram( graphicsOutput, dc ); } bool GRA_polarCurve::Inside( double x, double y ) { std::vector xp(4,0.0), yp(4,0.0); double const eps = 0.05; int size = xCurve_.size(); for( int i=1; iGetConnectToPrevious() )pen_[i] = 2; } pen_[0] = 3; ExGlobals::GetGraphWindow()->PolarToWorld( r_, theta_, xCurve_, yCurve_ ); } void GRA_polarCurve::DrawNonHistogram( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { if( !areaFillColors_.empty() ) { areaFillColor_ = areaFillColors_[0]; std::vector().swap( areaFillColors_ ); } if( areaFillColor_ ) { // draw the filled region // make sure polygon is closed, may have to add last point set to first point // bool test = false; if( xCurve_.front()!=xCurve_.back() || yCurve_.front()!=yCurve_.back() ) { test = true; xCurve_.push_back( xCurve_.front() ); yCurve_.push_back( yCurve_.front() ); } GRA_polygon p( xCurve_, yCurve_, color_, areaFillColor_, lineWidth_ ); p.Draw( graphicsOutput, dc ); if( test ) { xCurve_.erase( xCurve_.end()-1 ); yCurve_.erase( yCurve_.end()-1 ); } } // draw the data curve itself // int lineTypeSave = graphicsOutput->GetLineType(); graphicsOutput->SetLineType( lineType_ ); wxPen wxpen( dc.GetPen() ); wxpen.SetColour( ExGlobals::GetwxColor(color_) ); wxpen.SetWidth( lineWidth_ ); dc.SetPen( wxpen ); std::size_t size = xCurve_.size(); for( std::size_t i=0; iContinueLine( xCurve_[i], yCurve_[i], dc ) : graphicsOutput->StartLine( xCurve_[i], yCurve_[i] ); } // // draw the plot symbols at the data coordinates // double xmin, ymin, xmax, ymax; ExGlobals::GetClippingBoundary( xmin, ymin, xmax, ymax ); for( std::size_t i=0; iSetLocation( xCurve_[i], yCurve_[i] ); plotsymbols_[i]->Draw( graphicsOutput, dc ); } } graphicsOutput->SetLineType( lineTypeSave ); } std::ostream &operator<<( std::ostream &out, GRA_polarCurve const &cc ) { out << "\n"; std::size_t size = cc.areaFillColors_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.r_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.xCurve_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.pen_.size(); out << ""; for( std::size_t i=0; i\n"; size = cc.plotsymbols_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } void GRA_polarCurve::SetValues( int histype, int linetype, int linewidth, double xmax, GRA_color* linecolor, GRA_color *areafillcolor, std::vector &areaFillColors, std::vector &xcurve, std::vector &ycurve, std::vector &pen, std::vector &symbols ) { histogramType_ = histype; lineType_ = linetype; lineWidth_ = linewidth; xmax_ = xmax; color_ = linecolor; areaFillColor_ = areafillcolor; areaFillColors_.assign( areaFillColors.begin(), areaFillColors.end() ); xCurve_.assign( xcurve.begin(), xcurve.end() ); yCurve_.assign( ycurve.begin(), ycurve.end() ); pen_.assign( pen.begin(), pen.end() ); plotsymbols_.assign( symbols.begin(), symbols.end() ); } int GRA_polarCurve::GetPlotsymbolCode() const { return plotsymbols_[0]->GetShapeCode(); } void GRA_polarCurve::SetPlotsymbolCode( int ps ) { int size = plotsymbols_.size(); for( int i=0; iSetShapeCode( ps ); } GRA_color *GRA_polarCurve::GetPlotsymbolColor() const { return plotsymbols_[0]->GetColor(); } void GRA_polarCurve::SetPlotsymbolColor( GRA_color *c ) { int size = plotsymbols_.size(); for( int i=0; iSetColor( c ); } double GRA_polarCurve::GetPlotsymbolSize() const { return plotsymbols_[0]->GetSize(); } void GRA_polarCurve::SetPlotsymbolSize( double s ) { int size = plotsymbols_.size(); for( int i=0; iSetSize( s ); } double GRA_polarCurve::GetPlotsymbolAngle() const { return plotsymbols_[0]->GetAngle(); } void GRA_polarCurve::SetPlotsymbolAngle( double a ) { int size = plotsymbols_.size(); for( int i=0; iSetAngle( a ); } // end of file extrema-4.4.5/src/Graphics/GRA_fontCharacteristic.h0000644012702201742730000000426311274636605021236 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_FONTCHARACTERISTIC #define GRA_FONTCHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_font; class GRA_fontCharacteristic : public GRA_characteristic { public: GRA_fontCharacteristic( wxChar const *name, GRA_font *value ) : GRA_characteristic(name,FONT,false), value_(value), default_(value) {} GRA_fontCharacteristic( wxChar const *name, std::vector const &values ) : GRA_characteristic(name,FONT,true), value_(0) { values_.assign( values.begin(), values.end() ); } ~GRA_fontCharacteristic() {} GRA_fontCharacteristic( GRA_fontCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff(rhs); } GRA_fontCharacteristic &operator=( GRA_fontCharacteristic const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Set( GRA_font *value ) { value_ = value; isAVector_ = false; } void Set( std::vector const &values ) { values_.assign( values.begin(), values.end() ); isAVector_ = true; } void Set( int ); void Set( std::vector const & ); GRA_font *Get() const { if( isAVector_ )return values_.front(); return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_fontCharacteristic const & ); private: void CopyStuff( GRA_fontCharacteristic const & ); // GRA_font *value_, *default_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_ditheringPlot.h0000644012702201742730000000604411274636605020232 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DITHERINGPLOT #define GRA_DITHERINGPLOT #include "wx/wx.h" #include "GRA_densityPlot.h" class GRA_wxWidgets; class GRA_color; class GRA_bitmap; class GRA_ditheringPlot : public GRA_densityPlot { public: GRA_ditheringPlot( std::vector &x, std::vector &y, std::vector &z, int nrow, double fmin, double fmax, double gmin, double gmax, bool xProfile, bool yProfile, bool border, bool zoom, bool axes, bool reset, bool legend, bool equallySpaced, bool areas, bool volumes, bool lines, std::vector &dither, std::vector &contourLevels ) : GRA_densityPlot(wxT("DITHERINGPLOT"), x, y, z, nrow, fmin, fmax, gmin, gmax, xProfile, yProfile, border, zoom, axes, reset, legend ), equallySpaced_(equallySpaced), areas_(areas), volumes_(volumes), lines_(lines) { dither_.assign( dither.begin(), dither.end() ); contourLevels_.assign( contourLevels.begin(), contourLevels.end() ); if( xProfile_ || yProfile_ )MakeProfiles( 0, x_.size(), 0, y_.size() ); } ~GRA_ditheringPlot() {} GRA_ditheringPlot( GRA_ditheringPlot const &rhs ) { CopyStuff(rhs); } GRA_ditheringPlot &operator=( GRA_ditheringPlot const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Draw( GRA_wxWidgets *, wxDC & ); friend std::ostream &operator<<( std::ostream &, GRA_ditheringPlot const & ); std::vector &GetAreaVec() { return areaVec_; } std::vector &GetVolumeVec() { return volumeVec_; } std::vector &GetContourVec() { return contourVec_; } std::vector &GetDither() { return dither_; } bool GetAreas() const { return areas_; } bool GetVolumes() const { return volumes_; } bool GetLines() const { return lines_; } std::vector &GetContourLevels() { return contourLevels_; } void FillBitmap( GRA_bitmap * ); void FillLegendBitmap( GRA_bitmap * ); private: void CopyStuff( GRA_ditheringPlot const & ); void DrawBitmap( GRA_wxWidgets *, wxDC & ); void DrawLegend( GRA_wxWidgets *, wxDC & ); bool equallySpaced_, areas_, volumes_, lines_; std::vector areaVec_, volumeVec_, contourVec_; std::vector contourLevels_; std::vector dither_; }; #endif extrema-4.4.5/src/Graphics/GRA_rectangle.cpp0000644012702201742730000000554011333106233017676 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include #include "GRA_rectangle.h" #include "GRA_color.h" GRA_rectangle::GRA_rectangle( double xc, double yc, double xSide, double ySide, double angle, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth,1) { SetRectangle(); double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const xs = xSide*0.5; double const ys = ySide*0.5; std::vector x, y; x.push_back(xc+RotX( xs,-ys,sinang,cosang)); y.push_back(yc+RotY( xs,-ys,sinang,cosang)); x.push_back(xc+RotX( xs, ys,sinang,cosang)); y.push_back(yc+RotY( xs, ys,sinang,cosang)); x.push_back(xc+RotX(-xs, ys,sinang,cosang)); y.push_back(yc+RotY(-xs, ys,sinang,cosang)); x.push_back(xc+RotX(-xs,-ys,sinang,cosang)); y.push_back(yc+RotY(-xs,-ys,sinang,cosang)); x.push_back(xc+RotX( xs,-ys,sinang,cosang)); y.push_back(yc+RotY( xs,-ys,sinang,cosang)); SetUp( x, y ); } GRA_rectangle::GRA_rectangle( double x1, double y1, double x2, double y2, double angle, bool square, GRA_color *lineColor, GRA_color *fillColor, int lineWidth ) : GRA_polygon(lineColor,fillColor,lineWidth,1) { SetRectangle(); double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double x22 = x1 + RotX( x2-x1, y2-y1, -sinang, cosang ); double y22 = y1 + RotY( x2-x1, y2-y1, -sinang, cosang ); if( square ) { double dx = fabs(x22 - x1); double dy = fabs(y22 - y1); if( dx < dy )y22 = y22>y1 ? (y1+dx) : (y1-dx); else if( dy < dx )x22 = x22>x1 ? (x1+dy) : (x1-dy); } std::vector x, y; x.push_back( x1 ); y.push_back( y1 ); x.push_back( x1+RotX(x22-x1,0.,sinang,cosang) ); y.push_back( y1+RotY(x22-x1,0.,sinang,cosang) ); x.push_back( x1+RotX(x22-x1,y22-y1,sinang,cosang) ); y.push_back( y1+RotY(x22-x1,y22-y1,sinang,cosang) ); x.push_back( x1+RotX(0.,y22-y1,sinang,cosang) ); y.push_back( y1+RotY(0.,y22-y1,sinang,cosang) ); x.push_back( x1 ); y.push_back( y1 ); SetUp( x, y ); } // end of file extrema-4.4.5/src/Graphics/GRA_postscript.h0000644012702201742730000000722111440742743017622 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #ifndef GRA_POSTSCRIPT #define GRA_POSTSCRIPT #include #include "wx/wx.h" class GRA_color; class GRA_font; class GRA_point; class GRA_polyline; class GRA_polygon; class GRA_multiLineFigure; class GRA_ellipse; class GRA_plotSymbol; class GRA_bitmap; class GRA_drawableText; class GRA_drawableObject; class GRA_axis; class GRA_cartesianAxes; class GRA_cartesianCurve; class GRA_polarAxes; class GRA_polarCurve; class GRA_legend; class GRA_contourLine; class GRA_densityPlot; class GRA_boxPlot; class GRA_diffusionPlot; class GRA_ditheringPlot; class GRA_gradientPlot; class GRA_window; class GRA_postscript { public: GRA_postscript() {} ~GRA_postscript(); void Initialize( wxString const & ); GRA_color *GetColor() const; void SetColor( GRA_color * ); void SetColor( int ); void SetColor( int, int, int ); void SetLineType( int ); int GetLineType() const; void SetLineWidth( int ); int GetLineWidth() const; void GetLimits( double &, double &, double &, double & ) const; void OutputTypeToWorld( int, int, double &, double & ) const; void WorldToOutputType( double, double, double &, double & ) const; void Plot( double, double, int ); void PlotPoint( double, double ); void PenUp( double, double ); void PenDown( double, double ); void StartLine( double, double ); void ContinueLine( double, double ); void DrawLineSet( int, double, double, double ); void DrawLineGet( int, double &, double &, double & ); void SetDefaultDrawLineTable(); void DrawLineScale( int, double ); void DrawLineScale( double ); void DisplayBackground( GRA_window * ); void Draw( GRA_point * ); void Draw( GRA_polyline * ); void Draw( GRA_polygon * ); void Draw( GRA_multiLineFigure * ); void Draw( GRA_ellipse * ); void Draw( GRA_plotSymbol * ); void Draw( GRA_bitmap * ); void Draw( GRA_drawableText * ); void Draw( GRA_axis * ); void Draw( GRA_cartesianAxes * ); void Draw( GRA_cartesianCurve * ); void Draw( GRA_polarAxes * ); void Draw( GRA_polarCurve * ); void Draw( GRA_legend * ); void Draw( GRA_contourLine * ); void Draw( GRA_boxPlot * ); void Draw( GRA_diffusionPlot * ); void Draw( GRA_ditheringPlot * ); void Draw( GRA_gradientPlot * ); void EndDoc(); private: void SetUpTransformationMatrices( double, double, double, double ); void GenerateOutput( double, double, int ); void DrawProfiles( GRA_densityPlot * ); void DrawAngle( wxString &, double, double, double, double, GRA_color *, GRA_font * ); std::ofstream outFile_; wxString filename_; int r_, g_, b_; int lineWidth_, lineType_; double xMin_, yMin_, xMax_, yMax_; double w2oMatrix_[2][2], w2oShift_[2]; // world to output transformation matrix double o2wMatrix_[2][2], o2wShift_[2]; // output to world transformation matrix double xPrevious_, yPrevious_; // world units int penPrevious_; bool newLine_; double drawLineTable_[3][10]; static double dotsPerInch_; int counter_; }; #endif extrema-4.4.5/src/Graphics/GRA_arrow3.cpp0000644012702201742730000001262211332164652017156 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include #include "GRA_arrow3.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_arrow3::GRA_arrow3( double xc, double yc, double side, double offset, double angle, GRA_color *lineColor, int lineWidth ) : GRA_multiLineFigure() { SetArrow3(); SetLineColor( lineColor ); SetLineWidth( lineWidth ); xc_ = xc; yc_ = yc; double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const tan20 = 0.36397023400; x_.push_back(xc+RotX(0.,-offset,sinang,cosang)); y_.push_back(yc+RotY(0.,-offset,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(0.,side-offset,sinang,cosang)); y_.push_back(yc+RotY(0.,side-offset,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-0.2*side*tan20,0.8*(side-offset),sinang,cosang)); y_.push_back(yc+RotY(-0.2*side*tan20,0.8*(side-offset),sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(0.2*side*tan20,0.8*(side-offset),sinang,cosang)); y_.push_back(yc+RotY(0.2*side*tan20,0.8*(side-offset),sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(0.,side-offset,sinang,cosang)); y_.push_back(yc+RotY(0.,side-offset,sinang,cosang)); pen_.push_back(2); } GRA_arrow3::GRA_arrow3( double x1, double y1, double x2, double y2, bool heads, GRA_color *lineColor, int lineWidth, double widthFactor, double lengthFactor ) : GRA_multiLineFigure(), headsBothEnds_(heads) { SetArrow3(); SetLineColor( lineColor ); SetLineWidth( lineWidth ); double const dx = x2 - x1; double const dy = y2 - y1; double const angle = atan2(dy,dx)+0.5*M_PI; double const cosang = cos(angle); double const sinang = sin(angle); double const length = sqrt(dx*dx+dy*dy); //double const headWidth = 0.3; //double const headLength = 0.3; double const temp = length - 15.; double headLength = 0.2+(temp/5.)*(temp/5.)*exp(-temp*temp/25.); double headWidth = 0.75*headLength; headWidth *= widthFactor; headLength *= lengthFactor; xc_ = 0.5*(x1+x2); yc_ = 0.5*(y1+y2); double const tan30 = tan(30.*M_PI/180.); if( headsBothEnds_ ) { x_.push_back(xc_+RotX(-headWidth*tan30,-0.5*length+headLength,sinang,cosang)); y_.push_back(yc_+RotY(-headWidth*tan30,-0.5*length+headLength,sinang,cosang)); pen_.push_back(3); x_.push_back(xc_+RotX(0.0,-0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,-0.5*length,sinang,cosang)); pen_.push_back(2); x_.push_back(xc_+RotX(headWidth*tan30,-0.5*length+headLength,sinang,cosang)); y_.push_back(yc_+RotY(headWidth*tan30,-0.5*length+headLength,sinang,cosang)); pen_.push_back(2); x_.push_back(xc_+RotX(0.0,-0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,-0.5*length,sinang,cosang)); pen_.push_back(3); x_.push_back(xc_+RotX(0.0,0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,0.5*length,sinang,cosang)); pen_.push_back(2); x_.push_back(xc_+RotX(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); y_.push_back(yc_+RotY(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); pen_.push_back(3); x_.push_back(xc_+RotX(0.0,0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,0.5*length,sinang,cosang)); pen_.push_back(2); x_.push_back(xc_+RotX(headWidth*tan30,0.5*length-headLength,sinang,cosang)); y_.push_back(yc_+RotY(headWidth*tan30,0.5*length-headLength,sinang,cosang)); pen_.push_back(2); } else { x_.push_back(xc_+RotX(0.0,-0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,-0.5*length,sinang,cosang)); pen_.push_back(3); x_.push_back(xc_+RotX(0.0,0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,0.5*length,sinang,cosang)); pen_.push_back(2); x_.push_back(xc_+RotX(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); y_.push_back(yc_+RotY(-headWidth*tan30,0.5*length-headLength,sinang,cosang)); pen_.push_back(3); x_.push_back(xc_+RotX(0.0,0.5*length,sinang,cosang)); y_.push_back(yc_+RotY(0.0,0.5*length,sinang,cosang)); pen_.push_back(2); x_.push_back(xc_+RotX(headWidth*tan30,0.5*length-headLength,sinang,cosang)); y_.push_back(yc_+RotY(headWidth*tan30,0.5*length-headLength,sinang,cosang)); pen_.push_back(2); } } /* std::ostream &operator<<( std::ostream &out, GRA_arrow3 const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } */ // end of file extrema-4.4.5/src/Graphics/GRA_contourLine.h0000644012702201742730000000533211440750022017677 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #ifndef GRA_CONTOURLINE #define GRA_CONTOURLINE #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_color; class GRA_wxWidgets; class GRA_drawableText; class GRA_contourLine : public GRA_drawableObject { public: GRA_contourLine() : GRA_drawableObject(wxT("CONTOUR")) {} GRA_contourLine( double level, std::vector const &x, std::vector const &y, GRA_color *color, int ltype, int lwidth ) : GRA_drawableObject(wxT("CONTOUR")), level_(level), color_(color), lineType_(ltype), lineWidth_(lwidth) { xData_.assign( x.begin(), x.end() ); yData_.assign( y.begin(), y.end() ); } ~GRA_contourLine() {} GRA_contourLine( GRA_contourLine const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_contourLine &operator=( GRA_contourLine const &rhs ) { if( this != &rhs ) { type_ = rhs.type_; CopyStuff(rhs); } return *this; } void Make(); void Draw( GRA_wxWidgets *, wxDC & ); double const GetLevel() { return level_; } std::vector< std::vector > const &GetXCurve() { return xCurve_; } std::vector< std::vector > const &GetYCurve() { return yCurve_; } friend std::ostream &operator<<( std::ostream &, GRA_contourLine const & ); void SetValues( int, int, GRA_color*, double, std::vector< std::vector > &, std::vector< std::vector > & ); GRA_color *GetColor() const { return color_; } void SetColor( GRA_color *c ) { color_ = c; } int GetLineType() const { return lineType_; } void SetLineType( int lt ) { lineType_ = lt; } int GetLineWidth() const { return lineWidth_; } void SetLineWidth( int lw ) { lineWidth_ = lw; } private: void CopyStuff( GRA_contourLine const & ); // double level_; int lineType_, lineWidth_; GRA_color *color_; // std::vector xData_, yData_; std::vector< std::vector > xCurve_, yCurve_; }; #endif extrema-4.4.5/src/Graphics/GRA_asterisk.cpp0000644012702201742730000000602211274636605017572 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_asterisk.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_asterisk::GRA_asterisk( double xc, double yc, double side, double angle, GRA_color *lineColor, int lineWidth ) : GRA_multiLineFigure() { SetLineColor( lineColor ); SetLineWidth( lineWidth ); xc_ = xc; yc_ = yc; double cosang = cos(angle*M_PI/180.); double sinang = sin(angle*M_PI/180.); double const eps = 0.000001; if( fabs(cosang) < eps )cosang = 0.0; if( fabs(sinang) < eps )sinang = 0.0; double const cs45 = 0.70710678119; double const temp = side*0.5; double const temp2 = side*0.5*cs45; x_.push_back(xc+RotX(temp,0.,sinang,cosang)); y_.push_back(yc+RotY(temp,0.,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(-temp,0.,sinang,cosang)); y_.push_back(yc+RotY(-temp,0.,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(temp2,temp2,sinang,cosang)); y_.push_back(yc+RotY(temp2,temp2,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(-temp2,-temp2,sinang,cosang)); y_.push_back(yc+RotY(-temp2,-temp2,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(0.,temp,sinang,cosang)); y_.push_back(yc+RotY(0.,temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(0.,-temp,sinang,cosang)); y_.push_back(yc+RotY(0.,-temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-temp2,temp2,sinang,cosang)); y_.push_back(yc+RotY(-temp2,temp2,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(temp2,-temp2,sinang,cosang)); y_.push_back(yc+RotY(temp2,-temp2,sinang,cosang)); pen_.push_back(2); } std::ostream &operator<<( std::ostream &out, GRA_asterisk const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_doubleCharacteristic.h0000644012702201742730000000412011274636605021532 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_DOUBLECHARACTERISTIC #define GRA_DOUBLECHARACTERISTIC #include #include #include "GRA_characteristic.h" class GRA_doubleCharacteristic : public GRA_characteristic { public: GRA_doubleCharacteristic( wxChar const *name, double value ) : GRA_characteristic(name,DOUBLE,false), value_(value), default_(value) {} GRA_doubleCharacteristic( wxChar const *name, std::vector const &values ) : GRA_characteristic(name,DOUBLE,true), value_(0.0) { values_.assign( values.begin(), values.end() ); } ~GRA_doubleCharacteristic() {} GRA_doubleCharacteristic( GRA_doubleCharacteristic const &rhs ) : GRA_characteristic(rhs) { CopyStuff( rhs ); } GRA_doubleCharacteristic &operator=( GRA_doubleCharacteristic const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void Set( double value ) { value_ = value; isAVector_ = false; } void Set( std::vector const &values ) { values_.assign( values.begin(), values.end() ); isAVector_ = true; } double Get() const { return value_; } std::vector &Gets() { return values_; } friend std::ostream &operator<<( std::ostream &, GRA_doubleCharacteristic const & ); private: void CopyStuff( GRA_doubleCharacteristic const &rhs ); // double value_, default_; std::vector values_; }; #endif extrema-4.4.5/src/Graphics/GRA_thiessenTriangulation.cpp0000644012702201742730000016014411274636605022336 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_thiessenTriangulation.h" #include "EGraphicsError.h" GRA_thiessenTriangulation::GRA_thiessenTriangulation( std::vector x, std::vector y, std::vector z ) : theX(x), theY(y), theZ(z) { theNumberOfNodes = theX.size(); if( theNumberOfNodes < 3 ) throw EGraphicsError( wxT("ThiessenTriangulation: number of nodes < 3") ); // iadj.resize( 6*theNumberOfNodes-9, 0 ); iend.resize( theNumberOfNodes, 0 ); xPartials.resize( theNumberOfNodes, 0.0 ); yPartials.resize( theNumberOfNodes, 0.0 ); // // Use an order n*log(n) quick sort to reorder the array theX into increasing order // A record of the permutations applied to theX is stored in ind, and these // permutations are applied to two additional vectors // std::vector ind( theNumberOfNodes ); QuickSort( ind ); Permute( ind, theX ); Permute( ind, theY ); Permute( ind, theZ ); } GRA_thiessenTriangulation::~GRA_thiessenTriangulation() {} GRA_thiessenTriangulation::GRA_thiessenTriangulation( GRA_thiessenTriangulation const & ) {} GRA_thiessenTriangulation &GRA_thiessenTriangulation::operator=( GRA_thiessenTriangulation const &rhs ) { return *this; } void GRA_thiessenTriangulation::QuickSort( std::vector &ind ) { // This routine uses an order n*log(n) quick sort to sort the array theX into // increasing order. The algorithm follows: // // ind is initialized to the ordered sequence of indices 1,...,n, and all interchanges // are applied to ind. theX is divided into two portions by picking a central element // t. The first and last elements are compared with t, and interchanges are applied // as necessary so that the three values are in ascending order. Interchanges are then // applied so that all elements greater than t are in the upper portion of the array // and all elements less than t are in the lower portion. The upper and lower indices // of one of the portions are saved in local arrays, and the process is repeated // iteratively on the other portion. When a portion is completely sorted, the process // begins again by retrieving the indices bounding another unsorted portion. // // iu and il are temporary storage for the upper and lower indices of portions of theX // iu and il must be dimensioned >= log(theNumberOfNodes) where log has base 2. // double dn = static_cast(theNumberOfNodes); size_t n = static_cast(log(dn)/log(2.)+0.5); std::vector iu( n ); std::vector il( n ); // // initialize ind, m, i, j, and r // for( size_t i=1; i<=theNumberOfNodes; ++i )ind[i-1] = i; size_t m = 1; // index for iu and il size_t i = 1; // lower index of a portion of theX size_t j = theNumberOfNodes; // upper index for a portion of theX double r = 0.375; // pseudo random number for generating index between i and j // // top of loop // size_t k, ij, it, itt, indx, l; double t; L2: if( i >= j )goto L10; r > 0.5898437 ? r -= 0.21875 : r += 0.0390625; L4: k = i; // initialize k // // select a central element of x and save it in t // ij = i + static_cast(r*(j-i)); it = ind[ij-1]; t = theX[it-1]; // central element of theX // // if the first element of the array is greater than t, interchange it with t // indx = ind[i-1]; if( theX[indx-1] <= t )goto L5; ind[ij-1] = indx; ind[i-1] = it; it = indx; t = theX[it-1]; L5: l = j; // initialize l // // if the last element of the array is less than t, interchange it with t // indx = ind[j-1]; if( theX[indx-1] >= t )goto L7; ind[ij-1] = indx; ind[j-1] = it; it = indx; t = theX[it-1]; // // if the first element of the array is greater than t, interchange it with t // indx = ind[i-1]; if( theX[indx-1] <= t )goto L7; ind[ij-1] = indx; ind[i-1] = it; it = indx; t = theX[it-1]; goto L7; L6: // // interchange elements k and l // itt = ind[l-1]; ind[l-1] = ind[k-1]; ind[k-1] = itt; L7: // // find an element in the upper part of the array which is not larger than t // --l; indx = ind[l-1]; if( theX[indx-1] > t )goto L7; L8: // // find an element in the lower part of the array which is not smaller than t // ++k; indx = ind[k-1]; if( theX[indx-1] < t )goto L8; if( k <= l )goto L6; // // save the upper and lower subscripts of the portion of the array yet to be sorted // if( l-i <= j-k ) { il[m-1] = k; iu[m-1] = j; j = l; } else { il[m-1] = i; iu[m-1] = l; i = k; } ++m; goto L11; L10: // // begin again on another unsorted portion of the array // if( --m == 0 )return; i = il[m-1]; j = iu[m-1]; L11: if( j-i >= 11 )goto L4; if( i == 1 )goto L2; --i; L12: ++i; if( i == j )goto L10; indx = ind[i]; t = theX[indx-1]; it = indx; indx = ind[i-1]; if( theX[indx-1] <= t )goto L12; k = i; L13: ind[k] = ind[k-1]; --k; indx = ind[k-1]; if( t < theX[indx-1] )goto L13; ind[k] = it; goto L12; } void GRA_thiessenTriangulation::Permute( std::vector &ip, std::vector &a ) { // This routine applies a set of permutations to a vector. // size_t const n = a.size(); size_t k = 1; // index for ind and for the first element of a in a permutation size_t j, ipj; double temp; L1: j = k; temp = a[k-1]; L2: // // Apply permutation to a. ip(j) is marked (made negative) // as being included in the permutation // ipj = ip[j-1]; ip[j-1] = -1*ipj; if( ipj == k )goto L3; a[j-1] = a[ipj-1]; j = ipj; goto L2; L3: a[j-1] = temp; L4: // // search for an unmarked element of ip // if( ++k > n )goto L5; if( ip[k-1] > 0 )goto L1; goto L4; L5: for( size_t k=1; k<=n; ++k )ip[k-1] = -ip[k-1]; return; // all permutations have been applied } void GRA_thiessenTriangulation::CreateMesh() { // Algorithm 624, Collected Algorithms from ACM. // ACM-Trans. Math. Software, vol.10, no. 4, Dec. 1984, p. 437 // // This routine is called from outside. // // This routine creates a Thiessen triangulation of n arbitrarily spaced // points in the plane referred to as nodes. The triangulation is optimal // in the sense that it is as nearly equiangular as possible. This routine // is part of an interpolation package which also provides routines to // reorder the nodes, add a new node, delete an arc, plot the mesh, and // print the data structure. Unless the nodes are already ordered in some // reasonable fashion, they should be reordered by routine reordr for // increased efficiency before calling this routine. // // initialize // iend[0] = 1; iend[1] = 2; double xl = theX[0]; double yl = theY[0]; double xr = theX[1]; double yr = theY[1]; size_t k = 2; // // begin loop on nodes 3,4,... // double dxr = xr-xl; double dyr = yr-yl; // // next loop begins here if nl and nr are unchanged // // nl,nr leftmost and rightmost nodes in iend as viewed from the right // of 1-2 when iend contains the initial ordered set of nodal indices // cprod vector cross product of nl-nr and nl-k // used to determine the position of node k with respect to the // line defined by the nodes in iend // sprod scalar product used to determine the interval containing node k // when k is on the line defined by the nodes in iend double sprod; size_t nl, nr, indx, n0, itemp, km1, km1d2, kmi; double xk, yk, dxk, dyk, cprod; size_t kmin; L2: if( k == theNumberOfNodes )throw EGraphicsError( wxT("all nodes are collinear") ); km1 = k++; xk = theX[k-1]; yk = theY[k-1]; dxk = xk-xl; dyk = yk-yl; cprod = dxr*dyk - dxk*dyr; if( cprod > 0. )goto L6; if( cprod < 0. )goto L8; // // node k lies on the line containing nodes 1,2,...,k-1. // set sprod to (nl-nr,nl-k). // sprod = dxr*dxk + dyr*dyk; if( sprod > 0. ) { // // node k is to the right of nl. find the leftmost node // n0 which lies to the right of k. // set sprod to (n0-nl,n0-k). // for( size_t ind=2; ind<=km1; ++ind ) { n0 = iend[ind-1]; sprod = (xl-theX[n0-1])*(xk-theX[n0-1]) + (yl-theY[n0-1])*(yk-theY[n0-1]); if( sprod >= 0. ) // node k lies between iend(ind-1) and iend[ind-1] { // insert k in iend Shift( ind, km1, 1, iend ); iend[ind-1] = k; goto L2; } } // // node k is to the right of nr // insert k as the last (rightmost) node in iend and set nr to k // iend[k-1] = k; xr = xk; yr = yk; } else { // // node k is to the left of nl // insert k as the first (leftmost) node in iend and set nl to k // Shift( 1, km1, 1, iend ); iend[0] = k; xl = xk; yl = yk; } dxr = xr-xl; dyr = yr-yl; goto L2; // // node k is to the left of nl-nr. reorder iend so that nl // is the leftmost node as viewed from k. // L6: km1d2 = km1/2; for( size_t i=1; i<=km1d2; ++i ) { kmi = k-i; itemp = iend[i-1]; iend[i-1] = iend[kmi-1]; iend[kmi-1] = itemp; } // // node k is to the right of nl-nr. create a triangulation // consisting of nodes 1,2,...,k. // L8: nl = iend[0]; nr = iend[km1-1]; // // create the adjacency lists for the first k-1 nodes. // insert neighbors in reverse order. each node has four // neighbors except nl and nr which have three. // for( size_t ind=1; ind<=km1; ++ind ) { n0 = iend[ind-1]; indx = 4*n0; if( n0 >= nl )--indx; if( n0 >= nr )--indx; iadj[indx-1] = 0; --indx; if( ind < km1 )iadj[indx-1] = iend[ind]; if( ind < km1 )--indx; iadj[indx-1] = k; if( ind > 1 )iadj[indx-2] = iend[ind-2]; } // // create the adjacency list for node k // indx = 5*km1 - 1; iadj[indx-1] = 0; for( size_t ind=1; ind<=km1; ++ind ) { --indx; iadj[indx-1] = iend[ind-1]; } // // replace iend elements with pointers to iadj // indx = 0; for( size_t ind=1; ind<=km1; ++ind ) { indx += 4; if( ind==nl || ind==nr )--indx; iend[ind-1] = indx; } indx += k; iend[k-1] = indx; // // add the remaining nodes to the triangulation // if( k == theNumberOfNodes )return; kmin = k+1; try { for( size_t k=kmin; k<=theNumberOfNodes; ++k )AddNode( k ); } catch (EGraphicsError &e) { throw; } } void GRA_thiessenTriangulation::Gradients( double eps, size_t &numberOfIterations ) { // This routine is called from outside. // // Given a triangulation of nodes in the plane with associated data values, // this routine uses a global method to compute estimated gradients at the nodes. // The method consists of minimizing a quadratic functional Q(g) over the // n-vector g of gradients where Q approximates the linearized curvature of an // interpolant F over the triangulation. The restriction of F to an arc of the // triangulation is taken to be the Hermite cubic interpolant of the data values // and tangential gradient components at the endpoints of the arc, and Q is the // sum of the linearized curvatures of F along the arcs -- the integrals over the // arcs of d2f(t)^2 where d2f(t) is the second derivative of F with respect to // distance t along the arc. This minimization problem corresponds to an order 2n // symmetric positive-definite sparse linear system which is solved for the x and y // partial derivatives by the block Gauss-Seidel method with 2 by 2 blocks. // // eps - convergence criterion // The method is terminated when the maximum change in a // gradient component between iterations is at most eps // eps = 1.e-2 is sufficient for effective convergence // numberOfIterations - maximum number of Gauss-Seidel iterations to be applied // This maximum will likely be achieved if eps is smaller than // the machine precision. Optimal efficiency was achieved in // testing with eps = 0 and numberOfIterations = 3 or 4 // When finished, it is number of iterations actually used // size_t maxit = numberOfIterations; size_t iter = 0; // number of iterations used double dgmax, xk, yk, zk, zxk, zyk, a11, a12, a22, r1, r2; size_t indl, indf; // // top of iteration loop // L1: if( iter == maxit )throw EGraphicsError( wxT("Gradients: method failed to converge within given number of iterations") ); dgmax = 0.; indl = 0; for( size_t k=1; k<=theNumberOfNodes; ++k ) { xk = theX[k-1]; yk = theY[k-1]; zk = theZ[k-1]; zxk = xPartials[k-1]; zyk = yPartials[k-1]; // // initialize components of the 2 by 2 system // a11 = 0.; a12 = 0.; a22 = 0.; r1 = 0.; r2 = 0.; // // loop on neighbors nb of k // indf = indl + 1; indl = iend[k-1]; for( size_t indx=indf; indx<=indl; ++indx ) { size_t nb = iadj[indx-1]; if( nb != 0 ) { // // compute the components of arc nb-k // double delx = theX[nb-1] - xk; double dely = theY[nb-1] - yk; double delxs = delx*delx; double delys = dely*dely; double dsq = delxs + delys; double dcub = dsq*sqrt(dsq); // // update the system components for node nb // a11 = a11 + delxs/dcub; a12 = a12 + delx*dely/dcub; a22 = a22 + delys/dcub; double t = ( 1.5*(theZ[nb-1]-zk) - ((xPartials[nb-1]/2.+zxk)*delx + (yPartials[nb-1]/2.+zyk)*dely) )/dcub; r1 += t*delx; r2 += t*dely; } } // // solve the 2 by 2 system and update dgmax // double dzy = (a11*r2 - a12*r1)/(a11*a22 - a12*a12); double dzx = (r1 - a12*dzy)/a11; dgmax = std::max(dgmax,std::max(fabs(dzx),fabs(dzy))); // // update the partials at node k // xPartials[k-1] = zxk + dzx; yPartials[k-1] = zyk + dzy; } // // increment iter and test for convergence // ++iter; if( dgmax > eps )goto L1; // // method converged // numberOfIterations = iter; return; /* do { if( iter == maxit )throw EGraphicsError( "Gradients: method failed to converge within given number of iterations" ); // dgmax = 0.; // maximum change in a gradient component between iterations size_t indf; // iadj index of the first neighbor of k size_t indl = 0; // iadj index of the last neighbor of k for( size_t k=0; k eps ); // // method converged // numberOfIterations = iter; */ } void GRA_thiessenTriangulation::Interpolate( size_t nx, size_t ny, std::vector &px, std::vector &py, std::vector &zz ) { // This routine is called from outside. // // Given a Thiessen triangulation of a set of points in the plane with corresponding // data values, this routine interpolates the data values to a set of rectangular // grid points for such applications as contouring. The interpolant is once // continuously differentiable. Extrapolation is performed at grid points exterior // to the triangulation. // // nx,ny - number of rows and columns in the rectangular grid // px,py - vectors of length nx and ny containing the // coordinates of the grid lines // zz - nrow by ncol array with nrow >= nx and ncol >= ny // When finished zz will contain interpolated values at the grid // points. zz[j-1+(i-1)*ny] = f(py[j-1],px[i-1]) for i = 1,...,nx // and j = 1,...,ny. // if( nx<1 )throw EGraphicsError( wxT("Interpolate: nx < 1") ); if( ny<1 )throw EGraphicsError( wxT("Interpolate: ny < 1") ); size_t ist = 1; try // compute interpolated values { for( size_t j=0; j= 4 - index of the node to be added to the mesh // // initialization // size_t km1 = k-1; double xk = theX[k-1]; double yk = theY[k-1]; // // add node k to the mesh // size_t i1, i2, i3; Find( km1, xk, yk, i1, i2, i3 ); if( i1 == 0 ) throw EGraphicsError( wxT("all nodes are collinear") ); if( i3 == 0 )AddBoundaryNode( k, i1, i2 ); if( i3 != 0 )AddInteriorNode( k, i1, i2, i3 ); // // initialize variables for optimization of the mesh // size_t indkF = iend[km1-1] + 1; // iadj index of the first neighbor of k size_t const indkL = iend[k-1]; // iadj index of the last neighbor of k size_t const nabor1 = iadj[indkF-1]; // first neighbor of k before any swaps occur size_t io2 = nabor1; // to be tested for a swap size_t indk1 = indkF + 1; // index of io1 in the adjacency list for k size_t io1 = iadj[indk1-1]; // adjacent neighbors of k defining an arc // // begin loop -- find the vertex opposite k // size_t in1, ind2f, ind21; L1: ind2f = 1; if( io2 != 1 )ind2f = iend[io2-2] + 1; ind21 = Index( io2, io1 ); if( ind2f == ind21 )goto L2; in1 = iadj[ind21-2]; goto L3; // // in1 is the last neighbor of io2 // L2: ind21 = iend[io2-1]; in1 = iadj[ind21-1]; if( in1 == 0 )goto L4; L3: if( !SwapTest( in1, k, io1, io2 ) )goto L4; Swap( in1, k, io1, io2 ); io1 = in1; --indk1; --indkF; goto L1; // // no swap occurred. reset io2 and io1, and test for termination. // L4: if( io1 != nabor1 ) { io2 = io1; if( ++indk1 > indkL )indk1 = indkF; io1 = iadj[indk1-1]; if( io1 != 0 )goto L1; } return; } void GRA_thiessenTriangulation::AddBoundaryNode( size_t k, size_t right, size_t left ) { // This routine adds a boundary node to a triangulation of a set of k-1 // points in the plane. iadj and iend are updated with the insertion of node k // // k >= 4 - index of an exterior node to be added // right - first (rightmost as viewed from k) boundary node in the mesh // which is visible from k - the line segment k-right intersects no arcs // left - last (leftmost) boundary node which is visible from k // // iadj and iend are updated with the addition of node k as the last entry // node k will be connected to i1, i2, and all boundary nodes between them // no optimization of the mesh is performed // // local parameters - // nF,nL indices of iadj bounding the portion of the array to be shifted // n1,n2 iadj index of the first(last) neighbor of left(right) // imin,imax first(last) elements of iend to be incremented // kend pointer to the last neighbor of k in iadj // next next boundary node to be connected to kk // // initialize variables // size_t nL = iend[k-2]; size_t n1 = 1; if( left != 1 )n1 = iend[left-2] + 1; size_t n2 = iend[right-1]; size_t nF = std::max(n1,n2); // // insert k as a neighbor of max(right,left) // Shift( nF, nL, 2, iadj ); iadj[nF] = k; size_t imin = std::max(right,left); for( size_t i=imin; i<=k-1; ++i )iend[i-1] += 2; // // initialize kend and insert k as a neighbor of min(right,left) // size_t kend = nL + 3; nL = nF - 1; nF = std::min(n1,n2); Shift( nF, nL, 1, iadj ); iadj[nF-1] = k; size_t imax = imin - 1; imin = std::min(right,left); for( size_t i=imin; i<=imax; ++i )iend[i-1] += 1; // // insert right as the first neighbor of k // iadj[kend-1] = right; // // initialize indx for loop on boundary nodes between right and left // size_t indx = iend[right-1] - 2; size_t next; L3: next = iadj[indx-1]; if( next == left )goto L4; // // connect next and k // ++kend; iadj[kend-1] = next; indx = iend[next-1]; iadj[indx-1] = k; --indx; goto L3; L4: iadj[kend] = left; kend += 2; iadj[kend-1] = 0; iend[k-1] = kend; return; } void GRA_thiessenTriangulation::AddInteriorNode( size_t k, size_t i1, size_t i2, size_t i3 ) { // This routine adds an interior node to a triangulation of a set of k-1 points // in the plane. iadj and iend are updated with the insertion of node k in the // triangle whose vertices are i1, i2, and i3. // // k >= 4 - index of node to be inserted // i1,i2,i3 - indices of the vertices of a triangle containing node k // in counterclockwise order // size_t n[] = {i1, i2, i3}; size_t nft[3]; // indices of the tops of the 3 sets of iadj elements // to be shifted downward for( size_t i=1; i<=3; ++i ) { size_t n1 = n[i-1]; size_t index = i%3 + 1; size_t n2 = n[index-1]; index = iend[n1-1] + 1; // // find the index of n2 as a neighbor of n[i] // L1: --index; if( iadj[index-1] != n2 )goto L1; nft[i] = index + 1; } // // order the vertices by decreasing magnitude. // n(ip(i+1)) precedes n(ip[i-1]) in iend for // i = 1,2. // size_t ip1 = 1; size_t ip2 = 2; size_t ip3 = 3; size_t temp; if( n[1] <= n[0] )goto L3; ip1 = 2; ip2 = 1; L3: if( n[2] <= n[ip1-1] )goto L4; ip3 = ip1; ip1 = 3; L4: if( n[ip3-1] <= n[ip2-1] )goto L5; temp = ip2; ip2 = ip3; ip3 = temp; L5: // // add node k to the adjacency lists of each vertex and update iend // for each vertex, a set of iadj elements is shifted downward and k is inserted // shifting starts at the end of the array // size_t km1 = k - 1; size_t nL = iend[km1-1]; // index of last entry in iadj to be shifted down size_t nF = nft[ip1-1]; // index of first entry in iadj to be shifted down if( nF <= nL )Shift( nF, nL, 3, iadj ); iadj[nF+1] = k; size_t imin = n[ip1-1]; // first element of iend to be incremented size_t imax = km1; // last element of iend to be incremented for( size_t i=imin; i<=imax; ++i )iend[i-1] += 3; nL = nF - 1; nF = nft[ip2-1]; Shift( nF, nL, 2, iadj ); iadj[nF] = k; imax = imin - 1; imin = n[ip2-1]; for( size_t i=imin; i<=imax; ++i )iend[i-1] += 2; nL = nF - 1; nF = nft[ip3-1]; Shift( nF, nL, 1, iadj ); iadj[nF-1] = k; imax = imin - 1; imin = n[ip3-1]; for( size_t i=imin; i<=imax; ++i )iend[i-1] += 1; // // add node k to iend and its neighbors to iadj // size_t index = iend[km1-1]; iend[k-1] = index + 3; for( size_t i=1; i<=3; ++i ) { ++index; iadj[index-1] = n[i-1]; } } size_t GRA_thiessenTriangulation::Index( size_t vertex, size_t nabor ) { // This function returns the index of nabor in the adjacency list for nvertx // // vertex - node whose adjacency list is to be searched // nabor - node whose index is to be returned // nabor must be connected to nvertx // size_t index = iend[vertex-1] + 1; // // search the list of nvertx neighbors for nb // L1: --index; if( iadj[index-1] != nabor )goto L1; return index; } void GRA_thiessenTriangulation::Shift( size_t nF, size_t nL, int k, std::vector &array ) { // This routine shifts a set of contiguous elements of an integer array k // positions downward (upward if k < 0). The loops are unrolled in order to // increase efficiency. // // nF,nL - bounds on the portion of array to be shifted // All elements between and including the bounds are shifted unless // nfrst > nlast, in which case no shift occurs // k - number of positions each element is to be shifted // if k < 0 shift up, if k > 0 shift down // array - array of length >= nlast + max(k,0) // if( nF>nL || k==0 )return; size_t nlp1 = nL + 1; size_t ns = nlp1 - nF; // number of shifts size_t const inc = 5; size_t nsl = inc*(ns/inc); // number of shifts done in unrolled for-loop if( k < 0 )goto L4; // // shift downward starting from the bottom // if( nsl <= 0 )goto L2; size_t ibak, indx; for( size_t i=1; i<=nsl; i+=inc ) { ibak = nlp1 - i; indx = ibak + k; array[indx-1] = array[ibak-1]; array[indx-2] = array[ibak-2]; array[indx-3] = array[ibak-3]; array[indx-4] = array[ibak-4]; array[indx-5] = array[ibak-5]; } // // perform the remaining ns-nsl shifts one at a time // L2: ibak = nlp1 - nsl; L3: if( ibak <= nF )return; --ibak; indx = ibak + k; array[indx-1] = array[ibak-1]; goto L3; // // shift upward starting from the top // L4: if( nsl <= 0 )goto L6; for( size_t i=nF; i<=nlp1-inc; i+=inc ) { indx = i + k; array[indx-1] = array[i-1]; array[indx] = array[i]; array[indx+1] = array[i+1]; array[indx+2] = array[i+2]; array[indx+3] = array[i+3]; } // // perform the remaining ns-nsl shifts one at a time // L6: size_t i = nsl + nF; L7: if( i > nL )return; indx = i + k; array[indx-1] = array[i-1]; ++i; goto L7; } void GRA_thiessenTriangulation::Swap( size_t nin1, size_t nin2, size_t nout1, size_t nout2 ) { // // This routine swaps the diagonals in a convex quadrilateral // // nin1,nin2,nout1,nout2 - nodal indices of a pair of adjacent triangles // which form a convex quadrilateral. // nout1 and nout2 are connected by an arc which is to be replaced by the // arc nin1-nin2. // (nin1,nout1,nout2) must be triangle vertices in counterclockwise order // size_t in[] = { nin1, nin2 }; // nin1 and nin2 ordered by increasing magnitude // (the neighbors of in[0] precede those of in[1] in iadj) size_t io[] = { nout1, nout2 }; // nout1 and nout2 in increasing order // // ip1 and ip2 are permutations of (1,2) such that io[ip1-1] // precedes io[ip2-1] as a neighbor of in[0] // size_t ip1=1, ip2; // // order the indices so that in[0] < in[1] and io[0] < io(2), // and choose ip1 and ip2 such that (in[0],io[ip1-1],io[ip2-1]) forms a triangle // if( in[0] < in[1] )goto L1; in[0] = in[1]; in[1] = nin1; ip1 = 2; L1: if( io[0] < io[1] )goto L2; io[0] = io[1]; io[1] = nout1; ip1 = 3 - ip1; L2: ip2 = 3 - ip1; if( io[1] < in[0] ) // the vertices are ordered (io[0],io[1],in[0],in[1]) { // delete io[1] by shifting up by 1 size_t nf = 1 + Index( io[0], io[1] ); size_t nl = -1 + Index( io[1], io[0] ); if( nf <= nl )Shift( nf, nl, -1, iadj ); for( size_t i=io[0]; i<=io[1]-1; ++i )iend[i-1] -= 1; // // delete io[0] by shifting up by 2 and insert in[1] // nf = nl + 2; nl = -1 + Index( in[0], io[ip2-1] ); if( nf <= nl )Shift( nf, nl, -2, iadj ); iadj[nl-2] = in[1]; for( size_t i=io[1]; i<=in[0]-1; ++i )iend[i-1] -= 2; // // shift up by 1 and insert in[0] // nf = nl + 1; nl = -1 + Index( in[1], io[ip1-1] ); Shift( nf, nl, -1, iadj ); iadj[nl-1] = in[0]; for( size_t i=in[0]; i<=in[1]-1; ++i )iend[i-1] -= 1; } else if( in[1] < io[0] ) // the vertices are ordered (in[0],in[1],io[0],io[1]) { // delete io[0] by shifting down by 1 size_t nf = 1 + Index( io[0], io[1] ); size_t nl = -1 + Index( io[1], io[0] ); if( nf <= nl )Shift( nf, nl, 1, iadj ); for( size_t i=io[0]; i<=io[1]-1; ++i )iend[i-1] += 1; // // delete io[1] by shifting down by 2 and insert in[0] // nl = nf - 2; nf = 1 + Index( in[1], io[ip2-1] ); if( nf <= nl )Shift( nf, nl, 2, iadj ); iadj[nf] = in[0]; for( size_t i=in[1]; i<=io[0]-1; ++i )iend[i-1] += 2; // // shift down by 1 and insert in[1] // nl = nf - 1; nf = 1 + Index( in[0], io[ip1-1] ); Shift( nf, nl, 1, iadj ); iadj[nf-1] = in[1]; for( size_t i=in[0]; i<=in[1]-1; ++i )iend[i-1] += 1; } else // in[0] and io[0] precede in[1] and io[1] { // for (j,k) = (0,1) and (1,0), delete io[k-1] as a neighbor of io[j-1] // by shifting a portion of iadj either up or down and // and insert in[k-1] as a neighbor of in[j-1] // for( size_t j=1; j<=2; ++j ) { size_t k = 3 - j; if( in[j-1] <= io[j-1] ) // the neighbors of in[j-1] precede those of io[j-1] { // shift down by 1 size_t nf = 1 + Index( in[j-1], io[ip1-1] ); size_t nl = -1 + Index( io[j-1], io[k-1] ); if( nf <= nl )Shift( nf, nl, 1, iadj ); iadj[nf-1] = in[k-1]; for( size_t i=in[j-1]; i<=io[j-1]-1; ++i )iend[i-1] += 1; } else // the neighbors of io[j-1] precede those of in[j-1] { // shift up by 1 size_t nf = 1 + Index( io[j-1], io[k-1] ); size_t nl = -1 + Index( in[j-1], io[ip2-1] ); if( nf <= nl )Shift( nf, nl, -1, iadj ); iadj[nl-1] = in[k-1]; for( size_t i=io[j-1]; i<=in[j-1]-1; ++i )iend[i-1] -= 1; } // // reverse (ip1,ip2) for (j,k) = (1,0) // ip1 = ip2; ip2 = 3 - ip1; } } } bool GRA_thiessenTriangulation::SwapTest( size_t in1, size_t in2, size_t io1, size_t io2 ) { // // This function decides whether or not to replace a diagonal arc in a // quadrilateral with the other diagonal. The determination is based on // the sizes of the angles contained in the 2 triangles defined by the diagonal. // The diagonal is chosen to maximize the smallest of the six angles over the // two pairs of triangles. // // in1,in2,io1,io2 - node indices of the four points defining the quadrilateral // io1 and io2 are currently connected by a diagonal arc // This arc should be replaced by an arc connecting in1, in2 if // the decision is made to swap. // in1,io1,io2 must be in counterclockwise order // SwapTest returns true iff the arc connecting io1 and io2 is to be replaced // // compute the vectors containing the angles t1, t2 // double dx11 = theX[io1-1] - theX[in1-1]; double dx12 = theX[io2-1] - theX[in1-1]; double dx22 = theX[io2-1] - theX[in2-1]; double dx21 = theX[io1-1] - theX[in2-1]; // double dy11 = theY[io1-1] - theY[in1-1]; double dy12 = theY[io2-1] - theY[in1-1]; double dy22 = theY[io2-1] - theY[in2-1]; double dy21 = theY[io1-1] - theY[in2-1]; // // compute inner products // double cos1 = dx11*dx12 + dy11*dy12; double cos2 = dx22*dx21 + dy22*dy21; // // the diagonals should be swapped iff (t1+t2) > 180 degrees // the following two tests insure numerical stability // if( cos1>=0. && cos2>=0. )return false; // if( cos1<0. && cos2<0. )return true; // // compute vector cross products // double sin1 = dx11*dy12 - dx12*dy11; double sin2 = dx22*dy21 - dx21*dy22; if( sin1*cos2+cos1*sin2 >= 0. )return false; return true; } void GRA_thiessenTriangulation::Find( size_t nst, double xp, double yp, size_t &i1, size_t &i2, size_t &i3 ) { // This routine locates a point p in a Thiessen triangulation, // returning the vertex indices of a triangle which contains p // // nst - index of node at which Find begins search // search time depends on the proximity of nst to p // px,py - x and y-coordinates of the point to be located // i1,i2,i3 - vertex indices in counter-clockwise order // vertices of a triangle containing p if p is an interior node // if p is outside of the boundary of the mesh, i1 and i2 are the // first (rightmost) and last (leftmost) nodes which are visible from p, // and i3 = 0 if p and all of the nodes lie on a line then i1=i2=i3=0 // // initialize variables and find a cone containing p // size_t n0 = std::max(nst,static_cast(1)); size_t indx, next, nL, nF, n1, n2, n3, n4, ind; // // initialize variables and find a cone containing p // L1: indx = iend[n0-1]; nL = iadj[indx-1]; indx = 1; if( n0 != 1 )indx = iend[n0-2] + 1; nF = iadj[indx-1]; n1 = nF; if( nL != 0 )goto L3; // // n0 is a boundary node. set nL to the last nonzero // neighbor of n0. // ind = iend[n0-1] - 1; nL = iadj[ind-1]; if( (theX[nF-1]-theX[n0-1])*(yp-theY[n0-1])>=(xp-theX[n0-1])*(theY[nF-1]-theY[n0-1]) )goto L2; // // p is outside the boundary // nL = n0; goto L16; L2: if( (theX[n0-1]-theX[nL-1])*(yp-theY[nL-1])>=(xp-theX[nL-1])*(theY[n0-1]-theY[nL-1]) )goto L4; // // p is outside the boundary and n0 is the rightmost // visible boundary node // i1 = n0; goto L18; // // n0 is an interior node. find n1. // L3: if( (theX[n1-1]-theX[n0-1])*(yp-theY[n0-1])>=(xp-theX[n0-1])*(theY[n1-1]-theY[n0-1]) )goto L4; ++indx; n1 = iadj[indx-1]; if( n1 == nL )goto L7; goto L3; // // p is to the left of arc n0-n1. initialize n2 to the next // neighbor of n0. // L4: ++indx; n2 = iadj[indx-1]; if( !((theX[n2-1]-theX[n0-1])*(yp-theY[n0-1])>=(xp-theX[n0-1])*(theY[n2-1]-theY[n0-1])) )goto L8; n1 = n2; if( n1 != nL )goto L4; if( !((theX[nF-1]-theX[n0-1])*(yp-theY[n0-1])>=(xp-theX[n0-1])*(theY[nF-1]-theY[n0-1])) )goto L7; if( xp == theX[n0-1] && yp == theY[n0-1] )goto L6; // // p is left of or on arcs n0-nb for all neighbors nb // of n0. // all points are collinear iff p is left of nb-n0 for // all neighbors nb of n0. search the neighbors of n0 // in reverse order. note -- n1 = nL and indx points to // nL. // L5: if( !((theX[n0-1]-theX[n1-1])*(yp-theY[n1-1])>=(xp-theX[n1-1])*(theY[n0-1]-theY[n1-1])))goto L6; if( n1 == nF )goto L20; --indx; n1 = iadj[indx-1]; goto L5; // // p is to the right of n1-n0, or p=n0. set n0 to n1 and // start over. // L6: n0 = n1; goto L1; // // p is between arcs n0-n1 and n0-nF // L7: n2 = nF; // // p is contained in a cone defined by line segments n0-n1 // and n0-n2 where n1 is adjacent to n2 // L8: n3 = n0; L9: if( (theX[n2-1]-theX[n1-1])*(yp-theY[n1-1])>=(xp-theX[n1-1])*(theY[n2-1]-theY[n1-1]) )goto L13; // // set n4 to the first neighbor of n2 following n1 // indx = iend[n2-1]; if( iadj[indx-1] != n1 )goto L10; // // n1 is the last neighbor of n2. // set n4 to the first neighbor. // indx = 1; if( n2 != 1 )indx = iend[n2-2] + 1; n4 = iadj[indx-1]; goto L11; // // n1 is not the last neighbor of n2 // L10: --indx; if( iadj[indx-1] != n1 )goto L10; n4 = iadj[indx]; if( n4 != 0 )goto L11; // // p is outside the boundary // nF = n2; nL = n1; goto L16; // // define a new arc n1-n2 which intersects the line // segment n0-p // L11: if( (theX[n4-1]-theX[n0-1])*(yp-theY[n0-1])>=(xp-theX[n0-1])*(theY[n4-1]-theY[n0-1]) )goto L12; n3 = n2; n2 = n4; goto L9; L12: n3 = n1; n1 = n4; goto L9; // // p is in the triangle (n1,n2,n3) and not on n2-n3. if // n3-n1 or n1-n2 is a boundary arc containing p, treat p // as exterior. // L13: indx = iend[n1-1]; if( iadj[indx-1] != 0 )goto L15; // // n1 is a boundary node. n3-n1 is a boundary arc iff n3 // is the last nonzero neighbor of n1. // if( n3 != iadj[indx-2] )goto L14; // // n3-n1 is a boundary arc // if( !((theX[n3-1]-theX[n1-1])*(yp-theY[n1-1])>=(xp-theX[n1-1])*(theY[n3-1]-theY[n1-1])) )goto L14; // // p lies on n1-n3 // i1 = n1; i2 = n3; i3 = 0; return; // // n3-n1 is not a boundary arc containing p. n1-n2 is a // boundary arc iff n2 is the first neighbor of n1. // L14: indx = 1; if( n1 != 1 )indx = iend[n1-2] + 1; if( n2 != iadj[indx-1] )goto L15; // // n1-n2 is a boundary arc // if( !((theX[n1-1]-theX[n2-1])*(yp-theY[n2-1])>=(xp-theX[n2-1])*(theY[n1-1]-theY[n2-1])) )goto L15; // // p lies on n1-n2 // i1 = n2; i2 = n1; i3 = 0; return; // // p does not lie on a boundary arc. // L15: i1 = n1; i2 = n2; i3 = n3; return; // // nF and nL are adjacent boundary nodes which are visible // from p. find the first visible boundary node. // set next to the first neighbor of nF. // L16: indx = 1; if( nF != 1 )indx = iend[nF-2] + 1; next = iadj[indx-1]; if( (theX[next-1]-theX[nF-1])*(yp-theY[nF-1])>=(xp-theX[nF-1])*(theY[next-1]-theY[nF-1]) )goto L17; nF = next; goto L16; // // nF is the first (rightmost) visible boundary node // L17: i1 = nF; // // find the last visible boundary node. nL is the first // candidate for i2. // set next to the last neighbor of nL. // L18: indx = iend[nL-1] - 1; next = iadj[indx-1]; if( (theX[nL-1]-theX[next-1])*(yp-theY[next-1])>=(xp-theX[next-1])*(theY[nL-1]-theY[next-1]) )goto L19; nL = next; goto L18; // // nL is the last (leftmost) visible boundary node // L19: i2 = nL; i3 = 0; return; // // all points are collinear // L20: i1 = 0; i2 = 0; i3 = 0; return; /* L1: indx = iend[n0-1]; nL = iadj[indx-1]; indx = 1; if( n0 != 1 )indx = iend[n0-2] + 1; nF = iadj[indx-1]; n1 = nF; if( nL != 0 ) // n0 is an interior node { // find n1 for( ;; ) { if( (theX[n1-1]-theX[n0-1])*(yp-theY[n0-1]) >= (xp-theX[n0-1])*(theY[n1-1]-theY[n0-1]) )goto L4; ++indx; n1 = iadj[indx-1]; if( n1 == nL ) // p is between arcs n0-n1 and n0-nF { n2 = nF; // // p is contained in a cone defined by line segments n0-n1 // and n0-n2 where n1 is adjacent to n2 // n3 = n0; goto L9; } } } // // n0 is a boundary node // set nL to the last nonzero neighbor of n0 // ind = iend[n0-1] - 1; nL = iadj[ind-1]; if( (theX[nF-1]-theX[n0-1])*(yp-theY[n0-1]) < (xp-theX[n0-1])*(theY[nF-1]-theY[n0-1]) ) { // p is outside the boundary nL = n0; goto L16; } if( (theX[n0-1]-theX[nL-1])*(yp-theY[nL-1]) >= (xp-theX[nL-1])*(theY[n0-1]-theY[nL-1]) )goto L4; // // p is outside the boundary and n0 is the rightmost // visible boundary node // i1 = n0; // // find the last visible boundary node // nL is the first candidate for i2 // set next to the last neighbor of nL // for( ;; ) { indx = iend[nL-1] - 1; next = iadj[indx-1]; if( (theX[nL-1]-theX[next-1])*(yp-theY[next-1]) >= (xp-theX[next-1])*(theY[nL-1]-theY[next-1]) ) { // nL is the last (leftmost) visible boundary node // i2 = nL; i3 = 0; return; } nL = next; } // // p is to the left of arc n0-n1 // initialize n2 to the next neighbor of n0 // L4: ++indx; n2 = iadj[indx-1]; if( (theX[n2-1]-theX[n0-1])*(yp-theY[n0-1]) < (xp-theX[n0-1])*(theY[n2-1]-theY[n0-1]) ) { // // p is contained in a cone defined by line segments n0-n1 // and n0-n2 where n1 is adjacent to n2 // n3 = n0; goto L9; } n1 = n2; if( n1 != nL )goto L4; if( (theX[nF-1]-theX[n0-1])*(yp-theY[n0-1]) < (xp-theX[n0-1])*(theY[nF-1]-theY[n0-1]) ) // p is between arcs n0-n1 and n0-nF { n2 = nF; // // p is contained in a cone defined by line segments n0-n1 // and n0-n2 where n1 is adjacent to n2 // n3 = n0; goto L9; } if( xp==theX[n0-1] && yp==theY[n0-1] ) { // // p is to the right of n1-n0, or p=n0 // set n0 to n1 and start over // n0 = n1; goto L1; } // // p is left of or on arcs n0-nb for all neighbors nb of n0 // all points are collinear iff p is left of nb-n0 for all neighbors nb of n0 // search the neighbors of n0 in reverse order // note: n1 = nL and indx points to nL // for( ;; ) { if( (theX[n0-1]-theX[n1-1])*(yp-theY[n1-1]) < (xp-theX[n1-1])*(theY[n0-1]-theY[n1-1]) ) { // // p is to the right of n1-n0, or p=n0 // set n0 to n1 and start over // n0 = n1; goto L1; } if( n1 == nF ) // all points are collinear { i1 = 0; i2 = 0; i3 = 0; return; } --indx; n1 = iadj[indx-1]; } L9: if( (theX[n2-1]-theX[n1-1])*(yp-theY[n1-1]) >= (xp-theX[n1-1])*(theY[n2-1]-theY[n1-1]) )goto L13; // // set n4 to the first neighbor of n2 following n1 // indx = iend[n2-1]; if( iadj[indx-1] != n1 ) // n1 is not the last neighbor of n2 { do { --indx; } while( iadj[indx-1] != n1 ); n4 = iadj[indx]; if( n4 != 0 ) // define a new arc n1-n2 which intersects the line segment n0-p { if( (theX[n4-1]-theX[n0-1])*(yp-theY[n0-1]) < (xp-theX[n0-1])*(theY[n4-1]-theY[n0-1]) ) { n3 = n2; n2 = n4; } else { n3 = n1; n1 = n4; } goto L9; } // // p is outside the boundary // nF = n2; nL = n1; goto L16; } // // n1 is the last neighbor of n2. // set n4 to the first neighbor. // indx = 1; if( n2 != 1 )indx = iend[n2-2] + 1; n4 = iadj[indx-1]; // // define a new arc n1-n2 which intersects the line segment n0-p // if( (theX[n4-1]-theX[n0-1])*(yp-theY[n0-1]) < (xp-theX[n0-1])*(theY[n4-1]-theY[n0-1]) ) { n3 = n1; n1 = n4; } else { n3 = n2; n2 = n4; } goto L9; // // p is in the triangle (n1,n2,n3) and not on n2-n3. if // n3-n1 or n1-n2 is a boundary arc containing p, treat p // as exterior. // L13: indx = iend[n1-1]; if( iadj[indx-1] != 0 ) { // // p does not lie on a boundary arc // i1 = n1; i2 = n2; i3 = n3; return; } // // n1 is a boundary node. n3-n1 is a boundary arc iff n3 // is the last nonzero neighbor of n1. // if( n3 != iadj[indx-2] ) // n3-n1 is not a boundary arc containing p { // n1-n2 is a boundary arc iff n2 is the first neighbor of n1 indx = 1; if( n1 != 1 )indx = iend[n1-2] + 1; if( n2 != iadj[indx-1] ) // p does not lie on a boundary arc { i1 = n1; i2 = n2; i3 = n3; } else // n1-n2 is a boundary arc { if( (theX[n1-1]-theX[n2-1])*(yp-theY[n2-1]) < (xp-theX[n2-1])*(theY[n1-1]-theY[n2-1]) ) // p does not lie on a boundary arc { i1 = n1; i2 = n2; i3 = n3; } else // p lies on n1-n2 { i1 = n2; i2 = n1; i3 = 0; } } return; } // // n3-n1 is a boundary arc // if( (theX[n3-1]-theX[n1-1])*(yp-theY[n1-1]) >= (xp-theX[n1-1])*(theY[n3-1]-theY[n1-1]) ) { // p lies on n1-n3 // i1 = n1; i2 = n3; i3 = 0; } else { // n3-n1 is not a boundary arc containing p. n1-n2 is a // boundary arc iff n2 is the first neighbor of n1. // indx = 1; if( n1 != 1 )indx = iend[n1-2] + 1; if( n2 != iadj[indx-1] ) // p does not lie on a boundary arc { i1 = n1; i2 = n2; i3 = n3; } else // n1-n2 is a boundary arc { if( (theX[n1-1]-theX[n2-1])*(yp-theY[n2-1]) < (xp-theX[n2-1])*(theY[n1-1]-theY[n2-1]) ) // p does not lie on a boundary arc { i1 = n1; i2 = n2; i3 = n3; } else // p lies on n1-n2 { i1 = n2; i2 = n1; i3 = 0; } } } return; // // nF and nL are adjacent boundary nodes which are visible from p // find the first visible boundary node // set next to the first neighbor of nF // L16: for( ;; ) { indx = 1; if( nF != 1 )indx = iend[nF-2] + 1; next = iadj[indx-1]; if( (theX[next-1]-theX[nF-1])*(yp-theY[nF-1]) >= (xp-theX[nF-1])*(theY[next-1]-theY[nF-1]) ) { i1 = nF; // nF is the first (rightmost) visible boundary node // // find the last visible boundary node // nL is the first candidate for i2 // set next to the last neighbor of nL // for( ;; ) { indx = iend[nL-1] - 1; next = iadj[indx-1]; if( (theX[nL-1]-theX[next-1])*(yp-theY[next-1]) >= (xp-theX[next-1])*(theY[nL-1]-theY[next-1]) ) { // nL is the last (leftmost) visible boundary node // i2 = nL; i3 = 0; return; } nL = next; } } nF = next; } */ } void GRA_thiessenTriangulation::InterpolateSub( double xp, double yp, double &pz, size_t &ist ) { // Given a triangulation of a set of points in the plane, this routine determines // a piecewise cubic function f(x,y) which interpolates a set of data values and // partial derivatives at the vertices. f has continuous first derivatives over // the mesh and extends beyond the mesh boundary allowing extrapolation. // Interpolation is exact for quadratic data. The value of f at (px,py) is returned. // // px,py - coordinates of a point at which f is to be evaluated // ist - index of the starting node in the search for a triangle containing (px,py) // 1 <= ist <= theNumberOfNodes // The output value of ist from a previous call may be a good choice // When finished, ist is the index of one of the vertices of the triangle // containing (px,py) // pz - when finished, pz is the value of f at (px,py) // size_t i1, i2, i3, n1, n2, indx; double zx1, zy1, zx2, zy2, zx3, zy3, x1, y1; double x2, y2, x3, y3, z1, z2, z3, dp, u, v, xq; double yq, r1, r2, a1, a2, b1, b2, c1, c2, f1, f2; /* i1,i2,i3 vertices determined by Find n1,n2 endpoints of the closest boundary edge to p when p is outside of the mesh boundary indx iadj index of n1 as a neighbor of n2 zx1,zy1,zx2,zy2,zx3,zy3 x and y derivatives at the vertices of a triangle t which contains p or at n1 and n2 x1,y1,x2,y2,x3,y3 x,y coordinates of the vertices of t or of n1 and n2 z1,z2,z3 data values at the vertices of t dp inner product of n1-n2 and p-n2 u,v x,y coordinates of the vector n2-n1 xq,yq x,y coordinates of the closest boundary point to p when p is outside of the mesh boundary r1,r2 barycentric coordinates of q with respect to the line segment n2-n1 containing q a1,a2,b1,b2,c1,c2 cardinal functions for evaluating the interpolatory surface at q f1,f2 cubic factors used to compute the cardinal functions */ pz = 0.0; // // find a triangle containing p if p is within the mesh boundary // Find( ist, xp, yp, i1, i2, i3 ); if( i1 == 0 )throw EGraphicsError( wxT("InterpolateSub: nodes are collinear") ); ist = i1; if( i3 == 0 )goto L3; // // derivatives are user provided // zx1 = xPartials[i1-1]; zx2 = xPartials[i2-1]; zx3 = xPartials[i3-1]; zy1 = yPartials[i1-1]; zy2 = yPartials[i2-1]; zy3 = yPartials[i3-1]; // // set local parameters for call to tval // x1 = theX[i1-1]; y1 = theY[i1-1]; x2 = theX[i2-1]; y2 = theY[i2-1]; x3 = theX[i3-1]; y3 = theY[i3-1]; z1 = theZ[i1-1]; z2 = theZ[i2-1]; z3 = theZ[i3-1]; try { pz = tval( xp, yp, x1, x2, x3, y1, y2, y3, z1, z2, z3, zx1, zx2, zx3, zy1, zy2, zy3 ); } catch (EGraphicsError &e) { throw; } return; L3: // // p is outside of the mesh boundary // extrapolate to p by passing a linear function of one variable through the // value and directional derivative (in the direction p-q) of the interpolatory // surface at q where q is the closest boundary point to p // // determine q by traversing the boundary starting from the rightmost visible node i1 // n2 = i1; // // set n1 to the last nonzero neighbor of n2 and compute dp // L4: indx = iend[n2-1] - 1; n1 = iadj[indx-1]; x1 = theX[n1-1]; y1 = theY[n1-1]; x2 = theX[n2-1]; y2 = theY[n2-1]; dp = (x1-x2)*(xp-x2) + (y1-y2)*(yp-y2); if( dp <= 0. )goto L5; if( (xp-x1)*(x2-x1)+(yp-y1)*(y2-y1)>0. )goto L8; n2 = n1; goto L4; L5: // // n2 is the closest boundary point to p // compute partial derivatives at n2 // zx2 = xPartials[n2-1]; zy2 = yPartials[n2-1]; // // compute extrapolated value at p // pz = theZ[n2-1] + zx2*(xp-x2) + zy2*(yp-y2); return; L8: // // the closest boundary point q lies on n2-n1 // compute partials at n1 and n2 // zx1 = xPartials[n1-1]; zy1 = yPartials[n1-1]; zx2 = xPartials[n2-1]; zy2 = yPartials[n2-1]; // // compute q, its barycentric coordinates, // and the cardinal functions for extrapolation // u = x2-x1; v = y2-y1; r1 = dp/(u*u + v*v); r2 = 1. - r1; xq = r1*x1 + r2*x2; yq = r1*y1 + r2*y2; f1 = r1*r1*r2; f2 = r1*r2*r2; a1 = r1 + (f1-f2); a2 = r2 - (f1-f2); b1 = u*f1; b2 = -u*f2; c1 = v*f1; c2 = -v*f2; // // compute the value of the interpolatory surface at q // pz = a1*theZ[n1-1] + a2*theZ[n2-1] + b1*zx1 + b2*zx2 + c1*zy1 + c2*zy2; // // compute the extrapolated value at p // pz += (r1*zx1 + r2*zx2)*(xp-xq) + (r1*zy1 + r2*zy2)*(yp-yq); return; } double GRA_thiessenTriangulation::TriangleVolume( double x1, double x2, double x3, double y1, double y2, double y3, double z1, double z2, double z3 ) { // This function computes the integral over a triangle of the planar surface which // interpolates data values at the vertices // // x1,x2,x3 - x coordinates of the vertices of the triangle in counterclockwise order // y1,y2,y3 - y coordinates of the vertices of the triangle // z1,z2,z3 - data values at the vertices // // output - volume under the interpolatory surface above the triangle or zero if the // coordinates are incorrectly ordered or collinear // double area = x2*y3-x3*y2 + x3*y1-x1*y3 + x1*y2-x2*y1; if( area < 0. )area = 0.; // // area is twice the area of the triangle // return the mean of the data values times the area of the triangle // return (z1+z2+z3)*area/6.0; } double GRA_thiessenTriangulation::Volume() { // This routine can be called from outside. // // Given a set of n data points (x[i],y[i]) and function values // z[i]=f(x[i],y[i]) and a triangulation covering the convex hull h of the // data points, this function approximates the integral of f over h by // integrating the piecewise linear interpolant of the data values. // // output - sum of the volumes of the linear interpolants on the triangles // size_t indF = 1; double sum = 0.0; // // loop on triangles (n1,n2,n3) such that n2 and n3 are // adjacent neighbors of n1 which are both larger than n1 // for( size_t n1=1; n1<=theNumberOfNodes-2; ++n1 ) { double xn1 = theX[n1-1]; double yn1 = theY[n1-1]; double zn1 = theZ[n1-1]; size_t indL = iend[n1-1]; for( size_t indx=indF; indx<=indL; ++indx ) { size_t n2 = iadj[indx-1]; size_t n3 = iadj[indx]; if( indx == indL )n3 = iadj[indF-1]; if( n2>=n1 && n3>=n1 ) sum += TriangleVolume( xn1, theX[n2-1], theX[n3-1], yn1, theY[n2-1], theY[n3-1], zn1, theZ[n2-1], theZ[n3-1] ); } indF = indL + 1; } return sum; } double GRA_thiessenTriangulation::tval( double x, double y, double x1, double x2, double x3, double y1, double y2, double y3, double z1, double z2, double z3, double zx1, double zx2, double zx3, double zy1, double zy2, double zy3 ) { // Given function values and first partial derivatives at the three vertices of a // triangle, this routine determines a function w which agrees with the given data, // returning the value. The interpolation method is exact for quadratic polynomial // data. The triangle is partitioned into three subtriangles with equal areas. // w is cubic in each subtriangle and along the edges, but has only one continuous // derivative across edges. The normal derivative of w varies linearly along // each outer edge. The values and partial derivatives of w along a triangle edge // depend only on the data values at the endpoints of the edge. Thus the method // yields c-1 continuity when used to interpolate over a triangular grid. // This algorithm is due to C. L. Lawson. // // x,y - coordinates of a point at which w is to be evaluated // x1,x2,x3,y1,y2,y3 - coordinates of the vertices of a triangle containing (x,y) // z1,z2,z3 - function values at the vertices to be interpolated // zx1,zx2,zx3 - x-derivative values at the vertices // zy1,zy2,zy3 - y-derivative values at the vertices // // tval returns the estimated value of the interpolatory function at (x,y) // double u[3]; // x-component of the vector representing the side opposite vertex u[0] = x3 - x2; u[1] = x1 - x3; u[2] = x2 - x1; // double v[3]; // y-component of the vector representing the side opposite vertex v[0] = y3 - y2; v[1] = y1 - y3; v[2] = y2 - y1; // double sl[3]; // square of the length of the side opposite vertex for( size_t i=0; i<3; ++i )sl[i] = u[i]*u[i] + v[i]*v[i]; // // area = 3-1 x 3-2 // double area = u[0]*v[1] - u[1]*v[0]; // twice the area of the triangle if( area == 0. )return 0.0; // vertices are collinear // // r[0] = (2-3 x 2-(x,y))/area, r[1] = (1-(x,y) x 1-3)/area, // r[2] = (1-2 x 1-(x,y))/area // double r[3]; // barycentric coordinates r[0] = (u[0]*(y-y2) - v[0]*(x-x2))/area; r[1] = (u[1]*(y-y1) - v[1]*(x-x1))/area; r[2] = (u[2]*(y-y1) - v[2]*(x-x1))/area; // double phi[3]; phi[0] = r[1]*r[2]; phi[1] = r[2]*r[0]; phi[2] = r[0]*r[1]; // double rmin = std::min(std::min(r[0],r[1]),r[2]); size_t ip1, ip2, ip3; if( rmin != r[0] )goto L3; ip1 = 1; ip2 = 2; ip3 = 3; goto L5; L3: if( rmin != r[1] )goto L4; ip1 = 2; ip2 = 3; ip3 = 1; goto L5; L4: ip1 = 3; ip2 = 1; ip3 = 2; L5: double ro[3]; // cubic correction terms for computing g double c1 = rmin*rmin/2.; double c2 = rmin/3.; ro[ip1-1] = (phi[ip1-1] + 5.*c1/3.)*r[ip1-1] - c1; ro[ip2-1] = c1*(r[ip3-1] - c2); ro[ip3-1] = c1*(r[ip2-1] - c2); // double f[3]; f[0] = 3.*(sl[1]-sl[2])/sl[0]; f[1] = 3.*(sl[2]-sl[0])/sl[1]; f[2] = 3.*(sl[0]-sl[1])/sl[2]; // double g[3]; g[0] = (r[1]-r[2])*phi[0] + f[0]*ro[0] - ro[1] + ro[2]; g[1] = (r[2]-r[0])*phi[1] + f[1]*ro[1] - ro[2] + ro[0]; g[2] = (r[0]-r[1])*phi[2] + f[2]*ro[2] - ro[0] + ro[1]; // double p[3]; p[0] = g[0] + phi[0]; p[1] = g[1] + phi[1]; p[2] = g[2] + phi[2]; // double q[3]; q[0] = g[0] - phi[0]; q[1] = g[1] - phi[1]; q[2] = g[2] - phi[2]; // double a[3]; a[0] = r[0] + g[2] - g[1]; a[1] = r[1] + g[0] - g[2]; a[2] = r[2] + g[1] - g[0]; // double b[3]; b[0] = u[2]*p[2] + u[1]*q[1]; b[1] = u[0]*p[0] + u[2]*q[2]; b[2] = u[1]*p[1] + u[0]*q[0]; // double c[3]; c[0] = v[2]*p[2] + v[1]*q[1]; c[1] = v[0]*p[0] + v[2]*q[2]; c[2] = v[1]*p[1] + v[0]*q[0]; // // w is a linear combination of the cardinal functions // return a[0]*z1 + a[1]*z2 + a[2]*z3 + (b[0]*zx1 + b[1]*zx2 + b[2]*zx3 + c[0]*zy1 + c[1]*zy2 + c[2]*zy3)/2.; } // end of file extrema-4.4.5/src/Graphics/GRA_cartesianCurve.h0000644012702201742730000001307211274636605020373 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_CARTESIANCURVE #define GRA_CARTESIANCURVE #include #include #include "wx/wx.h" #include "GRA_drawableObject.h" class GRA_plotSymbol; class GRA_errorBar; class GRA_color; class GRA_wxWidgets; class GRA_cartesianCurve : public GRA_drawableObject { public: GRA_cartesianCurve() : GRA_drawableObject(wxT("CARTESIANCURVE")), smooth_(false), popup_(false) {} GRA_cartesianCurve( std::vector const &x, std::vector const &y, std::vector const &xE1, std::vector const &yE1, std::vector const &xE2, std::vector const &yE2, bool smooth =false ) : GRA_drawableObject(wxT("CARTESIANCURVE")), smooth_(smooth), popup_(false) { xData_.assign( x.begin(), x.end() ); yData_.assign( y.begin(), y.end() ); xE1_.assign( xE1.begin(), xE1.end() ); yE1_.assign( yE1.begin(), yE1.end() ); xE2_.assign( xE2.begin(), xE2.end() ); yE2_.assign( yE2.begin(), yE2.end() ); if( !xE1_.empty() && xE2_.empty() )xE2_.assign( xE1_.begin(), xE1_.end() ); if( !yE1_.empty() && yE2_.empty() )yE2_.assign( yE1_.begin(), yE1_.end() ); SetUp(); } ~GRA_cartesianCurve(); GRA_cartesianCurve( GRA_cartesianCurve const &rhs ) : GRA_drawableObject(rhs) { CopyStuff(rhs); } GRA_cartesianCurve &operator=( GRA_cartesianCurve const &rhs ) { if( this != &rhs ) { DeleteStuff(); type_ = rhs.type_; CopyStuff(rhs); } return *this; } void Make(); void Draw( GRA_wxWidgets *, wxDC & ); bool Inside( double, double ); std::vector const &GetXData() { return xData_; } std::vector const &GetYData() { return yData_; } void GetXYMinMax( double &, double &, double &, double & ); void GetXMinMax( double const, double const, double &, double & ); void GetYMinMax( double const, double const, double &, double & ); friend std::ostream &operator<<( std::ostream &, GRA_cartesianCurve const & ); void SetValues( int, int, int, GRA_color*, GRA_color*, double, double, double, double, double, double, double, double, std::vector &, std::vector &, std::vector &, std::vector &, std::vector &, std::vector & ); void GetClippingBoundary( double &xlaxis, double &ylaxis, double &xuaxis, double &yuaxis ) { xlaxis = xlaxis_; ylaxis = ylaxis_; xuaxis = xuaxis_; yuaxis = yuaxis_; } std::vector &GetAreaFillColors() { return areaFillColors_; } GRA_color *GetAreaFillColor(); void SetAreaFillColor( GRA_color *c ) { areaFillColor_ = c; } void GetXYcurve( std::vector &x, std::vector &y ) { x.assign( xCurve_.begin(), xCurve_.end() ); y.assign( yCurve_.begin(), yCurve_.end() ); } GRA_color *GetColor() { return color_; } void SetColor( GRA_color *c ) { color_ = c; } int GetHistogramType() const { return histogramType_; } void SetHistogramType( int ht ) { histogramType_ = ht; } int GetLineWidth() const { return lineWidth_; } void SetLineWidth( int lw ) { lineWidth_ = lw; } int GetLineType() const { return lineType_; } void SetLineType( int lt ) { lineType_ = lt; } int GetPlotsymbolCode() const; void SetPlotsymbolCode( int ); GRA_color *GetPlotsymbolColor() const; void SetPlotsymbolColor( GRA_color * ); double GetPlotsymbolSize() const; void SetPlotsymbolSize( double ); double GetPlotsymbolAngle() const; void SetPlotsymbolAngle( double ); std::vector &GetPen() { return pen_; } std::vector &GetPlotSymbols() { return plotsymbols_; } std::vector &GetErrorBars() { return errorBars_; } void SetPopup() { popup_ = true; } void Disconnect() { popup_ = false; } private: void SetUp(); void DeleteStuff(); void CopyStuff( GRA_cartesianCurve const & ); // void MakeHorizontalHistogramNoTails(); void MakeHorizontalHistogramWithTails(); void MakeVerticalHistogramNoTails(); void MakeVerticalHistogramWithTails(); void MakeNonHistogram(); void MakeErrorBars(); // void DrawHistogramNoTails( GRA_wxWidgets *, wxDC & ); void DrawHistogramWithTails( GRA_wxWidgets *, wxDC & ); void DrawNonHistogram( GRA_wxWidgets *, wxDC & ); void DrawErrorBars( GRA_wxWidgets *, wxDC & ); // int histogramType_, lineType_, lineWidth_; bool smooth_; GRA_color *color_, *areaFillColor_; std::vector areaFillColors_; // std::vector xData_, yData_, xE1_, xE2_, yE1_, yE2_, xCurve_, yCurve_; std::vector pen_; std::vector plotsymbols_; std::vector errorBars_; double xlaxis_, ylaxis_, xuaxis_, yuaxis_; double xmin_, xmax_, ymin_, ymax_; // bool popup_; }; #endif extrema-4.4.5/src/Graphics/GRA_cross.cpp0000644012702201742730000000457511274636605017111 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "GRA_cross.h" #include "GRA_color.h" #include "GRA_colorControl.h" GRA_cross::~GRA_cross() {} GRA_cross::GRA_cross( double xc, double yc, double side, double angle, GRA_color *lineColor, int lineWidth ) : GRA_multiLineFigure() { SetLineColor( lineColor ); SetLineWidth( lineWidth ); xc_ = xc; yc_ = yc; double const cosang = cos(angle*M_PI/180.); double const sinang = sin(angle*M_PI/180.); double const temp = side*0.5; x_.push_back(xc+RotX(temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(temp,-temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(-temp,temp,sinang,cosang)); y_.push_back(yc+RotY(-temp,temp,sinang,cosang)); pen_.push_back(2); x_.push_back(xc+RotX(-temp,-temp,sinang,cosang)); y_.push_back(yc+RotY(-temp,-temp,sinang,cosang)); pen_.push_back(3); x_.push_back(xc+RotX(temp,temp,sinang,cosang)); y_.push_back(yc+RotY(temp,temp,sinang,cosang)); pen_.push_back(2); } std::ostream &operator<<( std::ostream &out, GRA_cross const &mlf ) { out << "\n"; std::size_t size = mlf.x_.size(); out << ""; for( std::size_t i=0; i\n"; return out << "\n"; } // end of file extrema-4.4.5/src/Graphics/GRA_crossPlus.h0000644012702201742730000000211411274636605017405 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef GRA_CROSSPLUS #define GRA_CROSSPLUS #include #include "GRA_multiLineFigure.h" class GRA_color; class GRA_crossPlus : public GRA_multiLineFigure { public: GRA_crossPlus( double, double, double, double, GRA_color * =0, int =1 ); virtual ~GRA_crossPlus(); friend std::ostream &operator<<( std::ostream &, GRA_crossPlus const & ); }; #endif extrema-4.4.5/src/Parsing/0000755012702201742730000000000011440766120014402 5ustar spangspangextrema-4.4.5/src/Parsing/Script.h0000644012702201742730000000740211274636606016034 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_SCRIPT #define EX_SCRIPT #include #include "wx/wx.h" class ParseToken; class Script { public: Script( wxString const &name =wxString(wxT(" ")) ) : procedureName_(name), paramCount_(0), currentLine_(0), doNumber_(-1), echo_(false), scriptOriginatingPause_(false) {} ~Script() { DeleteStuff(); } Script( Script const &rhs ) { CopyStuff(rhs); } Script &operator=( Script const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void AddScriptLine( std::size_t, wxString &, wxString & ); void SetUpDos(); bool GetNextLine( wxString & ); void RemakeInputLine( wxString & ); void ProcessGoTo( wxString const & ); void ProcessIf(); bool ProcessDo( wxString const & ); void SetDoData( std::vector const &data ) { doData_[doNumber_].assign( data.begin(), data.end() ); doCount_[doNumber_] = 0; } bool ProcessEnddo( wxString &, double & ); void SetEcho( bool e ) { echo_ = e; } static wxChar GetCommentCharacter() { return Script::commentCharacter_; } static void SetCommentCharacter( wxChar const c ) { Script::commentCharacter_ = c; } static wxChar GetParameterCharacter() { return Script::parameterCharacter_; } static void SetParameterCharacter( wxChar const c ) { Script::parameterCharacter_ = c; } void AddParameter(); void AddParameter( wxString const & ); void AddParameter( double ); void AddLabel( std::size_t n, wxString const &s ) { labelLines_.push_back( n ); labels_.push_back( s ); } void AddIf( std::size_t n ) { ifLines_.push_back( n ); endifLines_.push_back( 0 ); ifStack_.push_back( ifLines_.size()-1 ); } void AddEndif( std::size_t ); void AddDo( std::size_t n ) { doLines_.push_back( n ); enddoLines_.push_back( 0 ); doStack_.push_back( doLines_.size()-1 ); } void AddEnddo( std::size_t ); std::size_t GetNumberOfDos() const { return doLines_.size(); } std::size_t GetEnddoLine( std::size_t n ) const { return enddoLines_[n]; } std::size_t GetDoLine( std::size_t n ) const { return doLines_[n]; } wxString Filename(); wxString CurrentLine(); void Run(); private: static wxChar commentCharacter_; static wxChar parameterCharacter_; bool echo_; // std::size_t paramCount_; // wxString procedureName_; // unused for now // std::vector scriptLines_; // bool scriptOriginatingPause_; std::size_t currentLine_; int doNumber_; std::vector inADo_; std::vector doNames_; std::vector< std::vector > doData_; std::vector doCount_; // std::vector parameters_; // std::vector labels_; std::vector labelLines_; std::vector ifLines_; std::vector endifLines_; std::vector ifStack_; std::vector doLines_; std::vector enddoLines_; std::vector doStack_; // void DeleteStuff(); void CopyStuff( Script const & ); }; #endif extrema-4.4.5/src/Parsing/ParseToken.cpp0000644012702201742730000000434611274636606017202 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "ParseToken.h" #include ParseToken &ParseToken::operator=( ParseToken const &rhs ) { if( this != &rhs ) { DeleteQualifiers(); CopyStuff( rhs ); } return *this; } void ParseToken::DeleteQualifiers() { stringVec::const_iterator end = qualifiers_.end(); for( stringVec::const_iterator i=qualifiers_.begin(); i!=end; ++i )delete *i; stringVec().swap( qualifiers_ ); } void ParseToken::CopyStuff( ParseToken const &rhs ) { stringToken_ = rhs.stringToken_; numericToken_ = rhs.numericToken_; std::size_t size( rhs.qualifiers_.size() ); for( std::size_t i=0; i tmp( new wxString(*rhs.qualifiers_[i]) ); qualifiers_.push_back( tmp.release() ); } tokenType_ = rhs.tokenType_; } bool ParseToken::operator==( ParseToken const &rhs ) const { if( rhs.stringToken_ != stringToken_ )return false; if( rhs.numericToken_ != numericToken_ )return false; if( rhs.tokenType_ != tokenType_ )return false; if( rhs.qualifiers_.size() != qualifiers_.size() )return false; std::size_t size( qualifiers_.size() ); for( std::size_t i=0; i!=size; ++i ) { if( *rhs.qualifiers_[i] != *qualifiers_[i] )return false; } return true; } bool ParseToken::operator<( ParseToken const &rhs ) const { if( tokenType_ == rhs.tokenType_ ) { if( tokenType_ == STRINGFIELD ) return (stringToken_ < rhs.stringToken_); else if( tokenType_ == NUMERICFIELD ) return (numericToken_ < rhs.numericToken_); } return false; } // end of file extrema-4.4.5/src/Parsing/ParseToken.h0000644012702201742730000000543611274636606016650 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_PARSETOKEN #define EX_PARSETOKEN #include #include "wx/wx.h" class ParseToken { private: typedef std::vector stringVec; public: enum Types { NULLFIELD, NUMERICFIELD, STRINGFIELD, EQUALSIGN }; ParseToken() : tokenType_(NULLFIELD), stringToken_(wxT("")), numericToken_(0.0) {} ~ParseToken() { DeleteQualifiers(); } ParseToken( ParseToken const &rhs ) { CopyStuff( rhs ); } ParseToken &operator=( ParseToken const & ); bool operator==( ParseToken const & ) const; bool operator<( ParseToken const & ) const; void SetString( wxString const &s ) { stringToken_ = s; tokenType_ = STRINGFIELD; } void SetNumeric( double v ) { numericToken_ = v; tokenType_ = NUMERICFIELD; } void MakeNewQualifier() { wxString *tmp = new wxString(); qualifiers_.push_back( tmp ); } void SetType( Types t ) { tokenType_ = t; } void SetNull() { tokenType_ = NULLFIELD; } void SetNumeric() { tokenType_ = NUMERICFIELD; } void SetString() { tokenType_ = STRINGFIELD; } void SetEqualSign() { tokenType_ = EQUALSIGN; } bool IsaNull() const { return (tokenType_ == NULLFIELD); } bool IsaNumeric() const { return (tokenType_ == NUMERICFIELD); } bool IsaString() const { return (tokenType_ == STRINGFIELD); } bool IsaEqualSign() const { return (tokenType_ == EQUALSIGN); } Types GetType() const { return tokenType_; } wxString &GetString() { return stringToken_; } double GetNumeric() const { return numericToken_; } void SetQualifier( wxString *q ) { qualifiers_.back() = q; } stringVec const &GetQualifiers() const { return qualifiers_; } wxString *GetQualifier( int i ) const { return qualifiers_[i]; } wxString *GetLastQualifier() const { return qualifiers_.back(); } int GetNumberOfQualifiers() const { return qualifiers_.size(); } private: wxString stringToken_; double numericToken_; stringVec qualifiers_; Types tokenType_; // void DeleteQualifiers(); void CopyStuff( ParseToken const & ); }; #endif extrema-4.4.5/src/Parsing/ParseLine.h0000644012702201742730000000333711274636606016455 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_PARSELINE #define EX_PARSELINE #include #include "wx/wx.h" class ParseToken; class ParseLine { public: ParseLine( wxString const & ); ~ParseLine(); ParseLine( ParseLine const & ); ParseLine &operator=( ParseLine const & ); wxString const &GetInputLine() const; ParseToken *GetToken( int ) const; int GetNumberOfTokens() const; wxString &GetString( std::size_t ) const; double GetNumeric( std::size_t ) const; bool IsEqualSign( std::size_t ) const; bool IsNull( std::size_t ) const; bool IsNumeric( std::size_t ) const; bool IsString( std::size_t ) const; int NumberOfStrings() const; int NumberOfNumerics() const; int NumberOfNulls() const; void ParseIt(); private: typedef std::vector parseTokenVec; typedef parseTokenVec::const_iterator ptvIter; void CopyStuff( ParseLine const & ); void NumericOrString(); void AddToString( wxChar ); void AddToQualifier( wxChar ); parseTokenVec tokens_; wxString inputLine_; }; #endif extrema-4.4.5/src/Parsing/Makefile.am0000644012702201742730000000141511274636606016451 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libparsing.la libparsing_la_SOURCES = ParseLine.cpp ParseLine.h \ ParseToken.cpp ParseToken.h \ Script.cpp Script.h \ ESyntaxError.h extrema-4.4.5/src/Parsing/Script.cpp0000644012702201742730000003462011274636606016371 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 3 || \ (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ >= 0))) #include #else #include #endif #include "Script.h" #include "ESyntaxError.h" #include "ParseToken.h" #include "ExGlobals.h" wxChar Script::commentCharacter_ = wxT('!'); wxChar Script::parameterCharacter_ = wxT('?'); void Script::Run() { for( ;; ) { Script *script = 0; wxString commandLine; if( ExGlobals::GetRestartingScript() ) { if( scriptOriginatingPause_ ) { ExGlobals::SetRestartingScript( false ); scriptOriginatingPause_ = false; if( GetNextLine(commandLine) )return; // end of script file found if( echo_ )ExGlobals::WriteOutput( commandLine ); } else { ExGlobals::IncrementScript(); commandLine.clear(); ExGlobals::SetExecuteCommand( true ); } } else if( ExGlobals::GetPausingScript() ) { return; } else { if( GetNextLine(commandLine) )return; // end of script file found if( echo_ )ExGlobals::WriteOutput( commandLine ); } try { if( !commandLine.empty() && commandLine!=wxString(wxT(" ")) ) ExGlobals::ProcessCommand(commandLine); } catch( std::runtime_error const &e ) { throw; } if( ExGlobals::GetExecuteCommand() ) { ExGlobals::SetExecuteCommand( false ); try { ExGlobals::RunScript(); } catch( std::runtime_error const &e ) { throw; } } else if( ExGlobals::GetReturnCommand() ) { ExGlobals::SetReturnCommand( false ); return; } else if( ExGlobals::GetPausingScript() ) { scriptOriginatingPause_ = true; return; } } } wxString Script::Filename() { return parameters_[0]->GetString(); } wxString Script::CurrentLine() { return scriptLines_[currentLine_-1]; } void Script::DeleteStuff() { std::vector::const_iterator end = parameters_.end(); for( std::vector::const_iterator i=parameters_.begin(); i!=end; ++i )delete *i; std::vector().swap( parameters_ ); } void Script::CopyStuff( Script const &rhs ) { DeleteStuff(); std::vector::const_iterator end = rhs.parameters_.end(); for( std::vector::const_iterator i=rhs.parameters_.begin(); i!=end; ++i ) { ParseToken *pt = new ParseToken(); *pt = **i; } // echo_ = rhs.echo_; // paramCount_ = rhs.paramCount_; procedureName_ = rhs.procedureName_; // unused for now scriptLines_.assign( rhs.scriptLines_.begin(), rhs.scriptLines_.end() ); currentLine_ = currentLine_; scriptOriginatingPause_ = rhs.scriptOriginatingPause_; doNumber_ = rhs.doNumber_; inADo_.assign( rhs.inADo_.begin(), rhs.inADo_.end() ); doNames_.assign( rhs.doNames_.begin(), rhs.doNames_.end() ); // std::vector< std::vector >().swap( doData_ ); std::size_t size = rhs.doData_.size(); for( std::size_t i=0; i57 ) { ipindex = ++paramCount_; if( paramCount_ > numberOfParameters ) { missingParameter = true; ++numberOfParameters; } npl = i; npn = 1; } else // numbered parameter substitution { npl = i; wxString s; s.append( line[++i] ); for( ;; ) { int ival = i+157 )break; s.append( line[++i] ); } double x; std::stringstream ss; ss << s.mb_str(wxConvUTF8); ss >> x; // npn = i - npl + 1; // ipindex = static_cast(x); if ( ipindex > numberOfParameters ) { missingParameter = true; numberOfParameters = ipindex; } } if ( missingParameter ) { wxChar c[100]; ::wxSnprintf( c, 100, wxT("parameter %d missing from file: %s"), ipindex, fname.c_str() ); throw ESyntaxError( c ); } wxString s1; if ( parameters_[ipindex]->IsaNull() ) { s1 = wxT(",,"); } else if ( parameters_[ipindex]->IsaNumeric() ) { wxChar c[50]; ::wxSnprintf( c, 50, wxT("%g"), parameters_[ipindex]->GetNumeric() ); s1.assign( c ); } else // must be string type { s1 = parameters_[ipindex]->GetString(); } line.replace( npl, npn, s1 ); // substitution done here i = npl + s1.length(); lineLength = line.size(); } ++i; } scriptLines_.push_back( line ); } void Script::SetUpDos() { std::size_t n = doLines_.size(); inADo_.assign( n, false ); doNames_.resize( n, wxString(wxT(" ")) ); doCount_.resize( n, 0 ); doData_.resize( n ); } bool Script::GetNextLine( wxString &line ) { line.erase(); bool getLine = true; while (getLine) { getLine = false; if( currentLine_ == scriptLines_.size() ) { line.erase(); return true; } line = scriptLines_[currentLine_]; std::vector::iterator vi = find(labelLines_.begin(),labelLines_.end(),currentLine_++); if( vi != labelLines_.end() )getLine = true; } RemakeInputLine(line); return false; } void Script::RemakeInputLine( wxString &line ) { if( line.find(parameterCharacter_) == line.npos )return; // wxString cline; wxChar const openingQuote = 96; wxChar const singleQuote = 39; wxChar const doubleQuote = 34; // std::size_t parameterCount = 0; std::size_t lineLen = line.length(); std::size_t i = 0; while ( i < lineLen ) { if( line[i] == openingQuote ) { cline.append( openingQuote ); while ( ++i < lineLen ) { cline.append( line[i] ); if( line[i] == singleQuote )break; } } else if( line[i] == singleQuote ) { cline.append( singleQuote ); while ( ++i < lineLen ) { cline.append( line[i] ); if( line[i] == singleQuote )break; } } else if( line[i] == doubleQuote ) { cline.append( doubleQuote ); while ( ++i < lineLen ) { cline.append( line[i] ); if( line[i] == doubleQuote )break; } } else if( line[i] == commentCharacter_ ) { return; } else if( line[i] == parameterCharacter_ ) { int ival = i+157 ) { // sequential parameter substitution // ParseToken *pt = parameters_[parameterCount]; if( pt->IsaNumeric() ) { wxChar c[50]; ::wxSnprintf( c, 50, wxT("%g"), pt->GetNumeric() ); cline.append( c ); } else if( pt->IsaString() ) { cline += pt->GetString(); } ++parameterCount; } else // numbered parameter substitution { wxString s; s.append( line[++i] ); for( ;; ) { ival = i+157 )break; s.append( line[++i] ); } double xtemp; std::stringstream ss; ss << s.mb_str(wxConvUTF8); ss >> xtemp; // parameterCount = static_cast( xtemp ); ParseToken *pt = parameters_[parameterCount]; if( pt->IsaNumeric() ) { wxChar c[50]; ::wxSnprintf( c, 50, wxT("%g"), pt->GetNumeric() ); cline += wxString( c ); } else if( pt->IsaString() ) { cline += pt->GetString(); } } } else // character is nothing special { cline.append( line[i] ); } ++i; } line = cline; return; } void Script::ProcessGoTo( wxString const &label ) { bool found = false; std::size_t end = labels_.size(); for( std::size_t i=0; ienddoLines_[j] || currentLine_().swap( doData_[j] ); doStack_.pop_back(); } } doStack_.empty() ? doNumber_=-1 : doNumber_=doStack_.back(); } void Script::ProcessIf() { std::size_t end = ifLines_.size(); for( std::size_t jj=0; jj().swap( doData_[doNumber_] ); doStack_.pop_back(); doStack_.empty() ? doNumber_=-1 : doNumber_=doStack_.back(); return true; } currentLine_ = doLines_[doNumber_]+1; name = doNames_[doNumber_]; value = doData_[doNumber_][doCount_[doNumber_]]; return false; } void Script::AddEndif( std::size_t n ) { if( ifStack_.empty() )throw ESyntaxError( wxT("ENDIF without a preceeding IF") ); endifLines_[ifStack_.back()] = n; ifStack_.pop_back(); } void Script::AddEnddo( std::size_t n ) { if( doStack_.empty() )throw ESyntaxError( wxT("ENDDO without a preceeding DO") ); enddoLines_[doStack_.back()] = n; doStack_.pop_back(); } void Script::AddParameter() { ParseToken *p = new ParseToken(); p->SetNull(); parameters_.push_back( p ); } void Script::AddParameter( wxString const &s ) { ParseToken *p = new ParseToken(); p->SetString( s ); parameters_.push_back( p ); } void Script::AddParameter( double d ) { ParseToken *p = new ParseToken(); p->SetNumeric( d ); parameters_.push_back( p ); } // end of file extrema-4.4.5/src/Parsing/Makefile.in0000644012702201742730000003613611440762625016466 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Parsing DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libparsing_la_LIBADD = am_libparsing_la_OBJECTS = ParseLine.lo ParseToken.lo Script.lo libparsing_la_OBJECTS = $(am_libparsing_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libparsing_la_SOURCES) DIST_SOURCES = $(libparsing_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libparsing.la libparsing_la_SOURCES = ParseLine.cpp ParseLine.h \ ParseToken.cpp ParseToken.h \ Script.cpp Script.h \ ESyntaxError.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Parsing/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Parsing/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libparsing.la: $(libparsing_la_OBJECTS) $(libparsing_la_DEPENDENCIES) $(CXXLINK) $(libparsing_la_OBJECTS) $(libparsing_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParseLine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParseToken.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Script.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Parsing/ParseLine.cpp0000644012702201742730000004124211274636606017005 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "ParseLine.h" #include "ESyntaxError.h" #include "ParseToken.h" ParseLine::ParseLine( wxString const &line ) : inputLine_(line) {} ParseLine::~ParseLine() { ptvIter end = tokens_.end(); for( ptvIter i=tokens_.begin(); i!=end; ++i )delete *i; } ParseLine::ParseLine( ParseLine const &rhs ) { CopyStuff( rhs ); } ParseLine &ParseLine::operator=( ParseLine const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } wxString const &ParseLine::GetInputLine() const { return inputLine_; } ParseToken *ParseLine::GetToken( int i ) const { return tokens_[i]; } int ParseLine::GetNumberOfTokens() const { return tokens_.size(); } void ParseLine::CopyStuff( ParseLine const &rhs ) { inputLine_ = rhs.inputLine_; ptvIter end = tokens_.end(); for( ptvIter i=tokens_.begin(); i!=end; ++i )delete *i; parseTokenVec().swap( tokens_ ); end = rhs.tokens_.end(); for( ptvIter i=rhs.tokens_.begin(); i!=end; ++i ) { ParseToken *pt = new ParseToken( **i ); tokens_.push_back( pt ); } } wxString &ParseLine::GetString( std::size_t i ) const { if( i >= tokens_.size() )throw ESyntaxError( wxT("attempt to access non-existent token") ); return tokens_[i]->GetString(); } double ParseLine::GetNumeric( std::size_t i ) const { if( i >= tokens_.size() )throw ESyntaxError( wxT("attempt to access non-existent token") ); return tokens_[i]->GetNumeric(); } bool ParseLine::IsEqualSign( std::size_t i ) const { if( i >= tokens_.size() )return false; return tokens_[i]->IsaEqualSign(); } bool ParseLine::IsNull( std::size_t i ) const { if( i >= tokens_.size() )return false; return tokens_[i]->IsaNull(); } bool ParseLine::IsNumeric( std::size_t i ) const { if( i >= tokens_.size() )return false; return tokens_[i]->IsaNumeric(); } bool ParseLine::IsString( std::size_t i ) const { if( i >= tokens_.size() )return false; return tokens_[i]->IsaString(); } void ParseLine::AddToString( wxChar c ) { tokens_.back()->GetString().append( c ); } void ParseLine::AddToQualifier( wxChar c ) { tokens_.back()->GetLastQualifier()->append( c ); } int ParseLine::NumberOfStrings() const { int n = 0; std::size_t size = tokens_.size(); for( std::size_t i=0; iIsaString() )++n; } return n; } int ParseLine::NumberOfNumerics() const { int n = 0; std::size_t size = tokens_.size(); for( std::size_t i=0; iIsaNumeric() )++n; } return n; } int ParseLine::NumberOfNulls() const { int n = 0; std::size_t size = tokens_.size(); for( std::size_t i=0; iIsaNull() )++n; } return n; } void ParseLine::NumericOrString() { ptvIter tokenEnd = tokens_.end(); for( ptvIter j=tokens_.begin(); j!=tokenEnd; ++j ) { wxString tokenString( (*j)->GetString() ); if( !tokenString.empty() && (*j)->IsaNull() ) { double rdum; if( tokenString.ToDouble(&rdum) ) { (*j)->SetNumeric( rdum ); } else { (*j)->SetString(); if( tokenString.Upper() == wxT("IFF") )(*j)->SetString( wxT("IFF") ); } } } } void ParseLine::ParseIt() { int const Classes[128] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0,10, 4, 8, 8, 8, 8, 3, 5, 6, 8, 8, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 7, 6, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 8, 6, 8, 8 }; int const StateTable[28][11] = { // blank , ` ' " {[( }]) \ othr = ! { 0, 2, 5, 8, 11, 14,-18,-12, 3, 21,100}, // 0 delimeter after field { 1, 0, 5, 8, 11, 14,-18,-12, 3, 21,100}, // 1 blank following field { 0, 2, 5, 8, 11, 14,-18,-12, 3, 21,100}, // 2 comma after blank (+) { 1, 0, 5, 8, 11, 15,-18, 19, 4, 21,100}, // 3 start valid char. (+) { 1, 0, 5, 8, 11, 15,-18, 19, 4, 21,100}, // 4 continue valid char. { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, // 5 opening quote ` (+) { 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6}, // 6 inside quotes { 1, 0,-10,-10,-10, 4, 4, 19, 4, 4,100}, // 7 closing quote { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, // 8 opening quote ' (+) { 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9}, // 9 inside quotes { 1, 0,-10,-10,-10, 4, 4, 19, 4, 4,100}, // 10 closing quote { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, // 11 opening quote " (+) { 12, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12}, // 12 inside quotes { 1, 0,-10,-10,-10, 4, 4, 19, 4, 4,100}, // 13 closing quote { 16, 16, 16, 16, 16, 15, 17, 16, 16, 16, 16}, // 14 open ( (+) { 16, 16, 16, 16, 16, 15, 17, 16, 16, 16, 16}, // 15 open ( { 16, 16, 16, 16, 16, 15, 17, 16, 16, 16, 16}, // 16 inside () { 16, 16, 16, 16, 16, 15, 17, 16, 16, 16, 16}, // 17 close ) { 1, 0,-19,-19,-19, 15,-18, 19, 4, 21,100}, // 18 close final ) {-22,-22,-16,-16,-16, 24,-18,-12, 20,-30,-22}, // 19 start qualifier { 1, 0,-16,-16,-16, 24,-18, 19, 20,-30,100}, // 20 inside qual. { 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,100}, // 21 equals sign (+) { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, // 22 start expression (+) { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, // 23 continue expr. { 25, 25,-16,-16,-16, 24, 26,-12, 25, 25, 25}, // 24 qual. opening ( { 25, 25,-16,-16,-16, 24, 26,-12, 25, 25, 25}, // 25 qual. inside () { 25, 25,-16,-16,-16, 24, 26,-12, 25, 25, 25}, // 26 qual. closing ) { 1, 0,-14,-14,-14, 24,-18, 20, 20, 21,100} // 27 qual. closing final ) }; int len = inputLine_.size(); std::size_t openBracketCounter = 0; wxChar const openingQuote = 96; wxChar const singleQuote = 39; wxChar const doubleQuote = 34; int currentState, newState = 0; int i = -1; std::size_t errNo = 0; bool newToken = true; std::string std_input( inputLine_.mb_str(wxConvUTF8) ); for( ;; ) { switch (newState) { case 0: { errNo = 0; newToken = true; break; } case 1: // blank following field { errNo = 0; newToken = true; break; } case 2: // comma after blank { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); openBracketCounter = 0; errNo = 0; newToken = true; break; } case 3: // start valid character { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); openBracketCounter = 0; AddToString( inputLine_[i] ); break; } case 4: // add character to a string { AddToString( inputLine_[i] ); errNo = 0; newToken = false; break; } case 5: // start quote string with ` { if( newToken ) { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); } errNo = 1; AddToString( inputLine_[i] ); break; } case 6: // add character to quote ` ' string { AddToString( inputLine_[i] ); break; } case 7: // closing quote ' { AddToString( inputLine_[i] ); errNo = 0; break; } case 8: // start quote string with ' { if( newToken ) { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); } errNo = 1; AddToString( inputLine_[i] ); break; } case 9: // add character to quote ' ' string { AddToString( inputLine_[i] ); break; } case 10: // closing quote ' { AddToString( inputLine_[i] ); errNo = 0; break; } case 11: // start quote string with " { if( newToken ) { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); } errNo = 1; AddToString( inputLine_[i] ); break; } case 12: // add character to quote " " string { AddToString( inputLine_[i] ); break; } case 13: // closing quote " { AddToString( inputLine_[i] ); errNo = 0; break; } case 14: // initial opening bracket { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); ++openBracketCounter; errNo = 2; AddToString( inputLine_[i] ); break; } case 15: // opening bracket { ++openBracketCounter; AddToString( inputLine_[i] ); break; } case 16: // add character inside brackets { AddToString( inputLine_[i] ); break; } case 17: // closing bracket { if( --openBracketCounter == 0 ) // final closing bracket { newState = 18; errNo = 0; } AddToString( inputLine_[i] ); break; } case 18: // final closing bracket { AddToString( inputLine_[i] ); break; } case 19: // encountered qualifier symbol { tokens_.back()->MakeNewQualifier(); errNo = 3; break; } case 20: // add character to qualifier { wxString s( inputLine_[i] ); s.MakeUpper(); AddToQualifier( s[0] ); //int tmp = toupper( inputLine_[i] ); //AddToQualifier( static_cast(tmp) ); errNo = 0; break; } case 21: // encountered equal sign { std::auto_ptr atoken( new ParseToken ); ParseToken *token0 = atoken.release(); tokens_.push_back( token0 ); if( GetNumberOfTokens() == 1 ) { std::auto_ptr atoken( new ParseToken ); ParseToken *token1 = atoken.release(); tokens_.push_back( token1 ); } // // If field 1 is an equal sign, the input line must be an evaluation // For consistency, make the first field a null field, putting the // equal sign into the second field // tokens_.back()->SetType( ParseToken::EQUALSIGN ); AddToString( '=' ); errNo = 0; break; } case 22: // start expression after an equal sign { std::auto_ptr atoken( new ParseToken ); ParseToken *token = atoken.release(); tokens_.push_back( token ); tokens_.back()->SetType( ParseToken::STRINGFIELD ); openBracketCounter = 0; errNo = 0; if( inputLine_[i] == openingQuote ) { AddToString( inputLine_[i] ); while ( ++i < len ) { AddToString( inputLine_[i] ); if( inputLine_[i] == singleQuote )break; } } else if( inputLine_[i] == singleQuote ) { AddToString( inputLine_[i] ); while ( ++i < len ) { AddToString( inputLine_[i] ); if( inputLine_[i] == singleQuote )break; } } else if( inputLine_[i] == doubleQuote ) { AddToString( inputLine_[i] ); while ( ++i < len ) { AddToString( inputLine_[i] ); if( inputLine_[i] == doubleQuote )break; } } else if( inputLine_[i] == '!' ) { len = i--; } else { AddToString( inputLine_[i] ); } break; } case 23: // inside expression after an equal sign { if( inputLine_[i] == openingQuote ) { AddToString( inputLine_[i] ); while ( ++i < len ) { AddToString( inputLine_[i] ); if( inputLine_[i] == singleQuote )break; } } else if( inputLine_[i] == singleQuote ) { AddToString( inputLine_[i] ); while ( ++i < len ) { AddToString( inputLine_[i] ); if( inputLine_[i] == singleQuote )break; } } else if( inputLine_[i] == doubleQuote ) { AddToString( inputLine_[i] ); while ( ++i < len ) { AddToString( inputLine_[i] ); if( inputLine_[i] == doubleQuote )break; } } else if( inputLine_[i] == '!' ) { len = i--; } else { AddToString( inputLine_[i] ); } break; } case 24: // (qualifier) opening bracket { ++openBracketCounter; errNo = 2; AddToQualifier( inputLine_[i] ); break; } case 25: // (qualifier) inside brackets { wxString s( inputLine_[i] ); s.MakeUpper(); AddToQualifier( s[0] ); //int tmp = toupper( inputLine_[i] ); //AddToQualifier( static_cast(tmp) ); break; } case 26: // (qualifier) closing bracket { if( --openBracketCounter == 0 ) { newState = 27; errNo = 0; } AddToQualifier( inputLine_[i] ); break; } } if( ++i >= len ) { switch ( errNo ) { case 0: break; case 1: throw ESyntaxError( wxT("unbalanced quotes") ); case 2: throw ESyntaxError( wxT("unbalanced brackets") ); case 3: throw ESyntaxError( wxT("null qualifier") ); } break; } currentState = newState; int iascii = toascii( std_input[i] ); newState = StateTable[currentState][Classes[iascii]]; if( newState == 100 ) { switch ( errNo ) { case 0: break; case 1: throw ESyntaxError( wxT("unbalanced quotes") ); case 2: throw ESyntaxError( wxT("unbalanced brackets") ); case 3: throw ESyntaxError( wxT("null qualifier") ); } break; } else if( newState < 0 ) { switch ( newState ) { case -10: throw ESyntaxError( wxT("unseperated quote strings") ); case -11: throw ESyntaxError( wxT("opening bracket following quote") ); case -12: throw ESyntaxError( wxT("invalid qualifier") ); case -13: throw ESyntaxError( wxT("closing bracket following quote") ); case -14: throw ESyntaxError( wxT("unbalanced quotes") ); case -15: throw ESyntaxError( wxT("empty quote string") ); case -16: throw ESyntaxError( wxT("quote string in qualifier") ); case -17: throw ESyntaxError( wxT("qualifier on quote string") ); case -18: throw ESyntaxError( wxT("unbalanced brackets") ); case -19: throw ESyntaxError( wxT("unseperated fields") ); case -20: throw ESyntaxError( wxT("equal sign immediately following quote string") ); case -21: throw ESyntaxError( wxT("quote string immediately following valid character") ); case -22: throw ESyntaxError( wxT("expecting qualifier string") ); case -30: throw ESyntaxError( wxT("equal sign inside qualifier") ); } break; } } NumericOrString(); } // end of file extrema-4.4.5/src/Parsing/ESyntaxError.h0000644012702201742730000000201411274636606017167 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_SYNTAXERROR #define EX_SYNTAXERROR #include #include #include "wx/wx.h" class ESyntaxError : public std::runtime_error { public: ESyntaxError( wxString const &errorMessage ) : std::runtime_error( (char const *)errorMessage.mb_str(wxConvUTF8) ) {} }; #endif extrema-4.4.5/src/extrema.h0000644012702201742730000000275511274636612014635 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_APP #define EXTREMA_APP #define wxUSE_UNICODE 1 #include "wx/wx.h" #include "wx/config.h" class AnalysisWindow; class extrema : public wxApp { public: // OnInit is called on application startup and is a good place for the app // initialization (doing it here and not in the ctor allows to have an error // return: if OnInit() returns false, the application terminates) bool OnInit(); // OnExit is called after destroying all application windows and controls, // but before wxWidgets cleanup. It is not called at all if OnInit fails. int OnExit() { wxConfigBase *config = wxConfigBase::Get(); if( config )delete config; } void WriteOutput( wxString const & ); void QuitApp(); private: AnalysisWindow *analysisWindow_; }; #endif extrema-4.4.5/src/Operators/0000755012702201742730000000000011440766120014755 5ustar spangspangextrema-4.4.5/src/Operators/OPR_lt.cpp0000644012702201742730000000144011274636612016626 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_lt.h" OPR_lt *OPR_lt::opr_lt_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_union.cpp0000644012702201742730000002326411274636612017347 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_union.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" OPR_union *OPR_union::opr_union_ = 0; void OPR_union::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff != 1 ) throw EExpressionError( wxT("union first operand must be a vector") ); code->SetIndx(0,0); } else { if( ndmEff != 1 ) throw EExpressionError( wxT("union second operand must be a vector") ); nDim = 1; nLoop = 1; code->SetIndx(0,1); // // overwrite RPN codes to correct the array operand loop index // if( code->IsaNVariable() && code->GetIndexCntr()>0 ) { ExprCodes *ec = oCode[oCode.size()-1]; ec->SetImmediateValue( oCode.back()->GetIndx(0) ); } } } void OPR_union::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) ws->SetDimMag( 0, nptEff[0] ); else { std::deque &cd( ws->GetCodes() ); ExprCodes *c = cd[cd.size()-2]; std::size_t ndim; if( c->IsaNVariable() ) ndim = c->GetNVarPtr()->GetData().GetNumberOfDimensions(); else if( c->IsaWorkspace() ) ndim = c->GetWorkspacePtr()->GetNumberOfDimensions(); else throw EExpressionError( wxT("union second operand problem") ); if( ndim != 1 ) throw EExpressionError( wxT("union second operand must be a vector: 2") ); ws->SetDimMag( c->GetIndx(0)-1, nptEff[0] ); } } void OPR_union::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; ExprCodes *op2 = codes[1]; std::vector d1, d2; std::size_t size1 = 0; std::size_t size2 = 0; unsigned short int o1 = 0; // default is unordered unsigned short int o2 = 0; // " " " if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = nd.GetDimMag(0); if( nd.IsAscending() ) o1 = 2; else if( nd.IsDescending() )o1 = 1; } else { Workspace *w1 = op1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("union operator: first operand workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); size1 = w1->GetDimMag(0); if( w1->IsAscending() ) o1 = 2; else if( w1->IsDescending() )o1 = 1; } if( op2->IsaNVariable() ) { NumericData nd( op2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = nd.GetDimMag(0); if( nd.IsAscending() ) o2 = 2; else if( nd.IsDescending() )o2 = 1; } else { Workspace *w2 = op2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("union operator: second operand workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); size2 = w2->GetDimMag(0); if( w2->IsAscending() ) o2 = 2; else if( w2->IsDescending() )o2 = 1; } ws->SetNumberOfDimensions(1); std::size_t cntr = 0; if( o1 == 0 ) // first not ordered { if( o2 == 2 ) // second ascending { ws->SetData( d2 ); cntr = size2; for( std::size_t i=0; i d1[i] )break; } if( flag )ws->SetData( cntr++, d1[i] ); } ws->SetUnordered(); } else if( o2 == 1 ) // second descending { ws->SetData( d2 ); cntr = size2; for( std::size_t i=0; iSetData( cntr++, d1[i] ); } ws->SetUnordered(); } else // second not ordered { ws->SetData( d1 ); cntr = size1; for( std::size_t j=0; jSetData( cntr++, d2[j] ); } ws->SetUnordered(); } } else if( o1 == 2 ) // first ascending order { if( o2 == 2 ) // second ascending { std::size_t j, i=0; for( j=0; jSetData( cntr++, d1[i-1] ); } else if( d1[i-1] == d2[j] ) { ws->SetData( cntr++, d2[j] ); break; } else { ws->SetData( cntr++, d2[j] ); --i; break; } } } if( i < size1-1 ) { for( std::size_t k=i; kSetData( cntr++, d1[k] ); } if( j < size2-1 ) { for( std::size_t k=j; kSetData( cntr++, d2[k] ); } ws->SetAscending(); } else if( o2 == 1 ) // descending order { std::size_t j, i=0; for( j=0; jSetData( cntr++, d1[i-1] ); } else if( d1[i-1] == d2[size2-j-1] ) { ws->SetData( cntr++, d2[size2-j-1] ); break; } else { ws->SetData( cntr++, d2[size2-j-1] ); --i; break; } } } if( i < size1 ) { for( std::size_t k=i; kSetData( cntr++, d1[k] ); } if( j < size2 ) { for( std::size_t k=j; kSetData( cntr++, d2[size2-k-1] ); } ws->SetAscending(); } else // second not ordered { ws->SetData( d1 ); cntr = size1; for( std::size_t j=0; j d2[j] )break; } if( flag )ws->SetData( cntr++, d2[j] ); } ws->SetUnordered(); } } else if( o1 == 1 ) // first descending order { if( o2 == 2 ) // second ascending { std::size_t j, i=0; for( j=0; jSetData( cntr++, d1[size1-i] ); } else if( d1[size1-i] == d2[j] ) { ws->SetData( cntr++, d2[j] ); break; } else { ws->SetData( cntr++, d2[j] ); --i; break; } } } if( i < size1 ) { for( std::size_t k=i; kSetData( cntr++, d1[size1-k-1] ); } if( j < size2 ) { for( std::size_t k=j; kSetData( cntr++, d2[k] ); } ws->SetAscending(); } else if( o2 == 1 ) // second descending { std::size_t j, i=0; for( j=0; j d2[j] ) { ws->SetData( cntr++, d1[i-1] ); } else if( d1[i-1] == d2[j] ) { ws->SetData( cntr++, d2[j] ); break; } else { ws->SetData( cntr++, d2[j] ); --i; break; } } } if( i < size1 ) { for( std::size_t k=i; kSetData( cntr++, d1[k] ); } if( j < size2 ) { for( std::size_t k=j; kSetData( cntr++, d2[k] ); } ws->SetDescending(); } else // second not ordered { for( std::size_t i=0; iSetData( cntr++, d1[size1-i-1] ); for( std::size_t j=0; j d2[j] )break; } if( flag )ws->SetData( cntr++, d2[j] ); } } } ws->SetDimMag( 0, cntr ); } // end of file extrema-4.4.5/src/Operators/OPR_divide.cpp0000644012702201742730000000206511274636612017457 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "OPR_divide.h" #include "EExpressionError.h" OPR_divide *OPR_divide::opr_divide_ = 0; double OPR_divide::ScalarEval( double a, double b ) const { if( fabs(b) < std::numeric_limits::min() ) throw EExpressionError(wxT("attempted division by zero")); return a/b; } // end of file extrema-4.4.5/src/Operators/ScalarOperator.cpp0000644012702201742730000000262211274636612020413 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "ScalarOperator.h" #include "Workspace.h" #include "EExpressionError.h" void ScalarOperator::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) { for( unsigned int j=0; jGetNumberOfLoops(); ++j ) ws->SetDimMag( static_cast(j), nptEff[j] ); } else { for( unsigned int j=0; jGetNumberOfLoops(); ++j ) { if( static_cast(ws->GetDimMag(static_cast(j))) != nptEff[j] ) { wxString s( wxT("size mismatch for dimension ") ); throw EExpressionError( s << j ); } } } } // end-of-file extrema-4.4.5/src/Operators/OPR_multiply.h0000644012702201742730000000232011274636612017531 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_MULTIPLY #define OPR_MULTIPLY #include "ScalarOperator.h" class OPR_multiply : public ScalarOperator { public: static OPR_multiply *Instance() { if( !opr_multiply_ )opr_multiply_ = new OPR_multiply(); return opr_multiply_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return a*b; } private: OPR_multiply() : ScalarOperator( wxT("*"), 0, 6 ) {} static OPR_multiply *opr_multiply_; }; #endif extrema-4.4.5/src/Operators/OPR_not.h0000644012702201742730000000225211274636612016456 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_NOT #define OPR_NOT #include "ScalarOperator.h" class OPR_not : public ScalarOperator { public: static OPR_not *Instance() { if( !opr_not_ )opr_not_ = new OPR_not(); return opr_not_; } double ScalarEval( double a, double b ) const { return 0.0; } double ScalarEval( double a ) const { return (a==0.0) ? 1.0 : 0.0; } private: OPR_not() : ScalarOperator( wxT("~"), 3, 0 ) {} static OPR_not *opr_not_; }; #endif extrema-4.4.5/src/Operators/OPR_plus.h0000644012702201742730000000224211274636612016640 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_PLUS #define OPR_PLUS #include "ScalarOperator.h" class OPR_plus : public ScalarOperator { public: static OPR_plus *Instance() { if( !opr_plus_ )opr_plus_ = new OPR_plus(); return opr_plus_; } double ScalarEval( double a, double b ) const { return a+b; } double ScalarEval( double a ) const { return a; } private: OPR_plus() : ScalarOperator( wxT("+"), 5, 5 ) {} static OPR_plus *opr_plus_; }; #endif extrema-4.4.5/src/Operators/OPR_and.h0000644012702201742730000000226211274636612016421 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_AND #define OPR_AND #include "ScalarOperator.h" class OPR_and : public ScalarOperator { public: static OPR_and *Instance() { if( !opr_and_ )opr_and_ = new OPR_and(); return opr_and_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a!=0.0&&b!=0.0) ? 1.0 : 0.0; } private: OPR_and() : ScalarOperator( wxT("&"), 0, 2 ) {} static OPR_and *opr_and_; }; #endif extrema-4.4.5/src/Operators/OPR_transpose.h0000644012702201742730000000244511274636612017700 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_TRANSPOSE #define OPR_TRANSPOSE #include "ArrayOperator.h" class OPR_transpose : public ArrayOperator { public: static OPR_transpose *Instance() { if( !opr_transpose_ )opr_transpose_ = new OPR_transpose(); return opr_transpose_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); private: OPR_transpose() : ArrayOperator( wxT("<-"), 9, 0 ) {} static OPR_transpose *opr_transpose_; }; #endif extrema-4.4.5/src/Operators/OPR_outerProduct.h0000644012702201742730000000256511274636612020364 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_OUTERPRODUCT #define OPR_OUTERPRODUCT #include "ArrayOperator.h" class OPR_outerProduct : public ArrayOperator { public: static OPR_outerProduct *Instance() { if( !opr_outerProduct_ )opr_outerProduct_ = new OPR_outerProduct(); return opr_outerProduct_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); private: OPR_outerProduct() : ArrayOperator( wxT("><"), 0, 8 ) {} static OPR_outerProduct *opr_outerProduct_; unsigned short int firstOperandDimension_; }; #endif extrema-4.4.5/src/Operators/OPR_not.cpp0000644012702201742730000000144411274636612017013 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_not.h" OPR_not *OPR_not::opr_not_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_reflect.h0000644012702201742730000000241711274636612017305 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_REFLECT #define OPR_REFLECT #include "ArrayOperator.h" class OPR_reflect : public ArrayOperator { public: static OPR_reflect *Instance() { if( !opr_reflect_ )opr_reflect_ = new OPR_reflect(); return opr_reflect_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); private: OPR_reflect() : ArrayOperator( wxT(">-"), 9, 0 ) {} static OPR_reflect *opr_reflect_; }; #endif extrema-4.4.5/src/Operators/OPR_gt.h0000644012702201742730000000223411274636612016270 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_GT #define OPR_GT #include "ScalarOperator.h" class OPR_gt : public ScalarOperator { public: static OPR_gt *Instance() { if( !opr_gt_ )opr_gt_ = new OPR_gt(); return opr_gt_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a>b) ? 1.0 : 0.0; } private: OPR_gt() : ScalarOperator( wxT(">"), 0, 4 ) {} static OPR_gt *opr_gt_; }; #endif extrema-4.4.5/src/Operators/OPR_innerProduct.h0000644012702201742730000000256211274636612020336 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_INNERPRODUCT #define OPR_INNERPRODUCT #include "ArrayOperator.h" class OPR_innerProduct : public ArrayOperator { public: static OPR_innerProduct *Instance() { if( !opr_innerProduct_ )opr_innerProduct_ = new OPR_innerProduct(); return opr_innerProduct_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); private: OPR_innerProduct() : ArrayOperator( wxT("<>"), 0, 8 ) {} static OPR_innerProduct *opr_innerProduct_; unsigned short int firstOperandDimension_; }; #endif extrema-4.4.5/src/Operators/OperatorDefinition.cpp0000644012702201742730000000205111274636612021272 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OperatorDefinition.h" #include "OperatorTable.h" OperatorDefinition::OperatorDefinition( wxString const &name, int up, int bp, OperatorDefinition::Type type ) : name_(name), unaryPriority_(up), binaryPriority_(bp), type_(type) { OperatorTable::GetTable()->AddEntry( this ); } extrema-4.4.5/src/Operators/OPR_ge.h0000644012702201742730000000223611274636612016253 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_GE #define OPR_GE #include "ScalarOperator.h" class OPR_ge : public ScalarOperator { public: static OPR_ge *Instance() { if( !opr_ge_ )opr_ge_ = new OPR_ge(); return opr_ge_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a>=b) ? 1.0 : 0.0; } private: OPR_ge() : ScalarOperator( wxT(">="), 0, 4 ) {} static OPR_ge *opr_ge_; }; #endif extrema-4.4.5/src/Operators/OperatorDefinition.h0000644012702201742730000000530311274636612020742 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_OPERATORDEFINITION #define OPR_OPERATORDEFINITION #include #include #include "wx/wx.h" class Workspace; class ExprCodes; class OperatorDefinition { protected: enum Type { SCALAR, ARRAY, CHARACTER }; OperatorDefinition( wxString const &, int, int, Type ); public: virtual ~OperatorDefinition() {} bool operator==( OperatorDefinition const &rhs ) const { return (name_ == rhs.name_); } bool operator!=( OperatorDefinition const &rhs ) const { return (name_ != rhs.name_); } wxString Name() const { return name_; } int UnaryPriority() const { return unaryPriority_; } int BinaryPriority() const { return binaryPriority_; } void OperandCounter( unsigned short int i ) { operandCounter_ = i; } unsigned short int OperandCounter() const { return operandCounter_; } bool IsScalar() const { return (type_ == SCALAR); } bool IsCharacter() const { return (type_ == CHARACTER); } bool IsArray() const { return (type_ == ARRAY); } void SetArray() { type_ = ARRAY; } void SetCharacter() { type_ = CHARACTER; } virtual void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ) {} virtual void CalcOperand( bool, int, int *, Workspace * ) {} virtual void TextScalarEval( int, std::vector & ) const {} virtual double ScalarEval( double, double ) const { return 0.0; } virtual double ScalarEval( double ) const { return 0.0; } virtual void ArrayEval( Workspace * ) {} private: // // singleton class: // cannot call default constructor, copy constructor, or operator= // OperatorDefinition() {} OperatorDefinition( OperatorDefinition const & ) {} OperatorDefinition const &operator=( OperatorDefinition const & ) { return *this; } wxString name_; int unaryPriority_, binaryPriority_; unsigned short int operandCounter_; Type type_; }; #endif extrema-4.4.5/src/Operators/OPR_minus.cpp0000644012702201742730000000145411274636612017347 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_minus.h" OPR_minus *OPR_minus::opr_minus_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_divide.h0000644012702201742730000000224511274636612017124 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_DIVIDE #define OPR_DIVIDE #include "ScalarOperator.h" class OPR_divide : public ScalarOperator { public: static OPR_divide *Instance() { if( !opr_divide_ )opr_divide_ = new OPR_divide(); return opr_divide_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double, double ) const; private: OPR_divide() : ScalarOperator( wxT("/"), 0, 6 ) {} static OPR_divide *opr_divide_; }; #endif extrema-4.4.5/src/Operators/ArrayOperator.h0000644012702201742730000000223311274636612017727 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_ARRAYOPERATOR #define OPR_ARRAYOPERATOR #include "OperatorDefinition.h" class ArrayOperator : public OperatorDefinition { // A virtual class for array operators public: virtual ~ArrayOperator() {} protected: ArrayOperator( wxString const &name, int unaryPriority, int binaryPriority ) : OperatorDefinition( name, unaryPriority, binaryPriority, OperatorDefinition::ARRAY ) {} }; #endif extrema-4.4.5/src/Operators/OPR_equals.cpp0000644012702201742730000000146211274636612017505 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_equals.h" OPR_equals *OPR_equals::opr_equals_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_le.h0000644012702201742730000000223611274636612016260 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_LE #define OPR_LE #include "ScalarOperator.h" class OPR_le : public ScalarOperator { public: static OPR_le *Instance() { if( !opr_le_ )opr_le_ = new OPR_le(); return opr_le_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a<=b) ? 1.0 : 0.0; } private: OPR_le() : ScalarOperator( wxT("<="), 0, 4 ) {} static OPR_le *opr_le_; }; #endif extrema-4.4.5/src/Operators/OPR_exclusiveOr.cpp0000644012702201742730000000150311274636612020517 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_exclusiveOr.h" OPR_exclusiveOr *OPR_exclusiveOr::opr_exclusiveOr_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_transpose.cpp0000644012702201742730000000517211274636612020233 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_transpose.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" OPR_transpose *OPR_transpose::opr_transpose_ = 0; void OPR_transpose::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff != 2 ) throw EExpressionError( wxT("transpose operand must be a matrix") ); code->SetIndx( 0, 0 ); code->SetIndx( 1, 1 ); } } void OPR_transpose::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) { ws->SetDimMag( 0, nptEff[1] ); ws->SetDimMag( 1, nptEff[0] ); } } void OPR_transpose::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; std::vector d1; unsigned int ndm1; unsigned int size1[3] = {0,0,0}; if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("transpose operator: operand workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } // // c[i,j] = a[j,i] // ws->SetNumberOfDimensions(2); std::size_t dm0 = ws->GetDimMag(0); std::size_t dm1 = ws->GetDimMag(1); for( std::size_t j=0; jSetData( i+j*dm0, d1[j+i*size1[0]] ); } } // end of file extrema-4.4.5/src/Operators/OPR_outerProduct.cpp0000644012702201742730000001326411274636612020715 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_outerProduct.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" OPR_outerProduct *OPR_outerProduct::opr_outerProduct_ = 0; void OPR_outerProduct::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff == 0 ) throw EExpressionError( wxT("outer product first operand must be an array") ); firstOperandDimension_ = ndmEff; for( unsigned short int i=0; iSetIndx(i,i+1); } else { if( ndmEff == 0 ) throw EExpressionError( wxT("outer product second operand must be an array") ); nDim = ndmEff + firstOperandDimension_; nLoop = nDim; if( nDim > 3 ) throw EExpressionError( wxT("outer product result dimension > 3") ); for( int i = 0; i < ndmEff; ++i ) code->SetIndx( i, firstOperandDimension_+i+1 ); // // overwrite RPN codes to correct the array operand loop index // if( code->IsaNVariable() && code->GetIndexCntr() > 0 ) { std::size_t nBack = 0; for( int i=ndmEff-1; i>=0; --i ) { ExprCodes *ec = oCode[oCode.size()-nBack-1]; ec->SetImmediateValue( oCode.back()->GetIndx(i) ); nBack += 5; } } } } void OPR_outerProduct::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) { firstOperandDimension_ = ndmEff; for( unsigned short int j=0; jSetDimMag(j,nptEff[j]); } else { std::deque &cd( ws->GetCodes() ); ExprCodes *c = cd[cd.size()-2]; std::size_t ndim = 0; if( c->IsaNVariable() ) ndim = c->GetNVarPtr()->GetData().GetNumberOfDimensions(); else if( c->IsaWorkspace() ) ndim = c->GetWorkspacePtr()->GetNumberOfDimensions(); else throw EExpressionError( wxT("outer product second operand problem") ); for( std::size_t i=0; iSetDimMag(c->GetIndx(i)-1,nptEff[i]); } } void OPR_outerProduct::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; ExprCodes *op2 = codes[1]; std::vector d1, d2; std::size_t ndm1, ndm2; std::size_t size1[3] = {0,0,0}; std::size_t size2[3] = {0,0,0}; if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("outer product: first operand workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } if( op2->IsaNVariable() ) { NumericData nd( op2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); ndm2 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("outer product: second operand workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); ndm2 = w2->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } std::size_t dm0 = ws->GetDimMag(0); std::size_t dm1 = ws->GetDimMag(1); std::size_t dm2 = ws->GetDimMag(2); if( ws->GetNumberOfLoops() == 2 ) // matrix result { // c[i,j] = a[i]*b[j] ws->SetNumberOfDimensions(2); for( std::size_t i=0; iSetData( i+j*dm0, d1[i]*d2[j] ); } } else if( ws->GetNumberOfLoops() == 3 ) // tensor result { ws->SetNumberOfDimensions(3); if( ndm1 == 2 ) // matrix >< vector { // c[i,j,k] = a[i,j]*b[k] for( std::size_t k=0; kSetData( i+j*dm0+k*dm0*dm1, d1[i+j*size1[0]]*d2[k] ); } } } else if( ndm1 == 1 ) // vector >< matrix { // c[i,j,k] = a[i]<>b[j,k] for( std::size_t k=0; kSetData( i+j*dm0+k*dm0*dm1, d1[i]*d2[j+k*size1[0]] ); } } } } } // end of file extrema-4.4.5/src/Operators/OPR_ge.cpp0000644012702201742730000000144011274636612016602 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_ge.h" OPR_ge *OPR_ge::opr_ge_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_concatenation.h0000644012702201742730000000303111274636612020477 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_CONCATENATION #define OPR_CONCATENATION #include "OperatorDefinition.h" class OPR_concatenation : public OperatorDefinition { public: static OPR_concatenation *Instance() { if( !opr_concatenation_ )opr_concatenation_ = new OPR_concatenation(); return opr_concatenation_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); void TextScalarEval( int j, std::vector &sStack ) const { sStack[j] += sStack[j+1]; } private: OPR_concatenation() : OperatorDefinition( wxT("//"), 0, 9, OperatorDefinition::CHARACTER ) {} static OPR_concatenation *opr_concatenation_; unsigned short int firstOperandDimension_; }; #endif extrema-4.4.5/src/Operators/OPR_intersection.h0000644012702201742730000000250611274636612020366 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_INTERSECTION #define OPR_INTERSECTION #include "ArrayOperator.h" class OPR_intersection : public ArrayOperator { public: static OPR_intersection *Instance() { if( !opr_intersection_ )opr_intersection_ = new OPR_intersection(); return opr_intersection_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); private: OPR_intersection() : ArrayOperator( wxT("/&"), 0, 9 ) {} static OPR_intersection *opr_intersection_; }; #endif extrema-4.4.5/src/Operators/OPR_exponentiation2.h0000644012702201742730000000241211274636612021002 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_EXPONENTIATION2 #define OPR_EXPONENTIATION2 #include "ScalarOperator.h" class OPR_exponentiation2 : public ScalarOperator { public: static OPR_exponentiation2 *Instance() { if( !opr_exponentiation2_ )opr_exponentiation2_ = new OPR_exponentiation2(); return opr_exponentiation2_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double, double ) const; private: OPR_exponentiation2() : ScalarOperator( wxT("**"), 0, -7 ) {} static OPR_exponentiation2 *opr_exponentiation2_; }; #endif extrema-4.4.5/src/Operators/OPR_minus.h0000644012702201742730000000225611274636612017015 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_MINUS #define OPR_MINUS #include "ScalarOperator.h" class OPR_minus : public ScalarOperator { public: static OPR_minus *Instance() { if( !opr_minus_ )opr_minus_ = new OPR_minus(); return opr_minus_; } double ScalarEval( double a, double b ) const { return a-b; } double ScalarEval( double a ) const { return -a; } private: OPR_minus() : ScalarOperator( wxT("-"), 5, 5 ) {} static OPR_minus *opr_minus_; }; #endif extrema-4.4.5/src/Operators/OPR_exclusiveOr.h0000644012702201742730000000242711274636612020172 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_EXCLUSIVEOR #define OPR_EXCLUSIVEOR #include "ScalarOperator.h" class OPR_exclusiveOr : public ScalarOperator { public: static OPR_exclusiveOr *Instance() { if( !opr_exclusiveOr_ )opr_exclusiveOr_ = new OPR_exclusiveOr(); return opr_exclusiveOr_; } double ScalarEval( double ) const { return 0.0; } double ScalarEval( double a, double b ) const { return ((a==0.0||b==0.0)&&(a+b!=0.0)) ? 1.0 : 0.0; } private: OPR_exclusiveOr() : ScalarOperator( wxT("||"), 0, 1 ) {} static OPR_exclusiveOr *opr_exclusiveOr_; }; #endif extrema-4.4.5/src/Operators/OPR_ne.cpp0000644012702201742730000000144011274636612016611 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_ne.h" OPR_ne *OPR_ne::opr_ne_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_concatenation.cpp0000644012702201742730000001165411274636612021044 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_concatenation.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" #include "NumericVariable.h" OPR_concatenation *OPR_concatenation::opr_concatenation_ = 0; void OPR_concatenation::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff == 1 ) { firstOperandDimension_ = 1; code->SetIndx( 0, 1 ); } else if( ndmEff == 0 ) { firstOperandDimension_ = 0; code->SetIndx( 0, 1 ); } else { throw EExpressionError( wxT("concatenation first operand must be a vector or scalar") ); } } else { if( ndmEff!=0 && ndmEff!=1 ) { throw EExpressionError( wxT("concatenation second operand must be a vector or scalar") ); } nDim = 1; nLoop = 2; code->SetIndx( 0, 1 ); // // overwrite RPN codes to correct the array operand loop index // if( code->IsaNVariable() && code->GetIndexCntr()>0 && ndmEff>0 ) oCode[oCode.size()-2]->SetImmediateValue(2); } } void OPR_concatenation::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) { firstOperandDimension_ = ndmEff; ws->SetDimMag( 0, nptEff[0] ); } else { std::deque &cd( ws->GetCodes() ); ExprCodes *c = cd[cd.size()-2]; size_t ndim = 0; if( c->IsaNVariable() ) { ndim = c->GetNVarPtr()->GetData().GetNumberOfDimensions(); } else if( c->IsaWorkspace() ) { ndim = c->GetWorkspacePtr()->GetNumberOfDimensions(); } else if( c->IsaConstant() ) { ndim = 0; } else { throw EExpressionError( wxT("concatenation second operand problem") ); } size_t size = 0; for( size_t i=0; iSetDimMag( c->GetIndx(0)-1, size ); } } void OPR_concatenation::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; ExprCodes *op2 = codes[1]; std::vector d1, d2; size_t size1 = 0; size_t size2 = 0; if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); if( nd.GetNumberOfDimensions() == 1 ) { d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = nd.GetDimMag(0); } else { d1.push_back( nd.GetScalarValue() ); size1 = 1; } } else if( op1->IsaWorkspace() ) { Workspace *w1 = op1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("concatenation: first operand workspace is empty") ); if( w1->GetNumberOfDimensions() == 1 ) { d1.assign( w1->GetData().begin(), w1->GetData().end() ); size1 = w1->GetDimMag(0); } else { d1.push_back( w1->GetValue() ); size1 = 1; } } else if( op1->IsaConstant() ) { d1.push_back( op1->GetConstantValue() ); size1 = 1; } if( op2->IsaNVariable() ) { NumericData nd( op2->GetNVarPtr()->GetData() ); if( nd.GetNumberOfDimensions() == 1 ) { d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = nd.GetDimMag(0); } else { d2.push_back( nd.GetScalarValue() ); size2 = 1; } } else if( op2->IsaWorkspace() ) { Workspace *w2 = op2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("concatenation: second operand workspace is empty") ); if( w2->GetNumberOfDimensions() == 1 ) { d2.reserve(w2->GetData().size()); d2.insert( d2.begin(), w2->GetData().begin(), w2->GetData().end() ); size2 = w2->GetDimMag(0); } else { d2.push_back( w2->GetValue() ); size2 = 1; } } else if( op2->IsaConstant() ) { d2.push_back( op2->GetConstantValue() ); size2 = 1; } ws->SetNumberOfDimensions(1); size_t cntr = 0; for( size_t i=0; iSetData( cntr++, d1[i] ); for( size_t i=0; iSetData( cntr++, d2[i] ); ws->SetDimMag(0,size1+size2); } // end of file extrema-4.4.5/src/Operators/OPR_reflect.cpp0000644012702201742730000000516611274636612017644 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_reflect.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" OPR_reflect *OPR_reflect::opr_reflect_ = 0; void OPR_reflect::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff != 2 ) throw EExpressionError( wxT("reflect operand must be a matrix") ); code->SetIndx( 0, 0 ); code->SetIndx( 1, 1 ); } } void OPR_reflect::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) { ws->SetDimMag( 0, nptEff[0] ); ws->SetDimMag( 1, nptEff[1] ); } } void OPR_reflect::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; std::vector d1; std::size_t ndm1; std::size_t size1[3] = {0,0,0}; if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("reflect operator: operand workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } // // c[i,j] = a[i,#-j+1] // ws->SetNumberOfDimensions(2); std::size_t dm0 = ws->GetDimMag(0); std::size_t dm1 = ws->GetDimMag(1); for( std::size_t j=0; jSetData( i+(size1[1]-j-1)*dm0, d1[i+j*size1[0]] ); } } // end of file extrema-4.4.5/src/Operators/Makefile.am0000644012702201742730000000304411274636612017021 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = liboperators.la liboperators_la_SOURCES = \ OperatorTable.cpp OperatorTable.h \ OperatorDefinition.cpp OperatorDefinition.h \ ScalarOperator.cpp ScalarOperator.h \ OPR_and.cpp OPR_and.h \ OPR_concatenation.cpp OPR_concatenation.h \ OPR_divide.cpp OPR_divide.h \ OPR_equals.cpp OPR_equals.h \ OPR_exclusiveOr.cpp OPR_exclusiveOr.h \ OPR_exponentiation2.cpp OPR_exponentiation2.h \ OPR_exponentiation.cpp OPR_exponentiation.h \ OPR_ge.cpp OPR_ge.h \ OPR_gt.cpp OPR_gt.h \ OPR_innerProduct.cpp OPR_innerProduct.h \ OPR_intersection.cpp OPR_intersection.h \ OPR_le.cpp OPR_le.h \ OPR_lt.cpp OPR_lt.h \ OPR_minus.cpp OPR_minus.h \ OPR_multiply.cpp OPR_multiply.h \ OPR_ne.cpp OPR_ne.h \ OPR_not.cpp OPR_not.h \ OPR_or.cpp OPR_or.h \ OPR_outerProduct.cpp OPR_outerProduct.h \ OPR_plus.cpp OPR_plus.h \ OPR_reflect.cpp OPR_reflect.h \ OPR_transpose.cpp OPR_transpose.h \ OPR_union.cpp OPR_union.h \ ArrayOperator.h extrema-4.4.5/src/Operators/OPR_or.cpp0000644012702201742730000000144111274636612016630 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_or.h" OPR_or *OPR_or::opr_or_ = 0; // end of file extrema-4.4.5/src/Operators/OperatorTable.h0000644012702201742730000000357511274636612017712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_OPERATORTABLE #define OPR_OPERATORTABLE #include #include "wx/wx.h" class OperatorDefinition; class OperatorTable { // OperatorTable is the table of pointers to OperatorDefinitions // OperatorTable is a "singleton" (only one static object) // In OperatorTable, each OperatorDefinition pointer is stored // with its name as a key to itself, so each OperatorDefinition // object must have a unique name. // private: typedef std::map< wxString const, OperatorDefinition* > operatorMap; typedef operatorMap::value_type entryType; protected: OperatorTable(); OperatorTable( OperatorTable const & ); public: static OperatorTable *GetTable(); ~OperatorTable(); void ClearTable(); bool Contains( OperatorDefinition const *opd ) const; bool Contains( wxString const &name ) const { return ( operatorMap_->find( name ) != operatorMap_->end() ); } int Entries() const { return operatorMap_->size(); } OperatorDefinition *GetOperator( wxString const &name ) const; void AddEntry( OperatorDefinition *opd ); void CreateOperators(); private: operatorMap *operatorMap_; static OperatorTable *operatorTable_; }; #endif extrema-4.4.5/src/Operators/OPR_innerProduct.cpp0000644012702201742730000002126411274636612020671 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_innerProduct.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" OPR_innerProduct *OPR_innerProduct::opr_innerProduct_ = 0; void OPR_innerProduct::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff == 0 ) throw EExpressionError( wxT("inner product first operand must be an array") ); firstOperandDimension_ = ndmEff; for( unsigned short int i=0; iSetIndx( i, i ); } else // second operand { if( ndmEff == 0 ) throw EExpressionError( wxT("inner product second operand must be an array") ); nDim = ndmEff+firstOperandDimension_-2; nLoop = nDim+1; if( nDim > 3 ) throw EExpressionError( wxT("inner product result dimension > 3") ); for( int i = 0; i < ndmEff; ++i ) code->SetIndx( i, firstOperandDimension_+i ); // // overwrite RPN codes to correct the array operand loop index // if( code->IsaNVariable() && code->GetIndexCntr() > 0 ) // indexed variable { std::size_t nBack = 0; for( int i=ndmEff-1; i>=0; --i ) { ExprCodes *ec = oCode[oCode.size()-nBack-1]; ec->SetImmediateValue( oCode.back()->GetIndx(i) ); nBack += 5; } } } } void OPR_innerProduct::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) { firstOperandDimension_ = ndmEff; for( unsigned short int j=0; jSetDimMag( j, nptEff[j] ); } } else { if( int(ws->GetDimMag( firstOperandDimension_-1 )) != nptEff[0] ) { throw EExpressionError( wxT("inner product dimension mismatch") ); } std::deque &cd( ws->GetCodes() ); ExprCodes *c = cd[cd.size()-2]; std::size_t ndim = 0; if( c->IsaNVariable() ) ndim = c->GetNVarPtr()->GetData().GetNumberOfDimensions(); else if( c->IsaWorkspace() ) ndim = c->GetWorkspacePtr()->GetNumberOfDimensions(); else throw EExpressionError( wxT("inner product second operand problem") ); for( std::size_t i=0; iSetDimMag( c->GetIndx(i), nptEff[i] ); } } void OPR_innerProduct::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; ExprCodes *op2 = codes[1]; std::vector d1, d2; std::size_t ndm1, ndm2; std::size_t size1[3] = {0,0,0}; std::size_t size2[3] = {0,0,0}; if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("inner product first operand workspace is empty") ); d1.reserve( w1->GetData().size() ); d1.insert( d1.begin(), w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } if( op2->IsaNVariable() ) { NumericData nd( op2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); ndm2 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("inner product second operand workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); ndm2 = w2->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } if( ws->GetNumberOfLoops() == 1 ) // vector <> vector = scalar { ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); double value = 0.0; // c = a[i]*b[i] for( std::size_t i=0; iSetValue( value ); } else if( ws->GetNumberOfLoops() == 2 ) // vector result { ws->SetNumberOfDimensions(1); if( ndm1 == 2 ) // matrix <> vector { ws->SetDimMag( 0, size1[0] ); for( std::size_t i=0; iSetData( i, value ); } } else // vector <> matrix { ws->SetDimMag( 0, size2[1] ); for( std::size_t i=0; iSetData( i, value ); } } } else if( ws->GetNumberOfLoops() == 3 ) // matrix result { ws->SetNumberOfDimensions(2); if( ndm1 == 1 ) // vector <> tensor { for( std::size_t j = 0; j < ws->GetDimMag(2); ++j ) { for( std::size_t i = 0; i < ws->GetDimMag(1); ++i ) { double value = 0.0; // c[i,j] = a[k]*b[k,i,j] for( std::size_t k = 0; k < ws->GetDimMag(0); ++k ) value += d1[j] * d2[k+i*size2[0]+j*size2[0]*size2[1]]; ws->SetData( i+j*ws->GetDimMag(0), value ); } } } else if( ndm1 == 2 ) // matrix <> matrix { ws->SetDimMag( 0, size1[0] ); ws->SetDimMag( 1, size2[1] ); for( std::size_t j=0; jSetData( i+j*size1[0], value ); } } } else // tensor <> vector { for( std::size_t j = 0; j < ws->GetDimMag(1); ++j ) { for( std::size_t i = 0; i < ws->GetDimMag(0); ++i ) { double value = 0.0; // c[i,j] = a[i,j,k]*b[k] for( std::size_t k = 0; k < ws->GetDimMag(2); ++k ) value += d1[i+j*size1[0]+k*size1[0]*size1[1]] * d2[k]; ws->SetData( i+j*ws->GetDimMag(0), value ); } } } } else if( ws->GetNumberOfLoops() == 4 ) // tensor result { ws->SetNumberOfDimensions(3); if( ndm1 == 2 ) // matrix <> tensor { for( std::size_t k = 0; k < ws->GetDimMag(3); ++k ) { for( std::size_t j = 0; j < ws->GetDimMag(2); ++j ) { for( std::size_t i = 0; i < ws->GetDimMag(0); ++i ) { double value = 0.0; // c[i,j,k] = a[i,l]*b[l,j,k] for( std::size_t l = 0; l < ws->GetDimMag(1); ++l ) value += d1[i+l*size1[0]] * d2[l+j*size2[0]+k*size2[0]*size2[1]]; ws->SetData( i+j*ws->GetDimMag(0)+k*ws->GetDimMag(0)*ws->GetDimMag(1), value ); } } } } else if( ndm1 == 3 ) // tensor <> matrix { for( std::size_t k = 0; k < ws->GetDimMag(3); ++k ) { for( std::size_t j = 0; j < ws->GetDimMag(1); ++j ) { for( std::size_t i = 0; i < ws->GetDimMag(0); ++i ) { double value = 0.0; // c[i,j,k] = a[i,j,l]*b[l,k] for( std::size_t l = 0; l < ws->GetDimMag(2); ++l ) value += d1[i+j*size1[0]+l*size1[0]*size1[1]] * d2[l+k*size2[0]]; ws->SetData( i+j*ws->GetDimMag(0)+k*ws->GetDimMag(0)*ws->GetDimMag(1), value ); } } } } } } // end of file extrema-4.4.5/src/Operators/OPR_exponentiation.h0000644012702201742730000000237611274636612020731 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_EXPONENTIATION #define OPR_EXPONENTIATION #include "ScalarOperator.h" class OPR_exponentiation : public ScalarOperator { public: static OPR_exponentiation *Instance() { if( !opr_exponentiation_ )opr_exponentiation_ = new OPR_exponentiation(); return opr_exponentiation_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double, double ) const; private: OPR_exponentiation() : ScalarOperator( wxT("^"), 0, -7 ) {} static OPR_exponentiation *opr_exponentiation_; }; #endif extrema-4.4.5/src/Operators/OPR_intersection.cpp0000644012702201742730000001670111274636612020723 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_intersection.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" OPR_intersection *OPR_intersection::opr_intersection_ = 0; void OPR_intersection::ProcessOperand( bool firstOperand, int ndmEff, ExprCodes *code, std::deque &oCode, int &nDim, int &nLoop ) { if( firstOperand ) { if( ndmEff != 1 ) throw EExpressionError( wxT("intersection first operand must be a vector") ); code->SetIndx(0,0); } else { if( ndmEff != 1 ) throw EExpressionError( wxT("intersection second operand must be a vector") ); nDim = 1; nLoop = 1; code->SetIndx(0,1); // // overwrite RPN codes to correct the array operand loop index // if( code->IsaNVariable() && code->GetIndexCntr()>0 ) { ExprCodes *ec = oCode[oCode.size()-1]; ec->SetImmediateValue( oCode.back()->GetIndx(0) ); } } } void OPR_intersection::CalcOperand( bool firstOperand, int ndmEff, int *nptEff, Workspace *ws ) { if( firstOperand ) ws->SetDimMag( 0, nptEff[0] ); else { std::deque &cd( ws->GetCodes() ); ExprCodes *c = cd[cd.size()-2]; std::size_t ndim; if( c->IsaNVariable() ) ndim = c->GetNVarPtr()->GetData().GetNumberOfDimensions(); else if( c->IsaWorkspace() ) ndim = c->GetWorkspacePtr()->GetNumberOfDimensions(); else throw EExpressionError( wxT("intersection second operand problem") ); if( ndim != 1 ) throw EExpressionError( wxT("intersection second operand must be a vector: 2") ); ws->SetDimMag( c->GetIndx(0)-1, nptEff[0] ); } } void OPR_intersection::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *op1 = codes[0]; ExprCodes *op2 = codes[1]; std::vector d1, d2; std::size_t size1 = 0; std::size_t size2 = 0; unsigned short int o1 = 0; // default is unordered unsigned short int o2 = 0; // " " " if( op1->IsaNVariable() ) { NumericData nd( op1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = nd.GetDimMag(0); if( nd.IsAscending() ) o1 = 2; else if( nd.IsDescending() )o1 = 1; } else { Workspace *w1 = op1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("intersection operator: first operand workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); size1 = w1->GetDimMag(0); if( w1->IsAscending() ) o1 = 2; else if( w1->IsDescending() )o1 = 1; } if( op2->IsaNVariable() ) { NumericData nd( op2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = nd.GetDimMag(0); if( nd.IsAscending() ) o2 = 2; else if( nd.IsDescending() )o2 = 1; } else { Workspace *w2 = op2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("intersection operator: second operand workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); size2 = w2->GetDimMag(0); if( w2->IsAscending() ) o2 = 2; else if( w2->IsDescending() )o2 = 1; } ws->SetNumberOfDimensions(1); std::size_t cntr = 0; if( o1 == 0 ) // first not ordered { if( o2 == 2 ) // second ascending { for( std::size_t i=0; iSetData(cntr++,d1[i]); break; } else if( d1[i] < d2[j] ) { break; } } } ws->SetUnordered(); } else if( o2 == 1 ) // second descending { for( std::size_t i=0; iSetData(cntr++,d1[i]); break; } else if( d1[i] > d2[j] ) { break; } } } ws->SetUnordered(); } else // second not ordered { for( std::size_t i=0; iSetData(cntr++,d1[i]); break; } } } ws->SetUnordered(); } } else if( o1 == 2 ) // first ascending order { if( o2 == 2 ) // second ascending { std::size_t i = 0; for( std::size_t j=0; jSetData(cntr++,d1[i]); } ws->SetAscending(); } else if( o2 == 1 ) // second descending { std::size_t i = 0; for( std::size_t jj=0; jjSetData(cntr++,d1[i]); } ws->SetAscending(); } else // second not ordered { for( std::size_t j=0; jSetData( cntr++, d1[i] ); break; } else if( d1[i] > d2[j] ) { break; } } } ws->SetUnordered(); } } else if( o1 == 1 ) // first descending { if( o2 == 2 ) // second ascending { std::size_t i = 0; for( std::size_t j=0; jSetData(cntr++,d1[size1-i-1]); } ws->SetAscending(); } else if( o2 == 1 ) // second descending { std::size_t i = 0; for( std::size_t j=0; jd2[j] )++i; if( i == size1 )break; if( d1[i] == d2[j] )ws->SetData(cntr++,d1[i]); } ws->SetDescending(); } else // second not ordered { for( std::size_t j=0; jSetData( cntr++, d1[i] ); break; } else if( d1[i] < d2[j] ) { break; } } } ws->SetUnordered(); } } if( cntr == 0 )throw EExpressionError( wxT("intersection is empty") ); ws->SetDimMag( 0, cntr ); } // end of file extrema-4.4.5/src/Operators/OPR_multiply.cpp0000644012702201742730000000147011274636612020071 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_multiply.h" OPR_multiply *OPR_multiply::opr_multiply_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_plus.cpp0000644012702201742730000000145011274636612017173 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_plus.h" OPR_plus *OPR_plus::opr_plus_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_gt.cpp0000644012702201742730000000144011274636612016621 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_gt.h" OPR_gt *OPR_gt::opr_gt_ = 0; // end of file extrema-4.4.5/src/Operators/Makefile.in0000644012702201742730000004376311440762625017045 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Operators DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liboperators_la_LIBADD = am_liboperators_la_OBJECTS = OperatorTable.lo OperatorDefinition.lo \ ScalarOperator.lo OPR_and.lo OPR_concatenation.lo \ OPR_divide.lo OPR_equals.lo OPR_exclusiveOr.lo \ OPR_exponentiation2.lo OPR_exponentiation.lo OPR_ge.lo \ OPR_gt.lo OPR_innerProduct.lo OPR_intersection.lo OPR_le.lo \ OPR_lt.lo OPR_minus.lo OPR_multiply.lo OPR_ne.lo OPR_not.lo \ OPR_or.lo OPR_outerProduct.lo OPR_plus.lo OPR_reflect.lo \ OPR_transpose.lo OPR_union.lo liboperators_la_OBJECTS = $(am_liboperators_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(liboperators_la_SOURCES) DIST_SOURCES = $(liboperators_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = liboperators.la liboperators_la_SOURCES = \ OperatorTable.cpp OperatorTable.h \ OperatorDefinition.cpp OperatorDefinition.h \ ScalarOperator.cpp ScalarOperator.h \ OPR_and.cpp OPR_and.h \ OPR_concatenation.cpp OPR_concatenation.h \ OPR_divide.cpp OPR_divide.h \ OPR_equals.cpp OPR_equals.h \ OPR_exclusiveOr.cpp OPR_exclusiveOr.h \ OPR_exponentiation2.cpp OPR_exponentiation2.h \ OPR_exponentiation.cpp OPR_exponentiation.h \ OPR_ge.cpp OPR_ge.h \ OPR_gt.cpp OPR_gt.h \ OPR_innerProduct.cpp OPR_innerProduct.h \ OPR_intersection.cpp OPR_intersection.h \ OPR_le.cpp OPR_le.h \ OPR_lt.cpp OPR_lt.h \ OPR_minus.cpp OPR_minus.h \ OPR_multiply.cpp OPR_multiply.h \ OPR_ne.cpp OPR_ne.h \ OPR_not.cpp OPR_not.h \ OPR_or.cpp OPR_or.h \ OPR_outerProduct.cpp OPR_outerProduct.h \ OPR_plus.cpp OPR_plus.h \ OPR_reflect.cpp OPR_reflect.h \ OPR_transpose.cpp OPR_transpose.h \ OPR_union.cpp OPR_union.h \ ArrayOperator.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Operators/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Operators/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done liboperators.la: $(liboperators_la_OBJECTS) $(liboperators_la_DEPENDENCIES) $(CXXLINK) $(liboperators_la_OBJECTS) $(liboperators_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_and.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_concatenation.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_divide.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_equals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_exclusiveOr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_exponentiation.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_exponentiation2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_ge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_gt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_innerProduct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_intersection.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_le.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_lt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_minus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_multiply.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_ne.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_not.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_or.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_outerProduct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_plus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_reflect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_transpose.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OPR_union.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OperatorDefinition.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OperatorTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ScalarOperator.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Operators/OPR_and.cpp0000644012702201742730000000144311274636612016754 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_and.h" OPR_and *OPR_and::opr_and_ = 0; // end of file extrema-4.4.5/src/Operators/OperatorTable.cpp0000644012702201742730000000670511274636612020243 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OperatorTable.h" #include "OperatorDefinition.h" #include "EExpressionError.h" #include "OPR_and.h" #include "OPR_concatenation.h" #include "OPR_divide.h" #include "OPR_equals.h" #include "OPR_exclusiveOr.h" #include "OPR_exponentiation2.h" #include "OPR_exponentiation.h" #include "OPR_ge.h" #include "OPR_gt.h" #include "OPR_innerProduct.h" #include "OPR_intersection.h" #include "OPR_le.h" #include "OPR_lt.h" #include "OPR_minus.h" #include "OPR_multiply.h" #include "OPR_ne.h" #include "OPR_not.h" #include "OPR_or.h" #include "OPR_outerProduct.h" #include "OPR_plus.h" #include "OPR_reflect.h" #include "OPR_transpose.h" #include "OPR_union.h" OperatorTable *OperatorTable::operatorTable_ = 0; OperatorTable::OperatorTable() { operatorMap_ = new operatorMap; } OperatorTable::OperatorTable( OperatorTable const &rhs ) { delete operatorMap_; operatorMap_ = new operatorMap(*(rhs.operatorMap_)); } OperatorTable::~OperatorTable() { ClearTable(); } OperatorTable *OperatorTable::GetTable() { // returns the pointer to the OperatorTable object // OperatorTable is a "singleton", and can get its // pointer by this operator. The first time this // operator is called, the OperatorTable object // is instantiated. // if( !operatorTable_ )operatorTable_ = new OperatorTable(); return operatorTable_; } void OperatorTable::ClearTable() { operatorMap::const_iterator end = operatorMap_->end(); for( operatorMap::const_iterator i=operatorMap_->begin(); i!=end; ++i )delete (*i).second; delete operatorMap_; } bool OperatorTable::Contains( OperatorDefinition const *opd ) const { return Contains( opd->Name() ); } void OperatorTable::AddEntry( OperatorDefinition *opd ) { wxString name = opd->Name(); if( Contains(name) )throw EExpressionError( wxString(wxT("The operator "))+name+wxT(" is already in the table") ); operatorMap_->insert( entryType(name,opd) ); } OperatorDefinition *OperatorTable::GetOperator( wxString const &name ) const { operatorMap::iterator i = operatorMap_->find( name ); if( i != operatorMap_->end() )return (*i).second; return 0; } void OperatorTable::CreateOperators() { OPR_and::Instance(); OPR_concatenation::Instance(); OPR_divide::Instance(); OPR_equals::Instance(); OPR_exclusiveOr::Instance(); OPR_exponentiation2::Instance(); OPR_exponentiation::Instance(); OPR_ge::Instance(); OPR_gt::Instance(); OPR_innerProduct::Instance(); OPR_intersection::Instance(); OPR_le::Instance(); OPR_lt::Instance(); OPR_minus::Instance(); OPR_multiply::Instance(); OPR_ne::Instance(); OPR_not::Instance(); OPR_or::Instance(); OPR_outerProduct::Instance(); OPR_plus::Instance(); OPR_reflect::Instance(); OPR_transpose::Instance(); OPR_union::Instance(); } // end of file extrema-4.4.5/src/Operators/OPR_or.h0000644012702201742730000000225311274636612016277 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_OR #define OPR_OR #include "ScalarOperator.h" class OPR_or : public ScalarOperator { public: static OPR_or *Instance() { if( !opr_or_ )opr_or_ = new OPR_or(); return opr_or_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return ((a!=0.0)||(b!=0.0)) ? 1.0 : 0.0; } private: OPR_or() : ScalarOperator( wxT("|"), 0, 1 ) {} static OPR_or *opr_or_; }; #endif extrema-4.4.5/src/Operators/OPR_ne.h0000644012702201742730000000223611274636612016262 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_NE #define OPR_NE #include "ScalarOperator.h" class OPR_ne : public ScalarOperator { public: static OPR_ne *Instance() { if( !opr_ne_ )opr_ne_ = new OPR_ne(); return opr_ne_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a!=b) ? 1.0 : 0.0; } private: OPR_ne() : ScalarOperator( wxT("~="), 0, 4 ) {} static OPR_ne *opr_ne_; }; #endif extrema-4.4.5/src/Operators/OPR_le.cpp0000644012702201742730000000144011274636612016607 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "OPR_le.h" OPR_le *OPR_le::opr_le_ = 0; // end of file extrema-4.4.5/src/Operators/OPR_exponentiation.cpp0000644012702201742730000000167511274636612021265 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_exponentiation.h" OPR_exponentiation *OPR_exponentiation::opr_exponentiation_ = 0; double OPR_exponentiation::ScalarEval( double a, double b ) const { return pow(a,b); } // end of file extrema-4.4.5/src/Operators/ScalarOperator.h0000644012702201742730000000234411274636612020061 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_SCALAROPERATOR #define OPR_SCALAROPERATOR #include "OperatorDefinition.h" class ScalarOperator : public OperatorDefinition { // A virtual class for scalar operators public: virtual ~ScalarOperator() {} virtual void CalcOperand( bool, int, int *, Workspace * ); protected: ScalarOperator( wxString const &name, int unaryPriority, int binaryPriority ) : OperatorDefinition( name, unaryPriority, binaryPriority, OperatorDefinition::SCALAR ) {} }; #endif extrema-4.4.5/src/Operators/OPR_exponentiation2.cpp0000644012702201742730000000170111274636612021335 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "OPR_exponentiation2.h" OPR_exponentiation2 *OPR_exponentiation2::opr_exponentiation2_ = 0; double OPR_exponentiation2::ScalarEval( double a, double b ) const { return pow(a,b); } // end of file extrema-4.4.5/src/Operators/OPR_equals.h0000644012702201742730000000231111274636612017144 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_EQUALS #define OPR_EQUALS #include "ScalarOperator.h" class OPR_equals : public ScalarOperator { public: static OPR_equals *Instance() { if( !opr_equals_ )opr_equals_ = new OPR_equals(); return opr_equals_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a==b) ? 1.0 : 0.0; } private: OPR_equals() : ScalarOperator( wxT("="), 0, 4 ) {} static OPR_equals *opr_equals_; }; #endif extrema-4.4.5/src/Operators/OPR_union.h0000644012702201742730000000237111274636612017010 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_UNION #define OPR_UNION #include "ArrayOperator.h" class OPR_union : public ArrayOperator { public: static OPR_union *Instance() { if( !opr_union_ )opr_union_ = new OPR_union(); return opr_union_; } void ProcessOperand( bool, int, ExprCodes *, std::deque &, int &, int & ); void CalcOperand( bool, int, int *, Workspace * ); void ArrayEval( Workspace * ); private: OPR_union() : ArrayOperator( wxT("/|"), 0, 9 ) {} static OPR_union *opr_union_; }; #endif extrema-4.4.5/src/Operators/OPR_lt.h0000644012702201742730000000223411274636612016275 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef OPR_LT #define OPR_LT #include "ScalarOperator.h" class OPR_lt : public ScalarOperator { public: static OPR_lt *Instance() { if( !opr_lt_ )opr_lt_ = new OPR_lt(); return opr_lt_; } double ScalarEval( double a ) const { return 0.0; } double ScalarEval( double a, double b ) const { return (a class NumericVariable; class Workspace; class ListVector { private: enum ItemType { NUMERICVARIABLE, WORKSPACE, CONSTANT }; enum UseType { REAL, INT }; public: ListVector() : dimension_(1), numberOfDimensions_(0), numberOfItems_(0), useType_(REAL) {} ~ListVector() {} ListVector( ListVector const &rhs ) { CopyStuff( rhs ); } ListVector &operator=( ListVector const &rhs ) { if( &rhs != this )CopyStuff( rhs ); return *this; } void SetItemCntr( std::size_t n ) { numberOfItems_ = n; } std::size_t GetItemCntr() const { return numberOfItems_; } void SetNumberOfDimensions( std::size_t i ) { numberOfDimensions_ = i; } std::size_t GetNumberOfDimensions() const { return numberOfDimensions_; } void SetDimension( std::size_t i ) { dimension_ = i; } std::size_t GetDimension() const { return dimension_; } void SetItem( NumericVariable const *nv ) { nvItems_.push_back( nv ); wsItems_.push_back( 0 ); constantItems_.push_back( 0.0 ); itemTypes_.push_back( NUMERICVARIABLE ); } void SetItem( Workspace const *ws ) { nvItems_.push_back( 0 ); wsItems_.push_back( ws ); constantItems_.push_back( 0.0 ); itemTypes_.push_back( WORKSPACE ); } void SetItem( double d ) { nvItems_.push_back( 0 ); wsItems_.push_back( 0 ); constantItems_.push_back( d ); itemTypes_.push_back( CONSTANT ); } NumericVariable const *GetNVItem( std::size_t i ) { return nvItems_[i]; } Workspace const *GetWSItem( std::size_t i ) { return wsItems_[i]; } double GetConstantItem( std::size_t i ) const { return constantItems_[i]; } bool ItemIsaNVariable( std::size_t i ) const { return (itemTypes_[i] == NUMERICVARIABLE); } bool ItemIsaWorkspace( std::size_t i ) const { return (itemTypes_[i] == WORKSPACE); } bool ItemIsaConstant( std::size_t i ) const { return (itemTypes_[i] == CONSTANT); } double GetItem( std::size_t const i ) const; std::size_t GetNpt() const; void SetReal() { useType_ = REAL; } void SetInt() { useType_ = INT; } bool IsReal() const { return (useType_==REAL); } bool IsInt() const { return (useType_==INT); } private: std::size_t numberOfItems_; std::size_t dimension_; std::size_t numberOfDimensions_; UseType useType_; std::vector itemTypes_; std::vector nvItems_; std::vector wsItems_; std::vector constantItems_; void CopyStuff( ListVector const & ); }; #endif extrema-4.4.5/src/Expression/ExprCodes.h0000644012702201742730000002313411274636605017217 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_EXPRCODES #define EX_EXPRCODES #include "wx/wx.h" class Workspace; class ListVector; class RangeVector; class FunctionDefinition; class OperatorDefinition; class NumericVariable; class TextVariable; class ExprCodes { private: enum TokenType { UNKNOWN, FUNCTION, OPERATOR, NVARIABLE, TVARIABLE, CONSTANT, NOOP, WORKSPACE, IMMEDIATEVALUE, RANGEVECTOR, LISTVECTOR, TSTRING, OPENINGBRACKET, CLOSINGBRACKET, PAIRBRACKET, COMMA, COLON, SEMICOLON, HASH, ASTERISK, MLOOP }; enum OperatorType { UNDETERMINED, BINARY, UNARY }; public: ExprCodes() : nVariablePtr_(0), tVariablePtr_(0), functionPtr_(0), operatorPtr_(0), textArrayIndexPtr_(0), textCharacterIndexPtr_(0), workspacePtr_(0), listVectorPtr_(0), rangeVectorPtr_(0), operatorType_(UNDETERMINED), objectCntr_(0), argumentCntr_(0), indexCntr_(0), nestingLevel_(0), immediateValue_(0), insertedTextVar_(false), valid_(true), isAnIndex_(false), constantValue_(0.0), followingTerm_(7), tokenType_(UNKNOWN), referenceType_(UNKNOWN), functionIsDone_(false) { lindex_[0] = 0; lindex_[1] = 0; lindex_[2] = 0; } ~ExprCodes(); ExprCodes( ExprCodes const &rhs ) { CopyStuff( rhs ); } ExprCodes &operator=( ExprCodes const &rhs ) { if( &rhs != this )CopyStuff( rhs ); return *this; } bool operator==( ExprCodes const &rhs ) const { if( tokenType_ != rhs.tokenType_ )return false; return true; } bool operator!=( ExprCodes const &rhs ) const { if( tokenType_ == rhs.tokenType_ )return false; return true; } int GetTokenType() { return tokenType_; } void SetIndx( int i, int j ) { lindex_[i] = j; } int GetIndx( int i ) const { return lindex_[i]; } void SetNoop() { tokenType_ = NOOP; } void SetMloop() { tokenType_ = MLOOP; } void SetRangeVector() { tokenType_ = RANGEVECTOR; } void SetListVector() { tokenType_ = LISTVECTOR; } void SetOpeningBracket() { tokenType_ = OPENINGBRACKET; followingTerm_ = 5; } void SetClosingBracket() { tokenType_ = CLOSINGBRACKET; followingTerm_ = 4; } void SetPairBracket() { tokenType_ = PAIRBRACKET; followingTerm_ = 14; } void SetComma() { tokenType_ = COMMA; followingTerm_ = 6; } void SetColon() { tokenType_ = COLON; followingTerm_ = 9; } void SetSemicolon() { tokenType_ = SEMICOLON; followingTerm_ = 12; } void SetHash() { tokenType_ = HASH; followingTerm_ = 10; } void SetAsterisk() { tokenType_ = ASTERISK; followingTerm_ = 11; } bool IsaFunction() const { return (tokenType_ == FUNCTION); } bool IsaOperator() const { return (tokenType_ == OPERATOR); } bool IsaNVariable() const { return (tokenType_ == NVARIABLE); } bool IsaTVariable() const { return (tokenType_ == TVARIABLE); } bool IsaConstant() const { return (tokenType_ == CONSTANT); } bool IsaNoop() const { return (tokenType_ == NOOP); } bool IsaMloop() const { return (tokenType_ == MLOOP); } bool IsaWorkspace() const { return (tokenType_ == WORKSPACE); } bool IsaImmediateValue() const { return (tokenType_ == IMMEDIATEVALUE); } bool IsaRangeVector() const { return (tokenType_ == RANGEVECTOR); } bool IsaListVector() const { return (tokenType_ == LISTVECTOR); } bool IsaTString() const { return (tokenType_ == TSTRING); } bool IsaOpeningBracket() const { return (tokenType_ == OPENINGBRACKET); } bool IsaClosingBracket() const { return (tokenType_ == CLOSINGBRACKET); } bool IsaPairBracket() const { return (tokenType_ == PAIRBRACKET); } bool IsaComma() const { return (tokenType_ == COMMA); } bool IsaColon() const { return (tokenType_ == COLON); } bool IsaSemicolon() const { return (tokenType_ == SEMICOLON); } bool IsaHash() const { return (tokenType_ == HASH); } bool IsaAsterisk() const { return (tokenType_ == ASTERISK); } void SetReferenceType( TokenType t ) { referenceType_ = t; } void SetRefFunction() { referenceType_ = FUNCTION; } void SetRefOperator() { referenceType_ = OPERATOR; } void SetRefNVariable() { referenceType_ = NVARIABLE; } void SetRefRangeVector() { referenceType_ = RANGEVECTOR; } void SetRefListVector() { referenceType_ = LISTVECTOR; } TokenType GetReferenceType() const { return referenceType_; } bool IsFlaggedByFunction() const { return (referenceType_ == FUNCTION); } bool IsFlaggedByOperator() const { return (referenceType_ == OPERATOR); } bool IsFlaggedByNVariable() const { return (referenceType_ == NVARIABLE); } bool IsFlaggedByRangeVector() const { return (referenceType_ == RANGEVECTOR); } bool IsFlaggedByListVector() const { return (referenceType_ == LISTVECTOR); } NumericVariable *GetNVarPtr() const { return nVariablePtr_; } void SetNVarPtr( NumericVariable *p ) { nVariablePtr_ = p; tokenType_ = NVARIABLE; followingTerm_ = 2; } ListVector *GetListVectorPtr() const { return listVectorPtr_; } void SetListVectorPtr( ListVector *p ) { listVectorPtr_ = p; } RangeVector *GetRangeVectorPtr() const { return rangeVectorPtr_; } void SetRangeVectorPtr( RangeVector *p ) { rangeVectorPtr_ = p; } Workspace *GetWorkspacePtr() const { return workspacePtr_; } void SetWorkspacePtr( Workspace *p ) { tokenType_ = WORKSPACE; workspacePtr_ = p; } TextVariable *GetTVarPtr() const { return tVariablePtr_; } void SetTVarPtr( TextVariable *p ) { tokenType_ = TVARIABLE; tVariablePtr_ = p; followingTerm_ = 2; } FunctionDefinition *GetFcnPtr() const { return functionPtr_; } void SetFcnPtr( FunctionDefinition *p ) { tokenType_ = FUNCTION; functionPtr_ = p; followingTerm_ = 1; } OperatorDefinition *GetOpPtr() { return operatorPtr_; } void SetOpPtr( OperatorDefinition *p ) { tokenType_ = OPERATOR; operatorPtr_ = p; followingTerm_ = 8; } wxString GetConstantString() const { return constantString_; } double GetConstantValue() const { return constantValue_; } void SetConstantValue( double, wxString ); wxString GetTString() const; void SetTString( wxString s ) { tokenType_ = TSTRING; tString_ = s; followingTerm_ = 13; } bool GetInsertedTVar() const { return insertedTextVar_; } void SetInsertedTVar( bool f ) { insertedTextVar_ = f; } Workspace *GetTAIndexPtr() const { return textArrayIndexPtr_; } void SetTAIndexPtr( Workspace *p ) { textArrayIndexPtr_ = p; } Workspace *GetTCIndexPtr() const { return textCharacterIndexPtr_; } void SetTCIndexPtr( Workspace *p ) { textCharacterIndexPtr_ = p; } int GetImmediateValue() const { return immediateValue_; } void SetImmediateValue( int v ) { tokenType_ = IMMEDIATEVALUE; immediateValue_ = v; } bool IsBinary() const { return (operatorType_ == BINARY); } bool IsUnary() const { return (operatorType_ == UNARY); } void SetBinary() { operatorType_ = BINARY; } void SetUnary() { operatorType_ = UNARY; } int GetCntr() const { return objectCntr_; } void SetCntr( int rc ) { objectCntr_ = rc; } int GetArgCntr() const { return argumentCntr_; } void SetArgCntr( int i ) { argumentCntr_ = i; } unsigned int GetIndexCntr() const { return indexCntr_; } void SetIndexCntr( unsigned int i ) { indexCntr_ = i; } int GetNestingLevel() const { return nestingLevel_; } void SetNestingLevel( int i ) { nestingLevel_ = i; } bool GetValid() const { return valid_; } void SetValid( bool value ) { valid_ = value; } bool IsaIndex() const { return isAnIndex_; } void SetIsAnIndex( bool value ) { isAnIndex_ = value; } int GetFollowingTerm() { return followingTerm_; } bool GetFunctionIsDone() const { return functionIsDone_; } void SetFunctionIsDone() { functionIsDone_ = true; } private: wxString tString_; NumericVariable *nVariablePtr_; // // say a text variable should also use the text array index pointer and // the text character index pointer // TextVariable *tVariablePtr_; FunctionDefinition *functionPtr_; OperatorDefinition *operatorPtr_; Workspace *workspacePtr_; ListVector *listVectorPtr_; RangeVector *rangeVectorPtr_; int immediateValue_; double constantValue_; wxString constantString_; TokenType tokenType_; TokenType referenceType_; OperatorType operatorType_; Workspace *textArrayIndexPtr_; Workspace *textCharacterIndexPtr_; int objectCntr_; int argumentCntr_; unsigned int indexCntr_; int nestingLevel_; bool insertedTextVar_; bool valid_; bool isAnIndex_; int lindex_[3]; int followingTerm_; bool functionIsDone_; void CopyStuff( ExprCodes const & ); }; #endif extrema-4.4.5/src/Expression/Expression.cpp0000644012702201742730000003531111274636605020015 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 3 || \ (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ >= 0))) #include #else #include #endif #include "Expression.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "Workspace.h" #include "EVariableError.h" #include "NVariableTable.h" #include "NumericVariable.h" #include "TextVariable.h" #include "OperatorDefinition.h" #include "OperatorTable.h" #include "FunctionDefinition.h" Expression::Expression( wxString const &s ) : string_( s ), highestLevel_( 0 ) { // // trim leading and trailing blanks // wxChar const blank( wxT(' ') ); std::size_t rTemp = string_.find_last_not_of( blank ); std::size_t lTemp = string_.find_first_not_of( blank ); //std::cout << "rTemp= " << rTemp << ", lTemp= " << lTemp << "\n"; string_ = string_.substr( lTemp, rTemp-lTemp+1 ); Workspace *ws = new Workspace(this); ws->SetLevel( highestLevel_ ); levels_.insert( WSEntryType(highestLevel_,ws) ); isaFit_ = false; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetCharacter(); //std::cout << "1: s= |" << s.mb_str(wxConvUTF8) << "|\n"; } Expression::Expression( Expression const &rhs ) { CopyStuff(rhs); } Expression & Expression::operator=( Expression const &rhs ) { if( &rhs != this )CopyStuff(rhs); return *this; } Expression::~Expression() { WSLevel::const_iterator end( levels_.end() ); for( WSLevel::const_iterator i(levels_.begin()); i != end; ++i ) { Workspace *ws = (*i).second; if( ws != 0 )delete ws; } } void Expression::CopyStuff( Expression const &rhs ) { levels_ = rhs.levels_; highestLevel_ = rhs.highestLevel_; string_ = rhs.string_; type_ = rhs.type_; finalData_ = rhs.finalData_; finalString_ = rhs.finalString_; isaFit_ = rhs.isaFit_; fitParameters_ = rhs.fitParameters_; } NumericData &Expression::GetFinalAnswer() { return finalData_; } void Expression::AddWorkspace( Workspace *w ) { int level = w->GetLevel(); levels_.insert( WSEntryType(level,w) ); if( level > highestLevel_ )highestLevel_ = level; } void Expression::RemoveWorkspace( Workspace *w ) { WSLevelValuePair lvp = std::make_pair( w->GetLevel(), w ); levels_.erase( find( levels_.begin(), levels_.end(), lvp ) ); } Workspace *Expression::GetFinalWorkspace() { return (*levels_.find(0)).second; } void Expression::GetWorkspaces( int level, std::vector &wsv ) { std::vector().swap( wsv ); WSLevelPair lp = levels_.equal_range( level ); WSLevel::const_iterator end( lp.second ); for( WSLevel::const_iterator k(lp.first); k!=end; ++k ) { Workspace *ws = (*k).second; wsv.push_back( ws ); } } void Expression::TestFitParameterName( wxString &name ) { std::vector::const_iterator end( fitParameters_.end() ); for( std::vector::const_iterator i = fitParameters_.begin(); i != end; ++i ) { if( *i == name )return; // same fitting parameter used more than once } fitParameters_.push_back( name ); } double Expression::GetFitParameterValue( std::size_t i ) const { return NVariableTable::GetTable()-> GetVariable(fitParameters_[i])->GetData().GetScalarValue(); } void Expression::SetFitParameterValue( std::size_t i, double v ) { NVariableTable::GetTable()-> GetVariable(fitParameters_[i])->GetData().SetScalarValue( v ); } void Expression::SetFitParameterValue( std::size_t i, double v, wxString const &s ) { NumericVariable *nv = NVariableTable::GetTable()->GetVariable( fitParameters_[i] ); nv->GetData().SetScalarValue( v ); nv->AddToHistory( s ); } void Expression::Evaluate() { Workspace *w0 = (*levels_.find(0)).second; try { w0->ParseAndCheck( false ); w0->HandleFunctionsAndText(); } catch( EExpressionError &e ) { throw; } bool doOver = true; while( doOver ) { doOver = false; for( int level=highestLevel_; level>=1; --level ) { std::vector wsv; GetWorkspaces( level, wsv ); std::vector::const_iterator end( wsv.end() ); for( std::vector::const_iterator i=wsv.begin(); i!=end; ++i ) { Workspace *ws = *i; if( ws->IsFinished() )continue; if( ws->HandleFunctionsAndText() ) { doOver = true; break; } } if( doOver )break; } } bool newWorkspaceMade; do { for( int level=highestLevel_; level>=0; --level ) { newWorkspaceMade = false; // // loop over all Workspaces at each level // std::vector wsv; GetWorkspaces( level, wsv ); std::vector::const_iterator end( wsv.end() ); for( std::vector::const_iterator i=wsv.begin(); i!=end; ++i ) { Workspace *s = *i; if( s->IsFinished() )continue; // go to next Workspace at this level std::deque &sCodes = s->GetCodes(); std::size_t sCodesSize = sCodes.size(); for( std::size_t j=0; jIsaWorkspace() ) { Workspace *t = sjCode->GetWorkspacePtr(); if( t->IsNumeric() ) { if( !t->EvaluateNow() ) { ExprCodes *etmp = sjCode; std::deque &tCodes = t->GetCodes(); sCodes.insert( sCodes.begin()+j, tCodes.begin(), tCodes.end() ); j += tCodes.size(); sCodesSize += tCodes.size() - 1; sCodes.erase( sCodes.begin()+j ); std::deque().swap( tCodes ); RemoveWorkspace( t ); delete t; delete etmp; } } else if( t->IsCharacter() ) { sjCode->SetTString( t->GetFinalString() ); } } else if( sjCode->IsaTVariable() ) { TextVariable *tv = sjCode->GetTVarPtr(); if( s->IsNumeric() ) { NumericData *ia = 0; Workspace *iaw = sjCode->GetTAIndexPtr(); if( iaw )ia = &iaw->GetFinalData(); NumericData *ic = 0; Workspace *icw = sjCode->GetTCIndexPtr(); if( icw )ic = &icw->GetFinalData(); wxString str( wxT('(') ); wxString tmp; try { tmp = tv->GetString(ia,ic); } catch( EExpressionError &e ) { throw; } //wxChar *c = new wxChar[tmp.length()+1]; //strcpy( c, tmp.c_str() ); //str.append( c ); //delete [] c; str += tmp + wxT(')'); Workspace *ws = new Workspace(str); ws->SetExpression( this ); ws->SetLevel( level+1 ); if( level+1 > highestLevel_ )highestLevel_ = level+1; ws->SetNumeric(); if( IsaFit() )ws->SetEvaluateNow( false ); else ws->SetEvaluateNow( true ); AddWorkspace( ws ); sjCode->SetWorkspacePtr( ws ); newWorkspaceMade = true; } } else if( sjCode->IsaTString() ) { wxString tmp( sjCode->GetTString() ); if( s->IsNumeric() ) { wxString str( wxT('(') ); str += tmp + wxT(')'); std::auto_ptr aws( new Workspace(str) ); Workspace *ws = aws.release(); ws->SetExpression( this ); ws->SetLevel( level+1 ); if( level+1 > highestLevel_ )highestLevel_ = level+1; ws->SetNumeric(); if( IsaFit() )ws->SetEvaluateNow( false ); else ws->SetEvaluateNow( true ); AddWorkspace( ws ); sjCode->SetWorkspacePtr( ws ); newWorkspaceMade = true; } } // end of tests for code } // end of loop over codes if( level == 0 || newWorkspaceMade )continue; if( s->IsNumeric() && s->EvaluateNow() ) { try { if( !s->IsRPNdone() ) { //s->HandleFunctionsAndText(); s->RPNconvert(); s->SetHierarchy(); s->SixthPass(); } SeventhPass( s->GetLevel() ); } catch( EExpressionError &e ) { throw; } s->SetFinished(); } else if( s->IsCharacter() ) { try { //s->HandleFunctionsAndText(); s->RPNTconvert(); CalcText( s ); } catch( EExpressionError &e ) { throw; } s->SetFinished(); } } // end of loop over Workspaces at a level if( newWorkspaceMade && (level != highestLevel_) ) { std::vector wsv; GetWorkspaces( level+1, wsv ); std::vector::const_iterator end( wsv.end() ); for( std::vector::const_iterator i=wsv.begin(); i!=end; ++i ) { try { (*i)->ParseAndCheck( false ); (*i)->HandleFunctionsAndText(); } catch( EExpressionError &e ) { throw; } } break; // break out of loop over levels } else { highestLevel_ = level; } } // end of loop over levels } while( newWorkspaceMade ); // // check that all Workspaces are finished // //std::cout << "highestLevel_=" << highestLevel_ << "\n"; for( int level=1; level<=highestLevel_; ++level ) { std::vector wsv; GetWorkspaces( level, wsv ); std::vector::const_iterator end( wsv.end() ); for( std::vector::const_iterator i=wsv.begin(); i!=end; ++i ) { Workspace *ws = *i; ws->HandleFunctionsAndText(); if( ws->IsCharacter() ) { ws->RPNTconvert(); CalcText( ws ); finalString_ = ws->GetFinalString(); } else { ws->RPNconvert(); ws->SetHierarchy(); ws->SixthPass(); SeventhPass( 0 ); finalData_ = ws->GetFinalData(); } } } Workspace *ws = GetFinalWorkspace(); if( ws->IsCharacter() ) { ws->RPNTconvert(); CalcText( ws ); finalString_ = ws->GetFinalString(); type_ = CHARACTER; } else { ws->RPNconvert(); ws->SetHierarchy(); ws->SixthPass(); SeventhPass( 0 ); finalData_ = ws->GetFinalData(); type_ = NUMERIC; } } void Expression::SeventhPass( int minLevel ) { for( int level=highestLevel_; level>=minLevel; --level ) { std::vector wsv; GetWorkspaces( level, wsv ); std::vector::const_iterator end( wsv.end() ); for( std::vector::const_iterator i(wsv.begin()); i!=end; ++i ) { if( level==0 || ((*i)->IsRPNdone() && !(*i)->IsFinished()) ) { try { (*i)->SetType(); (*i)->SetUp(); (*i)->Calculate(); } catch (EExpressionError &e) { throw; } } } } } void Expression::FinalPass() { for( int level=highestLevel_; level>=0; --level ) { std::vector wsv; GetWorkspaces( level, wsv ); std::vector::const_iterator end( wsv.end() ); for( std::vector::const_iterator i(wsv.begin()); i!=end; ++i ) { if( level==0 || ((*i)->IsRPNdone() && !(*i)->IsFinished()) )(*i)->Calculate(); } } finalData_ = GetFinalWorkspace()->GetFinalData(); type_ = NUMERIC; } void Expression::CalcText( Workspace *ws ) { std::vector sStack; std::vector wStack; int j = -1; std::deque &codes = ws->GetCodes(); std::deque::const_iterator end = codes.end(); for( std::deque::const_iterator i=codes.begin(); i!=end; ++i ) { ExprCodes *code = *i; if( code->IsaFunction() ) { FunctionDefinition *fp = code->GetFcnPtr(); int narg = code->GetArgCntr(); fp->SetArgumentCounter( narg ); j -= narg-1; if( fp->IsMixed2Char() ) { try { fp->TextArrayEval( j, wStack, sStack ); } catch( EExpressionError &e ) { throw; } } else { fp->TextScalarEval( j, sStack ); } for( int i=0; iIsaOperator() ) { int narg = code->GetOpPtr()->OperandCounter(); j -= narg-1; wxString s; code->GetOpPtr()->TextScalarEval( j, sStack ); wStack.pop_back(); sStack.pop_back(); } else if( code->IsaTVariable() ) { ++j; NumericData *ia = 0; Workspace *iaw = code->GetTAIndexPtr(); // array index workspace pointer if( iaw )ia = &iaw->GetFinalData(); NumericData *ic = 0; Workspace *icw = code->GetTCIndexPtr(); // character index workspace pointer if( icw )ic = &icw->GetFinalData(); try { sStack.push_back( code->GetTVarPtr()->GetString(ia,ic) ); } catch ( EVariableError &e ) { throw EExpressionError( wxString(e.what(),wxConvUTF8) ); } wStack.push_back( reinterpret_cast(0) ); } else if( code->IsaWorkspace() ) { ++j; Workspace *ws = code->GetWorkspacePtr(); if( ws->IsCharacter() ) { wStack.push_back( reinterpret_cast(0) ); sStack.push_back( ws->GetFinalString() ); } else { wStack.push_back( ws ); sStack.push_back( code->GetTString() ); } } else if( code->IsaTString() ) { ++j; sStack.push_back( code->GetTString() ); wStack.push_back( reinterpret_cast(0) ); } } ws->SetFinalString( sStack.front() ); } // end of file extrema-4.4.5/src/Expression/Expression.h0000644012702201742730000000631011274636605017457 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_EXPRESSION #define EX_EXPRESSION // expression evaluator: it converts the arithmetic expression // into an integerized code which is in Reverse Polish Notation (RPN) // The expression consists of functions, variables, strings, and // (binary and unary) operators. The expression also consists of numbers, // parentheses, or commas. Numbers may have exponents denoted by E or D. // ([{ are treated as equivalent and )]} are treated as equivalent. #include #include #include "wx/wx.h" #include "NumericData.h" class Workspace; class Expression { private: typedef std::multimap< int const, Workspace* > WSLevel; typedef WSLevel::value_type WSEntryType; typedef std::pair< WSLevel::const_iterator, WSLevel::const_iterator > WSLevelPair; typedef std::pair< int const, Workspace* > WSLevelValuePair; enum Type { NUMERIC, CHARACTER }; public: Expression( wxString const & ); ~Expression(); Expression( Expression const & ); Expression & operator=( Expression const & ); wxString GetString() const { return string_; } bool IsNumeric() const { return (type_ == NUMERIC); } bool IsCharacter() const { return (type_ == CHARACTER); } bool IsaFit() const { return isaFit_; } void SetIsaFit() { isaFit_ = true; } std::size_t GetNumberOfFitParameters() const { return fitParameters_.size(); } std::vector &GetFitParameterNames() { return fitParameters_; } wxString GetFitParameterName( std::size_t i ) const { return fitParameters_[i]; } NumericData &GetFinalAnswer(); wxString &GetFinalString() { return finalString_; } void SetHighestLevel( int i ) { highestLevel_ = i; } int GetHighestLevel() const { return highestLevel_; } void Evaluate(); void TestFitParameterName( wxString & ); double GetFitParameterValue( std::size_t ) const; void SetFitParameterValue( std::size_t, double ); void SetFitParameterValue( std::size_t, double, wxString const & ); void GetWorkspaces( int, std::vector & ); void AddWorkspace( Workspace * ); void RemoveWorkspace( Workspace * ); Workspace *GetFinalWorkspace(); void SeventhPass( int ); void FinalPass(); void CalcText( Workspace * ); private: wxString string_; Type type_; WSLevel levels_; int highestLevel_; // number of levels = highestLevel+1 NumericData finalData_; wxString finalString_; bool isaFit_; std::vector fitParameters_; void CopyStuff( Expression const & ); }; #endif extrema-4.4.5/src/Expression/Workspace.cpp0000644012702201742730000044262011274636605017621 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "Workspace.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "ListVector.h" #include "RangeVector.h" #include "Expression.h" #include "NumericVariable.h" #include "TextVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "FunctionDefinition.h" #include "FunctionTable.h" #include "OperatorDefinition.h" #include "OperatorTable.h" Workspace::Workspace() : level_(0), expression_(0), string_( wxT("") ) { Initialize(); } Workspace::Workspace( int i ) : level_(i), expression_(0), string_( wxT("") ) { Initialize(); } Workspace::Workspace( Expression *e ) : level_(-1), expression_(e), string_(e->GetString()) { Initialize(); } Workspace::Workspace( wxString &s ) : level_(-1), expression_(0), string_(s) { Initialize(); } Workspace::Workspace( Workspace const &rhs ) { CopyStuff(rhs); } Workspace &Workspace::operator=( Workspace const &rhs ) { if( &rhs != this )CopyStuff(rhs); return *this; } void Workspace::Initialize() { evalType_ = EVALUNKNOWN; ncFlag_ = true; parent_ = NULL; numberOfLoops_ = 0; evalFlag_ = false; type_ = UNKNOWN; evaluateNow_ = true; processingFinished_ = false; rpnDone_ = false; codesAreParsed_ = false; operatorCntr_ = 0; functionWithArgumentsCntr_ = 0; indexedVariableCntr_ = 0; rangeVectorCntr_ = 0; listVectorCntr_ = 0; highestNestingLevel_ = 0; } Workspace::~Workspace() { while ( !codes_.empty() ) { delete codes_.back(); codes_.pop_back(); } } void Workspace::CopyStuff( Workspace const &rhs ) { while ( !codes_.empty() ) { delete codes_.back(); codes_.pop_back(); } std::deque::const_iterator rhsEnd( rhs.codes_.end() ); for( std::deque::const_iterator i(rhs.codes_.begin()); i!=rhsEnd; ++i ) { ExprCodes *e = new ExprCodes( **i ); codes_.push_back( e ); } evalType_ = rhs.evalType_; ncFlag_ = rhs.ncFlag_; parent_ = rhs.parent_; numberOfLoops_ = rhs.numberOfLoops_; evalFlag_ = rhs.evalFlag_; finalData_ = rhs.finalData_; expression_ = rhs.expression_; type_ = rhs.type_; string_ = rhs.string_; level_ = rhs.level_; evaluateNow_ = rhs.evaluateNow_; processingFinished_ = rhs.processingFinished_; rpnDone_ = rhs.rpnDone_; codesAreParsed_ = rhs.codesAreParsed_; // operatorCntr_ = rhs.operatorCntr_; functionWithArgumentsCntr_ = rhs.functionWithArgumentsCntr_; indexedVariableCntr_ = rhs.indexedVariableCntr_; rangeVectorCntr_ = rhs.rangeVectorCntr_; listVectorCntr_ = rhs.listVectorCntr_; fcnPos_ = rhs.fcnPos_; fcnArg_ = rhs.fcnArg_; fcnIdx_ = rhs.fcnIdx_; oprPos_ = rhs.oprPos_; oprAnd_ = rhs.oprAnd_; varPos_ = rhs.varPos_; varIdx_ = rhs.varIdx_; rngPos_ = rhs.rngPos_; rngIdx_ = rhs.rngIdx_; lstPos_ = rhs.lstPos_; lstIdx_ = rhs.lstIdx_; highestNestingLevel_ = rhs.highestNestingLevel_; hierarchy_ = rhs.hierarchy_; } bool Workspace::operator==( Workspace const &right ) const { if( right.codes_.size() != codes_.size() )return false; std::size_t size( codes_.size() ); for( std::size_t i(0); i < size; ++i ) { if( *codes_[i] != *right.codes_[i] )return false; } return true; } wxString &Workspace::GetFinalString() { return finalString_; } void Workspace::SetFinalString( wxString &s ) { finalString_ = s; } NumericData &Workspace::GetFinalData() { return finalData_; } bool Workspace::IsEmpty() { return finalData_.IsEmpty(); } bool Workspace::IsUnordered() const { return finalData_.IsUnordered(); } bool Workspace::IsAscending() const { return finalData_.IsAscending(); } bool Workspace::IsDescending() const { return finalData_.IsDescending(); } void Workspace::SetUnordered() { finalData_.SetUnordered(); } void Workspace::SetAscending() { finalData_.SetAscending(); } void Workspace::SetDescending() { finalData_.SetDescending(); } std::size_t Workspace::GetNumberOfDimensions() const { return finalData_.GetNumberOfDimensions(); } void Workspace::SetNumberOfDimensions( std::size_t i ) { finalData_.SetNumberOfDimensions( i ); } unsigned int *Workspace::GetDimMag() { return finalData_.GetDimMag(); } std::size_t Workspace::GetDimMag( unsigned int i ) const { return finalData_.GetDimMag( i ); } void Workspace::SetDimMag( unsigned int i, unsigned int v ) { finalData_.SetDimMag( i, v ); } void Workspace::SetValue( double v ) { finalData_.SetScalarValue( v ); } double Workspace::GetValue() const { return finalData_.GetScalarValue(); } void Workspace::SetData( std::vector &d ) { finalData_.SetData( d ); } void Workspace::SetData( int i, double d ) { finalData_.SetData( i, d ); } void Workspace::SetData( unsigned int i, unsigned int j, double d ) { finalData_.SetData( i, j, d ); } void Workspace::SetData( unsigned int i, unsigned int j, unsigned int k, double d ) { finalData_.SetData( i, j, k, d ); } std::vector &Workspace::GetData() { return finalData_.GetData(); } double Workspace::GetData( unsigned int i ) const { return finalData_.GetData( i ); } double Workspace::GetData( unsigned int i, unsigned int j ) const { return finalData_.GetData( i, j ); } double Workspace::GetData( unsigned int i, unsigned int j, unsigned int k ) const { return finalData_.GetData( i, j, k ); } void Workspace::GetMinMax( double &min, double &max ) const { finalData_.GetMinMax( min, max ); } void Workspace::ParseAndCheck( bool expand ) { if( CodesAreParsed() )return; try { ParseCodes( expand ); } catch( EExpressionError &e ) { throw; } if( codes_.empty() ) { throw EExpressionError( wxT("blank expression") ); } if( expand )return; try { SequencingCheck(); BracketCheck(); FinalCheck(); } catch( EExpressionError &e ) { throw; } DetermineType(); } void Workspace::ParseCodes( bool expand ) { // Define the lexical scanner used to lexical scan input expression // string into tokens. The output of this operation is a list of tokens, // or basic mathematical entities, that can then be ordered into Reverse // Polish Notation (RPN) and put onto a command stack for later evaluation. // For example, the expression 2*EXP(X)+1 would be parsed by the lexical // scanner to give: // // Token Output state Description // 2 -3 Constant number // * -8 Operator // EXP -1 Variable or function name // ( 55 Left parenthesis // X -1 Variable or function name // ) 54 Right parenthesis // + -8 Operator // 1 -3 //onstant number // EOL -7 End of line // // Lexical scanner transition table: EXPARS(11,19) // This table has 11 transition states, 19 character classes, and 14 // output states (which indicate the token type). The description of // the table is as follows: // // EXPARS lexical scanner (to parse expressions) // TRANSITION // STATE --> 1 2 3 4 5 6 7 8 9 10 11 12 // CLASS // 1 EOL -7 -1 -102 -8 -3 -103 -3 -104 -104 -3 -8 -108 // 2 Others 101 -1 3 -8 -3 -103 -109 -104 -104 -3 -8 12 // 3 Blank 1 2 3 4 5 6 7 8 9 10 11 12 // 4 A-C,F-Z$_ 2 2 3 -8 -3 -103 -109 -104 -104 -3 -8 12 // 5 E,D,e,d 2 2 3 -8 8 -103 8 -104 -104 -3 -8 12 // 6 0-9 5 2 3 -8 5 7 7 10 10 10 -8 12 // 7 . 6 -1 3 -8 7 -103 -103 -104 -104 -3 -8 12 // 8 )]} 54 -1 3 -8 -3 -103 -3 -104 -104 -3 -11 12 // 9 ([{ 55 -1 3 -8 -3 -103 -3 -104 -104 -3 -8 12 // 10 , 56 -1 3 -8 -3 -103 -3 -104 -104 -3 -11 12 // 11 : 59 -1 3 -8 -3 -103 -3 -104 -104 -3 -11 12 // 12 " 3 -1 58 -8 -3 -103 -3 -104 -104 -3 -8 12 // 13 # 60 -1 3 -8 -3 -103 -3 -104 -104 -3 -8 12 // 14 * 11 -1 3 4 -3 -103 -3 -104 -104 -3 4 12 // 15 +- 4 -1 3 4 -3 -103 -3 9 -104 -3 4 12 // 16 Oper chars 4 -1 3 4 -3 -103 -3 -104 -104 -3 4 12 // 17 ; 62 -1 3 -8 -3 -103 -3 -104 -104 -3 -105 12 // 18 ` 12 -1 3 -8 -3 -103 -3 -104 -104 -3 -8 -106 // 19 ' -107 -107 -107 -107 -107 -107 -107 -107 -107 -107 -107 -13 // // Transition state key: // 1 Start 7 Constant (real number) // 2 Variable or function name 8 Real number + exponent (D,E) // 3 Operator in quotes 9 Real number + exponent sign // 4 Operator 10 Real number exponent // 5 Integer constant 11 Wildcard // 6 Decimal point 12 Quote string // // Output state key: // -1 Function or variable name -8 (or 58) Operator // -3 Constant number -9 (or 59) Colon : // -4 (or 54) Right bracket -10 (or 60) Hash character # // -5 (or 55) Left bracket -11 Wildcard character * // -6 (or 56) Comma , -12 (or 62) Semicolon ; // -7 EOL (End-Of-Line) -13 Quote string // // Error states // -101 invalid character // -102 no closing quote on operator // -103 invalid decimal point // -104 invalid exponent // -105 invalid semicolon after wildcard // -106 invalid opening quote // -107 invalid closing quote // -108 closing quote missing // -109 invalid real number // // A negative output state indicates the last character scanned can be // thrown away, and the scan pointer ILAST advanced in preparation for // the next scan. An output state larger than 50 indicates the last // character scanned forms an integral part of the next token, and must // be kept and re-used in the next scan. The scan pointer ILAST is // decremented by 1 to ensure this is done // // exClass contains the table of class codes for each of the 128 ASCII // characters, with the index of each character being its decimal ASCII // code value + 1. For example, the character '2' is a numeric digit with // class code 6 (see below), and has an ASCII code value of decimal 50. // Therefore, exClass(50 + 1)= 6 // // Class Characters // 1 end of line (end of input line encountered) // 2 invalid characters // 3 blank or tab // 4 A-C F-Z a-c f-z $ _ // 5 D E d e // 6 0-9 // 7 . // 8 )]} // 9 ([{ // 10 , // 11 : // 12 " // 13 # // 14 * // 15 +- // 16 ! % & = ~ ^ @ | \ < > / <> >< (operators) // 17 ; // 18 ` // 19 ' // int const exClass[128] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 16, 12, 13, 4, 16, 16, 19, 9, 8, 14, 15, 10, 15, 7, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 11, 17, 16, 16, 16, 16, 16, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 16, 8, 16, 4, 18, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 16, 8, 16, 2 }; int const expars[19][13] = { { -7, -1,-102, -8, -3,-103, -3,-104,-104, -3, -8,-108,-108 }, // eol { 101, -1, 3, -8, -3,-103,-109,-104,-104, -3, -8, 12, 13 }, // invalid char { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }, // blank { 2, 2, 3, -8, -3,-103,-109,-104,-104, -3, -8, 12, 13 }, // a-z { 2, 2, 3, -8, 8,-103, 8,-104,-104, -3, -8, 12, 13 }, // ed { 5, 2, 3, -8, 5, 7, 7, 10, 10, 10, -8, 12, 13 }, // 0-9 { 6, -1, 3, -8, 7,-103,-103,-104,-104, -3, -8, 12, 13 }, // . { 54, -1, 3, -8, -3,-103, -3,-104,-104, -3, -11, 12, 13 }, // ) { 55, -1, 3, -8, -3,-103, -3,-104,-104, -3, -8, 12, 13 }, // ( { 56, -1, 3, -8, -3,-103, -3,-104,-104, -3, -11, 12, 13 }, // , { 59, -1, 3, -8, -3,-103, -3,-104,-104, -3, -11, 12, 13 }, // : { 3, -1, 63, -8, -3,-103, -3,-104,-104, -3, -8, 12, 13 }, // " { 60, -1, 3, -8, -3,-103, -3,-104,-104, -3, -8, 12, 13 }, // # { 11, -1, 3, 4, -3,-103, -3,-104,-104, -3, 4, 12, 13 }, // * { 4, -1, 3, 4, -3,-103, -3, 9,-104, -3, 4, 12, 13 }, // +- { 4, -1, 3, 4, -3,-103, -3,-104,-104, -3, 4, 12, 13 }, // operators { 62, -1, 3, -8, -3,-103, -3,-104,-104, -3,-105, 12, 13 }, // ; { 12, -1, 3, -8, -3,-103, -3,-104,-104, -3, -8, 12, 13 }, // ` { 13, -1, 3, -8, -3,-103, -3,-104,-104, -3, -8, 63, 63 } // ' }; std::size_t last = 0; std::size_t first = 0; std::size_t ilast; // // Main loop for scanning the expression for tokens. The result // returned is a list of "tokens" types comprising the original // expression, from left to right. For example, the expression // // BFIELD[47]*1.0015 // // would yield a token list like: // Variable name BFIELD // Left parenthesis [ // Real constant 47 // Right parenthesis ] // Operator * // Real constant 1.0015 // // Perform a lexical scan using the transition table EXPARS described above. // Return a token consisting of the next operand or operator in the arithmetic // expression being scanned. Process repeatedly until the end of the input // buffer is reached, as flagged by the return of an EOL (End-Of-Line) token. // LAST points to the last index scanned, and is useful since it will usually // point to the source of error in case of a problem. The number of internal // (or transition) states coded in the lexical scanner array EXPARS is 12. // ISTATE indicates the type of the returned token, as previously documented. // while ( first < string_.length() ) { first = last+1; // // Perform a lexical scan of the string contained in the input buffer // using the transition table array expars. // Array ex_class contains the class codes for each of the ASCII characters // (the index of ex_class is the decimal ASCII value). ilast will be the // position of the last character scanned. In the event of error, ilast will // point to the location of the error. // // istate: The output state returned after completion of the lexical scan, // as determined by the transition table EXPARS. The convention is to // denote output states by the negative integers -1, -2, -3, ... to // clearly separate these states from internal (transition) states of // the transition table itself. // ilast = 0; // field pointer int state = 1; // // Main scan loop: check the current state and if this is a transition state // (i.e. the current field is not yet finished) then proceed with the next // character; else end the field and return. // //std::cout << "string_.length= " << string_.length() << ", first= " << first << "\n"; while ( state >= 1 && state <= 13 ) { // 1 <= state <= 13 (transition state) so increment the scan pointer // // Use the transition table to evaluate the new state // given the present state and class // if( ++ilast > string_.length()-first+1 ) // > input line length { state = expars[0][state-1]; //std::cout << "state= " << state << "\n"; } else // deduce the class of the current character { int iascii = toascii( string_[first+ilast-2] ); state = expars[exClass[iascii]-1][state-1]; //std::cout << "iascii= " << iascii << ", state= " << state << "\n"; } } if( state == -7 )return; // end-of-line if( state <= -100 ) // an error has been detected { switch ( -state-100 ) { case 1: throw EExpressionError( wxT("invalid character") ); case 2: throw EExpressionError( wxT("no closing quote on operator") ); case 3: throw EExpressionError( wxT("invalid decimal point") ); case 4: throw EExpressionError( wxT("invalid exponent") ); case 5: throw EExpressionError( wxT("invalid semicolon after wildcard") ); case 6: throw EExpressionError( wxT("invalid opening quote") ); case 7: throw EExpressionError( wxT("invalid closing quote") ); case 8: throw EExpressionError( wxT("closing quote missing") ); case 9: throw EExpressionError( wxT("invalid real number") ); } } TOP: if( state <= 0 )--ilast; // // output states // 4 )]} // 5 ([{ // 6 , // 8 " // 9 : // 10 # // 12 ; // 13 '...' // last = first+ilast-1; // absolute buffer position wxString name( string_.substr(first-1,last-first+1) ); // // trim leading and trailing blanks // wxString const blank( wxT(' ') ); int rTemp = name.find_last_not_of( blank ); int lTemp = name.find_first_not_of( blank ); name = name.substr( lTemp, rTemp-lTemp+1 ); // ExprCodes *aCode = new ExprCodes; // state = abs(state); if( state >= 50 )state -= 50; // a valid output state // // special characters , : # * ; // 6 9 10 11 12 // are valid only inside the range of a variable or a function // if( state==1 || state==2 ) // function or variable (numeric or text) { wxString name2( name.Upper() ); if( FunctionTable::GetTable()->Contains( name2 ) ) { FunctionDefinition *fcn = FunctionTable::GetTable()->GetFunction(name2); if( fcn->Name() == wxT("STRING") ) { ++ilast; if( string_[last+1]=='\'' || string_[last+1]=='"' || string_[last+1]=='`' ) { for( std::size_t j=last+2; jSetFcnPtr( fcn ); } else if( NVariableTable::GetTable()->Contains( name2 ) ) { NumericVariable *aVariable = NVariableTable::GetTable()->GetVariable( name2 ); // if( expression_ && (expression_->IsaFit() && aVariable->GetData().GetNumberOfDimensions()==0 && aVariable->GetData().IsFit()) ) { expression_->TestFitParameterName( name2 ); } // aCode->SetNVarPtr( aVariable ); // ivused[++nvused] = aVariable; } else if( TVariableTable::GetTable()->Contains( name2 ) ) { TextVariable *aVariable = TVariableTable::GetTable()->GetVariable( name2 ); aCode->SetTVarPtr( aVariable ); } else if( expand || (GetLevel()==0 && IsCharacter() && codes_.size()==1) ) { // single character string assumed to be a quote string without quotes aCode->SetTString( name ); } else { delete aCode; aCode = NULL; throw EExpressionError( name+wxT(" is undefined: not a function or a variable") ); } } else if( state == 3 ) // constant number { //std::cout << "name= |" << name.mb_str(wxConvUTF8) << "|\n"; double real8; if( !name.ToDouble(&real8) ) { delete aCode; aCode = 0; throw EExpressionError( wxString(wxT("invalid real number: "))+name ); } aCode->SetConstantValue( real8, name ); } else if( state == 4 ) // closing bracket ) ] } { aCode->SetClosingBracket(); } else if( state == 5 ) // opening bracket ( [ { { if( codes_.size() > 1 ) // more than 1 token on input { if( codes_.back()->IsaClosingBracket() ) { // previous token is ) delete aCode; aCode = NULL; codes_.back()->SetPairBracket(); // )( combination bracket continue; } else // coded as a single RPN code { aCode->SetOpeningBracket(); } } else // single ( token on input { aCode->SetOpeningBracket(); } } else if( state == 6 ) // comma , { aCode->SetComma(); aCode->SetValid( false ); // valid only in brackets } else if( state == 8 ) // operator { wxString name2( name.Upper() ); if( OperatorTable::GetTable()->Contains( name2 ) ) { OperatorDefinition *op = OperatorTable::GetTable()->GetOperator(name2); aCode->SetOpPtr( op ); } else { delete aCode; aCode = 0; throw EExpressionError( wxString(wxT("unknown operator: "))+name2 ); } } else if( state == 9 ) // colon : { aCode->SetColon(); aCode->SetValid( false ); // valid only in brackets } else if( state == 10 ) // hash character # { aCode->SetHash(); aCode->SetValid( false ); // valid only in brackets } else if( state == 11 ) // wildcard character * { aCode->SetAsterisk(); aCode->SetValid( false ); // valid only in brackets } else if( state == 12 ) // semicolon ; { aCode->SetSemicolon(); aCode->SetValid( false ); // valid only in brackets } else if( state == 13 ) // quote string `...' { if( name.length() == 2 ) { delete aCode; aCode = 0; throw EExpressionError( wxT("null quote string") ); } aCode->SetTString( name.substr(1,name.length()-2) ); } codes_.push_back( aCode ); } return; } void Workspace::DetermineType() { // Need to handle special case of // operator, which can be character (default) // or array type. If expression is numeric, set // to be array, but then have // to set it to character in the constructor for Expression class. // if( type_ != UNKNOWN )return; bool ambiguous = false; std::deque::const_iterator end( codes_.end() ); for( std::deque::const_iterator j(codes_.begin()); j!=end; ++j ) { ExprCodes *code = *j; if( code->IsaFunction() ) { if( !ambiguous ) { FunctionDefinition const *fp = code->GetFcnPtr(); if( fp->IsNum2NumScalar() || fp->IsNum2NumVector() || fp->IsMixed2Num() ) { type_ = NUMERIC; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetArray(); return; } else { type_ = CHARACTER; return; } } } else if( code->IsaNVariable() ) { if( !ambiguous ) { type_ = NUMERIC; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetArray(); return; } } else if( code->IsaWorkspace() ) { if( !ambiguous ) { Workspace const *ws = code->GetWorkspacePtr(); if( ws->IsNumeric() ) { type_ = NUMERIC; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetArray(); return; } else { type_ = CHARACTER; return; } } } else if( code->IsaTVariable() ) { ambiguous = true; } else if( code->IsaTString() ) { type_ = CHARACTER; return; } else if( code->IsaConstant() || code->IsaImmediateValue() ) { if( !ambiguous ) { type_ = NUMERIC; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetArray(); return; } } else if( code->IsaOperator() ) { if( !ambiguous ) { OperatorDefinition *op = code->GetOpPtr(); if( op->IsCharacter() ) { type_ = CHARACTER; return; } else { type_ = NUMERIC; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetArray(); return; } } } else if( code->IsaOpeningBracket() ) { } else if( code->IsaClosingBracket() ) { } else if( code->IsaPairBracket() || code->IsaComma() || code->IsaColon() || code->IsaSemicolon() || code->IsaHash() || code->IsaAsterisk() ) { } else if( code->IsaRangeVector() || code->IsaListVector() ) { if( !ambiguous ) { type_ = NUMERIC; OperatorTable::GetTable()->GetOperator(wxT("//"))->SetArray(); return; } } } type_ = CHARACTER; return; } void Workspace::SequencingCheck() { // The lexical scan of the expression is finished // Check for errors which involve invalid sequencing // of the terms in the expression // std::size_t const errorTable[14][14] = { { 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, // 11 { 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, // 11 { 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, // 12 { 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, // 11 { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 }, // 13 { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 }, // 13 { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 }, // 13 { 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1 }, // 14 { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1 }, // 15 { 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, // 12 { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, // 16 { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 }, // 13 { 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, // 17 { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 } }; // 13 int currentTerm; int followingTerm = 6; wxString const term[14] = { wxT("Function"), wxT("Variable"), wxT("Constant"), wxT(")"), wxT("("), wxT(","), wxT("Null"), wxT("Operator"), wxT(":"), wxT("#"), wxT("Wildcard"), wxT(";"), wxT("Quote string"), wxT(")(") }; // // both currentTerm and followingTerm start off as the number of the "null" term // which refers to the beginning or end of the expression // std::deque::const_iterator end( codes_.end() ); for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) { ExprCodes *code = *i; // // update the current term number and find the code for the following term // currentTerm = followingTerm; followingTerm = code->GetFollowingTerm()-1; if( code->IsaOperator() ) { // // Determine the operator type: oparg=1 (unary) or oparg=2 (binary) // OperatorDefinition *op = code->GetOpPtr(); unsigned short int oparg = 0; if( op->UnaryPriority() == 0 )oparg = 2; if( op->BinaryPriority() == 0 )oparg = 1; if( oparg == 0 ) { // // Here the operator is allowed to be either unary or binary. // The operator type of the following term is determined by the // current term number currentTerm. If the current term is a function, // variable, constant, # or ), then the operator is binary. // oparg = 1; if( currentTerm<4 || currentTerm==9 )oparg = 2; } if( oparg==2 && currentTerm==6 ) throw EExpressionError( wxT("NULL followed by binary operator") ); oparg==2 ? code->SetBinary() : code->SetUnary(); op->OperandCounter( oparg ); } // //Do the sequencing check of the terms // Term 1 Function name // Term 2 Variable name // Term 3 Constant number // Term 4 Right parenthesis )]} // Term 5 Left parenthesis ([{ // Term 6 Comma , // Term 7 End-of-line (null) // Term 8 Operator // Term 9 Colon : // Term 10 Hash # (current max. defined value of subscript) // Term 11 Wildcard subscript range * // Term 12 Semicolon ; // Term 13 Text (quote) string `....' // Term 14 Close & open parenthesis pair )( // Check to see if followingTerm is allowed to follow currentTerm, i.e. if the // following term may come after the current term. Branch to 40 if // allowed, otherwise to 30 if not // The following terms are grouped together and treated identically with // regard to sequencing errors // 1. Variable-like: 1,2,4 // 2. Constant-like: 3,10 // 3. Field separators: 5,6,7,12,14 // 4. Operators: 8 // 5. Colon: 9 // 6. Wildcard subscripts: 11 // 7. Text (quote) string: 13 // if( errorTable[currentTerm][followingTerm] ) throw EExpressionError( term[currentTerm]+wxT(" followed by ")+term[followingTerm] ); } currentTerm = followingTerm; followingTerm = 6; if( errorTable[currentTerm][followingTerm] ) throw EExpressionError( term[currentTerm]+wxT(" followed by ")+term[followingTerm] ); return; } void Workspace::BracketCheck() { // Check for mismatched parentheses, wrong number of variable // subscripts, and accumulate the number of routine arguments // level is the depth within parentheses. When searching // forward level starts off as zero and is incremented by 1 for every // "(" found, and is decremented by 1 for every ")" found. If level // becomes negative then a ")" with no leading "(" has been found // int level = 0; std::deque::const_iterator end( codes_.end() ); for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) { // search for closing bracket with no opening bracket // if( (*i)->IsaClosingBracket() )--level; if( (*i)->IsaOpeningBracket() )++level; if( level < 0 ) { throw EExpressionError( wxT("closing bracket has no opening bracket") ); } } if( level > 0 )throw EExpressionError( wxT("opening bracket has no closing bracket") ); // // level > 0 means there are more opening brackets than closing ones // To find the offending bracket, scan the expression backwards for openings // until a mismatch is found. level is incremented by 1 for every closing // found, and is decremented by 1 for every opening found. If level becomes // negative then a opening with no following closing has been found. // std::size_t shift = 0; for( std::size_t i=0; iIsaOpeningBracket() ) { // find out if the opening bracket begins a $null // The search for entries/ranges terminates at level zero. If pair bracket // found and level 1 opening bracket not preceeded by a function or a variable // then we have found a $null // int level = 1; bool insertNull = false; for( std::size_t j=i+1; jIsaOpeningBracket() )++level; if( level == 1 ) { if( codes_[j]->IsaClosingBracket() ) { if( insertNull ) // insert null function code for indexed expression { ExprCodes *aCode = new ExprCodes; codes_.push_back( aCode ); int end = static_cast(codes_.size())-2; for( int jj=end; jj>=static_cast(i); --jj )*codes_[jj+1] = *codes_[jj]; codes_[i]->SetFcnPtr( FunctionTable::GetTable()->GetFunction(wxT("NULLFUNC")) ); shift = 1; } break; // end of $null item, leave j loop } else if( codes_[j]->IsaPairBracket() ) { if( insertNull )throw EExpressionError( wxT("invalid usage of )(") ); if( i == 0 || (i>0 && !(codes_[i-1]->IsaFunction()||codes_[i-1]->IsaTVariable())) ) insertNull = true; if( insertNull )codes_[j]->SetValid( true ); } } if( codes_[j]->IsaClosingBracket() )--level; } // end of j loop } // end of if opening bracket } // end of i loop } void Workspace::MakeNewWorkspace( int j, int k, Type type ) { int level = GetLevel() + 1; if( level > expression_->GetHighestLevel() ) expression_->SetHighestLevel( level ); Workspace *aWs = new Workspace(level); aWs->SetType( type ); aWs->SetExpression( expression_ ); ExprCodes *aCode = new ExprCodes; aCode->SetOpeningBracket(); aWs->GetCodes().push_back( aCode ); for( int i=k+1; i<=j-1; ++i ) { ExprCodes *e = new ExprCodes; aWs->GetCodes().push_back( e ); *e = *codes_[i]; } ExprCodes *bCode = new ExprCodes; bCode->SetClosingBracket(); aWs->GetCodes().push_back( bCode ); aWs->SetCodesAreParsed(); expression_->AddWorkspace( aWs ); codes_[k+1]->SetWorkspacePtr( aWs ); for( std::size_t i=j+1; i<=codes_.size(); ++i )*codes_[i-j+k+1] = *codes_[i-1]; for( int i=0; iGetValid(); if( code->IsaClosingBracket() || code->IsaConstant() || code->IsaOperator() || code->IsaImmediateValue() )continue; if( code->IsaColon() ) { if( notValid )throw EExpressionError( wxT("invalid colon") ); } else if( code->IsaHash() ) { if( notValid )throw EExpressionError( wxT("invalid hash symbol") ); } else if( code->IsaAsterisk() ) { if( notValid )throw EExpressionError( wxT("invalid wildcard index") ); } else if( code->IsaSemicolon() ) { if( notValid )throw EExpressionError( wxT("invalid semicolon") ); } else if( code->IsaOpeningBracket() || code->IsaComma() || code->IsaPairBracket() ) { if( code->IsaComma() && notValid )throw EExpressionError( wxT("invalid comma") ); // // find out if the opening bracket begins a range or list vector // list vector: number of entries = one plus number of semicolons at level 1 // range vector: number of ranges = one plus number of colons at level 1 // The search for entries/ranges terminates at level zero // If colons/semicolons (but not both) are found, then // we have found a range/list vector // bool gotoOuterLoop = false; int level = 1; bool isaRangeVector = false; bool isaListVector = false; std::size_t listItemCounter = 0; // list vector item counter std::size_t rangeItemCounter = 0; // range vector item counter for( std::size_t j=i+1; j < codes_.size(); ++j ) // i points to opening bracket { if( codes_[j]->IsaOpeningBracket() )++level; if( level == 1 ) { if( codes_[j]->IsaClosingBracket() || codes_[j]->IsaComma() || codes_[j]->IsaPairBracket() ) { if( isaRangeVector || isaListVector ) { codes_.push_back( new ExprCodes ); codes_.push_back( new ExprCodes ); // // shift codes down // for( int k=codes_.size()-3; k>=static_cast(i+1); --k )*codes_[k+2] = *codes_[k]; if( isaRangeVector ) { ++rangeVectorCntr_; RangeVector *rngvec = new RangeVector; rngvec->SetItemCntr( rangeItemCounter ); codes_[i+1]->SetRangeVector(); codes_[i+1]->SetRangeVectorPtr( rngvec ); codes_[i+1]->SetCntr( rangeVectorCntr_ ); codes_[i+2]->SetOpeningBracket(); codes_[i+2]->SetRefRangeVector(); codes_[i+2]->SetCntr( rangeVectorCntr_ ); } else // must be a list vector { ++listVectorCntr_; ListVector *lstvec = new ListVector; lstvec->SetItemCntr( listItemCounter ); codes_[i+1]->SetListVector(); codes_[i+1]->SetListVectorPtr( lstvec ); codes_[i+1]->SetCntr( listVectorCntr_ ); codes_[i+2]->SetOpeningBracket(); codes_[i+2]->SetRefListVector(); codes_[i+2]->SetCntr( listVectorCntr_ ); } j += 2; codes_.push_back( new ExprCodes ); // // shift codes down // for( int k=codes_.size()-2; k>=static_cast(j); --k )*codes_[k+1] = *codes_[k]; codes_[j]->SetClosingBracket(); isaRangeVector ? codes_[j]->SetRefRangeVector() : codes_[j]->SetRefListVector(); shift = 2; } gotoOuterLoop = true; break; // end of range or list item } else if( codes_[j]->IsaColon() ) // colon { if( isaListVector )throw EExpressionError( wxT("colon not allowed in list of entries") ); if( isaRangeVector ) { if( rangeItemCounter >= 3 )throw EExpressionError( wxT("more than 3 items in a range") ); ++rangeItemCounter; codes_[j]->SetValid( true ); } else // first indication of range vector { isaRangeVector = true; rangeItemCounter = 2; // initialize range counter codes_[j]->SetValid( true ); } } else if( codes_[j]->IsaSemicolon() ) // semicolon { if( isaRangeVector ) throw EExpressionError( wxT("semicolon not allowed in range specification") ); if( isaListVector ) { ++listItemCounter; codes_[j]->SetValid( true ); } else // first indication of list vector { isaListVector = true; listItemCounter = 2; // initialize list counter codes_[j]->SetValid( true ); } } } // end of if level == 1 if( codes_[j]->IsaClosingBracket() )--level; // closing bracket } // end of for loop over j if( gotoOuterLoop )continue; } else if( code->IsaFunction() ) { std::size_t indexCounter = 0; std::size_t argCounter = 0; std::size_t jopen, jclose, jpair; FunctionDefinition *fcn = code->GetFcnPtr(); if( i < codes_.size()-1 ) { if( codes_[i+1]->IsaOpeningBracket() ) { argCounter = 1; // must be at least one argument std::size_t level = 0; // the depth of brackets following the function name // // The number of arguments is the number of commas (at level 1) + 1 // jopen = i+1; // points to opening bracket for( std::size_t j=jopen; jIsaClosingBracket() )--level; else if( codes_[j]->IsaOpeningBracket() )++level; if( level == 0 ) { jclose = j; if( fcn->Name() == wxT("VARNAME") ) { if( j-jopen > 2 ) throw EExpressionError( wxT("VARNAME function expects a simple variable name")); wxString name; if( codes_[jopen+1]->IsaNVariable() ) name = codes_[jopen+1]->GetNVarPtr()->GetName(); else if( codes_[jopen+1]->IsaTVariable() ) name = codes_[jopen+1]->GetTVarPtr()->GetName(); else throw EExpressionError(wxT("VARNAME function expects a variable name")); codes_[i]->SetTString( name ); // shift up to eliminate extraneous codes for( std::size_t k=j+1; kName() == wxT("VARTYPE") ) { ExprCodes *e = codes_[jopen+1]; wxString type(wxT("unknown")); if( j-jopen == 2 ) { if( e->IsaFunction() )type = wxT("function"); else if( e->IsaNVariable() ) { NumericData nd( e->GetNVarPtr()->GetData() ); if( nd.GetNumberOfDimensions() == 0 )type = wxT("scalar"); else if( nd.GetNumberOfDimensions() == 1 )type = wxT("vector"); else if( nd.GetNumberOfDimensions() == 2 )type = wxT("matrix"); else if( nd.GetNumberOfDimensions() == 3 )type = wxT("tensor"); } else if( e->IsaTVariable() ) { TextVariable *tv = e->GetTVarPtr(); if( tv->GetData().GetNumberOfDimensions() == 0 )type = wxT("string"); else type = wxT("string array"); } else if( e->IsaConstant() ) { type = wxT("number"); } else if( e->IsaTString() ) { type = wxT("literal string"); } } codes_[i]->SetTString( type ); // shift up to eliminate extraneous codes for( std::size_t k=j+1; kIsaComma() ) { codes_[j]->SetValid( true ); indexCounter > 0 ? ++indexCounter : ++argCounter; } else if( codes_[j]->IsaPairBracket() ) { jpair = j; // jpair points to close & open bracket pair codes_[j]->SetValid( true ); if( indexCounter > 0 ) // already processed pair throw EExpressionError( wxT("only one )( is allowed on a function") ); if( fcn->Name() == wxT("VARNAME") ) throw EExpressionError( wxT("indices are not allowed on the VARNAME function") ); indexCounter = 1; // must be at least one index } // end of code type test } // end level= 0,1 } // end jtabl= 1,5 } // end of if next code is an opening bracket } // end of if i+1 < codes_.size() if( argCounter < fcn->GetMinNumberOfArguments() || argCounter > fcn->GetMaxNumberOfArguments() ) throw EExpressionError( wxString(wxT("function "))+fcn->Name()+ wxT(" has the wrong number of arguments") ); //fcn->SetArgumentCounter( argCounter ); if( indexCounter > 0 ) { // switch argument and index fields // jopen points to starting opening bracket // jpair points to pair bracket // jclose points to final closing bracket // argument goes to temporary buffer // ExprCodes **tempCodes = new ExprCodes* [jpair-jopen]; for( std::size_t j=jopen+1; j<=jpair; ++j )tempCodes[j-jopen-1] = codes_[j]; std::size_t ntemp = jpair-jopen-1; // // index goes to argument field // for( std::size_t j=jpair+1; jSetIndexCntr( indexCounter ); code->SetArgCntr( argCounter ); } else if( code->IsaNVariable() ) { NumericVariable *v = code->GetNVarPtr(); std::size_t indexCounter = 0; if( i < codes_.size()-1 ) // variable may have arguments { if( codes_[i+1]->IsaOpeningBracket() ) { indexCounter = 1; // must be at least one argument std::size_t level = 0; // // level is the depth of brackets following the variable name // the number of arguments is 1+ the number of commas at level 1 // for( std::size_t j=i+1; jIsaClosingBracket() )--level; if( codes_[j]->IsaOpeningBracket() )++level; if( !level )break; // end search for arguments if( level == 1 ) // within range { if( codes_[j]->IsaComma() ) { if( v->GetData().GetNumberOfDimensions() == 0 ) throw EExpressionError( wxString(wxT("scalar variable "))+v->GetName()+ wxT(" cannot have indices") ); ++indexCounter; if( indexCounter > v->GetData().GetNumberOfDimensions() ) throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has too many indices") ); codes_[j]->SetValid( true ); // mark comma as valid } else if( codes_[j]->IsaHash() ) { codes_[j]->SetImmediateValue( v->GetData().GetDimMag(0) ); } else if( codes_[j]->IsaAsterisk() ) { codes_.push_back( new ExprCodes ); codes_.push_back( new ExprCodes ); for( int jj=codes_.size()-3; jj>=static_cast(j+1); --jj )*codes_[jj+2] = *codes_[jj]; codes_[j]->SetImmediateValue( 1 ); codes_[j]->SetValid( true ); codes_[j+1]->SetColon(); codes_[j+1]->SetValid( true ); codes_[j+2]->SetImmediateValue( v->GetData().GetDimMag(indexCounter-1) ); codes_[j+2]->SetValid( true ); } } } // end of j for loop } // end of if opening bracket } // end of if i < codes_.size() if( indexCounter>0 && indexCounter!=v->GetData().GetNumberOfDimensions() ) throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has wrong number of indices") ); code->SetIndexCntr( indexCounter ); } else if( code->IsaTVariable() ) { TextVariable *v = code->GetTVarPtr(); if( i == codes_.size()-1 ) // text variable is last code { if( v->GetData().GetNumberOfDimensions() == 1 ) throw EExpressionError( wxString(wxT("array text variable "))+v->GetName()+ wxT(" has no array subscript") ); continue; } if( code->GetInsertedTVar() ) // inserted text variable due to hash { code->SetInsertedTVar( false ); continue; } bool arg1 = false; bool arg2 = false; std::size_t jPair; if( codes_[i+1]->IsaOpeningBracket() ) { std::size_t jopen = i+1; std::size_t level = 0; for( std::size_t j=jopen; jIsaClosingBracket() )--level; if( codes_[j]->IsaOpeningBracket() )++level; if( level == 0 )break; // end search for indices if( level == 1 ) // within range { if( codes_[j]->IsaComma() ) throw EExpressionError( wxString(wxT("comma not allowed in text variable "))+ v->GetName()+wxT(" index") ); else if( codes_[j]->IsaPairBracket() ) { if( arg1 ) throw EExpressionError( wxString(wxT("text variable "))+v->GetName()+ wxT(" has too many indices") ); arg1 = true; jPair = j; } else if( codes_[j]->IsaHash() ) { if( arg1 ) // processing second index { std::size_t oSize = codes_.size(); for( std::size_t k=0; k<3+jPair-i; ++k )codes_.push_back( new ExprCodes ); for( std::size_t k=oSize-1; k>j; --k )*codes_[k+3+jPair-i] = *codes_[k]; codes_[j]->SetFcnPtr(FunctionTable::GetTable()->GetFunction(wxT("CLEN"))); codes_[j+1]->SetOpeningBracket(); for( std::size_t k=i; kSetInsertedTVar( true ); codes_[j+2+jPair-i]->SetClosingBracket(); codes_[j+3+jPair-i]->SetClosingBracket(); j += 3+jPair; } else // processing first index { if( v->GetData().GetNumberOfDimensions() == 0 ) // scalar text variable codes_[j]->SetImmediateValue( v->GetData().GetScalarValue().size() ); else // array text variable codes_[j]->SetImmediateValue( v->GetData().GetData().size() ); // max array index } } else if( codes_[j]->IsaAsterisk() ) throw EExpressionError( wxString(wxT("wild card not allowed in text variable "))+ v->GetName()+wxT(" index") ); } // end of if level=1 } // end of j for loop if( !arg1 )arg1 = true; // must be >= 1 argument else arg2 = true; // must be 2 arguments } else // unindexed text variable { if( v->GetData().GetNumberOfDimensions() == 1 ) throw EExpressionError( wxString(wxT("array text variable "))+v->GetName()+ wxT(" must have an array index") ); } // opening bracket if( v->GetData().GetNumberOfDimensions() == 0 ) { if( arg2 )throw EExpressionError( wxString(wxT("text variable "))+v->GetName()+ wxT(" is not an array text variable") ); } else { if( !arg1 )throw EExpressionError( wxString(wxT("array text variable "))+v->GetName()+ wxT(" must have an array index") ); } } // test of code types } // loop over all codes } bool Workspace::HandleFunctionsAndText() { bool madeNewWorkspace = false; for( std::size_t i=0; iIsaFunction() ) { int indexCounter = 0; int argCounter = 0; FunctionDefinition *fcn = code->GetFcnPtr(); if( i < codes_.size()-1 && !code->GetFunctionIsDone() ) { code->SetFunctionIsDone(); if( codes_[i+1]->IsaOpeningBracket() ) { argCounter = 1; // must be at least one argument std::size_t level = 0; // the depth of brackets following the function name // // The number of arguments is the number of commas (at level 1) + 1 // std::size_t k = i+1; for( std::size_t j=i+1; jIsaClosingBracket() )--level; else if( codes_[j]->IsaOpeningBracket() )++level; if( level == 0 ) { if( indexCounter == 0 ) { if( fcn->IsMixed2Num() ) { // only extract a character argument into a Workspace // k points to the opening bracket or comma, // j points to the closing bracket ( in the original Workspace ) // if( fcn->ArgTypeIsCharacter(argCounter-1) ) { if( fcn->Name() == wxT("EVALUATE") ) { type_ = NUMERIC; // remove the EVALUATE function for( std::size_t ii=i; iiIsMixed2Char() ) { if( fcn->ArgTypeIsNumeric( argCounter-1 ) ) { // only extract a numeric argument into a Workspace // MakeNewWorkspace( j, k, NUMERIC ); madeNewWorkspace = true; j = k+2; } } } break; // stop searching for arguments } if( level == 1 ) // within range { if( codes_[j]->IsaComma() ) { if( indexCounter > 0 ) // processing function index { ++indexCounter; k = j; } else { if( fcn->IsMixed2Num() ) { if( fcn->ArgTypeIsCharacter( argCounter-1 ) ) { // only extract a character argument into a Workspace // if( fcn->Name() == wxT("EVALUATE") ) { type_ = NUMERIC; // remove the EVALUATE function for( std::size_t ii=i; iiIsMixed2Char() ) { if( fcn->ArgTypeIsNumeric( argCounter-1 ) ) { // only extract a numeric argument into a Workspace // MakeNewWorkspace( j, k, NUMERIC ); madeNewWorkspace = true; j = k+2; } } k = j; ++argCounter; } } else if( codes_[j]->IsaPairBracket() ) { indexCounter = 1; // must be at least one index if( fcn->IsMixed2Num() ) { if( fcn->ArgTypeIsCharacter( argCounter-1 ) ) { if( fcn->Name() == wxT("EVALUATE") ) { type_ = NUMERIC; // remove the EVALUATE function for( std::size_t ii=i; iiIsMixed2Char() ) { if( fcn->ArgTypeIsNumeric( argCounter-1 ) ) { MakeNewWorkspace( j, k, NUMERIC ); madeNewWorkspace = true; j = k+2; } } k = j; } // end of code type test } // end level= 0,1 } // end jtabl= 1,5 } // end of if next code is an opening bracket } // end of if i+1 < codes_.size() } else if( code->IsaTVariable() ) { if( i == codes_.size()-1 )continue; // text variable is last code Workspace *argPtr1 = NULL; Workspace *argPtr2 = NULL; TextVariable *v = code->GetTVarPtr(); if( codes_[i+1]->IsaOpeningBracket() ) { std::size_t j; std::size_t jopen = i+1; std::size_t level = 0; for( j=jopen; jIsaClosingBracket() )--level; if( codes_[j]->IsaOpeningBracket() )++level; if( level == 0 )break; // end search for indices if( level == 1 ) // within range { if( codes_[j]->IsaPairBracket() ) { int expLevel = GetLevel() + 2; if( expLevel > expression_->GetHighestLevel() )expression_->SetHighestLevel(expLevel); Workspace *aWs = new Workspace(expLevel); aWs->SetExpression( expression_ ); ExprCodes *aCode = new ExprCodes; aCode->SetOpeningBracket(); aWs->codes_.push_back( aCode ); for( std::size_t k=jopen+1; k<=j-1; ++k ) { ExprCodes *e = new ExprCodes; aWs->GetCodes().push_back( e ); *e = *codes_[k]; } ExprCodes *bCode = new ExprCodes; bCode->SetClosingBracket(); aWs->GetCodes().push_back( bCode ); aWs->SetCodesAreParsed(); aWs->SetNumeric(); expression_->AddWorkspace( aWs ); std::size_t codeSize = codes_.size(); for( std::size_t k=j+1; k expression_->GetHighestLevel() )expression_->SetHighestLevel(expLevel); Workspace *aWs = new Workspace(expLevel); aWs->SetExpression( expression_ ); ExprCodes *aCode = new ExprCodes; aCode->SetOpeningBracket(); aWs->GetCodes().push_back( aCode ); for( std::size_t k=jopen+1; k<=j-1; ++k ) { ExprCodes *e = new ExprCodes; aWs->GetCodes().push_back( e ); *e = *codes_[k]; } ExprCodes *bCode = new ExprCodes; bCode->SetClosingBracket(); aWs->GetCodes().push_back( bCode ); aWs->SetNumeric(); aWs->SetCodesAreParsed(); expression_->AddWorkspace( aWs ); std::size_t codeSize = codes_.size(); for( std::size_t k=j+1; k= 1 argument else argPtr2 = aWs; // must be 2 arguments } if( v->GetData().GetNumberOfDimensions() == 0 ) code->SetTCIndexPtr( argPtr1 ); else { code->SetTAIndexPtr( argPtr1 ); // array index code->SetTCIndexPtr( argPtr2 ); // character index } } // end of if test of code types } // end of loop over all codes return madeNewWorkspace; } void Workspace::RPNconvert() { // 4th Pass: // Loop over the input codes and reorder into Reverse Polish Notation (RPN). // oprPos_[] = Position of binary operator token (found when taken off stack) // oprAnd_[] = Start of 1st operand of binary operator // fcnPos_[] = Position of function name token // fcnArg_[] = Position of start of first function argument // fcnIdx_[] = Position of start of first function index // varPos_[] = Position of indexed variable name token // varIdx_[] = Position of start of first index // All of these locations refer to position in output stack // std::size_t codeSize = codes_.size(); oprPos_.resize( codeSize ); std::vector().swap( oprAnd_ ); oprAnd_.insert( oprAnd_.begin(), codeSize, -1 ); fcnPos_.resize( codeSize ); fcnArg_.resize( codeSize ); fcnIdx_.resize( codeSize ); varPos_.resize( codeSize ); varIdx_.resize( codeSize ); rngPos_.resize( codeSize ); rngIdx_.resize( codeSize ); lstPos_.resize( codeSize ); lstIdx_.resize( codeSize ); std::deque aStack; std::deque outBuf; std::deque::const_iterator end( codes_.end() ); for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) { ExprCodes *code = *i; if( code->IsaFunction() ) { if( code->GetArgCntr() > 0 ) // function has arguments { ++functionWithArgumentsCntr_; if( code->GetIndexCntr() > 0 ) // indexed function { std::deque::const_iterator jpair( end ); int level = 0; for( std::deque::const_iterator j(i+1); j!=end; ++j ) { ExprCodes *jCode = *j; if( jCode->IsaOpeningBracket() )++level; if( jCode->IsaClosingBracket() )--level; if( jCode->IsaPairBracket() && level == 1 ) { jpair = j; break; } } assert( jpair != end ); // )( not found (*jpair)->SetCntr( functionWithArgumentsCntr_ ); fcnIdx_[functionWithArgumentsCntr_-1] = outBuf.size(); // position of start of index field } else // next output token is first argument { fcnArg_[functionWithArgumentsCntr_-1] = outBuf.size(); // position of start of arg. field } code->SetCntr( functionWithArgumentsCntr_ ); ExprCodes *nextCode = *(i+1); nextCode->SetRefFunction(); // flag following opening bracket as nextCode->SetCntr( functionWithArgumentsCntr_ ); // start of function arguments aStack.push_front( code ); } else // function has no arguments { // push directly onto output buffer outBuf.push_back( code ); if( oprAnd_[operatorCntr_] == -1 || outBuf.back()->IsaFunction() || outBuf.back()->IsaNVariable() || outBuf.back()->IsaConstant() || outBuf.back()->IsaImmediateValue() || outBuf.back()->IsaWorkspace() ) oprAnd_[operatorCntr_] = outBuf.size()-1; } } else if( code->IsaNVariable() ) { if( code->GetIndexCntr() > 0 ) // variable has indices { code->SetCntr( ++indexedVariableCntr_ ); ExprCodes *nextCode = *(i+1); nextCode->SetRefNVariable(); // flag following opening bracket as nextCode->SetCntr( indexedVariableCntr_ ); // start of variable arguments aStack.push_front( code ); varIdx_[indexedVariableCntr_-1] = outBuf.size(); // next output token is first index } else // variable has no indices { // push directly onto output buffer outBuf.push_back( code ); if( oprAnd_[operatorCntr_] == -1 || outBuf.back()->IsaFunction() || outBuf.back()->IsaNVariable() || outBuf.back()->IsaConstant() || outBuf.back()->IsaImmediateValue() || outBuf.back()->IsaWorkspace() ) oprAnd_[operatorCntr_] = outBuf.size()-1; } } else if( code->IsaConstant() ) { // push directly onto output buffer outBuf.push_back( code ); if( oprAnd_[operatorCntr_] == -1 || outBuf.back()->IsaFunction() || outBuf.back()->IsaNVariable() || outBuf.back()->IsaConstant() || outBuf.back()->IsaImmediateValue() || outBuf.back()->IsaWorkspace() ) oprAnd_[operatorCntr_] = outBuf.size()-1; } else if( code->IsaOperator() ) { code->SetCntr( ++operatorCntr_ ); OperatorDefinition *op = code->GetOpPtr(); // // |operatorPriority| is the operator priority or precedence // The sign gives associativity, with + for left and - for right // int operatorPriority; if( code->IsBinary() ) operatorPriority = op->BinaryPriority(); else operatorPriority = op->UnaryPriority(); // // Pop codes from the stack onto the output buffer until an // operator of lower precedence than that of the current, // or until an opening bracket, comma or colon is encountered // std::size_t aStackSize( aStack.size() ); for( std::size_t j = 0; j < aStackSize; ++j ) { ExprCodes *stackCode = aStack.front(); if( stackCode->IsaFunction() ) { // pop function onto output buffer aStack.pop_front(); outBuf.push_back( stackCode ); if( oprAnd_[operatorCntr_-1] == -1 ) // current operator oprAnd_[operatorCntr_-1] = outBuf.size()-1; if( stackCode->GetArgCntr() != 0 ) // function has arguments fcnPos_[stackCode->GetCntr()-1] = outBuf.size()-1; // function location } else if( stackCode->IsaNVariable() ) { // pop variable onto output buffer aStack.pop_front(); outBuf.push_back( stackCode ); if( oprAnd_[operatorCntr_-1] == -1 ) oprAnd_[operatorCntr_-1] = outBuf.size()-1; if( stackCode->GetIndexCntr() != 0) // variable has indices varPos_[stackCode->GetCntr()-1] = outBuf.size()-1; // variable location } else if( stackCode->IsaOperator() ) { OperatorDefinition *op2 = stackCode->GetOpPtr(); int opPrio; if( stackCode->IsBinary() ) opPrio = op2->BinaryPriority(); else opPrio = op2->UnaryPriority(); // // If the stack operator has a lower precedence than the current operator, // stop popping the stack and push the current operator onto the stack. // If not, then pop the operator off the stack onto the output buffer. // if( operatorPriority < 0 ) { if( abs(opPrio) <= abs(operatorPriority) )break; } else { if( abs(opPrio) < abs(operatorPriority) )break; } // // stack operator has a higher precedence than input stream operator // aStack.pop_front(); if( op2->IsArray() ) // array operator { ExprCodes *aCode = new ExprCodes; // write no-op code to output stream aCode->SetNoop(); aCode->SetRefOperator(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } outBuf.push_back( stackCode ); oprPos_[stackCode->GetCntr()-1] = outBuf.size()-1; } else if( stackCode->IsaOpeningBracket() ) { break; // stop popping the stack } else if( stackCode->IsaRangeVector() ) { if( oprAnd_[operatorCntr_-1] == -1 )oprAnd_[operatorCntr_-1] = outBuf.size()-1; rngPos_[stackCode->GetCntr()-1] = outBuf.size()-1; aStack.pop_front(); outBuf.push_back( stackCode ); } else if( stackCode->IsaListVector() ) { if( oprAnd_[operatorCntr_-1] == -1 )oprAnd_[operatorCntr_-1] = outBuf.size()-1; lstPos_[stackCode->GetCntr()-1] = outBuf.size()-1; aStack.pop_front(); outBuf.push_back( stackCode ); } } // end of j loop over codes on the stack if( code->IsBinary() ) // binary operator on input stream { // pop a no-op code to the output buffer // to mark the start of the second operand // ExprCodes *lastCode = outBuf.back(); // // ensure only one no-op written to output stream // if( lastCode->IsaNoop() ) { lastCode->SetCntr( operatorCntr_ ); } else { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefOperator(); aCode->SetCntr( operatorCntr_ ); outBuf.push_back( aCode ); } } aStack.push_front( code ); // // If the token pushed onto the stack is an operator, then the start // position oprAnd_[] of first operand is saved. If the current token // on the output stack is a variable or constant, then oprAnd_[] already // contains the correct location. If this however is an operator also, // then the start of the first operand will coincide with the start of // that operator, the index (operatorCntr_) of which should be one less // than that of the operator currently being pushed onto the operator stack // if( code->IsUnary() ) { // define start of unary operand, next output token is operand oprAnd_[operatorCntr_-1] = outBuf.size(); } else // binary operator { std::size_t nout = outBuf.size()-1; ExprCodes *lastCode = outBuf[nout]; if( lastCode->IsaFunction() ) { if( lastCode->GetArgCntr() ) { fcnPos_[lastCode->GetCntr()-1] = nout; oprAnd_[operatorCntr_-1] = fcnArg_[lastCode->GetCntr()-1]; } } else if( lastCode->IsaNVariable() ) { if( lastCode->GetIndexCntr() > 0 ) { if( !lastCode->GetNVarPtr()->GetData().GetNumberOfDimensions() == 0 ) { varPos_[lastCode->GetCntr()-1] = nout; oprAnd_[operatorCntr_-1] = varIdx_[lastCode->GetCntr()-1]; } } } else if( lastCode->IsaOperator() ) { oprAnd_[operatorCntr_-1] = oprAnd_[lastCode->GetCntr()-1]; } else if( lastCode->IsaNoop() ) { ExprCodes *prevCode = outBuf[nout-1]; if( prevCode->IsaFunction() ) { if( prevCode->GetArgCntr() > 0 ) { fcnPos_[prevCode->GetCntr()-1] = nout-1; oprAnd_[operatorCntr_-1] = fcnArg_[prevCode->GetCntr()-1]; } } else if( prevCode->IsaNVariable() ) { if( prevCode->GetIndexCntr() > 0 ) { varPos_[prevCode->GetCntr()-1] = nout-1; oprAnd_[operatorCntr_-1] = varIdx_[prevCode->GetCntr()-1]; } } else if( prevCode->IsaOperator() ) { oprAnd_[operatorCntr_-1] = oprAnd_[prevCode->GetCntr()-1]; } else if( prevCode->IsaRangeVector() ) { rngPos_[prevCode->GetCntr()-1] = nout-1; oprAnd_[operatorCntr_-1] = rngIdx_[prevCode->GetCntr()-1]; } else if( prevCode->IsaListVector() ) { lstPos_[prevCode->GetCntr()-1] = nout-1; oprAnd_[operatorCntr_-1] = lstIdx_[prevCode->GetCntr()-1]; } } else if( lastCode->IsaRangeVector() ) { rngPos_[lastCode->GetCntr()-1] = nout-1; oprAnd_[operatorCntr_-1] = rngIdx_[lastCode->GetCntr()-1]; } else if( lastCode->IsaListVector() ) { lstPos_[lastCode->GetCntr()-1] = nout-1; oprAnd_[operatorCntr_-1] = lstIdx_[lastCode->GetCntr()-1]; } } } else if( code->IsaOpeningBracket() ) { // opening bracket: push onto stack // closing bracket: pop stack up to corresponding opening bracket and discard // pair bracket: pop stack up to corresponding opening bracket // comma: pop stack up to corresponding opening bracket // colon: pop stack up to corresponding opening bracket // semicolon: pop stack up to corresponding opening bracket // hash: already taken care of // asterisk: already taken care of // aStack.push_front( code ); } else if( code->IsaClosingBracket() || code->IsaPairBracket() || code->IsaComma() || code->IsaSemicolon() || code->IsaColon() ) { // pop codes from the stack onto the output buffer until the // corresponding ( is encountered // std::size_t stackSize( aStack.size() ); for( std::size_t j=0; jIsaFunction() ) { // pop function onto output buffer if( !code->IsaClosingBracket() ) { // write no-op code to output stream // ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefFunction(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } outBuf.push_back( stackCode ); if( stackCode->GetArgCntr() != 0 ) // function has arguments fcnPos_[stackCode->GetCntr()-1] = outBuf.size()-1; // function location } else if( stackCode->IsaNVariable() ) { // pop variable onto output buffer if( stackCode->GetIndexCntr() != 0 ) { if( !code->IsaClosingBracket() ) { // write no-op code to output stream // ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefNVariable(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } } varPos_[stackCode->GetCntr()-1] = outBuf.size(); outBuf.push_back( stackCode ); if( oprAnd_[operatorCntr_] == -1 ) // refers to next operator oprAnd_[operatorCntr_] = outBuf.size(); } else if( stackCode->IsaOperator() ) { // pop operator onto output buffer OperatorDefinition *op = stackCode->GetOpPtr(); if( op->IsArray() ) // array operator { // write no-op code to output stream ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefOperator(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } outBuf.push_back( stackCode ); oprPos_[stackCode->GetCntr()-1] = outBuf.size()-1; } else if( stackCode->IsaOpeningBracket() ) { if( code->IsaClosingBracket() ) { delete stackCode; aStack.pop_front(); } else if( code->IsaColon() )// ensure only one no-op written to output stream { if( outBuf.back()->IsaNoop() ) { outBuf.back()->SetReferenceType( stackCode->GetReferenceType() ); outBuf.back()->SetCntr( stackCode->GetCntr() ); } else { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetCntr( stackCode->GetCntr() ); aCode->SetReferenceType( stackCode->GetReferenceType() ); outBuf.push_back( aCode ); } } else if( code->IsaSemicolon() )// ensure only one no-op written to output stream { if( outBuf.back()->IsaNoop() ) { outBuf.back()->SetReferenceType( stackCode->GetReferenceType() ); outBuf.back()->SetCntr( stackCode->GetCntr() ); } else { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetCntr( stackCode->GetCntr() ); aCode->SetReferenceType( stackCode->GetReferenceType() ); outBuf.push_back( aCode ); } } else if( code->IsaComma() ) { if( outBuf.back()->IsaNoop() ) { outBuf.back()->SetReferenceType( stackCode->GetReferenceType() ); outBuf.back()->SetCntr( stackCode->GetCntr() ); } else { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetReferenceType( stackCode->GetReferenceType() ); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } } break; // stop popping the stack } else if( stackCode->IsaRangeVector() ) { // pop onto output buffer if( oprAnd_[operatorCntr_] == -1 )oprAnd_[operatorCntr_] = outBuf.size()-1; if( !code->IsaClosingBracket() ) // write no-op code to output stream { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); if( code->IsaPairBracket() ) { aCode->SetRefFunction(); aCode->SetCntr( code->GetCntr() ); } else { aCode->SetRefRangeVector(); aCode->SetCntr( stackCode->GetCntr() ); } outBuf.push_back( aCode ); } rngPos_[stackCode->GetCntr()-1] = outBuf.size(); outBuf.push_back( stackCode ); } else if( stackCode->IsaListVector() ) // pop onto output buffer { if( oprAnd_[operatorCntr_] == -1 )oprAnd_[operatorCntr_] = outBuf.size()-1; if( !code->IsaClosingBracket() ) // write no-op code to output stream { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefListVector(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } lstPos_[stackCode->GetCntr()-1] = outBuf.size(); outBuf.push_back( stackCode ); } aStack.pop_front(); } // end of j loop over stack codes if( code->IsaPairBracket() ) { ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetReferenceType( code->GetReferenceType() ); aCode->SetCntr( code->GetCntr() ); outBuf.push_back( aCode ); fcnArg_[code->GetCntr()-1] = outBuf.size(); } delete code; } else if( code->IsaImmediateValue() ) { outBuf.push_back( code ); if( oprAnd_[operatorCntr_] == -1 || outBuf.back()->IsaFunction() || outBuf.back()->IsaNVariable() || outBuf.back()->IsaConstant() || outBuf.back()->IsaImmediateValue() || outBuf.back()->IsaWorkspace() ) oprAnd_[operatorCntr_] = outBuf.size()-1; } else if( code->IsaRangeVector() ) { // // next output token is first index // rngIdx_[code->GetCntr()-1] = outBuf.size(); aStack.push_front( code ); } else if( code->IsaListVector() ) { // // next output token is first item // lstIdx_[code->GetCntr()-1] = outBuf.size(); aStack.push_front( code ); } else if( code->IsaWorkspace() ) { outBuf.push_back( code ); if( oprAnd_[operatorCntr_] == -1 || outBuf.back()->IsaFunction() || outBuf.back()->IsaNVariable() || outBuf.back()->IsaConstant() || outBuf.back()->IsaImmediateValue() || outBuf.back()->IsaWorkspace() ) oprAnd_[operatorCntr_] = outBuf.size()-1; } else if( code->IsaTString() ) { outBuf.push_back( code ); } } // end of loop over all the codes // // pop the remaining elements of the stack // std::size_t jFinal( aStack.size() ); for( std::size_t j = 0; j < jFinal; ++j ) { ExprCodes *stackCode = aStack.front(); if( stackCode->IsaFunction() ) { // // write no-op code to output stream // ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefFunction(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); // // store function w/args location // if( stackCode->GetArgCntr() != 0 )fcnPos_[stackCode->GetCntr()-1] = outBuf.size(); } else if( stackCode->IsaNVariable() ) { if( oprAnd_[operatorCntr_] == -1 )oprAnd_[operatorCntr_] = outBuf.size(); if( stackCode->GetIndexCntr() )varPos_[stackCode->GetCntr()-1] = outBuf.size(); } else if( stackCode->IsaOperator() ) { OperatorDefinition *op = stackCode->GetOpPtr(); if( op->IsArray() ) { // write no-op code to output stream // ExprCodes *aCode = new ExprCodes; aCode->SetNoop(); aCode->SetRefOperator(); aCode->SetCntr( stackCode->GetCntr() ); outBuf.push_back( aCode ); } oprPos_[stackCode->GetCntr()-1] = outBuf.size(); } else if( stackCode->IsaRangeVector() ) { if( oprAnd_[operatorCntr_] == -1 )oprAnd_[operatorCntr_] = outBuf.size(); rngPos_[stackCode->GetCntr()-1] = outBuf.size(); } else if( stackCode->IsaListVector() ) { if( oprAnd_[operatorCntr_] == -1 )oprAnd_[operatorCntr_] = outBuf.size(); lstPos_[stackCode->GetCntr()-1] = outBuf.size(); } aStack.pop_front(); outBuf.push_back( stackCode ); } codes_ = outBuf; if( codes_.back()->IsaNoop() ) { delete codes_.back(); codes_.pop_back(); } } void Workspace::SetHierarchy() { // Fifth pass: // // Loop over all operands, and if an array operation is involved, // then increment and decrement the hierachy level accordingly at the // start and end of the operator"s range // hierarchy_.insert( hierarchy_.begin(), codes_.size(), 0 ); for( std::size_t i=0; iGetOpPtr(); if( op->IsArray() ) { --hierarchy_[opLocation]; hierarchy_[operandStart] += 2; if( opLocation < codes_.size() - 1 ) { if( codes_[opLocation+1]->IsaNoop() ) { if( opLocation < codes_.size() - 2 )--hierarchy_[opLocation+2]; } else --hierarchy_[opLocation+1]; } } } // // loop over all functions // increment/decrement the hierachy levels where array functions are involved // for( std::size_t i=0; iGetFcnPtr(); if( codes_[fcnLocation]->GetIndexCntr() != 0 ) { --hierarchy_[fcnLocation]; hierarchy_[argStart] += 2; ++hierarchy_[indexStart]; if( fcnLocation < codes_.size() - 1 ) { if( codes_[fcnLocation+1]->IsaNoop() ) { if( fcnLocation < codes_.size() - 2 ) hierarchy_[fcnLocation+2] -= 2; } else hierarchy_[fcnLocation+1] -= 2; } } else if( f->IsNum2NumVector() || f->IsMixed2Num() ) { --hierarchy_[fcnLocation]; hierarchy_[argStart] += 2; if( fcnLocation < codes_.size() - 1 ) { if( codes_[fcnLocation+1]->IsaNoop() ) { if( fcnLocation < codes_.size() - 2 )--hierarchy_[fcnLocation+2]; } else { --hierarchy_[fcnLocation+1]; } } } else { --hierarchy_[fcnLocation]; ++hierarchy_[argStart]; } } // // Loop over all indexed variables, range and list vectors, // increment/decrement the hierachy levels for each index evaluation // for( std::size_t i=0; iIsaRangeVector() ) { std::size_t rngLocation = rngPos_[rngCntr]; std::size_t itemStart = rngIdx_[rngCntr]; --hierarchy_[rngLocation]; ++hierarchy_[itemStart]; ++rngCntr; } } for( std::size_t i=0; iSetNestingLevel( hierarchy_[0] ); std::size_t j = 1; std::deque::const_iterator end( codes_.end() ); for( std::deque::const_iterator i(codes_.begin()+1); i!=end; ++j, ++i ) { (*i)->SetNestingLevel( (*(i-1))->GetNestingLevel() + hierarchy_[j] ); } int theMinimumNestingLevel = std::numeric_limits::max(); for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) { int n = (*i)->GetNestingLevel(); if( (*i)->IsaNoop() && n > 0 )(*i)->SetNestingLevel( --n ); if( n > highestNestingLevel_ )highestNestingLevel_ = n; // total number of levels if( n < theMinimumNestingLevel )theMinimumNestingLevel = n; // lowest level used } assert( theMinimumNestingLevel >= 0 ); if( theMinimumNestingLevel > 0 ) // shift all codes from theMinimumNestingLevel --> 0 { for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) (*i)->SetNestingLevel( (*i)->GetNestingLevel() - theMinimumNestingLevel ); highestNestingLevel_ -= theMinimumNestingLevel; } for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) { if( (*i)->IsaNoop() ) { std::size_t cntr = (*i)->GetCntr(); if( (*i)->IsFlaggedByFunction() ) { if( codes_[fcnPos_[cntr-1]]->GetIndexCntr() == 0 ) (*i)->SetNestingLevel( codes_[fcnPos_[cntr-1]]->GetNestingLevel() ); } else if( (*i)->IsFlaggedByNVariable() ) (*i)->SetNestingLevel( codes_[varPos_[cntr-1]]->GetNestingLevel() ); else if( (*i)->IsFlaggedByOperator() ) (*i)->SetNestingLevel( codes_[oprPos_[cntr-1]]->GetNestingLevel() ); else if( (*i)->IsFlaggedByRangeVector() ) { (*i)->SetNestingLevel( codes_[rngPos_[cntr-1]]->GetNestingLevel() ); } else if( (*i)->IsFlaggedByListVector() ) (*i)->SetNestingLevel( codes_[lstPos_[cntr-1]]->GetNestingLevel() ); } } std::vector().swap( oprPos_ ); std::vector().swap( oprAnd_ ); std::vector().swap( fcnPos_ ); std::vector().swap( fcnArg_ ); std::vector().swap( fcnIdx_ ); std::vector().swap( varPos_ ); std::vector().swap( varIdx_ ); std::vector().swap( rngPos_ ); std::vector().swap( rngIdx_ ); std::vector().swap( lstPos_ ); std::vector().swap( lstIdx_ ); } void Workspace::SixthPass() { // The RPN code sequence obtained must now be broken into portions // containing only scalar operations that can be simply looped over // and evaluated on an element-by-element basis. The final result will // be a tree of such sub-expressions (evaluated as workspaces) // int highestNestingLevel_2 = highestNestingLevel_; for( int level=highestNestingLevel_2; level>=0; --level ) { Workspace *ws = NULL; bool addedCodeToWorkspace = false; bool pack = true; std::deque newCodes; for( std::size_t i=0; iGetNestingLevel() == level ) { if( !addedCodeToWorkspace && !iCode->IsaNoop() ) { if( i==codes_.size()-1 && codes_.size()>1 ) // >1 code && the last code { iCode->SetNestingLevel( iCode->GetNestingLevel()-1 ); newCodes.push_back( iCode ); } else // only 1 code || it's not the last code { ws = new Workspace(level_+1); ws->SetExpression( expression_ ); ws->SetCodesAreParsed(); ws->SetRPNdone(); ws->GetCodes().push_back( iCode ); expression_->AddWorkspace( ws ); if( iCode->IsaWorkspace() )iCode->GetWorkspacePtr()->SetParent( ws ); ExprCodes *aCode = new ExprCodes; aCode->SetWorkspacePtr( ws ); // replace section in workspace aCode->SetNestingLevel( std::max(0,level-1) ); newCodes.push_back( aCode ); addedCodeToWorkspace = true; } } else // addedCodeToWorkspace or current code is no-op { if( iCode->IsaNoop() ) // current code is a no-op { delete iCode; } else { ws->GetCodes().push_back( iCode ); // add current code to workspace if( iCode->IsaWorkspace() )iCode->GetWorkspacePtr()->SetParent( ws ); ws->SetNcFlag( true ); addedCodeToWorkspace = true; } } } else if( iCode->GetNestingLevel() < level ) { if( addedCodeToWorkspace ) { std::deque &cd = ws->GetCodes(); if( cd.size() == 1 ) { int n = newCodes.back()->GetNestingLevel(); cd.front()->SetNestingLevel( n ); *newCodes.back() = *cd.front(); expression_->RemoveWorkspace( ws ); delete ws; ws = NULL; } else { ExprCodes *lastCode = cd.back(); if( lastCode->IsaRangeVector() && lastCode->GetRangeVectorPtr()->GetItemCntr() == cd.size()-1 ) { ws->SetNcFlag( !ws->GetNcFlag() ); } else if( lastCode->IsaListVector() && lastCode->GetListVectorPtr()->GetItemCntr() == cd.size()-1 ) { //ws->SetNcFlag( !ws->GetNcFlag() ); ws->SetNcFlag( true ); } else if( lastCode->IsaFunction() ) { FunctionDefinition *f = lastCode->GetFcnPtr(); if( f->IsNum2NumVector() || f->IsMixed2Num() || lastCode->GetIndexCntr() > 0 ) { pack = false; ws->SetNcFlag( true ); newCodes.back()->SetIndexCntr( lastCode->GetIndexCntr() ); } } else if( lastCode->IsaOperator() ) { OperatorDefinition *op = lastCode->GetOpPtr(); if( op->IsArray() ) { pack = false; ws->SetNcFlag( true ); } } if( pack ) { std::size_t cdSize = cd.size(); for( std::size_t j=0; jIsaWorkspace() ) { Workspace *w = cd.at(j)->GetWorkspacePtr(); std::deque &cdj = w->GetCodes(); if( !w->GetNcFlag() ) { ExprCodes *etmp = cd.at(j); cd.insert( cd.begin()+j, cdj.begin(), cdj.end() ); j += cdj.size(); cd.erase( cd.begin()+j ); --j; cdSize = cd.size(); std::deque().swap( cdj ); expression_->RemoveWorkspace( w ); delete w; w = NULL; delete etmp; } } } std::deque::const_iterator cdend( cd.end() ); for( std::deque::const_iterator j(cd.begin()); j!=cdend; ++j ) { if( (*j)->IsaWorkspace() )(*j)->GetWorkspacePtr()->SetParent( ws ); } } // end of if pack } // end of if cd.size() > 1 } // end of if addedCodeToWorkspace, cd goes out of scope newCodes.push_back( iCode ); addedCodeToWorkspace = false; } } // end of i loop over code array //if( flag && codes_.back()->GetNestingLevel() == level ) // flag --> addedCodeToWorkspace || only 1 code || lastCode is no-op if( codes_.back()->GetNestingLevel() == level ) { std::deque &cd = ws->GetCodes(); if( cd.size() == 1 ) { int n = newCodes.back()->GetNestingLevel(); cd.front()->SetNestingLevel( n ); *newCodes.back() = *cd.front(); expression_->RemoveWorkspace( ws ); delete ws; ws = NULL; } else { ExprCodes *lastCode = cd.back(); if( lastCode->IsaRangeVector() && lastCode->GetRangeVectorPtr()->GetItemCntr() == cd.size()-1 ) { ws->SetNcFlag( !ws->GetNcFlag() ); } else if( lastCode->IsaListVector() && lastCode->GetListVectorPtr()->GetItemCntr() == cd.size()-1 ) { ws->SetNcFlag( !ws->GetNcFlag() ); } else if( lastCode->IsaFunction() ) { FunctionDefinition *f = lastCode->GetFcnPtr(); if( f->IsNum2NumVector() || f->IsMixed2Num() || lastCode->GetIndexCntr() > 0 ) { pack = false; ws->SetNcFlag( true ); newCodes.back()->SetIndexCntr( lastCode->GetIndexCntr() ); } } else if( lastCode->IsaOperator() ) { OperatorDefinition *op = lastCode->GetOpPtr(); if( op->IsArray() ) { pack = false; ws->SetNcFlag( true ); } } if( pack ) { std::size_t cdSize = cd.size(); for( std::size_t k=0; k::iterator j = cd.begin()+k; ExprCodes *e = *j; if( e->IsaWorkspace() ) { Workspace *w = e->GetWorkspacePtr(); std::deque &wcd = w->GetCodes(); if( !w->GetNcFlag() ) { std::deque temp( cd.begin(), j ); std::size_t wcdEnd = wcd.size(); for( std::size_t i=0; iRemoveWorkspace( w ); delete w; w = NULL; delete e; } } } std::deque::const_iterator newend( newCodes.end() ); for( std::deque::const_iterator j(newCodes.begin()); j!=newend; ++j ) { if( (*j)->IsaWorkspace() )(*j)->GetWorkspacePtr()->SetParent( ws ); } } // end of if pack } // end of if cd->size() > 1 } codes_.assign( newCodes.begin(), newCodes.end() ); std::deque().swap( newCodes ); } assert( codes_.size() == 1 ); rpnDone_ = true; } void Workspace::RPNTconvert() { // 4th Pass: // Loop over the input codes and reorder into Reverse Polish Notation (RPN). // std::deque aStack; std::deque outBuf; for( std::size_t i=0; iIsaFunction() ) { FunctionDefinition *fcn = code->GetFcnPtr(); if( fcn->IsNum2NumScalar() || fcn->IsNum2NumVector() || fcn->IsMixed2Num() ) { throw EExpressionError( wxT("numeric function in character expression") ); } if( code->GetArgCntr() == 0 ) // function has no arguments outBuf.push_back( code ); else aStack.push_front( code ); } else if( code->IsaOperator() ) { OperatorDefinition *opr = code->GetOpPtr(); if( opr->IsScalar() || opr->IsArray() ) { if( opr->Name() != wxT("//") ) throw EExpressionError( wxT("numeric operator in character expression") ); } // // |operatorPriority| is the operator priority or precedence // The sign gives associativity, with + for left and - for right // int operatorPriority; if( code->IsBinary() ) operatorPriority = opr->BinaryPriority(); else operatorPriority = opr->UnaryPriority(); // // Pop codes from the stack onto the output buffer until an // operator of lower precedence than that of the current, // or until an opening bracket, comma or colon is encountered // std::size_t aStackSize( aStack.size() ); for( std::size_t j = 0; j < aStackSize; ++j ) { ExprCodes *stackCode = aStack.front(); aStack.pop_front(); if( stackCode->IsaFunction() ) { // pop function onto output buffer outBuf.push_back( stackCode ); } else if( stackCode->IsaOperator() ) { OperatorDefinition *op2 = stackCode->GetOpPtr(); int opPrio; if( stackCode->IsBinary() ) opPrio = op2->BinaryPriority(); else opPrio = op2->UnaryPriority(); // // If the stack operator has a lower precedence than the current operator, // stop popping the stack and push the current operator onto the stack. // If not, then pop the operator off the stack onto the output buffer. // if( operatorPriority < 0 ) { if( abs(opPrio) <= abs(operatorPriority) )break; } else { if( abs(opPrio) < abs(operatorPriority) )break; } // // stack operator has a higher precedence than input stream operator // outBuf.push_back( stackCode ); } else if( stackCode->IsaOpeningBracket() ) { delete stackCode; break; // stop popping the stack } } // end of j loop over codes on the stack aStack.push_front( code ); } else if( code->IsaOpeningBracket() ) { // opening bracket: push onto stack // closing bracket: pop stack up to corresponding opening bracket and discard // pair bracket: pop stack up to corresponding opening bracket // comma: pop stack up to corresponding opening bracket // colon: pop stack up to corresponding opening bracket // semicolon: pop stack up to corresponding opening bracket // hash: already taken care of // asterisk: already taken care of // aStack.push_front( code ); } else if( code->IsaClosingBracket() || code->IsaComma() ) { // pop codes from the stack onto the output buffer until the // corresponding ( is encountered // std::size_t aStackSize( aStack.size() ); for( std::size_t j = 0; j < aStackSize; ++j ) { ExprCodes *stackCode = aStack.front(); aStack.pop_front(); if( stackCode->IsaFunction() ) { // pop function onto output buffer outBuf.push_back( stackCode ); } else if( stackCode->IsaOperator() ) { // pop operator onto output buffer outBuf.push_back( stackCode ); } else if( stackCode->IsaOpeningBracket() ) { delete stackCode; break; // stop popping the stack } } // end of j loop over stack codes delete code; } else if( code->IsaTVariable() ) { outBuf.push_back( code ); } else if( code->IsaWorkspace() ) { outBuf.push_back( code ); } else if( code->IsaTString() ) { outBuf.push_back( code ); } else if( code->IsaNVariable() ) { throw EExpressionError( wxT("numeric variable in character expression") ); } else if( code->IsaConstant() ) { outBuf.push_back( code ); } else if( code->IsaImmediateValue() ) { throw EExpressionError( wxT("numeric constant in character expression") ); } else if( code->IsaRangeVector() ) { throw EExpressionError( wxT("range vector in character expression") ); } else if( code->IsaListVector() ) { throw EExpressionError( wxT("list vector in character expression") ); } } // end of loop over all the codes // // pop the remaining elements of the stack // std::size_t aStackSize( aStack.size() ); for( std::size_t j=0; jIsaFunction() && (lastCode->GetFcnPtr()->IsNum2NumVector() || lastCode->GetFcnPtr()->IsMixed2Num()) ) evalType_ = ARRAYFCN; else if( lastCode->IsaOperator() && lastCode->GetOpPtr()->IsArray() ) evalType_ = ARRAYOP; else evalType_ = SIMPLE; } void Workspace::SetUp() { // Mark codes which are indices of other variables // ExprCodes *lastCode = codes_.back(); std::size_t codeSize = codes_.size(); for( std::size_t i=0; iIsaNVariable() ) { NumericVariable *v = code->GetNVarPtr(); std::size_t ndm = v->GetData().GetNumberOfDimensions(); std::size_t nix = code->GetIndexCntr(); if( nix != 0 ) // variable has indices { if( nix != ndm )throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has wrong number of indices") ); std::size_t ii = 0; for( std::size_t j=0; jSetIsAnIndex( true ); if( aCode->IsaNVariable() ) { NumericVariable *vb = aCode->GetNVarPtr(); if( vb->GetData().GetNumberOfDimensions() == 2 ) throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has a matrix as an index") ); else if( vb->GetData().GetNumberOfDimensions() == 3 ) throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has a tensor as an index") ); aCode->SetIndx(0,ndm-j-1); } else if( aCode->IsaWorkspace() ) { Workspace const *ws = aCode->GetWorkspacePtr(); if( ws->GetNumberOfDimensions() == 2 ) throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has matrix as an index") ); else if( ws->GetNumberOfDimensions() == 3 ) throw EExpressionError( wxString(wxT("variable "))+v->GetName()+ wxT(" has a tensor as an index") ); aCode->SetIndx(0,ndm-j-1); } else if( aCode->IsaRangeVector() ) { RangeVector *rng = aCode->GetRangeVectorPtr(); rng->SetDimension( ndm-j ); rng->SetInt(); std::size_t n = rng->GetItemCntr(); rng->SetItemCntr( 0 ); for( std::size_t m=0; mIsaNVariable() ) { if( !bCode->GetNVarPtr()->GetData().GetNumberOfDimensions() == 0 ) throw EExpressionError( wxString(wxT("item "))<SetValue( m, bCode->GetNVarPtr()->GetData().GetScalarValue() ); } else if( bCode->IsaWorkspace() ) { Workspace *ws = bCode->GetWorkspacePtr(); if( ws->IsEmpty() ) throw EExpressionError(wxT("range element workspace is empty")); if( ws->GetNumberOfDimensions() != 0 ) throw EExpressionError( wxString(wxT("item "))<SetValue( m, ws->GetValue() ); } else if( bCode->IsaConstant() ) { rng->SetValue( m, bCode->GetConstantValue() ); } else if( bCode->IsaImmediateValue() ) { rng->SetValue( m, static_cast(bCode->GetImmediateValue()) ); } else throw EExpressionError( wxString(wxT("item "))<GetInc() == 0.0 ) throw EExpressionError( wxT("range vector has zero increment") ); if( rng->GetNpt() < 1 ) throw EExpressionError( wxT("range vector has no elements") ); int istrv = static_cast(rng->GetStart()); int iendv = static_cast(rng->GetEnd()); if( istrv<1 || istrv>static_cast(v->GetData().GetDimMag(ndm-j-1)) || iendv<1 || iendv>static_cast(v->GetData().GetDimMag(ndm-j-1)) ) throw EExpressionError( wxString(wxT("subscripts out of range for index "))<GetName() ); ++ii; } else if( aCode->IsaListVector() ) { ListVector *lst = aCode->GetListVectorPtr(); lst->SetDimension( ndm-j ); lst->SetNumberOfDimensions( 1 ); lst->SetInt(); std::size_t n = lst->GetItemCntr(); int idx; for( std::size_t m=0; mIsaNVariable() ) { if( !bCode->GetNVarPtr()->GetData().GetNumberOfDimensions() == 0 ) throw EExpressionError( wxT("list vector items used as indices must be scalars") ); lst->SetItem( bCode->GetNVarPtr() ); idx = static_cast(bCode->GetNVarPtr()->GetData().GetScalarValue()); } else if( bCode->IsaWorkspace() ) { Workspace *ws = bCode->GetWorkspacePtr(); if( ws->IsEmpty() ) throw EExpressionError(wxT("list element workspace is empty")); if( ws->GetNumberOfDimensions() != 0 ) throw EExpressionError(wxT("list vector items used as indices must be scalars") ); lst->SetItem( ws ); idx = static_cast(ws->GetValue()); } else if( bCode->IsaConstant() ) { lst->SetItem( bCode->GetConstantValue() ); idx = static_cast(bCode->GetConstantValue()); } else throw EExpressionError( wxString(wxT("item "))<static_cast(v->GetData().GetDimMag(ndm-j-1)) ) throw EExpressionError( wxString(wxT("subscripts out of range for index "))<GetName() ); delete bCode; codes_.erase( codes_.begin()+codeSize-1-i-(j+1+n)+m ); --codeSize; } ++ii; } } i += ii; } } else if( code->IsaWorkspace() ) { Workspace *ws = code->GetWorkspacePtr(); if( ws->IsEmpty() ) throw EExpressionError( wxT("function or expression has empty workspace") ); std::size_t nix = code->GetIndexCntr(); std::size_t ndm = ws->GetNumberOfDimensions(); if( nix != 0 ) { if( nix != ndm ) throw EExpressionError( wxT("function or expression has wrong number of indices") ); for( std::size_t j=0; jSetIsAnIndex( true ); if( aCode->IsaNVariable() ) { NumericVariable *vb = aCode->GetNVarPtr(); if( vb->GetData().GetNumberOfDimensions() == 2 ) throw EExpressionError( wxT("function or expression has a matrix as an index") ); else if( vb->GetData().GetNumberOfDimensions() == 3 ) throw EExpressionError( wxT("function or expression has a tensor as an index") ); aCode->SetIndx(0,ndm-j-1); } else if( aCode->IsaWorkspace() ) { Workspace *w = aCode->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("function or expression workspace index is empty") ); if( w->GetNumberOfDimensions() == 2 ) throw EExpressionError( wxT("function or expression has a matrix as an index") ); else if( w->GetNumberOfDimensions() == 3 ) throw EExpressionError( wxT("function or expression has a tensor as an index") ); aCode->SetIndx(0,ndm-j-1); } else if( aCode->IsaRangeVector() ) { RangeVector *rng = aCode->GetRangeVectorPtr(); rng->SetDimension( ndm-j ); rng->SetInt(); std::size_t n = rng->GetItemCntr(); rng->SetItemCntr( 0 ); for( std::size_t m=0; mIsaNVariable() ) { if( !bCode->GetNVarPtr()->GetData().GetNumberOfDimensions() == 0 ) throw EExpressionError( wxString(wxT("item "))<SetValue( m, bCode->GetNVarPtr()->GetData().GetScalarValue() ); } else if( bCode->IsaWorkspace() ) { Workspace *w = bCode->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("range item workspace is empty") ); if( w->GetNumberOfDimensions() != 0 ) throw EExpressionError( wxString(wxT("item "))<SetValue( m, w->GetValue() ); } else if( bCode->IsaConstant() ) { rng->SetValue( m, bCode->GetConstantValue() ); } else if( bCode->IsaImmediateValue() ) { rng->SetValue( m, static_cast(bCode->GetImmediateValue()) ); } else throw EExpressionError( wxString(wxT("item "))<GetInc() == 0.0 ) throw EExpressionError( wxT("range vector has zero increment") ); if( rng->GetNpt() < 1 ) throw EExpressionError( wxT("range vector has no elements") ); int istrv = static_cast(rng->GetStart()); int iendv = static_cast(rng->GetEnd()); if( istrv<1 || istrv>static_cast(ws->GetDimMag(ndm-j-1)) || iendv<1 || iendv>static_cast(ws->GetDimMag(ndm-j-1)) ) throw EExpressionError( wxString(wxT("subscripts out of range for index "))<IsaListVector() ) { ListVector *lst = aCode->GetListVectorPtr(); lst->SetDimension( ndm-j ); lst->SetNumberOfDimensions( 1 ); lst->SetInt(); std::size_t n = lst->GetItemCntr(); for( std::size_t m=0; mIsaNVariable() ) { if( !bCode->GetNVarPtr()->GetData().GetNumberOfDimensions() == 0 ) throw EExpressionError( wxT("list vector items used as indices must be scalars") ); lst->SetItem( bCode->GetNVarPtr() ); idx = static_cast(bCode->GetNVarPtr()->GetData().GetScalarValue()); } else if( bCode->IsaWorkspace() ) { Workspace *w = bCode->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("list item workspace is empty") ); if( w->GetNumberOfDimensions() != 0 ) throw EExpressionError(wxT("list vector items used as indices must be scalars") ); lst->SetItem( w ); idx = static_cast(w->GetValue()); } else if( bCode->IsaConstant() ) { lst->SetItem( bCode->GetConstantValue() ); idx = static_cast(bCode->GetConstantValue()); } else throw EExpressionError( wxString(wxT("item "))<static_cast(ws->GetDimMag(ndm-j-1)) ) throw EExpressionError( wxString(wxT("subscripts out of range for index ")) <IsaRangeVector() ) { RangeVector *rng = code->GetRangeVectorPtr(); std::size_t n = rng->GetItemCntr(); for( std::size_t m=0; mIsaNVariable() ) { if( !aCode->GetNVarPtr()->GetData().GetNumberOfDimensions() == 0 ) throw EExpressionError( wxString(wxT("item "))<SetValue( m, aCode->GetNVarPtr()->GetData().GetScalarValue() ); } else if( aCode->IsaWorkspace() ) { Workspace *w = aCode->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("range item workspace is empty") ); if( w->GetNumberOfDimensions() != 0 ) throw EExpressionError( wxString(wxT("item "))<SetValue( m, w->GetValue() ); } else if( aCode->IsaConstant() ) { rng->SetValue( m, aCode->GetConstantValue() ); } else if( aCode->IsaImmediateValue() ) { rng->SetValue( m, static_cast(aCode->GetImmediateValue()) ); } else throw EExpressionError( wxString(wxT("item "))<GetInc() == 0.0 ) throw EExpressionError( wxT("range vector has zero increment") ); if( rng->GetNpt() < 1 ) throw EExpressionError( wxT("range vector has no elements") ); } else if( code->IsaListVector() ) { ListVector *lst = code->GetListVectorPtr(); std::size_t n = lst->GetItemCntr(); for( std::size_t m=0; mIsaNVariable() ) { if( m == 0 ) { lst->SetNumberOfDimensions( 1+aCode->GetNVarPtr()->GetData().GetNumberOfDimensions() ); } else { if( 1+aCode->GetNVarPtr()->GetData().GetNumberOfDimensions() != lst->GetNumberOfDimensions() ) throw EExpressionError( wxT("all items in a list must have the the same number of dimensions") ); } lst->SetItem( aCode->GetNVarPtr() ); } else if( aCode->IsaWorkspace() ) { Workspace *w = aCode->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("list item workspace is empty") ); if( m == 0 ) { lst->SetNumberOfDimensions( 1+w->GetNumberOfDimensions() ); } else { if( 1+w->GetNumberOfDimensions() != lst->GetNumberOfDimensions() ) throw EExpressionError( wxT("all items in a list must have the the same number of dimensions") ); } lst->SetItem( aCode->GetWorkspacePtr() ); } else if( aCode->IsaConstant() ) { if( m == 0 ) { lst->SetNumberOfDimensions( 1 ); } else { if( 1 != lst->GetNumberOfDimensions() ) throw EExpressionError( wxT("all items in a list must have the the same number of dimensions") ); } lst->SetItem( aCode->GetConstantValue() ); } else throw EExpressionError( wxString(wxT("item "))< oCode; int ndmEff = 0; for( std::size_t i=0; iIsaNVariable() || code->IsaConstant() || code->IsaWorkspace() || code->IsaImmediateValue() || code->IsaRangeVector() || code->IsaListVector() || code->IsaTString() ) { if( code->IsaConstant() || code->IsaImmediateValue() ) { ndmEff = 0; } else if( code->IsaNVariable() ) { NumericVariable *v = code->GetNVarPtr(); ndm = v->GetData().GetNumberOfDimensions(); ndmEff = ndm; if( code->GetIndexCntr() > 0 ) // there are indices { ndmEff = 0; std::size_t shift = 0; for( std::size_t j=0; jIsaNVariable() && codes_[k]->GetNVarPtr()->GetData().GetNumberOfDimensions()==1 ) { ++ndmEff; } else if( codes_[k]->IsaWorkspace() && codes_[k]->GetWorkspacePtr()->GetNumberOfDimensions()==1 ) { ++ndmEff; } else if( codes_[k]->IsaRangeVector() ) { ++ndmEff; } else if( codes_[k]->IsaListVector() ) { ++ndmEff; } } } } else if( code->IsaWorkspace() ) { Workspace *ws = code->GetWorkspacePtr(); if( ws->IsEmpty() ) throw EExpressionError( wxT("workspace is empty") ); ndm = ws->GetNumberOfDimensions(); ndmEff = ndm; if( code->GetIndexCntr() > 0 ) // there are indices { ndmEff = 0; std::size_t shift = 0; for( std::size_t j=0; jIsaNVariable() && codes_[k]->GetNVarPtr()->GetData().GetNumberOfDimensions()==1 ) { ++ndmEff; } else if( codes_[k]->IsaWorkspace() && codes_[k]->GetWorkspacePtr()->GetNumberOfDimensions()==1 ) { ++ndmEff; } else if( codes_[k]->IsaRangeVector() ) { ++ndmEff; } else if( codes_[k]->IsaListVector() ) { ++ndmEff; } } } } else if( code->IsaRangeVector() ) { ndmEff = 1; } else if( code->IsaListVector() ) { ndmEff = code->GetListVectorPtr()->GetNumberOfDimensions(); } // // Store loop information for evaluation // if( !code->IsaIndex() ) // do not process indices of variables { if( lastCode->IsaOperator() ) { if( IsSimpleEvalType() && ndmEff > 0 ) // element by element array evaluation { if( first ) { nloop = ndmEff; SetNumberOfDimensions( ndmEff ); } else { if( ndmEff != nloop ) throw EExpressionError( wxT("dimension mismatch (ndmEff != nloop)") ); } for( int j=0; jSetIndx( j, j ); first = false; } else if( IsArrayOpEvalType() ) { try { int tmp = GetNumberOfDimensions(); lastCode->GetOpPtr()->ProcessOperand( first, ndmEff, code, oCode, tmp, nloop ); SetNumberOfDimensions( tmp ); first = false; } catch( EExpressionError &e ) { throw; } } } else if( lastCode->IsaFunction() ) { if( IsSimpleEvalType() && ndmEff>0 ) // element by element array evaluation { if( first ) { nloop = ndmEff; SetNumberOfDimensions( ndmEff ); first = false; } else { if( ndmEff != nloop ) throw EExpressionError( wxT("dimension mismatch: (ndmEff != nloop)") ); } } else if( IsArrayFcnEvalType() ) { try { lastCode->GetFcnPtr()->ProcessArgument( first, ndmEff, nloop ); SetNumberOfDimensions( ndmEff ); first = false; } catch( EExpressionError &e ) { throw; } } for( unsigned short int j=0; jSetIndx( j, j ); } else { if( IsSimpleEvalType() && ndmEff > 0 ) { if( first ) { first = false; nloop = ndmEff; SetNumberOfDimensions( ndmEff ); } else { if( nloop != ndmEff ) throw EExpressionError( wxString(wxT("dimension mismatch: "))<IsaNVariable() || code->IsaConstant() || code->IsaWorkspace() || code->IsaImmediateValue() || code->IsaRangeVector() || code->IsaListVector() || code->IsaTString() ) { std::size_t ndm = 0; if( code->IsaNVariable() ) { NumericVariable *v = code->GetNVarPtr(); ndm = v->GetData().GetNumberOfDimensions(); if( code->GetIndexCntr() == 0 ) // no indices { for( std::size_t j=0; jGetData().GetDimMag(j); ndmEff = ndm; } else // there are indices { std::size_t nback = 0; ExprCodes *temp[3]; for( std::size_t j=0; jIsaNVariable() ) { int dm = aCode->GetNVarPtr()->GetData().GetDimMag(0); if( dm > 0 )nptEff[ndmEff++] = dm; } else if( aCode->IsaWorkspace() ) { int dm = aCode->GetWorkspacePtr()->GetDimMag(0); if( dm > 0 )nptEff[ndmEff++] = dm; } else if( aCode->IsaRangeVector() ) { RangeVector *rng = aCode->GetRangeVectorPtr(); nptEff[ndmEff++] = rng->GetNpt(); } else if( aCode->IsaListVector() ) { ListVector *lst = aCode->GetListVectorPtr(); nptEff[ndmEff++] = lst->GetNpt(); } } } } else if( code->IsaWorkspace() ) { Workspace *ws = code->GetWorkspacePtr(); if( ws->IsEmpty() )throw EExpressionError( wxT("workspace is empty") ); ndm = ws->GetNumberOfDimensions(); if( code->GetIndexCntr() == 0 ) // no indices { for( std::size_t j=0; jGetDimMag( j ); ndmEff = ndm; } else // there are indices { std::size_t nback = 0; ExprCodes *temp[3]; for( std::size_t j=0; jIsaNVariable() ) { int dm = aCode->GetNVarPtr()->GetData().GetDimMag(0); if( dm > 0 )nptEff[ndmEff++] = dm; } else if( temp[j]->IsaWorkspace() ) { int dm = aCode->GetWorkspacePtr()->GetDimMag(0); if( dm > 0 )nptEff[ndmEff++] = dm; } else if( temp[j]->IsaRangeVector() ) { RangeVector *rng = aCode->GetRangeVectorPtr(); nptEff[ndmEff++] = rng->GetNpt(); } else if( temp[j]->IsaListVector() ) { ListVector *lst = aCode->GetListVectorPtr(); nptEff[ndmEff++] = lst->GetNpt(); } } } } else if( code->IsaTString() ) { nptEff[0] = code->GetTString().size(); } else if( code->IsaRangeVector() ) { RangeVector *rng = code->GetRangeVectorPtr(); ndm = 1; ndmEff = 1; nptEff[0] = rng->GetNpt(); } else if( code->IsaListVector() ) { ListVector *lst = code->GetListVectorPtr(); ndm = lst->GetNumberOfDimensions(); ndmEff = ndm; // // we already know that the list is all 0, 1, or 2 dimensional entities // if( ndm == 1 ) { nptEff[0] = lst->GetItemCntr(); } else if( ndm == 2 ) { if( lst->ItemIsaNVariable(0) ) nptEff[0] = const_cast(lst->GetNVItem(0))->GetData().GetDimMag(0); else nptEff[0] = const_cast(lst->GetWSItem(0))->GetDimMag(0); nptEff[1] = lst->GetItemCntr(); } else if( ndm == 3 ) { if( lst->ItemIsaNVariable(0) ) { NumericVariable *nv = const_cast(lst->GetNVItem(0)); nptEff[1] = nv->GetData().GetDimMag(0); nptEff[0] = nv->GetData().GetDimMag(1); } else { Workspace *ws = const_cast(lst->GetWSItem(0)); nptEff[1] = ws->GetDimMag(0); nptEff[0] = ws->GetDimMag(1); } nptEff[2] = lst->GetItemCntr(); } for( std::size_t j=0; jIsaIndex() ) // do not process indices of variables { if( lastCode->IsaOperator() ) { if( (IsSimpleEvalType() && ndmEff>0) || IsArrayOpEvalType() ) { // element by element array evaluation or array operator // try { lastCode->GetOpPtr()->CalcOperand( first, ndmEff, nptEff, this ); } catch( EExpressionError &e ) { throw; } first = false; } } else if( lastCode->IsaFunction() ) { if( (IsSimpleEvalType() && ndmEff>0) || IsArrayFcnEvalType() ) { // element by element array evaluation or array function // try { lastCode->GetFcnPtr()->CalcArgument( first, ndmEff, nptEff, this ); } catch( EExpressionError &e ) { throw; } first = false; } } else { if( IsSimpleEvalType() && ndmEff>0 ) { if( first ) { for( std::size_t j = 0; j < GetNumberOfLoops(); ++j ) SetDimMag( static_cast(j), nptEff[j] ); first = false; } else { for( std::size_t j = 0; j < GetNumberOfLoops(); ++j ) { if( static_cast(GetDimMag(static_cast(j))) != nptEff[j] ) throw EExpressionError( wxString(wxT("size mismatch for dimension "))<GetFcnPtr()->ArrayEval( this ); } else if( IsArrayOpEvalType() ) { try { codes_.back()->GetOpPtr()->ArrayEval( this ); } catch( EExpressionError &e ) { throw; } } //std::cout << "end Calculate\n"; } void Workspace::SimpleEval() { // 9th Pass // // evaluate this workspace and store the result // element by element evaluation // std::vector rStack; int loopCntr[] = {0,0,0}; int ndm = 0; TOP: int j = -1; std::deque::const_iterator end( codes_.end() ); for( std::deque::const_iterator i(codes_.begin()); i!=end; ++i ) { if( (*i)->IsaTString() ) { throw EExpressionError( wxT("character string in numeric expression") ); } else if( (*i)->IsaFunction() ) { int narg = (*i)->GetArgCntr(); j -= narg-1; try { (*i)->GetFcnPtr()->ScalarEval( j, rStack ); } catch (EExpressionError &e) { throw; } } else if( (*i)->IsaOperator() ) { if( (*i)->IsBinary() ) { --j; try { rStack[j] = (*i)->GetOpPtr()->ScalarEval( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } else { try { rStack[j] = (*i)->GetOpPtr()->ScalarEval( rStack[j] ); } catch (EExpressionError &e) { throw; } } } else if( (*i)->IsaConstant() ) { ++j; rStack.push_back( (*i)->GetConstantValue() ); } else if( (*i)->IsaImmediateValue() ) { ++j; rStack.push_back( static_cast( (*i)->GetImmediateValue() ) ); } else if( (*i)->IsaNVariable() ) { NumericData &nd( (*i)->GetNVarPtr()->GetData() ); if( nd.IsEmpty() )return; if( nd.GetNumberOfDimensions() == 0 ) { ++j; rStack.push_back( nd.GetScalarValue() ); } else // vector, matrix or tensor { double value; int i1, i2, i3; if( (*i)->GetIndexCntr() == 0 ) // unindexed array variable { switch ( nd.GetNumberOfDimensions() ) { case 1: ndm = (*i)->GetIndx(0); i1 = loopCntr[ndm]; value = nd.GetData( i1 ); break; case 2: i1 = loopCntr[ (*i)->GetIndx(0) ]; i2 = loopCntr[ (*i)->GetIndx(1) ]; value = nd.GetData( i1, i2 ); break; case 3: i1 = loopCntr[ (*i)->GetIndx(0) ]; i2 = loopCntr[ (*i)->GetIndx(1) ]; i3 = loopCntr[ (*i)->GetIndx(2) ]; value = nd.GetData( i1, i2, i3 ); break; } ++j; rStack.push_back( value ); } else // indexed array variable { switch( nd.GetNumberOfDimensions() ) { case 1: i1 = static_cast(rStack[j])-1; if( i1 < 0 )throw EExpressionError( wxT("vector subscript < minimum") ); if( i1 >= static_cast(nd.GetDimMag(0)) ) throw EExpressionError( wxT("vector subscript > maximum") ); value = nd.GetData( i1 ); break; case 2: --j; i1 = static_cast(rStack[j])-1; i2 = static_cast(rStack[j+1])-1; rStack.pop_back(); if( i1 < 0 )throw EExpressionError( wxT("matrix first subscript < minimum") ); if( i1 >= static_cast(nd.GetDimMag(0)) ) throw EExpressionError( wxT("matrix first subscript > maximum") ); if( i2 < 0 )throw EExpressionError( wxT("matrix second subscript < minimum") ); if( i2 >= static_cast(nd.GetDimMag(1)) ) throw EExpressionError( wxT("matrix second subscript > maximum") ); value = nd.GetData( i1, i2 ); break; case 3: --(--j); i1 = static_cast(rStack[j])-1; i2 = static_cast(rStack[j+1])-1; i2 = static_cast(rStack[j+2])-1; rStack.pop_back(); rStack.pop_back(); if( i1 < 0 )throw EExpressionError( wxT("tensor first subscript < minimum") ); if( i1 >= static_cast(nd.GetDimMag(0)) ) throw EExpressionError( wxT("tensor first subscript > maximum") ); if( i2 < 0 )throw EExpressionError( wxT("tensor second subscript < minimum") ); if( i2 >= static_cast(nd.GetDimMag(1)) ) throw EExpressionError( wxT("tensor second subscript > maximum") ); if( i3 < 0 )throw EExpressionError( wxT("tensor third subscript < minimum") ); if( i3 >= static_cast(nd.GetDimMag(2)) ) throw EExpressionError( wxT("tensor third subscript > maximum") ); value = nd.GetData( i1, i2, i3 ); break; } rStack[j] = value; } } } else if( (*i)->IsaWorkspace() ) // workspace variables { Workspace *ws = (*i)->GetWorkspacePtr(); if( !ws || ws->IsEmpty() )return; if( ws->GetNumberOfDimensions() == 0 ) // scalar variable { ++j; rStack.push_back( ws->GetValue() ); } else // vector or matrix or tensor { double value; int i1, i2, i3; if( (*i)->GetIndexCntr() == 0 ) // unindexed array variable { switch ( ws->GetNumberOfDimensions() ) { case 1: ndm = (*i)->GetIndx(0); i1 = loopCntr[ndm]; value = ws->GetData( i1 ); //std::cout << "ndm=" << ndm << ", loopCntr[ndm]=" << loopCntr[ndm] // << ", value=" << value << "\n"; break; case 2: i1 = loopCntr[ (*i)->GetIndx(0) ]; i2 = loopCntr[ (*i)->GetIndx(1) ]; value = ws->GetData( i1, i2 ); break; case 3: i1 = loopCntr[ (*i)->GetIndx(0) ]; i2 = loopCntr[ (*i)->GetIndx(1) ]; i3 = loopCntr[ (*i)->GetIndx(2) ]; value = ws->GetData( i1, i2, i3 ); break; } ++j; rStack.push_back( value ); } else // indexed array variable { switch( ws->GetNumberOfDimensions() ) { case 1: i1 = static_cast(rStack[j]) - 1; if( i1 < 0 ) throw EExpressionError( wxT("workspace subscript < 0") ); if( i1 >= static_cast(ws->GetDimMag(0)) ) throw EExpressionError( wxT("workspace subscript > maximum") ); value = ws->GetData( i1 ); break; case 2: --j; i1 = static_cast(rStack[j]) - 1; i2 = static_cast(rStack[j+1]) - 1; rStack.pop_back(); if( i1 < 0 ) throw EExpressionError( wxT("workspace first subscript < minimum") ); if( i1 >= static_cast(ws->GetDimMag(0)) ) throw EExpressionError( wxT("workspace first subscript > maximum") ); if( i2 < 0 ) throw EExpressionError( wxT("workspace second subscript < minimum") ); if( i2 >= static_cast(ws->GetDimMag(1)) ) throw EExpressionError( wxT("workspace second subscript > maximum") ); value = ws->GetData( i1, i2 ); break; case 3: --(--j); i1 = static_cast(rStack[j]) - 1; i2 = static_cast(rStack[j+1]) - 1; i2 = static_cast(rStack[j+2]) - 1; rStack.pop_back(); rStack.pop_back(); if( i1 < 0 ) throw EExpressionError( wxT("workspace first subscript < minimum") ); if( i1 >= static_cast(ws->GetDimMag(0)) ) throw EExpressionError( wxT("workspace first subscript > maximum") ); if( i2 < 0 ) throw EExpressionError( wxT("workspace second subscript < minimum") ); if( i2 >= static_cast(ws->GetDimMag(1)) ) throw EExpressionError( wxT("workspace second subscript > maximum") ); if( i3 < 0 ) throw EExpressionError( wxT("workspace third subscript < minimum") ); if( i3 >= static_cast(ws->GetDimMag(2)) ) throw EExpressionError( wxT("workspace third subscript > maximum") ); value = ws->GetData( i1, i2, i3 ); break; } } rStack[j] = value; } } else if( (*i)->IsaRangeVector() ) { ++j; RangeVector *rng = (*i)->GetRangeVectorPtr(); ndm = rng->GetDimension()-1; rStack.push_back( rng->GetItem(loopCntr[ndm]) ); } else if( (*i)->IsaListVector() ) { ++j; ListVector *lst = (*i)->GetListVectorPtr(); ndm = lst->GetDimension()-1; if( lst->GetNumberOfDimensions() == 1 ) { int listItem = loopCntr[ndm]; rStack.push_back( lst->GetItem(listItem) ); } else if( lst->GetNumberOfDimensions() == 2 ) { int listItem = loopCntr[(*i)->GetIndx(1)]; int i1 = loopCntr[ (*i)->GetIndx(0) ]; if( lst->ItemIsaNVariable(listItem) ) { rStack.push_back( const_cast(lst->GetNVItem(listItem))->GetData().GetData(i1)); } else { rStack.push_back(lst->GetWSItem(listItem)->GetData(i1)); } } } else if( (*i)->IsaMloop() ) { assert( j == 0 ); // otherwise the RPN code is invalid switch ( GetNumberOfLoops() ) { case 0: // scalar expression SetValue( rStack[0] ); break; case 1: // vector expression SetData( loopCntr[ndm], rStack[0] ); if( loopCntr[ndm]+1 < static_cast(GetDimMag(0)) ) { ++loopCntr[ndm]; std::vector().swap( rStack ); goto TOP; } break; case 2: // matrix expression SetData( loopCntr[0]+loopCntr[1]*GetDimMag(0), rStack[0] ); if( loopCntr[0]+1 == static_cast(GetDimMag(0)) ) { if( loopCntr[1]+1 < static_cast(GetDimMag(1)) ) { ++loopCntr[1]; loopCntr[0] = 0; std::vector().swap( rStack ); goto TOP; } } else { ++loopCntr[0]; std::vector().swap( rStack ); goto TOP; } break; case 3: // tensor expression SetData( loopCntr[0]+loopCntr[1]*GetDimMag(0)+ loopCntr[2]*GetDimMag(0)*GetDimMag(1), rStack[0] ); if( loopCntr[0]+1 == static_cast(GetDimMag(0)) ) { if( loopCntr[1]+1 == static_cast(GetDimMag(1)) ) { if( loopCntr[2]+1 < static_cast(GetDimMag(2)) ) { ++loopCntr[2]; loopCntr[1] = 0; loopCntr[0] = 0; std::vector().swap( rStack ); goto TOP; } else { ++loopCntr[1]; loopCntr[0] = 0; std::vector().swap( rStack ); goto TOP; } } } else { ++loopCntr[0]; std::vector().swap( rStack ); goto TOP; } break; } } } // end of loop over codes in workspace } Workspace *Workspace::GetFinalWorkspace() { return expression_->GetFinalWorkspace(); } // end of file extrema-4.4.5/src/Expression/BndChk.h0000644012702201742730000000335211274636605016454 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_BNDCHK #define EX_BNDCHK class Workspace; class NumericVariable; class BndChk { public: BndChk() {} ~BndChk() {} public: void NVarType() { type_ = NUMERICVARIABLE; } void WrkspcType() { type_ = WORKSPACE; } bool IsaNVar() const { return (type_ == NUMERICVARIABLE); } bool IsaWrkspc() const { return (type_ == WORKSPACE); } void NVarPtr( NumericVariable const *v ) { type_ = NUMERICVARIABLE; numericVariable_ = v; } NumericVariable const *NVarPtr() const { return numericVariable_; } void WorkspacePtr( Workspace const *w ) { type_ = WORKSPACE; workspace_ = w; } Workspace const *WorkspacePtr() const { return workspace_; } void Dimension( unsigned int i ) { dimension_ = i; } unsigned int Dimension() const { return dimension_; } private: enum TokenType { NUMERICVARIABLE, WORKSPACE }; TokenType type_; NumericVariable const *numericVariable_; Workspace const *workspace_; unsigned int dimension_; }; #endif extrema-4.4.5/src/Expression/RangeVector.h0000644012702201742730000000477611274636605017555 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_RANGEVECTOR #define EX_RANGEVECTOR #ifdef _WIN32 #include #endif class RangeVector { private: enum UseType { REAL, INT }; public: RangeVector() : numberOfItems_(0), dimension_(1), useType_(REAL) { values_[0] = 0.0; values_[1] = 0.0; values_[2] = 1.0; } RangeVector( RangeVector const &rhs ) { CopyStuff( rhs ); } RangeVector & operator=( RangeVector const &rhs ) { if( &rhs != this )CopyStuff( rhs ); return *this; } double GetItem( std::size_t i ) const { double result = values_[0] + i*values_[2]; if( useType_ == INT )result = static_cast(static_cast(result)); return result; } void SetItemCntr( std::size_t i ) { numberOfItems_ = i; } std::size_t GetItemCntr() const { return numberOfItems_; } void SetValue( int i, double v ) { values_[i] = v; } int GetNpt() const { double tmp = (values_[1]-values_[0])/values_[2]; return static_cast(tmp+0.499999)+1; } double GetStart() const { return values_[0]; } double GetEnd() const { return values_[1]; } double GetInc() const { return values_[2]; } void SetDimension( int i ) { dimension_ = i; } int GetDimension() const { return dimension_; } bool IsReal() const { return useType_==REAL; } bool IsInt() const { return useType_==INT; } void SetReal() { useType_ = REAL; } void SetInt() { useType_ = INT; } private: std::size_t numberOfItems_; double values_[3]; int dimension_; UseType useType_; void CopyStuff( RangeVector const &rhs ) { numberOfItems_ = rhs.numberOfItems_; values_[0] = rhs.values_[0]; values_[1] = rhs.values_[1]; values_[2] = rhs.values_[2]; dimension_ = rhs.dimension_; useType_ = rhs.useType_; } }; #endif extrema-4.4.5/src/Expression/ListVector.cpp0000644012702201742730000000470711274636605017761 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "ListVector.h" #include "Workspace.h" #include "NumericVariable.h" void ListVector::CopyStuff( ListVector const &rhs ) { dimension_ = rhs.dimension_; numberOfDimensions_ = rhs.numberOfDimensions_; numberOfItems_ = rhs.numberOfItems_; useType_ = rhs.useType_; itemTypes_.assign( rhs.itemTypes_.begin(), rhs.itemTypes_.end() ); nvItems_.assign( rhs.nvItems_.begin(), rhs.nvItems_.end() ); wsItems_.assign( rhs.wsItems_.begin(), rhs.wsItems_.end() ); constantItems_.assign( rhs.constantItems_.begin(), rhs.constantItems_.end() ); } std::size_t ListVector::GetNpt() const { std::size_t npt = 0; switch (numberOfDimensions_) { case 1: npt = numberOfItems_; break; case 2: itemTypes_[0]==NUMERICVARIABLE ? npt=const_cast(nvItems_[0])->GetData().GetDimMag(0) : npt=const_cast(wsItems_[0])->GetDimMag(0); break; case 3: itemTypes_[0]==NUMERICVARIABLE ? npt = const_cast(nvItems_[0])->GetData().GetDimMag(0)* const_cast(nvItems_[0])->GetData().GetDimMag(1) : npt = const_cast(wsItems_[0])->GetDimMag(0)* const_cast(wsItems_[0])->GetDimMag(1); } return npt; } double ListVector::GetItem( std::size_t const i ) const { double result; switch (itemTypes_[i] ) { case NUMERICVARIABLE: result = const_cast(nvItems_[i])->GetData().GetScalarValue(); break; case WORKSPACE: result = wsItems_[i]->GetValue(); break; default: result = constantItems_[i]; } if( useType_ == INT )result = static_cast(static_cast(result)); return result; } // end of file extrema-4.4.5/src/Expression/Makefile.am0000644012702201742730000000163111274636605017204 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libexpression.la libexpression_la_SOURCES = ExprCodes.cpp ExprCodes.h \ Expression.cpp Expression.h \ ListVector.cpp ListVector.h \ Workspace.cpp Workspace.h \ BndChk.h EExpressionError.h \ RangeVector.h extrema-4.4.5/src/Expression/Makefile.in0000644012702201742730000003656511440762625017230 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Expression DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libexpression_la_LIBADD = am_libexpression_la_OBJECTS = ExprCodes.lo Expression.lo ListVector.lo \ Workspace.lo libexpression_la_OBJECTS = $(am_libexpression_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libexpression_la_SOURCES) DIST_SOURCES = $(libexpression_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libexpression.la libexpression_la_SOURCES = ExprCodes.cpp ExprCodes.h \ Expression.cpp Expression.h \ ListVector.cpp ListVector.h \ Workspace.cpp Workspace.h \ BndChk.h EExpressionError.h \ RangeVector.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Expression/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Expression/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libexpression.la: $(libexpression_la_OBJECTS) $(libexpression_la_DEPENDENCIES) $(CXXLINK) $(libexpression_la_OBJECTS) $(libexpression_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ExprCodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Expression.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ListVector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Workspace.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Expression/EExpressionError.h0000644012702201742730000000202011274636605020570 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_EEXPRESSIONERROR #define EX_EEXPRESSIONERROR #include #include "wx/wx.h" class EExpressionError : public std::runtime_error { public: EExpressionError( wxString const &errorMessage ) : std::runtime_error( (char const *)errorMessage.mb_str(wxConvUTF8) ) {} }; #endif extrema-4.4.5/src/Expression/Workspace.h0000644012702201742730000001312211274636605017255 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_WORKSPACE #define EX_WORKSPACE #include #include #include "wx/wx.h" #include "NumericData.h" class Expression; class ExprCodes; class Workspace { private: enum Type { UNKNOWN, AMBIGUOUS, NUMERIC, CHARACTER }; enum EvaluationType { EVALUNKNOWN, SIMPLE, ARRAYFCN, ARRAYOP }; public: Workspace(); Workspace( int ); Workspace( Expression * ); Workspace( wxString & ); ~Workspace(); Workspace( Workspace const & ); Workspace &operator=( Workspace const & ); bool operator==( Workspace const & ) const; // // data functions // NumericData &GetFinalData(); Workspace *GetFinalWorkspace(); bool IsEmpty(); bool IsUnordered() const; bool IsAscending() const; bool IsDescending() const; void SetUnordered(); void SetAscending(); void SetDescending(); std::size_t GetNumberOfDimensions() const; void SetNumberOfDimensions( std::size_t ); unsigned int *GetDimMag(); std::size_t GetDimMag( unsigned int ) const; void SetDimMag( unsigned int, unsigned int ); void SetValue( double ); double GetValue() const; void SetData( std::vector & ); void SetData( int, double ); void SetData( unsigned int, unsigned int, double ); void SetData( unsigned int, unsigned int, unsigned int, double ); std::vector &GetData(); double GetData( unsigned int ) const; double GetData( unsigned int, unsigned int ) const; double GetData( unsigned int, unsigned int, unsigned int ) const; void GetMinMax( double &, double & ) const; Expression *GetExpression() const { return expression_; } void SetExpression( Expression *e ) { expression_ = e; } std::deque &GetCodes() { return codes_; } int GetLevel() const { return level_; } void SetLevel( int i ) { level_ = i; } bool IsSimpleEvalType() const { return (evalType_ == SIMPLE); } bool IsArrayFcnEvalType() const { return (evalType_ == ARRAYFCN); } bool IsArrayOpEvalType() const { return (evalType_ == ARRAYOP); } void SetSimple() { evalType_ = SIMPLE; } void SetArrayFcn() { evalType_ = ARRAYFCN; } void SetArrayOp() { evalType_ = ARRAYOP; } bool GetNcFlag() const { return ncFlag_; } void SetNcFlag( bool f ) { ncFlag_ = f; } std::size_t GetNumberOfLoops() const { return numberOfLoops_; } void SetNumberOfLoops( std::size_t i ) { numberOfLoops_ = i; } Workspace *GetParent() const { return parent_; } void SetParent( Workspace *p ) { parent_ = p; } void SetEvaluateNow( bool flag ) { evaluateNow_ = flag; } bool EvaluateNow() const { return evaluateNow_; } void SetFinished() { processingFinished_ = true; } bool IsFinished() const { return processingFinished_; } void SetRPNdone() { rpnDone_ = true; } bool IsRPNdone() const { return rpnDone_; } bool CodesAreParsed() const { return codesAreParsed_; } void SetCodesAreParsed() { codesAreParsed_ = true; } void SetType( Type t ) { type_ = t; } bool IsUnknown() const { return (type_ == UNKNOWN); } bool IsAmbiguous() const { return (type_ == AMBIGUOUS); } bool IsNumeric() const { return (type_ == NUMERIC); } bool IsCharacter() const { return (type_ == CHARACTER); } void SetNumeric() { type_ = NUMERIC; } void SetCharacter() { type_ = CHARACTER; } wxString &GetFinalString(); void SetFinalString( wxString & ); // // end of data functions // void SetType(); void SetUp(); void Calculate(); void SimpleEval(); void DetermineType(); void ParseAndCheck( bool ); void ParseCodes( bool ); void SequencingCheck(); void BracketCheck(); void FinalCheck(); bool HandleFunctionsAndText(); void RPNconvert(); void SetHierarchy(); void SixthPass(); void RPNTconvert(); void MakeNewWorkspace( int, int, Type ); void GetMinMax( double &, double & ); private: void CopyStuff( Workspace const & ); void Initialize(); // Expression *expression_; wxString string_; Type type_; int level_, highestNestingLevel_, numberOfLoops_; EvaluationType evalType_; std::deque codes_; Workspace *parent_; bool ncFlag_, evalFlag_, evaluateNow_, processingFinished_, rpnDone_, codesAreParsed_; std::size_t operatorCntr_, functionWithArgumentsCntr_, indexedVariableCntr_; std::size_t rangeVectorCntr_, listVectorCntr_; std::vector fcnPos_; // used in RPNconvert and SetHierarchy std::vector fcnArg_; // " std::vector fcnIdx_; // " std::vector oprPos_; // " std::vector oprAnd_; // " std::vector varPos_; // " std::vector varIdx_; // " std::vector rngPos_; std::vector rngIdx_; std::vector lstPos_; std::vector lstIdx_; std::vector hierarchy_; // NumericData finalData_; wxString finalString_; }; #endif extrema-4.4.5/src/Expression/ExprCodes.cpp0000644012702201742730000000547711274636605017564 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "ExprCodes.h" #include "RangeVector.h" #include "ListVector.h" #include "NumericVariable.h" #include "TextVariable.h" ExprCodes::~ExprCodes() { switch (tokenType_) { case RANGEVECTOR: if( rangeVectorPtr_ != 0 )delete rangeVectorPtr_; break; case LISTVECTOR: if( listVectorPtr_ != 0 )delete listVectorPtr_; break; } } void ExprCodes::CopyStuff( ExprCodes const &rhs ) { if( listVectorPtr_ ) { delete listVectorPtr_; listVectorPtr_ = 0; } if( rangeVectorPtr_ ) { delete rangeVectorPtr_; rangeVectorPtr_ = 0; } if( rhs.tokenType_ == LISTVECTOR ) { std::auto_ptr s( new ListVector(*rhs.listVectorPtr_) ); listVectorPtr_ = s.release(); } else if( rhs.tokenType_ == RANGEVECTOR ) { std::auto_ptr s( new RangeVector(*rhs.rangeVectorPtr_) ); rangeVectorPtr_ = s.release(); } tokenType_ = rhs.tokenType_; // // the following pointers should not be deleted here // nVariablePtr_ = rhs.nVariablePtr_; tVariablePtr_ = rhs.tVariablePtr_; functionPtr_ = rhs.functionPtr_; operatorPtr_ = rhs.operatorPtr_; textArrayIndexPtr_ = rhs.textArrayIndexPtr_; textCharacterIndexPtr_ = rhs.textCharacterIndexPtr_; workspacePtr_ = rhs.workspacePtr_; // tString_ = rhs.tString_; referenceType_ = rhs.referenceType_; operatorType_ = rhs.operatorType_; objectCntr_ = rhs.objectCntr_; argumentCntr_ = rhs.argumentCntr_; indexCntr_ = rhs.indexCntr_; nestingLevel_ = rhs.nestingLevel_; immediateValue_ = rhs.immediateValue_; insertedTextVar_ = rhs.insertedTextVar_; valid_ = rhs.valid_; isAnIndex_ = rhs.isAnIndex_; constantValue_ = rhs.constantValue_; constantString_ = rhs.constantString_; followingTerm_ = rhs.followingTerm_; // functionIsDone_ = rhs.functionIsDone_; // for( std::size_t i=0; i<3; ++i )lindex_[i] = rhs.lindex_[i]; } void ExprCodes::SetConstantValue( double v, wxString s ) { tokenType_ = CONSTANT; constantValue_ = v; constantString_ = s; followingTerm_ = 3; } wxString ExprCodes::GetTString() const { return tString_; } // end of file extrema-4.4.5/src/Variables/0000755012702201742730000000000011440766120014707 5ustar spangspangextrema-4.4.5/src/Variables/NumericVariable.h0000644012702201742730000000502711274636611020142 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_NUMERICVARIABLE #define EX_NUMERICVARIABLE #include #include #include #include "wx/wx.h" #include "Variable.h" #include "NumericData.h" class NVariableTable; class NumericVariable : public Variable { public: NumericVariable( wxString const & ); ~NumericVariable() {} NumericVariable( NumericVariable const & ); NumericVariable &operator=( NumericVariable const & ); NumericData &GetData(); void SetData( NumericData const & ); // scalar variable static NumericVariable *PutVariable( wxString, double, wxString const &, bool =true ); // vector variable static NumericVariable *PutVariable( wxString, std::vector const &, int, wxString const &, bool =true ); // matrix variable static NumericVariable *PutVariable( wxString, std::vector &, std::size_t, std::size_t, wxString const &, bool =true ); static void GetVariable( wxString const &, int &, double &, std::vector &, int * ); static void GetScalar( wxString &, wxChar const *, double & ); static void GetVector( wxString const &, wxChar const *, std::vector & ); static void GetMatrix( wxString const &, wxChar const *, std::vector &, std::size_t &, std::size_t & ); bool DeletePartial( wxString const &, wxString const & ); friend std::ostream &operator<<( std::ostream &, NumericVariable const & ); private: void CopyStuff( NumericVariable const &rhs ) { data_ = rhs.data_; } static void GetIndices( wxString &, int &, std::vector *, bool * ); static NumericVariable *GetPreExisting( wxString const &, int, std::vector *, bool *, int *, int *, int *, int * ); NumericData data_; }; #endif extrema-4.4.5/src/Variables/TVariableTable.cpp0000644012702201742730000000477011274636611020252 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "TVariableTable.h" #include "TextVariable.h" #include "EVariableError.h" TVariableTable *TVariableTable::tVariableTable_ = 0; bool TVariableTable::Contains( wxString const &name ) const { return ( vMap_.find(name.Upper())!=vMap_.end() ); } void TVariableTable::RemoveEntry( wxString const &name ) { RemoveEntry( GetVariable(name) ); } TextVariable *TVariableTable::GetEntry( int i ) { TVariableMap::iterator k = vMap_.begin(); for( int j=0; jGetName() ); if( Contains(name) ) throw EVariableError( wxString(wxT("The variable "))+name+wxString(wxT(" is already in the table")) ); vMap_.insert( entry_type(name,v) ); } void TVariableTable::RemoveEntry( TextVariable *v ) { if( !v )return; wxString name = v->GetName(); delete v; v = 0; vMap_.erase( name ); } TextVariable *TVariableTable::GetVariable( wxString const &name ) const { if( !name.empty() ) { TVariableMap::const_iterator i = vMap_.find( name.Upper() ); if( i != vMap_.end() )return (*i).second; } return 0; } std::ostream &operator<<( std::ostream &out, TVariableTable const &table ) { out << "\n"; TVariableTable::TVariableMap::const_iterator end = table.vMap_.end(); for( TVariableTable::TVariableMap::const_iterator i=table.vMap_.begin(); i!=end; ++i ) out << *((*i).second); return out << "\n"; } // end of file extrema-4.4.5/src/Variables/TextVariable.cpp0000644012702201742730000011034311274636611020015 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "TextVariable.h" #include "EVariableError.h" #include "TVariableTable.h" #include "NumericData.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "ExGlobals.h" #include "EExpressionError.h" #include "Expression.h" TextVariable::TextVariable( wxString const &name ) : Variable(name) { TVariableTable::GetTable()->AddEntry(this); } TextVariable::TextVariable( TextVariable const &rhs ) : Variable(rhs) { data_ = rhs.data_; } TextVariable &TextVariable::operator=( TextVariable const &rhs ) { if( this != &rhs ) { Variable::CopyStuff( rhs ); data_ = rhs.data_; } return *this; } TextData &TextVariable::GetData() { return data_; } void TextVariable::SetData( TextData const &data ) { data_ = data; } void TextVariable::GetVariable( wxString const &name, bool flag, wxString &data ) { // if flag == false: if the name is reserved, return the uppercase // version of name // if flag == true: if the name cannot be evaluated, simply return // the name without throwing an error // (useful for filenames) // if( name.empty() )throw EVariableError(wxT("variable name is blank")); // if( !flag ) { try { CheckReservedName( name ); } catch ( EVariableError &e ) { data = name.Upper(); return; } } Expression expr( name ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { if( flag ) { data = name; return; } throw EVariableError( wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() ) { data = expr.GetFinalString(); } else if( expr.IsNumeric() ) { if( flag ) { data = name; return; } throw EVariableError( name+wxT(" is not character type") ); } } std::ostream &operator<<( std::ostream &out, TextVariable const &tv ) { wxString closer; switch ( tv.data_.GetNumberOfDimensions() ) { case 0: // scalar { out << "\n" << "\n"; closer = wxT("\n"); break; } case 1: // vector { std::size_t size = const_cast(tv).data_.GetData().size(); out << "\n"; for( std::size_t i=0; i(tv).data_.GetData(i).mb_str(wxConvUTF8) << "]]>\n"; closer = wxT("\n"); break; } } out << "\n"; std::deque::const_reverse_iterator hEnd = tv.history_.rend(); for( std::deque::const_reverse_iterator i=tv.history_.rbegin(); i!=hEnd; ++i ) out << "\n"; return out << "\n\n" << closer.mb_str(wxConvUTF8); } wxString TextVariable::GetString( NumericData const *nda, NumericData const *ndb ) { wxString aString, finalString; if( nda ) // there is an array index { if( data_.GetNumberOfDimensions() == 0 )throw EVariableError( wxString(wxT("text scalar variable "))+name_+wxString(wxT(" cannot have an array index")) ); if( nda->GetNumberOfDimensions() > 0 )throw EVariableError( wxString(wxT("text array variable "))+name_+wxString(wxT(" array index must be scalar")) ); // int i = static_cast( nda->GetScalarValue() ); if( i > static_cast( data_.GetData().size() ) ) throw EVariableError( wxString(wxT("array index > maximum for "))+name_ ); if( i <= 0 ) throw EVariableError( wxString(wxT("array index <= 0 for "))+name_ ); aString = data_.GetData( i-1 ); } else { aString = data_.GetScalarValue(); } if( ndb ) // there are character indices { if( ndb->GetNumberOfDimensions() == 0 ) // scalar character index { int jval = static_cast( ndb->GetScalarValue() ); if( jval <= 0 ) throw EVariableError( wxString(wxT("character index <= 0 for "))+name_ ); if( jval > static_cast(aString.length()) ) throw EVariableError( wxString(wxT("character index > maximum for "))+name_ ); finalString = aString[jval-1]; } else if( ndb->GetNumberOfDimensions() == 1 ) { for( unsigned int k=0; kGetDimMag(0); ++k ) { int jval = static_cast( ndb->GetData(k) ); if( jval <= 0 ) throw EVariableError( wxString(wxT("character index <= 0 for "))+name_ ); if( jval > static_cast(aString.length()) ) throw EVariableError( wxString(wxT("character index > maximum for "))+name_ ); finalString += aString[jval-1]; } } else throw EVariableError(wxT("character index can only be scalar or vector")); } else // there is no character index finalString = aString; return finalString; } void TextVariable::GetIndices( wxString &name, int &numberOfIndices, std::vector *indexVecs, bool *indexIsScalar ) { std::size_t dum = name.find( wxT("//") ); if( dum != name.npos ) { // See if the variable name needs to be constructed, i.e., // `A'//RCHAR(I) could be `A3' if I=3. This is done by default, if // the name contains "//", but be aware that the expansion continues, // e.g. if A3=`X2', then if you entered A3=5, you would get X2=5. // This also means that you can enter `A'//RCHAR(I)=`testing' since // the output variable name will be constructed. // Expression expr( name ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw EVariableError( wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() )name = expr.GetFinalString(); } wxString simpleName; try { simpleName = SimpleName( name ); CheckReservedName( simpleName ); } catch( EVariableError &e ) { throw; } int simpleLen = simpleName.size(); int indexLen = name.size() - simpleLen; numberOfIndices = 0; if( indexLen == 0 ) // variable had no indices { name = simpleName; return; } wxString indices( name.substr(simpleLen,indexLen) ); // // the first character of indices must be (, [, or { // int bracketCntr = 0; int start; for( int i=0; i(nd.GetScalarValue()) < 0 ) throw EVariableError( wxString(wxT("string variable index < 0: "))+idx ); indexVecs[0].push_back( nd.GetScalarValue() ); indexIsScalar[0] = true; } else if( ndim == 1 ) { std::size_t size = nd.GetData().size(); for( std::size_t i=0; i(nd.GetScalarValue()) < 0 ) throw EVariableError( wxString(wxT("string variable character index < 0: "))+idx ); indexVecs[1].push_back( nd.GetScalarValue() ); indexIsScalar[1] = true; } else if( ndim == 1 ) { std::size_t size = nd.GetData().size(); for( std::size_t i=0; i(nd.GetData().at(i)) < 0 ) throw EVariableError( wxString(wxT("string variable character index < 0: "))+idx ); } indexVecs[1].assign( nd.GetData().begin(), nd.GetData().end() ); indexIsScalar[1] = false; } else throw EVariableError( wxString(wxT("string variable index must be scalar or vector: "))+idx ); } else throw EVariableError( wxString(wxT("string variable has too many indices: "))+idx ); } } } if( bracketCntr != 0 ) throw EVariableError( wxString(wxT("unmatched brackets in index: "))+name ); name = simpleName; } bool TextVariable::DeletePartial( wxString &name, wxString const &inputLine ) { int numberOfIndices; std::vector indexVecs[2]; bool indexIsScalar[2]; GetIndices( name, numberOfIndices, indexVecs, indexIsScalar ); // bool allGone = false; if( numberOfIndices == 1 ) // one set of indices were used { if( data_.GetNumberOfDimensions() == 0 ) // scalar text variable { wxString s( data_.GetScalarValue() ); int sLen = static_cast(s.size()); if( indexIsScalar[0] ) // destroy one character { int charIndex = static_cast(indexVecs[0][0]); if( charIndex > sLen ) throw EVariableError( wxString(wxT("character index > maximum ("))+name+wxT(")") ); if( charIndex < 1 ) throw EVariableError( wxString(wxT("character index < 1 ("))+name+wxT(")") ); s.erase( charIndex-1 ); } else // destroy multiple characters { wxString t; int nValues = static_cast(indexVecs[0].size()); for( int j=1; j<=sLen; ++j ) { bool remove = false; for( int k=0; k(indexVecs[0][k]); if( charIndex > sLen ) throw EVariableError( wxString(wxT("character index > maximum ("))+name+wxT(")") ); if( charIndex < 1 ) throw EVariableError( wxString(wxT("character index < 1 ("))+name+wxT(")") ); if( j == charIndex ) { remove = true; break; } } if( !remove )t.append( 1, s[j-1] ); } s = t; } if( s.empty() ) { allGone = true; } else { data_.SetScalarValue( s ); AddToHistory( inputLine ); } } else // array text variable with one index { std::vector data( data_.GetData() ); int finalIndex = static_cast(data.size()); if( indexIsScalar[0] ) // destroy one string { int arrayIndex = static_cast(indexVecs[0][0]); if( arrayIndex > finalIndex ) throw EVariableError( wxString(wxT("text array index > maximum ("))+name+wxT(")") ); if( arrayIndex < 1 ) throw EVariableError( wxString(wxT("text array index < 1 ("))+name+wxT(")") ); data.erase( data.begin()+arrayIndex-1 ); } else // destroy multiple strings from array text variable { std::vector tmp; int nValues = static_cast(indexVecs[0].size()); int const fI = finalIndex; for( int j=1; j<=fI; ++j ) { bool remove = false; for( int k=0; k(indexVecs[0][k]); if( index > fI ) throw EVariableError( wxString(wxT("text array index > maximum ("))+name+wxT(")") ); if( index < 1 ) throw EVariableError( wxString(wxT("text array index < 1 ("))+name+wxT(")") ); if( j == index ) { remove = true; --finalIndex; break; } } if( !remove )tmp.push_back( data[j-1] ); } data.assign( tmp.begin(), tmp.end() ); } if( data.empty() ) { allGone = true; } else { data_.SetData( data ); AddToHistory( inputLine ); } } } else if( numberOfIndices == 2 ) { if( data_.GetNumberOfDimensions() == 0 ) // scalar text variable { ExGlobals::WarningMessage( wxString(wxT("array index not allowed on text scalar variables ("))+name+wxT(")") ); return false; } std::vector data( data_.GetData() ); int finalIndex = static_cast(data.size())+1; // if( indexIsScalar[0] ) // destroy characters in one string { int arrayIndex = static_cast(indexVecs[0][0]); if( arrayIndex > finalIndex ) throw EVariableError( wxString(wxT("text array index > maximum ("))+name+wxT(")") ); if( arrayIndex < 1 ) throw EVariableError( wxString(wxT("text array index < 1 ("))+name+wxT(")") ); wxString s( data[arrayIndex-1] ); int sLen = static_cast( s.size() ); if( indexIsScalar[1] ) // destroy one character in one string { int charIndex = static_cast(indexVecs[1][0]); if( charIndex > sLen ) throw EVariableError( wxString(wxT("character index > maximum ("))+name+wxT(")") ); if( charIndex < 1 ) throw EVariableError( wxString(wxT("character index < 1 ("))+name+wxT(")") ); s.erase( charIndex-1 ); } else // destroy multiple characters in one string { wxString t; int nValues = static_cast(indexVecs[1].size()); for( int j=1; j<=sLen; ++j ) { bool remove = false; for( int k=0; k(indexVecs[1][k]); if( charIndex > sLen ) throw EVariableError( wxString(wxT("character index > maximum ("))+name+wxT(")") ); if( charIndex < 1 ) throw EVariableError( wxString(wxT("character index < 1 ("))+name+wxT(")") ); if( j == charIndex ) { remove = true; break; } } if( !remove )t.append( 1, s[j-1] ); } s = t; } if( s.empty() ) data.erase( data.begin()+arrayIndex-1 ); else data[arrayIndex-1].assign( s ); if( data.empty() ) { allGone = true; } else { data_.SetData( data ); AddToHistory( inputLine ); } } else // destroy one or more characters in multiple strings { int nArrayIndices = static_cast(indexVecs[0].size()); int const fI = finalIndex; for( int j=1; j<=fI; ++j ) { wxString s( data[j-1] ); int sLen = static_cast( s.size() ); for( int k=0; k(indexVecs[0][k]); if( arrayIndex > fI ) throw EVariableError( wxString(wxT("text array index > maximum ("))+name+wxT(")") ); if( arrayIndex < 1 ) throw EVariableError( wxString(wxT("text array index < 1 ("))+name+wxT(")") ); if( j == arrayIndex ) // found a string to work on { if( indexIsScalar[1] ) // destroy one character in this string { int charIndex = static_cast(indexVecs[1][0]); if( charIndex > sLen ) throw EVariableError( wxString(wxT("character index > maximum ("))+name+wxT(")") ); if( charIndex < 1 ) throw EVariableError( wxString(wxT("character index < 1 ("))+name+wxT(")") ); s.erase( charIndex-1 ); } else // destroy multiple characters in this string { wxString t; int nCharIndices = static_cast(indexVecs[1].size()); for( int jj=1; jj<=sLen; ++jj ) { bool removeChar = false; for( int kk=0; kk(indexVecs[1][kk]); if( charIndex > sLen ) throw EVariableError( wxString(wxT("character index > maximum ("))+name+wxT(")") ); if( charIndex < 1 ) throw EVariableError( wxString(wxT("character index < 1 ("))+name+wxT(")") ); if( jj == charIndex ) { removeChar = true; break; } } if( !removeChar )t.append( 1, s[jj-1] ); } s = t; } if( s.empty() )break; } } if( s.empty() )data.erase( data.begin()+j-1 ); } if( data.empty() ) { allGone = true; } else { data_.SetData( data ); AddToHistory( inputLine ); } } } return allGone; } TextVariable *TextVariable::PutVariable( wxString name, wxString const &result, wxString const &inputLine, bool addToHistory ) { // name = name of the text variable without indices // result = characters to add to the text variable // inputLine = the input line that led to this method being called // int numberOfIndices; std::vector indexVecs[2]; bool indexIsScalar[2]; GetIndices( name, numberOfIndices, indexVecs, indexIsScalar ); // // if it is a numeric variable, delete it // NVariableTable::GetTable()->RemoveEntry( name ); // TextVariable *tv = TVariableTable::GetTable()->GetVariable( name ); bool preExisting = (tv!=0); // bool arrayIndexUsed = false, characterIndexUsed = false; bool scalarCharacterIndex = true; int arrayIndex = 0, characterIndex = 0; // if( numberOfIndices == 2 ) { arrayIndexUsed = true; characterIndexUsed = true; if( indexIsScalar[0] ) arrayIndex = static_cast(indexVecs[0][0]); else throw EVariableError(wxString(wxT("Error in "))+inputLine+wxString(wxT(": array index must be scalar"))); if( indexIsScalar[1] ) { characterIndex = static_cast(indexVecs[1][0]); scalarCharacterIndex = true; } else { characterIndex = static_cast(indexVecs[1][0]); std::size_t size = indexVecs[1].size(); for( std::size_t i=0; i(indexVecs[1][i]); if( j > characterIndex )characterIndex = j; } scalarCharacterIndex = false; } if( preExisting && tv->data_.GetNumberOfDimensions()==0 ) // pre-existing scalar { TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; } } else if( numberOfIndices == 1 ) { characterIndexUsed = true; if( preExisting ) { if( tv->data_.GetNumberOfDimensions() == 1 ) // is a vector { arrayIndexUsed = true; characterIndexUsed = false; if( indexIsScalar[0] ) { arrayIndex = static_cast(indexVecs[0][0]); } else // vector index used { throw EVariableError(wxString(wxT("Error in "))+inputLine+wxString(wxT(": array index must be scalar"))); } } else { arrayIndexUsed = false; characterIndexUsed = true; if( indexIsScalar[0] ) { characterIndex = static_cast(indexVecs[0][0]); scalarCharacterIndex = true; } else // vector index used { characterIndex = static_cast(indexVecs[0][0]); std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i]); if( j > characterIndex )characterIndex = j; } scalarCharacterIndex = false; } } } else { if( indexIsScalar[0] ) { arrayIndexUsed = true; characterIndexUsed = false; arrayIndex = static_cast(indexVecs[0][0]); } else // vector index used { arrayIndexUsed = false; characterIndexUsed = true; characterIndex = static_cast(indexVecs[0][0]); std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i]); if( j > characterIndex )characterIndex = j; } scalarCharacterIndex = false; } } } // // input is always a single string // which is why an array index must be a scalar // if( arrayIndexUsed ) // output variable had an array index so it will be a text vector { if( preExisting && tv->data_.GetNumberOfDimensions()==0 ) // output variable exists { // and is a text scalar TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; } if( preExisting ) // output variable already exists so it must be a vector { for( int i=tv->data_.GetData().size(); idata_.AddString(wxString(wxT(" "))); if( characterIndexUsed ) // there are character indices { int oldLength = tv->data_.GetData()[arrayIndex-1].size(); int smax = std::max( characterIndex, oldLength ); wxString s( smax, wxT(' ') ); s.replace( 0, oldLength, tv->data_.GetData()[arrayIndex-1] ); if( scalarCharacterIndex ) s.replace( characterIndex-1, 1, 1, result.c_str()[0] ); else { std::size_t j = 0; std::size_t size = indexVecs[1].size(); std::size_t rsize = result.size(); for( std::size_t i=0; i(indexVecs[1][i])-1, 1, 1, result.c_str()[j] ); } tv->data_.GetData()[arrayIndex-1].assign( s ); } else // no character indices { if( arrayIndex-1 < static_cast(tv->data_.GetData().size()) ) tv->data_.GetData()[arrayIndex-1].assign( result ); else tv->data_.GetData().push_back( result ); } } else // output variable does not exist { tv = new TextVariable( name ); tv->data_.SetNumberOfDimensions( 1 ); for( int i=0; idata_.AddString( wxString(wxT(" ")) ); if( characterIndexUsed ) // there are character indices { wxString s( characterIndex-1, wxT(' ') ); if( scalarCharacterIndex ) s.replace( characterIndex-1, 1, 1, result.c_str()[0] ); else { std::size_t j = 0; std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i])-1, 1, 1, result.c_str()[j] ); } tv->data_.AddString( s ); } else // no character indices tv->data_.AddString( result ); } } else // output variable had no array indices { if( preExisting && tv->data_.GetNumberOfDimensions()==1 ) // output variable exists { // and is a text vector TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; } if( preExisting ) // output variable already exists { // so it must be a scalar if( characterIndexUsed ) // there are character indices { wxString s( tv->data_.GetScalarValue() ); int oldLength = s.size(); int newLength = std::max( characterIndex, oldLength ); if( newLength > oldLength )s.append( newLength-oldLength, ' ' ); if( scalarCharacterIndex ) s.replace( characterIndex-1, 1, 1, result.c_str()[0] ); else { std::size_t j = 0; std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i])-1, 1, 1, result.c_str()[j] ); } tv->data_.SetScalarValue( s ); } else // no character indices used { tv->data_.SetScalarValue( result ); } } else // output variable does not exist { tv = new TextVariable( name ); tv->data_.SetNumberOfDimensions( 0 ); if( characterIndexUsed ) // there are character indices { wxString s( characterIndex-1, wxT(' ') ); if( scalarCharacterIndex ) s.replace( characterIndex-1, 1, 1, result.c_str()[0] ); else { std::size_t j = 0; std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i])-1, 1, 1, result.c_str()[j] ); } tv->data_.SetScalarValue( s ); } else // no character indices used tv->data_.SetScalarValue( result ); } } if( addToHistory )tv->AddToHistory( inputLine ); return tv; } TextVariable *TextVariable::PutVariable( wxString name, std::vector const &results, wxString const &inputLine, bool addToHistory ) { // name = name of the text variable without indices // results = strings to add to the text variable // inputLine = the input line that led to this method being called // int numberOfIndices; std::vector indexVecs[2]; bool indexIsScalar[2]; GetIndices( name, numberOfIndices, indexVecs, indexIsScalar ); // // if it is a numeric variable, delete it // NVariableTable::GetTable()->RemoveEntry( name ); // TextVariable *tv = TVariableTable::GetTable()->GetVariable( name ); bool preExisting = (tv != NULL); // bool arrayIndexUsed = false; bool characterIndexUsed = false; std::vector arrayIndex; std::vector characterIndex; int maxCharacterIndex = std::numeric_limits::min(); // if( numberOfIndices == 2 ) { arrayIndexUsed = true; characterIndexUsed = true; arrayIndex.assign( indexVecs[0].begin(), indexVecs[0].end() ); characterIndex.assign( indexVecs[1].begin(), indexVecs[1].end() ); std::size_t size = characterIndex.size(); for( std::size_t i=0; i(characterIndex[i]), maxCharacterIndex ); if( preExisting && tv->data_.GetNumberOfDimensions()==0 ) { TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; } } else if( numberOfIndices == 1 ) { characterIndexUsed = true; if( preExisting ) { if( tv->data_.GetNumberOfDimensions() == 1 ) { arrayIndex.assign( indexVecs[0].begin(), indexVecs[0].end() ); arrayIndexUsed = true; characterIndexUsed = false; } else // not a vector { if( results.size() > 1 ) { arrayIndex.assign( indexVecs[0].begin(), indexVecs[0].end() ); arrayIndexUsed = true; characterIndexUsed = false; TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; } else // results is a single string { characterIndex.assign( indexVecs[0].begin(), indexVecs[0].end() ); std::size_t size = characterIndex.size(); for( std::size_t i=0; i(characterIndex[i]), maxCharacterIndex ); } } } else // not pre-existing { if( results.size() > 1 ) { arrayIndex.assign( indexVecs[0].begin(), indexVecs[0].end() ); arrayIndexUsed = true; characterIndexUsed = false; } else { characterIndex.assign( indexVecs[0].begin(), indexVecs[0].end() ); std::size_t size = characterIndex.size(); for( std::size_t i=0; i(characterIndex[i]), maxCharacterIndex ); } } } if( arrayIndexUsed ) // output variable had an array index { // so it will be a text vector if( results.size()!=1 && results.size()!=arrayIndex.size() ) throw EVariableError( wxT("array index length not equal to results length") ); // if( preExisting ) // output variable already exists { // so it must be a vector std::size_t tvLength = tv->data_.GetData().size(); std::size_t size = static_cast(arrayIndex[0]-1); for( std::size_t i=tvLength; idata_.AddString( wxString(wxT(" ")) ); size = arrayIndex.size(); for( std::size_t i=0; i(arrayIndex[i]); wxString result; results.size()==1 ? result=results[0] : result=results[i]; if( characterIndexUsed ) { if( result.size() != characterIndex.size() ) throw EVariableError( wxT("character index length not equal to result length") ); // int smax = std::max( maxCharacterIndex, static_cast(tv->data_.GetData(j-1).size()) ); wxString s( smax, wxT(' ') ); s.replace( 0, tv->data_.GetData(j-1).size(), tv->data_.GetData(j-1) ); std::size_t k = 0; std::size_t size = characterIndex.size(); for( std::size_t m=0; m(characterIndex[m])-1] = result[k]; tv->data_.GetData(j-1).assign( s ); } else // no character indices { if( j-1 < tv->data_.GetData().size() ) tv->data_.GetData(j-1).assign( result ); else tv->data_.AddString( result ); } if( i < arrayIndex.size()-1 ) { for( std::size_t k=j+1; k(arrayIndex[i+1]); ++k ) { if( k-1 >= tvLength )tv->data_.AddString( wxString(wxT(" ")) ); } } } } else // output variable does not exist { tv = new TextVariable( name ); tv->data_.SetNumberOfDimensions( 1 ); for( int i=0; i(arrayIndex[0])-1; ++i )tv->data_.AddString( wxString(wxT(" ")) ); for( std::size_t i=0; i(arrayIndex[i]); wxString result; results.size()==1 ? result=results[0] : result=results[i]; wxString s; if( characterIndexUsed ) { if( result.size() != characterIndex.size() ) throw EVariableError( wxT("character index length not equal to result length") ); s = wxString( maxCharacterIndex, wxT(' ') ); std::size_t k = 0; std::size_t size = characterIndex.size(); for( std::size_t m=0; m(characterIndex[m])-1] = result[k]; } else // no character indices s = result; tv->data_.AddString( s ); if( i < arrayIndex.size()-1 ) { for( int k=j+1; k(arrayIndex[i+1]); ++k ) tv->data_.AddString( wxString(wxT(" ")) ); } } } } else // output variable had no array indices { if( preExisting ) // output variable already exists { // so it must be a scalar if( characterIndexUsed ) // there are character indices { if( results.size() != 1 ) throw EVariableError( wxT("no array indices given but results is an array") ); if( results[0].size() != characterIndex.size() ) throw EVariableError( wxT("character index length not equal to result length") ); // wxString s( tv->data_.GetScalarValue() ); int oldLength = s.size(); int newLength = std::max( maxCharacterIndex, oldLength ); if( newLength > oldLength )s.append( newLength-oldLength, ' ' ); std::size_t j = 0; std::size_t size = characterIndex.size(); for( std::size_t i=0; i(characterIndex[i])-1, 1, 1, results[0].c_str()[j] ); tv->data_.SetScalarValue( s ); } else // no character indices used { if( results.size() == 1 ) { TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; tv = new TextVariable( name ); tv->data_.SetNumberOfDimensions( 0 ); tv->data_.SetScalarValue( results[0] ); } else { TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; preExisting = false; tv = new TextVariable( name ); tv->data_.SetNumberOfDimensions( 1 ); std::size_t size = results.size(); for( std::size_t i=0; idata_.AddString( results[i] ); } } } else // output variable does not exist { tv = new TextVariable( name ); if( characterIndexUsed ) { if( results.size() != 1 ) throw EVariableError( wxT("no array indices given but results is an array") ); if( results[0].size() != characterIndex.size() ) throw EVariableError( wxT("character index length not equal to result length") ); // wxString s( maxCharacterIndex, wxT(' ') ); std::size_t j = 0; std::size_t size = characterIndex.size(); for( std::size_t i=0; i(characterIndex[i])-1, 1, 1, results[0].c_str()[j] ); tv->data_.SetNumberOfDimensions( 0 ); tv->data_.SetScalarValue( s ); } else // no character indices used { if( results.size() == 1 ) { tv->data_.SetNumberOfDimensions( 0 ); tv->data_.SetScalarValue( results[0] ); } else { tv->data_.SetNumberOfDimensions( 1 ); std::size_t size = results.size(); for( std::size_t i=0; idata_.AddString( results[i] ); } } } } if( addToHistory )tv->AddToHistory( inputLine ); return tv; } // end of file extrema-4.4.5/src/Variables/EVariableError.h0000644012702201742730000000177211274636611017741 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_EVARIABLEERROR #define EX_EVARIABLEERROR #include #include "wx/wx.h" class EVariableError : public std::runtime_error { public: EVariableError( wxString const &message ) : std::runtime_error( (char const *)message.mb_str(wxConvUTF8) ) {} }; #endif extrema-4.4.5/src/Variables/Variable.cpp0000644012702201742730000001514011274636611017147 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "Variable.h" #include "EVariableError.h" #include "ExGlobals.h" Variable::Variable() {} Variable::Variable( wxString const &name ) : name_(name.Upper()) {} Variable::~Variable() {} Variable::Variable( Variable const &rhs ) { CopyStuff(rhs); } Variable &Variable::operator=( Variable const &rhs ) { if( this != &rhs )CopyStuff(rhs); return *this; } void Variable::AddToHistory( wxString s ) { history_.push_front(s); if( static_cast(history_.size()) >= ExGlobals::GetMaxHistory() )history_.pop_back(); } std::deque const &Variable::GetHistory() { return history_; } void Variable::SetHistory( std::deque &s ) { history_.swap( s ); } void Variable::SetName( wxString const &name ) { name_ = name; } wxString &Variable::GetName() { return name_; } void Variable::SetOrigin( wxString const &origin ) { origin_ = origin; } wxString const &Variable::GetOrigin() const { return origin_; } wxString Variable::SimpleName( wxString const &name ) { int const classes[128] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 6, 6, 6, 3, 6, 6, 6, 4, 5, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 6, 5, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 5, 6, 6 }; int const stateTable[3][6] = { // blnk A-Z $_0-9 {([ ])} other { 1, 2, -10, -20, -20, 2}, {100, 3, 3, 100, -30, 3}, {100, 3, 3, 100, -30, 3} }; wxString uName( name.Upper() ); // int start = -1; int newState = 1; std::size_t i = 0; while ( i < uName.length() ) { int currentState = newState; std::size_t iascii = toascii( uName[i] ); newState = stateTable[currentState-1][classes[iascii]-1]; if( newState == 2 ) // start variable name start = i; else if( newState == 100 ) // variable with no indices break; else if( newState == -10 ) throw EVariableError( wxString(wxT("invalid first character in name: "))+name ); else if( newState == -20 ) throw EVariableError( wxT("no variable name was given") ); else if( newState == -30 ) throw EVariableError( uName[i]+wxT(" is an invalid character in ")+name ); ++i; } if( start == -1 )throw EVariableError(wxT("no variable name was given")); return uName.substr(start,i-start); } void Variable::CheckReservedName( wxString const &name ) { std::size_t const nNames = 200; wxString const reservedName[nNames] = { wxT("LOG"), wxT("LN"), wxT("DIGAMMA"), wxT("PSI"), wxT("LOG10"), wxT("AIRY"), wxT("EXP"), wxT("LOGAM"), wxT("SQRT"), wxT("BESI0"), wxT("SIN"), wxT("SINE"), wxT("BESI1"), wxT("BESK0"), wxT("COS"), wxT("COSINE"), wxT("BESK1"), wxT("BESJ0"), wxT("TAN"), wxT("TANGENT"), wxT("BESJ1"), wxT("BESY0"), wxT("ASIN"), wxT("ARSIN"), wxT("BESY1"), wxT("COSINT"), wxT("DAWSON"), wxT("ELLICK"), wxT("ACOS"), wxT("ARCOS"), wxT("ELLICE"), wxT("ERF"), wxT("EXPINT"), wxT("FREQ"), wxT("ATAN"), wxT("ARTAN"), wxT("ARCTAN"), wxT("GAUSSIN"), wxT("SININT"), wxT("GAMMA"), wxT("ATAN2"), wxT("ARTAN2"), wxT("ARCTAN2"), wxT("DILOG"), wxT("STRUVE0"), wxT("STRUVE1"), wxT("SINH"), wxT("COSH"), wxT("TANH"), wxT("CSCH"), wxT("SECH"), wxT("COTH"), wxT("ABS"), wxT("ASINH"), wxT("ARSINH"), wxT("ARCOSH"), wxT("MAX"), wxT("ACOSH"), wxT("ACOTH"), wxT("ARCOTH"), wxT("MIN"), wxT("ASECH"), wxT("ARSECH"), wxT("ACSCH"), wxT("ARCSCH"), wxT("COT"), wxT("SEC"), wxT("CSC"), wxT("INT"), wxT("IFIX"), wxT("MOD"), wxT("ARCOT"), wxT("ACOT"), wxT("ARSEC"), wxT("SIGN"), wxT("ASEC"), wxT("DIM"), wxT("ARCSC"), wxT("RAN"), wxT("VOIGT"), wxT("ACSC"), wxT("FREC1"), wxT("FREC2"), wxT("FRES1"), wxT("FRES2"), wxT("PLM"), wxT("PLMN"), wxT("PLMU"), wxT("FERDIRAC"), wxT("ERFC"), wxT("BIRY"), wxT("EI"), wxT("FACTORIAL"), wxT("BER"), wxT("BEI"), wxT("AERF"), wxT("EXPN"), wxT("RADMAC"), wxT("WALSH"), wxT("BETA"), wxT("BINOM"), wxT("CHEBY"), wxT("CHISQ"), wxT("CHISQINV"), wxT("FINELLIC"), wxT("EINELLIC"), wxT("GAMMAIN"), wxT("GAMMACIN"), wxT("GAMMATIN"), wxT("HERMITE"), wxT("LAGUERRE"), wxT("LEGENDRE"), wxT("STUDENT"), wxT("STUDENTI"), wxT("BETAIN"), wxT("BIVARNOR"), wxT("CHLOGU"), wxT("FISHER"), wxT("POICA"), wxT("JACOBI"), wxT("HYPGEO"), wxT("KER"), wxT("KEI"), wxT("SIND"), wxT("COSD"), wxT("TAND"), wxT("ASIND"), wxT("ACOSD"), wxT("ATAND"), wxT("ATAN2D"), wxT("NINT"), wxT("AERFC"), wxT("GAUSS"), wxT("AGAUSS"), wxT("PROB"), wxT("ATANH"), wxT("ARTANH"), wxT("GAMMLN"), wxT("GAMMQ"), wxT("CLEBSG"), wxT("WIGN3J"), wxT("WIGN6J"), wxT("WIGN9J"), wxT("RACAHC"), wxT("JAHNUF"), wxT("NORMAL"), wxT("TINA"), wxT("ELTIME"), wxT("RCHAR"), wxT("CHAR"), wxT("ICHAR"), wxT("EVALUATE"), wxT("EXPAND"), wxT("DATE"), wxT("TIME"), wxT("UCASE"), wxT("LCASE"), wxT("TCASE"), wxT("INDEX"), wxT("CLEN"), wxT("VLEN"), wxT("LEN"), wxT("WHERE"), wxT("EQS"), wxT("NES"), wxT("SUB"), wxT("SUP"), wxT("ROLL"), wxT("STEP"), wxT("WRAP"), wxT("NULL"), wxT("FOLD"), wxT("UNFOLD"), wxT("CONVOLUTE"), wxT("INTEGRAL"), wxT("DERIVATIVE"), wxT("INTERPOLATE"), wxT("SMOOTH"), wxT("FFT"), wxT("SAVGOL"), wxT("SPLINTERP"), wxT("SPLSMOOTH"), wxT("FIRST"), wxT("LAST"), wxT("IFFT"), wxT("EXIST"), wxT("VARNAME"), wxT("ICLOSE"), wxT("GAUSSJ"), wxT("AREA"), wxT("TRANSLATE"), wxT("PFACTORS"), wxT("INVERSE"), wxT("DETERMINANT"), wxT("IDENTITY"), wxT("EIGEN"), wxT("IEQUAL"), wxT("STRING"), wxT("JOIN"), wxT("VARTYPE") }; wxString nameUp( name.Upper() ); for( std::size_t i=0; iAddEntry(this); } NumericVariable::NumericVariable( NumericVariable const &rhs ) : Variable(rhs) { CopyStuff(rhs); } NumericVariable &NumericVariable::operator=( NumericVariable const &rhs ) { if( this != &rhs ) { Variable::CopyStuff(rhs); CopyStuff(rhs); } return *this; } NumericData &NumericVariable::GetData() { return data_; } void NumericVariable::SetData( NumericData const &data ) { data_ = data; } std::ostream &operator<<( std::ostream &out, NumericVariable const &nv ) { wxString closer; switch ( nv.data_.GetNumberOfDimensions() ) { case 0: // scalar { out << "\n" : out << " type=\"FIT\">\n"; closer = wxT("\n"); break; } case 1: // vector { out << "\n"; else if( nv.data_.IsAscending() )out << " order=\"ASCENDING\">\n"; else out << " order=\"DESCENDING\">\n"; closer = wxT("\n"); break; } case 2: // matrix { out << "\n"; closer = wxT("\n"); break; } case 3: // tensor { out << "\n"; closer = wxT("\n"); break; } } out << nv.data_; out << "\n"; std::deque::const_reverse_iterator hEnd = nv.history_.rend(); for( std::deque::const_reverse_iterator i=nv.history_.rbegin(); i!=hEnd; ++i ) out << "\n"; return out << "\n\n" << closer.mb_str(wxConvUTF8); } void NumericVariable::GetVariable( wxString const &name, int &numberOfDimensions, double &scalarValue, std::vector &data, int *dimSizes ) { // input: name is the variable name to test // // output: numberOfDimensions is 0 if scalar, 1 if vector, 2 if matrix, 3 if tensor // scalarValue used if numberOfDimensions = 0 // data used if numberOfDimensions > 0 // dimSizes[0] first dimension size, if numberOfDimensions = 1 or 2 // dimSizes[1] second dimension size, if numberOfDimensions = 2 or 3 // dimSizes[2] third dimension size, if numberOfDimensions = 3 // if( name.empty() )throw EVariableError(wxT("name is blank")); Expression expr( name ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw EVariableError( wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() ) throw EVariableError(wxT("character expression found where numeric expected")); // NumericData nd( expr.GetFinalAnswer() ); numberOfDimensions = nd.GetNumberOfDimensions(); data.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )dimSizes[i] = nd.GetDimMag(i); if( numberOfDimensions == 0 )scalarValue = nd.GetScalarValue(); } void NumericVariable::GetMatrix( wxString const &name, wxChar const *description, std::vector &data, std::size_t &nRow, std::size_t &nCol ) { int numberOfDimensions; double scalarValue; int dimSizes[3]; try { GetVariable( name, numberOfDimensions, scalarValue, data, dimSizes ); } catch( EVariableError &e ) { throw EVariableError( wxString(description)+wxT("\n")+wxString(e.what(),wxConvUTF8) ); } switch (numberOfDimensions) { case 2: { nRow = dimSizes[0]; nCol = dimSizes[1]; break; } default: { wxString const varType[4] = { wxString(wxT("scalar")), wxString(wxT("vector")), wxString(wxT("matrix")), wxString(wxT("tensor")) }; wxString message( wxT("expecting a matrix, but ") ); message += name + wxString(wxT(" is a ")) + varType[numberOfDimensions]; throw EVariableError( message ); } } } void NumericVariable::GetVector( wxString const &name, wxChar const *description, std::vector &data ) { int numberOfDimensions; double scalarValue; int dimSizes[3]; try { GetVariable( name, numberOfDimensions, scalarValue, data, dimSizes ); } catch( EVariableError &e ) { throw EVariableError( wxString(description)+wxT("\n")+wxString(e.what(),wxConvUTF8) ); } switch (numberOfDimensions) { case 1: break; case 0: data.push_back( scalarValue ); break; default: { wxString const varType[4] = { wxString(wxT("scalar")), wxString(wxT("vector")), wxString(wxT("matrix")), wxString(wxT("tensor")) }; wxString message( wxT("expecting a vector, but ") ); message += name + wxString(wxT(" is a ")) + varType[numberOfDimensions]; throw EVariableError( message ); } } } void NumericVariable::GetScalar( wxString &name, wxChar const *description, double &value ) { // returns the scalar value as a double (in value) and as a string (in name) // int numberOfDimensions; double scalarValue; int dimSizes[3]; std::vector data; try { GetVariable( name, numberOfDimensions, scalarValue, data, dimSizes ); } catch( EVariableError &e ) { throw EVariableError( wxString(description)+wxT("\n")+wxString(e.what(),wxConvUTF8) ); } switch (numberOfDimensions) { case 0: { value = scalarValue; //name << value; break; } default: { wxString const varType[4] = { wxString(wxT("scalar")), wxString(wxT("vector")), wxString(wxT("matrix")), wxString(wxT("tensor")) }; wxString message( wxT("expecting a scalar, but ") ); message += name + wxString(wxT(" is a ")) + varType[numberOfDimensions]; throw EVariableError( message ); } } } bool NumericVariable::DeletePartial( wxString const &name, wxString const &inputLine ) { int numberOfIndices; std::vector indexVecs[3]; bool indexIsScalar[3]; try { GetIndices( const_cast(name), numberOfIndices, indexVecs, indexIsScalar ); } catch (EVariableError &e) { throw; } std::vector data( data_.GetData() ); int size = data.size(); if( indexIsScalar[0] ) { int index = static_cast(indexVecs[0][0]); if( index > size ) throw EVariableError( wxString(wxT("vector index > maximum ("))+name+wxT(")") ); if( index < 1 ) throw EVariableError( wxString(wxT("vector index < minimum ("))+name+wxT(")") ); data.erase( data.begin()+index-1 ); } else // vector index { std::vector tmp; int nValues = static_cast(indexVecs[0].size()); for( int j=1; j<=size; ++j ) { bool remove = false; for( int k=0; k(indexVecs[0][k]); if( index > size ) throw EVariableError( wxString(wxT("vector index > maximum ("))+name+wxT(")") ); if( index < 1 ) throw EVariableError( wxString(wxT("vector index < minimum ("))+name+wxT(")") ); if( j == index ) { remove = true; break; } } if( !remove )tmp.push_back( data[j-1] ); } data.assign( tmp.begin(), tmp.end() ); } bool allGone = false; if( data.empty() ) { allGone = true; } else { data_.SetData( data ); data_.SetDimMag( 0, data.size() ); AddToHistory( inputLine ); } return allGone; } void NumericVariable::GetIndices( wxString &name, int &numberOfIndices, std::vector *indexVecs, bool *indexIsScalar ) { // First see if the variable name needs to be constructed, i.e., // `A'//RCHAR(I) could be `A3' if I=3. This is done by default, if // the name contains "//", but be aware that the expansion continues, // e.g. if A3=`X2', then if you entered A3=5, you would get X2=5. // This also means that you can enter `A'//RCHAR(I)=`testing' since // the output variable name will be constructed. // try { Expression expr( name ); expr.Evaluate(); if( expr.IsCharacter() )name = expr.GetFinalString(); } catch ( EExpressionError &e ) {} // wxString simpleName; try { simpleName = SimpleName( name ); CheckReservedName( simpleName ); } catch ( EVariableError &e ) { throw; } int nameLen = simpleName.length(); int indexLen = name.length() - nameLen; int dimension = 0; numberOfIndices = 0; if( indexLen == 0 ) { name = simpleName; return; } wxString indices( name.substr(nameLen,indexLen) ); int cntr = 0; int start = 1; // if( indices[0] != '(' && indices[0] != '{' && indices[0] != '[' ) throw EVariableError( wxT("indices must begin with an opening bracket") ); // for( int i=0; i *indexVecs, bool *indexIsScalar, int *nmin, int *nmax, int *imin, int *imax ) { TVariableTable::GetTable()->RemoveEntry( TVariableTable::GetTable()->GetVariable(name) ); // NumericVariable *nv = NVariableTable::GetTable()->GetVariable( name ); if( nv ) { std::size_t nDims = nv->GetData().GetNumberOfDimensions(); for( std::size_t i=0; iGetData().GetDimMag(i); nmin[i] = imin[i]; nmax[i] = imax[i]; } } for( int i=0; i(indexVecs[i][0]); nmax[i] = nmin[i]; } else { nmin[i] = static_cast(indexVecs[i][0]); nmax[i] = nmin[i]; std::size_t size = indexVecs[i].size(); for( std::size_t j=0; j(indexVecs[i][j]); if( tmp < nmin[i] )nmin[i] = tmp; if( tmp > nmax[i] )nmax[i] = tmp; } } } return nv; } NumericVariable *NumericVariable::PutVariable( wxString name, double dataValue, wxString const &inputLine, bool addToHistory ) { // input data was a scalar // int numberOfIndices; std::vector indexVecs[3]; bool indexIsScalar[3]; try { GetIndices( name, numberOfIndices, indexVecs, indexIsScalar ); } catch (EVariableError &e) { throw; } // int nmin[3] = {0,0,0}, nmax[3] = {0,0,0}; int imin[3] = {0,0,0}, imax[3] = {0,0,0}; // NumericVariable *nv = GetPreExisting( name, numberOfIndices, indexVecs, indexIsScalar, nmin, nmax, imin, imax ); bool preExisting = (nv!=0); // if( numberOfIndices == 0 ) // new variable had no indices so it will be a scalar { // e.g. X = 3 if( nv && nv->data_.GetNumberOfDimensions()!=0 ) { NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } if( !nv ) { nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 0 ); nv->data_.SetFixed(); } nv->data_.SetScalarValue( dataValue ); } else if( numberOfIndices == 1 ) // new variable indices indicates vector { // but data indicates scalar // e.g. X[5] = 3 or X[3:9] = 2 if( nv && nv->data_.GetNumberOfDimensions()!=1 ) { NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } if( nv ) { int newpts = std::max(nmax[0],imax[0]); std::vector v( newpts, 0.0 ); nv->data_.SetOrderType( 0 ); // unordered nv->data_.SetDimMag( 0, newpts ); for( int i=0; idata_.GetData(i); if( indexIsScalar[0] ) // e.g., X[-2] = 3 { v[nmin[0]-1] = dataValue; } else // e.g. X[3:9] = 2 { std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i])-1] = dataValue; } nv->data_.SetData( v ); } else // new variable does not pre-exist { nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 1 ); std::vector v( nmax[0], 0.0 ); if( indexIsScalar[0] ) // e.g. X[-2] = 3 { v[nmin[0]-1] = dataValue; } else // e.g. X[-2:5] = 2 { std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i])-1] = dataValue; } nv->data_.SetData( v ); nv->data_.SetDimMag( 0, nmax[0] ); } } else if( numberOfIndices == 2 ) // new variable indices indicates matrix { // but data indicates scalar // e.g. X[2,5] = 3, X[2,3:9] = 2 if( nv && nv->data_.GetNumberOfDimensions()!=2 ) { NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } if( nv ) // variable exists and is a matrix { int newpts0 = std::max(nmax[0],imax[0]); int newpts1 = std::max(nmax[1],imax[1]); std::vector v( newpts0*newpts1, 0.0 ); int size1 = nv->data_.GetDimMag(0); for( int j=0; jdata_.GetData(i+j*size1); } nv->data_.SetDimMag( 0, newpts0 ); nv->data_.SetDimMag( 1, newpts1 ); if( indexIsScalar[0] ) { if( indexIsScalar[1] ) // e.g. X[2,5] = 3 v[nmin[0]-1+(nmin[1]-1)*newpts0] = dataValue; else // e.g. X[2,3:9] = 2 { std::size_t size = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[1][j])-1)*newpts0] = dataValue; } } else { if( indexIsScalar[1] ) // e.g. X[2:7,3] = 3 { std::size_t size = indexVecs[0].size(); for( std::size_t i=0; i(indexVecs[0][i])-1+(nmin[1]-1)*newpts0] = dataValue; } else // e.g. X[2:7,3:9] = 3 { std::size_t sizej = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[0][i])-1+ (static_cast(indexVecs[1][j])-1)*newpts0] = dataValue; } } } nv->data_.SetData( v ); } else // variable does not exist already { nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 2 ); nv->data_.SetDimMag( 0, nmax[0] ); nv->data_.SetDimMag( 1, nmax[1] ); std::vector v( nmax[0]*nmax[1], 0.0 ); if( indexIsScalar[0] ) { if( indexIsScalar[1] ) // e.g. X[2,5] = 2 v[nmin[0]-1+(nmin[1]-1)*nmax[0]] = dataValue; else // e.g. X[2,3:9] = 2 { std::size_t size = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[1][j])-1)*nmax[0]] = dataValue; } } else { if( indexIsScalar[1] ) // e.g. X[2:7,3] = 2 { std::size_t size = indexVecs[0].size(); for( std::size_t j=0; j(indexVecs[0][j])-1+(nmin[1]-1)*nmax[0]] = dataValue; } else // e.g. X[2:7,3:9] = 2 { std::size_t sizej = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[0][i])-1+ (static_cast(indexVecs[1][j])-1)*nmax[0]] = dataValue; } } } nv->data_.SetData( v ); } } if( preExisting ) { if( addToHistory )nv->AddToHistory( inputLine ); } else nv->AddToHistory( inputLine ); return nv; } NumericVariable *NumericVariable::PutVariable( wxString name, std::vector const &data, int order, wxString const &inputLine, bool addToHistory ) { // input data was a vector // int numberOfIndices; std::vector indexVecs[3]; bool indexIsScalar[3]; try { GetIndices( name, numberOfIndices, indexVecs, indexIsScalar ); } catch (EVariableError &e) { throw; } // int nmin[3] = {0,0,0}, nmax[3] = {0,0,0}; int imin[3] = {0,0,0}, imax[3] = {0,0,0}; // NumericVariable *nv = GetPreExisting( name, numberOfIndices, indexVecs, indexIsScalar, nmin, nmax, imin, imax ); bool preExisting = (nv!=0); // std::size_t dataSize = data.size(); // bool savedHistory = false; std::deque history2; // if( numberOfIndices == 0 ) // new variable had no indices so it will be a vector { // e.g. x = [3:9] if( nv ) // variable exists already { if( nv->data_.GetNumberOfDimensions() == 1 ) // variable is a pre-existing vector { savedHistory = true; history2.assign( nv->history_.begin(), nv->history_.end() ); } NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 1 ); nv->data_.SetOrderType( order ); nv->data_.SetData( data ); nv->data_.SetDimMag( 0, dataSize ); } else if( numberOfIndices == 1 ) // new variable indices indicates vector { // e.g. x[2:8] = [3:9] if( nv && nv->data_.GetNumberOfDimensions()!=1 ) { NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } std::vector v; int tmp; if( nv ) // variable exists and is a vector { int newpts = std::max(nmax[0],imax[0]); std::vector vtmp( newpts, 0.0 ); v.swap( vtmp ); std::size_t nvSize = nv->data_.GetData().size(); for( std::size_t i=0; idata_.GetData(i); nv->data_.SetDimMag( 0, newpts ); tmp = 1; } else // variable does not exist { nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 1 ); nv->data_.SetDimMag( 0, nmax[0] ); std::vector vtmp( nmax[0], 0.0 ); v.swap( vtmp ); tmp = nmin[0]; } if( indexIsScalar[0] ) { v[nmin[0]-1] = data[0]; } else { std::size_t size = std::min( indexVecs[0].size(), dataSize ); for( std::size_t i=0; i(indexVecs[0][i])-tmp] = data[i]; } nv->data_.SetOrderType( 0 ); // unordered nv->data_.SetData( v ); } else if( numberOfIndices == 2 ) // new variable indices indicates matrix { // e.g. x[2,4:10] = [3:9] or x[2:4,9] = [3:5] if( nv && nv->data_.GetNumberOfDimensions()!=2 ) { NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } std::vector v; if( nv ) // variable exists and is a matrix { int newpts0 = std::max(nmax[0],imax[0]); int newpts1 = std::max(nmax[1],imax[1]); std::vector vtmp( newpts0*newpts1, 0.0 ); v.swap( vtmp ); for( int j=0; jdata_.GetData(i+j*nv->data_.GetDimMag(0)); } nv->data_.SetDimMag( 0, newpts0 ); nv->data_.SetDimMag( 1, newpts1 ); if( indexIsScalar[0] ) { if( indexIsScalar[1] ) v[nmin[0]-1+(nmin[1]-1)*newpts0] = data[0]; else { std::size_t size = std::min( dataSize, indexVecs[1].size() ); for( std::size_t j=0; j(indexVecs[1][j])-1)*newpts0] = data[j]; } } else { if( indexIsScalar[1] ) { std::size_t size = std::min( dataSize, indexVecs[0].size()); for( std::size_t i=0; i(indexVecs[0][i])-1+(nmin[1]-1)*newpts0] = data[i]; } else { std::size_t k = 0; std::size_t size1 = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[0][i])-1+ (static_cast(indexVecs[1][j])-1)*newpts0] = data[k]; if( k++ == dataSize-1 )break; } if( k == dataSize-1 )break; } } } } else // variable does not exist already { nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 2 ); nv->data_.SetDimMag( 0, nmax[0] ); nv->data_.SetDimMag( 1, nmax[1] ); std::vector vtmp( nmax[0]*nmax[1], 0.0 ); v.swap( vtmp ); if( indexIsScalar[0] ) { if( indexIsScalar[1] ) { v[nmin[0]-1+(nmin[1]-1)*nmax[0]] = data[0]; } else { std::size_t size = std::min( dataSize, indexVecs[1].size() ); for( std::size_t j=0; j(indexVecs[1][j])-1)*nmax[0]] = data[j]; } } else { if( indexIsScalar[1] ) { std::size_t size = std::min( dataSize, indexVecs[0].size()); for( std::size_t i=0; i(indexVecs[0][i])-1+(nmin[1]-1)*nmax[0]] = data[i]; } else { std::size_t k = 0; std::size_t size1 = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[0][i])-1+ (static_cast(indexVecs[1][j])-1)*nmax[0]] = data[k]; if( k++ == dataSize-1 )break; } if( k == dataSize-1 )break; } } } } nv->data_.SetData( v ); } if( savedHistory )nv->history_.assign( history2.begin(), history2.end() ); if( preExisting ) { if( addToHistory )nv->AddToHistory( inputLine ); } else nv->AddToHistory( inputLine ); return nv; } NumericVariable *NumericVariable::PutVariable( wxString name, std::vector &data, std::size_t firstDim, std::size_t secondDim, wxString const &inputLine, bool addToHistory ) { // input data was a matrix // int numberOfIndices; std::vector indexVecs[3]; bool indexIsScalar[3]; try { GetIndices( name, numberOfIndices, indexVecs, indexIsScalar ); } catch (EVariableError &e) { throw; } // int nmin[3] = {0,0,0}, nmax[3] = {0,0,0}; int imin[3] = {0,0,0}, imax[3] = {0,0,0}; // NumericVariable *nv = GetPreExisting( name, numberOfIndices, indexVecs, indexIsScalar, nmin, nmax, imin, imax ); bool preExisting = (nv!=0); // std::size_t dataSize = data.size(); // bool savedHistory = false; std::deque history2; // if( numberOfIndices == 0 ) // new variable had no indices so it will be a matrix { // e.g. x = m[2:5,3:9] if( nv ) { if( nv->data_.GetNumberOfDimensions() == 2 ) // variable is a matrix already { savedHistory = true; history2.assign( nv->history_.begin(), nv->history_.end() ); } NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions(2); nv->data_.SetDimMag( 0, firstDim ); nv->data_.SetDimMag( 1, secondDim ); nv->data_.SetData( data ); } else if( numberOfIndices == 1 ) // new variable indices indicates vector { // e.g. x[1:28] = m[2:5,3:9] if( nv && nv->data_.GetNumberOfDimensions()!=1 ) NVariableTable::GetTable()->RemoveEntry(nv); // this deletes nv and sets it to zero if( nv ) // variable exists and is a vector { // e.g. x[14:41] = m[2:5,3:9] std::size_t newpts0 = std::max( nmax[0], imax[0] ); std::vector v( newpts0, 0.0 ); for( int i=0; idata_.GetData(i); nv->data_.SetOrderType( 0 ); // unordered nv->data_.SetDimMag( 0, newpts0 ); if( indexIsScalar[0] ) // e.g. x[-3] = m[2:5,3:9] v[nmin[0]-1] = data[0]; else // e.g. x[-14:13] = m[2:5,3:9] { std::size_t k = 0; for( std::size_t j=0; j(indexVecs[0][k])-1] = data[i+j*firstDim]; if( k++ == newpts0 )break; } if( k == newpts0 )break; } } nv->data_.SetData( v ); } else // variable does not exist already { nv = new NumericVariable( name ); nv->data_.SetOrderType( 0 ); // unordered nv->data_.SetNumberOfDimensions( 1 ); nv->data_.SetDimMag( 0, nmax[0] ); std::vector v( nmax[0], 0.0 ); if( indexIsScalar[0] ) v[nmin[0]-1] = data[0]; else { std::size_t k = 0; for( std::size_t j=0; j(indexVecs[0][k])-1] = data[i+j*firstDim]; if( k++ == dataSize )break; } if( k == dataSize )break; } } nv->data_.SetData( v ); } } else if( numberOfIndices == 2 ) // new variable indices indicates matrix { // e.g. x[2:7,1:4] = m[2:5,3:8] if( nv && nv->data_.GetNumberOfDimensions()!=2 ) { NVariableTable::GetTable()->RemoveEntry(nv); nv = 0; } if( nv ) // variable exists already and is a matrix { int newpts0 = std::max( nmax[0], imax[0] ); int newpts1 = std::max( nmax[1], imax[1] ); std::vector v( newpts0*newpts1, 0.0 ); int size1 = nv->data_.GetDimMag(0); for( int j=0; jdata_.GetData(i+j*size1); } nv->data_.SetDimMag( 0, newpts0 ); nv->data_.SetDimMag( 1, newpts1 ); if( indexIsScalar[0] ) { if( indexIsScalar[1] ) // e.g. x[2,1] = m[2:5,3:8] v[nmin[0]-1+(nmin[1]-1)*newpts0] = data[0]; else { std::size_t k = 0; // e.g. x[2,1:2] = m[2:5,3:8] std::size_t v1size = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[1][k])-1)*newpts0] = data[i+j*firstDim]; if( k++ == v1size-1 )break; } if( k == v1size-1 )break; } } } else { if( indexIsScalar[1] ) // e.g. x[2:3,1] = m[2:5,3:8] { std::size_t k = 0; std::size_t v0size = indexVecs[0].size(); for( std::size_t j=0; j(indexVecs[0][k])-1+(nmin[1]-1)*newpts0] = data[i+j*firstDim]; if( k++ == v0size-1 )break; } if( k == v0size-1 )break; } } else { int k = 0; // e.g. x[2:3,1:2] = m[2:5,3:8] std::size_t l = 0; std::size_t v0size = indexVecs[0].size(); std::size_t v1size = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[0][k])-1+ (static_cast(indexVecs[1][l])-1)*newpts0] = data[i+j*firstDim]; if( k == static_cast(v0size-1) ) { if( l++ == v1size-1 )break; k = -1; } ++k; } if( l == v1size-1 )break; } } } nv->data_.SetData( v ); } else // variable does not exist already { nv = new NumericVariable( name ); nv->data_.SetNumberOfDimensions( 2 ); nv->data_.SetDimMag( 0, nmax[0] ); nv->data_.SetDimMag( 1, nmax[1] ); std::vector v( nmax[0]*nmax[1], 0.0 ); if( indexIsScalar[0] ) { if( indexIsScalar[1] ) // e.g. x[2,1] = m[2:5,3:8] v[nmin[0]-1+(nmin[1]-1)*nmax[0]] = data[0]; else { std::size_t k = 0; // e.g. x[2,1:2] = m[2:5,3:8] std::size_t v1size = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[1][k])-1)*nmax[0]] = data[i+j*firstDim]; if( k++ == v1size-1 )break; } if( k == v1size-1 )break; } } } else { if( indexIsScalar[1] ) // e.g. x[-2:3,-1] = m[2:5,3:8] { std::size_t k = 0; std::size_t v0size = indexVecs[0].size(); for( std::size_t j=0; j(indexVecs[0][k])-1+(nmin[1]-1)*nmax[0]] = data[i+j*firstDim]; if( k++ == v0size-1 )break; } if( k == v0size-1 )break; } } else { int k = 0; // e.g. x[-2:3,-1:2] = m[2:5,3:8] std::size_t l = 0; std::size_t v0size = indexVecs[0].size(); std::size_t v1size = indexVecs[1].size(); for( std::size_t j=0; j(indexVecs[0][k])-1+ (static_cast(indexVecs[1][l])-1)*nmax[0]] = data[i+j*firstDim]; if( k == static_cast(v0size-1) ) { if( l++ == v1size-1 )break; k = -1; } if( l == v1size-1 )break; ++k; } } } } nv->data_.SetData( v ); } } if( savedHistory )nv->history_.assign( history2.begin(), history2.end() ); if( preExisting ) { if( addToHistory )nv->AddToHistory( inputLine ); } else { nv->AddToHistory( inputLine ); } return nv; } // end of file extrema-4.4.5/src/Variables/NumericData.h0000644012702201742730000001004311274636611017260 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_NUMERICDATA #define EX_NUMERICDATA #include #include class NumericData { private: enum ScalarType { NOTSCALAR, FIXED, FIT }; public: NumericData() : orderType_(0), numberOfDimensions_(0), lowLimitSet_(false), highLimitSet_(false) { dimMag_[0] = 0; dimMag_[1] = 0; dimMag_[2] = 0; } NumericData( unsigned int i ) : orderType_(0), numberOfDimensions_(i), lowLimitSet_(false), highLimitSet_(false) { dimMag_[0] = 0; dimMag_[1] = 0; dimMag_[2] = 0; } virtual ~NumericData() {} NumericData( NumericData const &rhs ) { CopyStuff( rhs ); } NumericData & operator=( NumericData const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } bool IsEmpty() const { return data_.empty(); } void SetNumberOfDimensions( unsigned int i ) { numberOfDimensions_ = i; } unsigned int GetNumberOfDimensions() const { return numberOfDimensions_; } bool IsFixed() const { return (scalarType_==FIXED); } bool IsFit() const { return (scalarType_==FIT); } void SetFixed() { scalarType_ = FIXED; } void SetFit() { scalarType_ = FIT; } void SetLowLimit( double x ) { lowLimit_ = x; lowLimitSet_ = true; } void ReleaseLowLimit() { lowLimitSet_ = false; } bool LowLimitSet() const { return lowLimitSet_; } double GetLowLimit() const { return lowLimit_; } void SetHighLimit( double x ) { highLimit_ = x; highLimitSet_ = true; } void ReleaseHighLimit() { highLimitSet_ = false; } bool HighLimitSet() const { return highLimitSet_; } double GetHighLimit() const { return highLimit_; } void SetOrderType( int i ) { orderType_ = i%3; } bool IsUnordered() const { return (orderType_ == 0); } bool IsAscending() const { return (orderType_ == 1); } bool IsDescending() const { return (orderType_ == 2); } void SetUnordered() { orderType_ = 0; } void SetAscending() { orderType_ = 1; } void SetDescending() { orderType_ = 2; } double GetScalarValue() const { return data_[0]; } void SetScalarValue( double v ) { std::vector().swap( data_ ); data_.push_back( v ); } unsigned int *GetDimMag() { return dimMag_; } unsigned int GetDimMag( unsigned int i ) const { return dimMag_[i]; } void SetDimMag( unsigned int i, unsigned int v ) { dimMag_[i] = v; } std::vector &GetData() { return data_; } void SetData( std::vector const &d ) { data_.assign( d.begin(), d.end() ); } void SetData( std::size_t, double ); void SetData( std::size_t, std::size_t, double ); void SetData( std::size_t, std::size_t, std::size_t, double ); double GetData( std::size_t i ) const { return data_[i]; } double GetData( std::size_t i, std::size_t j ) const { return data_[i+j*dimMag_[0]]; } double GetData( std::size_t i, std::size_t j, std::size_t k ) const { return data_[i+j*dimMag_[0]+k*dimMag_[0]*dimMag_[1]]; } void GetMinMax( double &, double & ) const; friend std::ostream &operator<<( std::ostream &, NumericData const & ); private: std::vector data_; ScalarType scalarType_; double lowLimit_, highLimit_; bool lowLimitSet_, highLimitSet_; unsigned int dimMag_[3]; unsigned int numberOfDimensions_; unsigned int orderType_; void CopyStuff( NumericData const & ); }; #endif extrema-4.4.5/src/Variables/NumericData.cpp0000644012702201742730000000467311274636611017627 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "NumericData.h" #include "EVariableError.h" #include "Variable.h" void NumericData::CopyStuff( NumericData const &rhs ) { data_.assign( rhs.data_.begin(), rhs.data_.end() ); scalarType_ = rhs.scalarType_; for( std::size_t i=0; i<3; ++i )dimMag_[i] = rhs.dimMag_[i]; numberOfDimensions_ = rhs.numberOfDimensions_; orderType_ = rhs.orderType_; lowLimit_ = rhs.lowLimit_; lowLimitSet_ = rhs.lowLimitSet_; highLimit_ = rhs.highLimit_; highLimitSet_ = rhs.highLimitSet_; } void NumericData::SetData( std::size_t i, double d ) { if( i < data_.size() ) { data_[i] = d; } else { for( std::size_t j=data_.size(); j data_[i] )min = data_[i]; if( max < data_[i] )max = data_[i]; } } std::ostream &operator<<( std::ostream &out, NumericData const &nd ) { if( nd.GetNumberOfDimensions() == 0 ) { out << "" << nd.GetScalarValue() << "\n"; } else { std::vector data( const_cast(nd).GetData() ); std::size_t size = data.size(); out << ""; for( std::size_t i=0; i\n"; } return out; } // end of file extrema-4.4.5/src/Variables/TextData.h0000644012702201742730000000301711274636611016605 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_TEXTDATA #define EX_TEXTDATA #include #include "wx/wx.h" class TextData { public: TextData(); TextData( int ); virtual ~TextData(); TextData( TextData const & ); TextData &operator=( TextData const & ); void SetNumberOfDimensions( int i ) { numberOfDimensions_ = i; } std::size_t GetNumberOfDimensions() const { return numberOfDimensions_; } wxString GetScalarValue() const; void SetScalarValue( wxString const & ); std::vector &GetData(); void AddString( wxString const & ); void SetData( std::vector const & ); void SetData( std::size_t, wxString const & ); wxString &GetData( std::size_t ); protected: std::vector data_; wxString scalarValue_; int numberOfDimensions_; void CopyStuff( TextData const & ); }; #endif extrema-4.4.5/src/Variables/Variable.h0000644012702201742730000000270111274636611016613 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_VARIABLE #define EX_VARIABLE #include #include "wx/wx.h" class Variable { public: Variable(); Variable( wxString const & ); virtual ~Variable(); Variable( Variable const & ); Variable &operator=( Variable const & ); void AddToHistory( wxString ); std::deque const &GetHistory(); void SetHistory( std::deque & ); void SetName( wxString const & ); wxString &GetName(); static wxString SimpleName( wxString const & ); void SetOrigin( wxString const & ); wxString const &GetOrigin() const; protected: static void CheckReservedName( wxString const & ); void CopyStuff( Variable const & ); wxString name_; std::deque history_; wxString origin_; }; #endif extrema-4.4.5/src/Variables/NVariableTable.cpp0000644012702201742730000000607711274636611020246 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "NVariableTable.h" #include "EVariableError.h" #include "NumericVariable.h" NVariableTable *NVariableTable::variableTable_ = 0; void NVariableTable::ClearTable() { NVariableMap::iterator end = vMap_.end(); for( NVariableMap::iterator i=vMap_.begin(); i!=end; ++i ) { delete (*i).second; (*i).second = 0; } NVariableMap().swap( vMap_ ); //vMap_.erase( vMap_.begin(), vMap_.end() ); } void NVariableTable::AddEntry( NumericVariable *v ) { if( !v )throw EVariableError(wxT("attempt to add a null numeric variable")); wxString name( v->GetName() ); if( NVariableTable::Contains( name ) ) throw EVariableError( wxString(wxT("The variable "))+name+wxString(wxT(" is already in the table")) ); vMap_.insert( entry_type(name,v) ); } void NVariableTable::RemoveEntry( NumericVariable *v ) { if( !v )return; wxString name = v->GetName(); delete v; vMap_.erase( name ); } bool NVariableTable::RemoveVariables( std::size_t d ) { NVariableMap::const_iterator end = vMap_.end(); for( NVariableMap::const_iterator i=vMap_.begin(); i!=end; ++i ) { if( static_cast((*i).second->GetData().GetNumberOfDimensions()) == d ) { RemoveEntry( (*i).second ); return true; } } return false; } bool NVariableTable::Contains( wxString const &name ) const { return ( vMap_.find(name.Upper())!=vMap_.end() ); } NumericVariable *NVariableTable::GetVariable( wxString const &name ) const { NVariableMap::const_iterator i = vMap_.find( name.Upper() ); if( i != vMap_.end() )return (*i).second; return 0; } void NVariableTable::RemoveScalars() { if( RemoveVariables(0) )RemoveScalars(); } void NVariableTable::RemoveVectors() { if( RemoveVariables(1) )RemoveVectors(); } void NVariableTable::RemoveMatrices() { if( RemoveVariables(2) )RemoveMatrices(); } void NVariableTable::RemoveTensors() { if( RemoveVariables(3) )RemoveTensors(); } void NVariableTable::RemoveEntry( wxString const &name ) { RemoveEntry( GetVariable(name) ); } std::ostream &operator<<( std::ostream &out, NVariableTable const &table ) { out << "\n"; NVariableTable::NVariableMap::const_iterator end = table.vMap_.end(); for( NVariableTable::NVariableMap::const_iterator i=table.vMap_.begin(); i!=end; ++i ) out << *((*i).second); return out << "\n"; } // end of file extrema-4.4.5/src/Variables/TVariableTable.h0000644012702201742730000000462211274636611017713 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_TVARIABLETABLE #define EX_TVARIABLETABLE #include #include "wx/wx.h" class TextVariable; class TVariableTable { private: typedef std::map< wxString const, TextVariable* > TVariableMap; typedef TVariableMap::value_type entry_type; // TVariableTable is the table of pointers to TextVariables // TVariableTable is a "singleton" (only one static object) // In TVariableTable, each TextVariable pointer is stored // with its name as a key to itself, so each variable // object must have a unique name public: static TVariableTable *GetTable() { // returns the pointer to the TVariableTable object. // TVariableTable is a "singleton", and can get its pointer by this function. The // first time this function is called, the TVariableTable object is instantiated. // if( !tVariableTable_ )tVariableTable_ = new TVariableTable(); return tVariableTable_; } virtual ~TVariableTable() { DeleteTable(); } static void DeleteTable() { if( tVariableTable_ ) { tVariableTable_->ClearTable(); delete tVariableTable_; tVariableTable_ = 0; } } int Entries() const { return vMap_.size(); } TextVariable *GetEntry( int ); bool Contains( wxString const & ) const; TextVariable *GetVariable( wxString const & ) const; void AddEntry( TextVariable * ); void RemoveEntry( TextVariable * ); void RemoveEntry( wxString const & ); void ClearTable(); friend std::ostream &operator<<( std::ostream &, TVariableTable const & ); protected: TVariableTable() {} TVariableTable( TVariableTable const &rhs ) { vMap_ = rhs.vMap_; } private: TVariableMap vMap_; static TVariableTable *tVariableTable_; }; #endif extrema-4.4.5/src/Variables/TextData.cpp0000644012702201742730000000367711274636611017154 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "TextData.h" #include "NumericData.h" TextData::TextData() : numberOfDimensions_(0) {} TextData::TextData( int i ) : numberOfDimensions_(i) {} TextData::~TextData() {} TextData::TextData( TextData const &rhs ) { CopyStuff( rhs ); } TextData & TextData::operator=( TextData const &rhs ) { if( this != &rhs )CopyStuff( rhs ); return *this; } void TextData::CopyStuff( TextData const &rhs ) { data_.assign( rhs.data_.begin(), rhs.data_.end() ); scalarValue_ = rhs.scalarValue_; numberOfDimensions_ = rhs.numberOfDimensions_; } void TextData::SetData( std::size_t i, wxString const &s ) { if( i < data_.size() ) { data_[i] = s; } else { for( std::size_t j=data_.size(); j &TextData::GetData() { return data_; } void TextData::AddString( wxString const &s ) { data_.push_back( s ); } void TextData::SetData( std::vector const &d ) { data_.assign( d.begin(), d.end() ); } wxString &TextData::GetData( std::size_t i ) { return data_[i]; } // end of file extrema-4.4.5/src/Variables/Makefile.am0000644012702201742730000000203311274636611016747 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libvariables.la libvariables_la_SOURCES = NumericData.cpp NumericData.h \ NumericVariable.cpp NumericVariable.h \ NVariableTable.cpp NVariableTable.h \ TextData.cpp TextData.h \ TextVariable.cpp TextVariable.h \ TVariableTable.cpp TVariableTable.h \ Variable.cpp Variable.h \ EVariableError.h extrema-4.4.5/src/Variables/TextVariable.h0000644012702201742730000000355211274636611017465 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_TEXTVARIABLE #define EX_TEXTVARIABLE #include #include #include #include "wx/wx.h" #include "Variable.h" #include "TextData.h" class NumericData; class TextVariable : public Variable { public: TextVariable( wxString const & ); ~TextVariable() {} TextVariable( TextVariable const & ); TextVariable &operator=( TextVariable const & ); TextData &GetData(); void SetData( TextData const & ); // scalar text variable static TextVariable *PutVariable( wxString, wxString const &, wxString const &, bool =true ); // array text variable static TextVariable *PutVariable( wxString, std::vector const &, wxString const &, bool =true ); static void GetVariable( wxString const &, bool, wxString & ); wxString GetString( NumericData const *, NumericData const * ); bool DeletePartial( wxString &, wxString const & ); friend std::ostream &operator<<( std::ostream &, TextVariable const & ); private: static void GetIndices( wxString &, int &, std::vector *, bool * ); TextData data_; }; #endif extrema-4.4.5/src/Variables/Makefile.in0000644012702201742730000003742411440762626016775 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Variables DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libvariables_la_LIBADD = am_libvariables_la_OBJECTS = NumericData.lo NumericVariable.lo \ NVariableTable.lo TextData.lo TextVariable.lo \ TVariableTable.lo Variable.lo libvariables_la_OBJECTS = $(am_libvariables_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libvariables_la_SOURCES) DIST_SOURCES = $(libvariables_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libvariables.la libvariables_la_SOURCES = NumericData.cpp NumericData.h \ NumericVariable.cpp NumericVariable.h \ NVariableTable.cpp NVariableTable.h \ TextData.cpp TextData.h \ TextVariable.cpp TextVariable.h \ TVariableTable.cpp TVariableTable.h \ Variable.cpp Variable.h \ EVariableError.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Variables/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Variables/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libvariables.la: $(libvariables_la_OBJECTS) $(libvariables_la_DEPENDENCIES) $(CXXLINK) $(libvariables_la_OBJECTS) $(libvariables_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NVariableTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NumericData.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NumericVariable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TVariableTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextData.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextVariable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Variable.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Variables/NVariableTable.h0000644012702201742730000000527111274636611017706 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_NVARIABLETABLE #define EX_NVARIABLETABLE #include #include #include "wx/wx.h" class NumericVariable; class NVariableTable { private: typedef std::map NVariableMap; typedef NVariableMap::value_type entry_type; // NVariableTable is the table of pointers to NumericVariables // NVariableTable is a "singleton" (only one static object) // In NVariableTable, each NumericVariable pointer is stored // with its name as a key to itself, so each variable // object must have a unique name public: static NVariableTable *GetTable() { // returns the pointer to the NVariableTable object // NVariableTable is a "singleton", and can get its // pointer by this variable. The first time this // variable is called, the NVariableTable object // is instantiated. if( !variableTable_ )variableTable_ = new NVariableTable(); return variableTable_; } virtual ~NVariableTable() { DeleteTable(); } static void DeleteTable() { if( variableTable_ ) { variableTable_->ClearTable(); delete variableTable_; variableTable_ = 0; } } bool Contains( wxString const & ) const; NumericVariable *GetVariable( wxString const & ) const; void RemoveScalars(); void RemoveVectors(); void RemoveMatrices(); void RemoveTensors(); int Entries() const { return vMap_.size(); } NumericVariable *GetEntry( int i ) { NVariableMap::iterator k = vMap_.begin(); for( int j=0; j # # This file is free software; as a special exception the author 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. SUBDIRS = Commands Expression Functions Graphics Operators Parsing Utilities Variables wxForms . # EX_CXXFLAGS, WX_CXXFLAGS, MUD_CXXFLAGS, and MINUIT_CXXFLAGS are defined in acinclude.m4 AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) AM_LDFLAGS = $(EX_LDFLAGS) $(WX_LIBS) $(GTK_LIBS) lib_LTLIBRARIES = libextrema.la libextrema_la_SOURCES = nodist_EXTRA_libextrema_la_SOURCES = dummy.cxx libextrema_la_LIBADD = Commands/libcommands.la \ Expression/libexpression.la \ Functions/libfunctions.la \ Graphics/libgraphics.la \ Operators/liboperators.la \ Parsing/libparsing.la \ Utilities/libutilities.la \ Variables/libvariables.la \ wxForms/libwxforms.la bin_PROGRAMS = extrema extrema_SOURCES = extrema.cpp extrema.h extrema_LDADD = libextrema.la $(WX_LIBS) $(GTK_LIBS) $(MUD_LIB) $(MINUIT_LIB) install-data-local: -cp -Rf ../Images $(pkgdatadir)/Images -cp -Rf ../Help $(pkgdatadir)/Help extrema-4.4.5/src/wxForms/0000755012702201742730000000000011440766121014445 5ustar spangspangextrema-4.4.5/src/wxForms/AxisPopup.h0000644012702201742730000000666211274636606016571 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_AXISPOPUP #define EXTREMA_AXISPOPUP #include "wx/wx.h" #include "wx/notebook.h" #include "ExSpinCtrlD.h" #include "ExSpinCtrlI.h" #include "ExColorCtrl.h" class GraphicsPage; class GRA_window; class GRA_setOfCharacteristics; class GRA_color; class AxisPopup : public wxFrame { public: AxisPopup( GraphicsPage * ); void Setup( GRA_window *, char const ); void OnMajorTicLen( double ); void OnMinorTicLen( double ); void OnNumbersHeight( double ); void OnLabelHeight( double ); void OnLowAxis( double ); void OnUpAxis( double ); void OnLineWidth( int ); void OnLineType( int ); void OnMinorIncs( int ); void OnNumbersAngle( int ); void OnAxisColor( GRA_color * ); void OnNumbersColor( GRA_color * ); void OnLabelColor( GRA_color * ); private: void CreateForm(); void MakeAxisPanel(); void MakeNumbersPanel(); void MakeLabelPanel(); void MakeLocationPanel(); void MakeAxisScalesPanel(); void ReDraw(); // event handlers void OnDrawAxis( wxCommandEvent & ); void OnDrawGraphBox( wxCommandEvent & ); void OnGridLines( wxCommandEvent & ); void OnDrawTics( wxCommandEvent & ); void OnTicDirection( wxCommandEvent & ); void OnDrawNumbers( wxCommandEvent & ); void OnDrawLabel( wxCommandEvent & ); void OnNumbersFont( wxCommandEvent & ); void OnLabel( wxCommandEvent & ); void OnLabelEnter( wxCommandEvent & ); void OnLabelFont( wxCommandEvent & ); void OnApplyScales( wxCommandEvent & ); void OnLogStyle( wxCommandEvent & ); void OnLogBase( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); bool setup_; GraphicsPage *page_; GRA_window *window_; GRA_setOfCharacteristics *axisChars_; char which_; wxNotebook *notebook_; wxCheckBox *drawAxisCB_, *drawGraphBoxCB_, *drawTicsCB_; wxCheckBox *drawNumbersCB_, *drawLabelCB_, *logStyleCB_; ExSpinCtrlI *lineWidthSC_, *lineTypeSC_, *minorIncsSC_, *numbersAngleSC_; ExSpinCtrlD *majorTicLenSC_, *minorTicLenSC_, *numbersHeightSC_; ExSpinCtrlD *labelHeightSC_, *lowAxisSC_, *upAxisSC_; ExColorCtrl *axisColor_, *numbersColor_, *labelColor_; wxRadioBox *gridLinesRB_, *ticDirectionRB_, *logBaseRB_; wxComboBox *nFontCB_, *lFontCB_; wxTextCtrl *labelTC_, *minTC_, *maxTC_; wxButton *applyScalesBTN_, *closeBTN_; enum { ID_drawAxis, ID_drawGraphBox, ID_gridLines, ID_drawTics, ID_ticDirection, ID_drawNumbers, ID_numbersFont, ID_drawLabel, ID_label, ID_label2, ID_labelFont, ID_applyScales, ID_logStyle, ID_logBase }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/PeakFindForm.h0000644012702201742730000000364711274636606017146 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_PEAKFINDFORM #define EXTREMA_PEAKFINDFORM #include #include "wx/wx.h" #include "wx/grid.h" class GRA_arrow3; class GRA_cartesianCurve; class VisualizationWindow; class PeakFindForm : public wxFrame { public: PeakFindForm( VisualizationWindow * ); private: void DrawArrow(); void EraseLastArrow(); void Initialize(); void ShowValues(); // event handlers void OnLeft( wxCommandEvent & ); void OnRight( wxCommandEvent & ); void OnSave( wxCommandEvent & ); void OnInitialize( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); VisualizationWindow *visualizationWindow_; wxRadioBox *maxMinRB_; wxTextCtrl *pxTC_, *pyTC_, *xvTC_, *yvTC_; bool first_; double xCurrent_, yCurrent_; int jPeak_; GRA_arrow3 *currentArrow_; GRA_cartesianCurve *curve_; std::vector xVec_, yVec_; std::vector xData_, yData_; int npts_; double arrowLength_; double xMin_, xMax_, xLogBase_, yMin_, yMax_, yLogBase_, yRange_; enum { ID_left, ID_right, ID_save, ID_initialize }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/WriteTextForm.cpp0000644012702201742730000001627111274636606017754 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "WriteTextForm.h" #include "AnalysisWindow.h" #include "ChooseFilePanel.h" #include "EVariableError.h" #include "TextVariable.h" #include "TVariableTable.h" #include "CMD_write.h" BEGIN_EVENT_TABLE( WriteTextForm, wxFrame ) EVT_BUTTON( wxID_APPLY, WriteTextForm::OnApply ) EVT_BUTTON( wxID_CLOSE, WriteTextForm::OnClose ) EVT_BUTTON( wxID_REFRESH, WriteTextForm::OnRefresh ) EVT_CLOSE( WriteTextForm::CloseEventHandler ) END_EVENT_TABLE() WriteTextForm::WriteTextForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Write text variables"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, false, wxT("Choose a data file for writing"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); variableList_ = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_MULTIPLE|wxLB_EXTENDED|wxLB_NEEDED_SB ); FillList(); mainSizer->Add( variableList_, wxSizerFlags(1).Expand().Border(wxALL,5) ); append_ = new wxCheckBox( this, wxID_ANY, wxT("Append data to the file") ); mainSizer->Add( append_, wxSizerFlags(0).Border(wxALL,5) ); append_->SetValue( false ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *refreshButton = new wxButton( bottomPanel, wxID_REFRESH, wxT("Refresh") ); refreshButton->SetToolTip( wxT("update the list of text above") ); bottomSizer->Add( refreshButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("write data to the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/WriteTextForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/WriteTextForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/WriteTextForm/WIDTH"), 550l ); int height = config->Read( wxT("/WriteTextForm/HEIGHT"), 300l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/WriteTextForm") ); Show( true ); } void WriteTextForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/WriteTextForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/WriteTextForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/WriteTextForm/WIDTH"), static_cast(width) ); config->Write( wxT("/WriteTextForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/WriteTextForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroWriteText(); Destroy(); } void WriteTextForm::OnRefresh( wxCommandEvent &WXUNUSED(event) ) { FillList(); } void WriteTextForm::FillList() { variableList_->Clear(); TVariableTable *tvTable = TVariableTable::GetTable(); int end = tvTable->Entries(); for( int i=0; iGetEntry( i ); if( tv->GetData().GetNumberOfDimensions() == 0 )variableList_->Append( tv->GetName() ); else { std::size_t len = tv->GetData().GetData().size(); for( std::size_t j=0; jGetName() ); variableList_->Append( name<GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was written"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_write *writeCommand = CMD_write::Instance(); writeCommand->SetFilename( fileName ); std::ofstream *outStream = writeCommand->GetStream(); if( outStream->is_open() )outStream->close(); outStream->clear( std::ios::goodbit ); if( append_->IsChecked() )outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out|std::ios::app ); else outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out ); if( !outStream->is_open() ) { outStream->clear( std::ios::goodbit ); wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } bool somethingChecked = false; int count = variableList_->GetCount(); for( int i=0; iIsChecked(i) )continue; somethingChecked = true; wxString line; wxString name( variableList_->GetString(i) ); try { TextVariable::GetVariable( name, false, line ); } catch( EVariableError const &e ) { outStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } (*outStream) << line.mb_str(wxConvUTF8) << "\n"; } outStream->close(); if( !somethingChecked ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no string variables were chosen"), wxT("Warning: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } void WriteTextForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/SetAspectRatioForm.h0000644012702201742730000000236611274636606020354 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_SETASPECTRATIO #define EXTREMA_SETASPECTRATIO #include "wx/wx.h" class VisualizationWindow; class SetAspectRatioForm : public wxFrame { public: SetAspectRatioForm( VisualizationWindow * ); // event handlers void OnOK( wxCommandEvent & ); void OnCancel( wxCommandEvent& ); void CloseEventHandler( wxCloseEvent & ); private: wxTextCtrl *heightTC_, *widthTC_; bool GetValues( double &, double & ); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/FitForm.cpp0000644012702201742730000022156511274636606016543 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "wx/datetime.h" #include "FitForm.h" #include "AnalysisWindow.h" #include "NumericVariable.h" #include "TextVariable.h" #include "NVariableTable.h" #include "EVariableError.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "GRA_window.h" #include "GRA_intCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_colorControl.h" #include "GRA_fontControl.h" #include "GRA_setOfCharacteristics.h" #include "EGraphicsError.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "GRA_drawableText.h" #include "Expression.h" #include "EExpressionError.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( FitForm, wxFrame ) EVT_COMBOBOX( ID_dvec, FitForm::OnDataVectorChange ) EVT_COMBOBOX( ID_ivec, FitForm::OnIndepVectorChange ) EVT_COMBOBOX( ID_evec, FitForm::OnErrorVectorChange ) EVT_COMBOBOX( ID_type, FitForm::OnFitTypeChange ) EVT_COMBOBOX( ID_degree, FitForm::OnDegreeChange ) EVT_BUTTON( ID_test, FitForm::OnTest ) EVT_BUTTON( ID_clear, FitForm::OnClear ) EVT_BUTTON( wxID_APPLY, FitForm::OnApply ) EVT_BUTTON( wxID_CLOSE, FitForm::OnClose ) EVT_CLOSE( FitForm::CloseEventHandler ) END_EVENT_TABLE() FitForm::FitForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Fit"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { CreateForm(); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/FitForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/FitForm/UPPERLEFTY"), 640l ); int width = 850; int height = 630; SetSize( ulx, uly, width, height ); Show( true ); FillOutForm(); wxString sTmp; config->Read( wxT("/FitForm/DATA_VECTOR"), &sTmp, wxT("") ); if( dataCB_->FindString(sTmp) > 0 ) { dVecName_ = sTmp; dataCB_->SetStringSelection( sTmp ); exprST_->SetLabel( wxString(wxT(" Fit expression: "))+dVecName_+wxT(" = ") ); indepCB_->Enable( true ); indepST_->Enable( true ); sTmp.clear(); config->Read( wxT("/FitForm/INDEPENDENT_VECTOR"), &sTmp, wxT("") ); if( indepCB_->FindString(sTmp) > 0 ) { iVecName_ = sTmp; indepCB_->SetStringSelection( sTmp ); minST_->Enable( true ); minTC_->Enable( true ); maxST_->Enable( true ); maxTC_->Enable( true ); double imin, imax; iVec_ = NVariableTable::GetTable()->GetVariable( iVecName_ ); iVec_->GetData().GetMinMax( imin, imax ); sTmp.clear(); minTC_->SetValue( sTmp<SetValue( sTmp<Enable( true ); errorST_->Enable( true ); sTmp.clear(); config->Read( wxT("/FitForm/ERROR_VECTOR"), &sTmp, wxT("") ); if( errorCB_->FindString(sTmp) > 0 ) { eVecName_ = sTmp; errorCB_->SetStringSelection( sTmp ); } typeCB_->Enable( true ); typeST_->Enable( true ); sTmp.clear(); config->Read( wxT("/FitForm/FIT_TYPE"), &sTmp, wxT("") ); if( typeCB_->FindString(sTmp) >= 0 ) { typeCB_->SetStringSelection( sTmp ); FitTypeChange(); wxString type( typeCB_->GetStringSelection() ); int nParams = -1; if( type==wxT("Legendre polynomials") || type==wxT("Polynomial") || type==wxT("Custom") ) { sTmp.clear(); config->Read( wxT("/FitForm/DEGREE"), &sTmp, wxT("") ); long n; if( sTmp.ToLong(&n) ) { nParams = type==wxT("Custom") ? n : n+1; degreeCB_->SetStringSelection( sTmp ); } } sTmp.clear(); config->Read( wxT("/FitForm/EXPRESSION"), &sTmp, wxT("") ); exprTC_->SetValue( sTmp ); for( int i=0; iRead( wxString(wxT("/FitForm/STARTVALUE_"))<Read( wxString(wxT("/FitForm/FIXED_"))<Read( wxT("/FitForm/XLOC"), &sTmp, wxT("53.0") ); legxTC_->SetValue( sTmp ); sTmp.clear(); config->Read( wxT("/FitForm/YLOC"), &sTmp, wxT("89.0") ); legyTC_->SetValue( sTmp ); Layout(); } void FitForm::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->AddSpacer( 10 ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *topRightPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *topRightSizer = new wxGridSizer( 5, 2, 5, 5 ); dataST_ = new wxStaticText( topRightPanel, wxID_ANY, wxT("Data vector") ); topRightSizer->Add( dataST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); dataCB_ = new wxComboBox( topRightPanel, ID_dvec, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topRightSizer->Add( dataCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); indepST_ = new wxStaticText( topRightPanel, wxID_ANY, wxT("Independent vector") ); topRightSizer->Add( indepST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); indepCB_ = new wxComboBox( topRightPanel, ID_ivec, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topRightSizer->Add( indepCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); errorST_ = new wxStaticText( topRightPanel, wxID_ANY, wxT("Error vector") ); topRightSizer->Add( errorST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); errorCB_ = new wxComboBox( topRightPanel, ID_evec, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topRightSizer->Add( errorCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); typeST_ = new wxStaticText( topRightPanel, wxID_ANY, wxT("Type of fit") ); topRightSizer->Add( typeST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); typeCB_ = new wxComboBox( topRightPanel, ID_type, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topRightSizer->Add( typeCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); degreeST_ = new wxStaticText( topRightPanel, wxID_ANY, wxT("Degree of polynomial") ); topRightSizer->Add( degreeST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); degreeCB_ = new wxComboBox( topRightPanel, ID_degree, wxT(""), wxDefaultPosition, wxSize(70,25), 0, 0, wxCB_READONLY ); topRightSizer->Add( degreeCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); topRightPanel->SetSizer( topRightSizer ); topSizer->Add( topRightPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); wxPanel *topMidPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topMidSizer = new wxBoxSizer( wxVERTICAL ); topMidSizer->AddSpacer( 14 ); wxPanel *rangePanel = new wxPanel( topMidPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *rangeSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *minPanel = new wxPanel( rangePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *minSizer = new wxBoxSizer( wxVERTICAL ); minST_ = new wxStaticText( minPanel, wxID_ANY, wxT("Min") ); minSizer->Add( minST_, wxSizerFlags(0).Center().Border(wxALL,1) ); minTC_ = new wxTextCtrl( minPanel, wxID_ANY ); minSizer->Add( minTC_, wxSizerFlags(0).Center().Border(wxALL,1) ); minPanel->SetSizer( minSizer ); rangeSizer->Add( minPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); wxPanel *maxPanel = new wxPanel( rangePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *maxSizer = new wxBoxSizer( wxVERTICAL ); maxST_ = new wxStaticText( maxPanel, wxID_ANY, wxT("Max") ); maxSizer->Add( maxST_, wxSizerFlags(0).Center().Border(wxALL,1) ); maxTC_ = new wxTextCtrl( maxPanel, wxID_ANY ); maxSizer->Add( maxTC_, wxSizerFlags(0).Center().Border(wxALL,1) ); maxPanel->SetSizer( maxSizer ); rangeSizer->Add( maxPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); rangePanel->SetSizer( rangeSizer ); topMidSizer->Add( rangePanel, wxSizerFlags(0).Left().Border(wxALL,1) ); topMidPanel->SetSizer( topMidSizer ); topSizer->Add( topMidPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); topSizer->AddSpacer( 25 ); wxPanel *resultsPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER ); wxGridSizer *resultsSizer = new wxGridSizer( 3, 2, 1, 1 ); resultsSizer->Add( new wxStaticText(resultsPanel,wxID_ANY,wxT("")), wxSizerFlags(0).Left().Border(wxTOP,10) ); resultsSizer->Add( new wxStaticText(resultsPanel,wxID_ANY,wxT(" Fit Results")), wxSizerFlags(0).Left().Border(wxTOP,10) ); resultsSizer->Add( new wxStaticText(resultsPanel,wxID_ANY,wxT("Total chi square")), wxSizerFlags(0).Right().Border(wxTOP,10) ); chiTC_ = new wxTextCtrl( resultsPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(120,25), wxTE_READONLY ); resultsSizer->Add( chiTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); resultsSizer->Add( new wxStaticText(resultsPanel,wxID_ANY,wxT("Confidence level")), wxSizerFlags(0).Right().Border(wxTOP,10) ); confTC_ = new wxTextCtrl( resultsPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(120,25), wxTE_READONLY ); resultsSizer->Add( confTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); resultsSizer->Add( new wxStaticText(resultsPanel,wxID_ANY,wxT(" Degrees of freedom")), wxSizerFlags(0).Right().Border(wxTOP,10) ); degFreeTC_ = new wxTextCtrl( resultsPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(120,25), wxTE_READONLY ); resultsSizer->Add( degFreeTC_, wxSizerFlags(0).Left().Border(wxALL,10) ); resultsPanel->SetSizer( resultsSizer ); topSizer->Add( resultsPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *exprPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *exprSizer = new wxBoxSizer( wxHORIZONTAL ); exprST_ = new wxStaticText( exprPanel, wxID_ANY, wxT(" Fit expression: Data vector = ") ); exprSizer->Add( exprST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); exprTC_ = new wxTextCtrl( exprPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(520,25), wxTE_DONTWRAP ); exprSizer->Add( exprTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); exprPanel->SetSizer( exprSizer ); mainSizer->Add( exprPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *parmPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxFlexGridSizer *parmSizer = new wxFlexGridSizer( 9, 4, 5, 5 ); parmSizer->Add( new wxStaticText(parmPanel,wxID_ANY,wxT("Fix ")), wxSizerFlags(0).Right().Border(wxTOP,10) ); parmSizer->Add( new wxStaticText(parmPanel,wxID_ANY,wxT("Parameters")), wxSizerFlags(0).Center().Border(wxTOP,10) ); parmSizer->Add( new wxStaticText(parmPanel,wxID_ANY,wxT("Start values")), wxSizerFlags(0).Center().Border(wxTOP,10) ); parmSizer->Add( new wxStaticText(parmPanel,wxID_ANY,wxT("Fit results")), wxSizerFlags(0).Center().Border(wxTOP,10) ); for( std::size_t i=0; i<8; ++i ) { pCkB_[i] = new wxCheckBox( parmPanel, wxID_ANY, wxT("") ); parmSizer->Add( pCkB_[i], wxSizerFlags(0).Left().Border(wxTOP,4) ); pnameTC_[i] = new wxTextCtrl( parmPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(200,25), wxTE_READONLY ); parmSizer->Add( pnameTC_[i], wxSizerFlags(0) ); pstartTC_[i] = new wxTextCtrl( parmPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(200,25), wxTE_DONTWRAP ); parmSizer->Add( pstartTC_[i], wxSizerFlags(0) ); presultTC_[i] = new wxTextCtrl( parmPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(200,25), wxTE_READONLY ); parmSizer->Add( presultTC_[i], wxSizerFlags(0) ); } parmPanel->SetSizer( parmSizer ); mainSizer->Add( parmPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *legendPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *legendSizer = new wxBoxSizer( wxHORIZONTAL ); legendSizer->Add( new wxStaticText(legendPanel,wxID_ANY,wxT("Legend location: %x ")), wxSizerFlags(0).Left().Border(wxTOP,5) ); legxTC_ = new wxTextCtrl( legendPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(160,25), wxTE_DONTWRAP ); legendSizer->Add( legxTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); legendSizer->Add( new wxStaticText(legendPanel,wxID_ANY,wxT(" %y")), wxSizerFlags(0).Left().Border(wxTOP,5) ); legyTC_ = new wxTextCtrl( legendPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(160,25), wxTE_DONTWRAP ); legendSizer->Add( legyTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); legendPanel->SetSizer( legendSizer ); mainSizer->Add( legendPanel, wxSizerFlags(0).Center().Border(wxALL,10) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); testButton_ = new wxButton( bottomPanel, ID_test, wxT("Test the fit") ); testButton_->SetToolTip( wxT("click to plot data and the fit expression using the current parameter values") ); bottomSizer->Add( testButton_, wxSizerFlags(0).Border(wxALL,10) ); wxButton *clearButton = new wxButton( bottomPanel, ID_clear, wxT("Clear graphics") ); clearButton->SetToolTip( wxT("click to clear the visualization window") ); bottomSizer->Add( clearButton, wxSizerFlags(0).Border(wxALL,10) ); applyButton_ = new wxButton( bottomPanel, wxID_APPLY, wxT("Do the fit") ); applyButton_->SetToolTip( wxT("calculate the fit parameters and plot the result") ); bottomSizer->Add( applyButton_, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); } void FitForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/FitForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/FitForm/UPPERLEFTY"), static_cast(uly) ); // config->Write( wxT("/FitForm/DATA_VECTOR"), dataCB_->GetStringSelection() ); config->Write( wxT("/FitForm/INDEPENDENT_VECTOR"), indepCB_->GetStringSelection() ); config->Write( wxT("/FitForm/ERROR_VECTOR"), errorCB_->GetStringSelection() ); wxString type( typeCB_->GetStringSelection() ); config->Write( wxT("/FitForm/FIT_TYPE"), type ); int nParams = 0; if( type==wxT("Legendre polynomials") || type==wxT("Polynomial") || type==wxT("Custom") ) { wxString s( degreeCB_->GetStringSelection() ); long nl; s.ToLong( &nl ); nParams = static_cast(nl); if( type==wxT("Legendre polynomials") || type==wxT("Polynomial") )++nParams; config->Write( wxT("/FitForm/DEGREE"), s ); } else if( type == wxT("Gaussian") )nParams = 3; else if( type == wxT("Least squares line") )nParams = 2; else if( type == wxT("Constant") )nParams = 1; config->Write( wxT("/FitForm/EXPRESSION"), exprTC_->GetValue() ); for( int i=0; iWrite( wxString(wxT("/FitForm/STARTVALUE_"))<GetValue() ); config->Write( wxString(wxT("/FitForm/FIXED_"))<IsChecked() ); } } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroFit(); Destroy(); } void FitForm::FillOutForm() { UpdateVectors( dataCB_ ); UpdateVectors( indepCB_ ); UpdateVectors( errorCB_ ); // typeCB_->Append( wxT("Polynomial") ); typeCB_->Append( wxT("Legendre polynomials") ); typeCB_->Append( wxT("Gaussian") ); typeCB_->Append( wxT("Least squares line") ); typeCB_->Append( wxT("Constant") ); typeCB_->Append( wxT("Custom") ); // degreeCB_->Append( wxT("1") ); degreeCB_->Append( wxT("2") ); degreeCB_->Append( wxT("3") ); degreeCB_->Append( wxT("4") ); degreeCB_->Append( wxT("5") ); degreeCB_->Append( wxT("6") ); degreeCB_->Append( wxT("7") ); degreeCB_->Append( wxT("8") ); // for( std::size_t i=0; i<8; ++i ) { pCkB_[i]->SetValue( false ); pCkB_[i]->Enable( false ); pnameTC_[i]->Clear(); pnameTC_[i]->Enable( false ); pstartTC_[i]->Clear(); pstartTC_[i]->Enable( false ); presultTC_[i]->Clear(); presultTC_[i]->Enable( false ); } // dataCB_->Enable( true ); dataST_->Enable( true ); indepCB_->Enable( false ); indepST_->Enable( false ); minST_->Enable( false ); minTC_->Enable( false ); maxST_->Enable( false ); maxTC_->Enable( false ); errorCB_->Enable( false ); errorST_->Enable( false ); typeCB_->Enable( false ); typeST_->Enable( false ); degreeCB_->Enable( false ); degreeST_->Enable( false ); exprTC_->Enable( true ); exprST_->Enable( true ); // eVecName_.clear(); pStartValues_.clear(); } void FitForm::UpdateVectors( wxComboBox *cb ) { cb->Clear(); cb->Append( wxT("") ); NVariableTable *nvTable = NVariableTable::GetTable(); int entries = nvTable->Entries(); for( int i=0; iGetEntry(i); if( nv->GetData().GetNumberOfDimensions() == 1 )cb->Append( nv->GetName() ); } } void FitForm::ClearResults() { chiTC_->Clear(); confTC_->Clear(); degFreeTC_->Clear(); for( std::size_t i=0; i<8; ++i )presultTC_[i]->Clear(); } void FitForm::SetupParameterFields( int i, bool enabled, bool checked, wxString const &value ) { pCkB_[i]->SetValue( checked ); pCkB_[i]->Enable( enabled ); pnameTC_[i]->Clear(); pnameTC_[i]->Enable( enabled ); pstartTC_[i]->Clear(); pstartTC_[i]->Enable( enabled ); if( enabled ) { pnameTC_[i]->SetValue( wxString(wxT("a"))<SetValue( value ); } presultTC_[i]->Enable( enabled ); } void FitForm::UpdateExpression() { dVecName_ = dataCB_->GetStringSelection(); iVecName_ = indepCB_->GetStringSelection(); int n = -1; fitExpression_.clear(); fitTitle_.clear(); wxString selection( typeCB_->GetStringSelection() ); if( selection == wxT("Legendre polynomials") ) { long nl; degreeCB_->GetStringSelection().ToLong( &nl ); n = static_cast(nl); for( int i=0; iGetValue() + wxT("*LEGENDRE("); fitExpression_ << i; fitExpression_ += wxT(",") + iVecName_ + wxT(")+"); fitTitle_ += pnameTC_[i]->GetValue() + wxT("*P<_>"); fitTitle_ << i; fitTitle_ += wxT("<^>(") + iVecName_ + wxT(")+"); } fitExpression_ += pnameTC_[n]->GetValue() + wxT("*LEGENDRE("); fitExpression_ << n; fitExpression_ += wxT(",") + iVecName_ + wxT(")"); fitTitle_ += pnameTC_[n]->GetValue() + wxT("*P<_>"); fitTitle_ << n; fitTitle_ += wxT("<^>(") + iVecName_ + wxT(")"); exprTC_->SetValue( fitExpression_ ); } else if( selection == wxT("Polynomial") ) { long nl; degreeCB_->GetStringSelection().ToLong( &nl ); n = static_cast(nl); fitExpression_ = pnameTC_[0]->GetValue() + wxT("+") + pnameTC_[1]->GetValue() + wxT("*") + iVecName_; fitTitle_ = pnameTC_[0]->GetValue() + wxT("+") + pnameTC_[1]->GetValue() + wxT("*") + iVecName_; for( int i=2; i<=n; ++i ) { fitExpression_ += wxT("+") + pnameTC_[i]->GetValue() + wxT("*") + iVecName_ + wxT("^"); fitExpression_ << i; fitTitle_ += wxT("+") + pnameTC_[i]->GetValue() + wxT("*") + iVecName_ + wxT("<^>"); fitTitle_ << i; fitTitle_ += wxT("<_>"); } exprTC_->SetValue( fitExpression_ ); } else if( selection == wxT("Gaussian") ) { fitExpression_ = pnameTC_[0]->GetValue() + wxT("*exp(-(") + iVecName_ + wxT("-") + pnameTC_[1]->GetValue() + wxT(")^2/") + pnameTC_[2]->GetValue() + wxT("^2)"); fitTitle_ = pnameTC_[0]->GetValue() + wxT("*exp(") + iVecName_ + wxT("-") + pnameTC_[1]->GetValue() + wxT(")<^>2<_>/") + pnameTC_[2]->GetValue() + wxT("<^>2<_>)"); exprTC_->SetValue( fitExpression_ ); } else if( selection == wxT("Least squares line") ) { fitExpression_ = pnameTC_[0]->GetValue() + wxT("+") + pnameTC_[1]->GetValue() + wxT("*") + iVecName_; fitTitle_ = pnameTC_[0]->GetValue() + wxT("+") + pnameTC_[1]->GetValue() + wxT("*") + iVecName_; exprTC_->SetValue( fitExpression_ ); } else if( selection == wxT("Constant") ) { fitExpression_ = pnameTC_[0]->GetValue(); fitTitle_ = pnameTC_[0]->GetValue(); exprTC_->SetValue( fitExpression_ ); } else // Custom { fitExpression_ = exprTC_->GetValue(); fitTitle_ = fitExpression_; } } void FitForm::OnDataVectorChange( wxCommandEvent &WXUNUSED(event) ) { dVecName_ = dataCB_->GetStringSelection(); indepCB_->Enable( true ); indepST_->Enable( true ); pStartValues_.clear(); exprST_->SetLabel( wxString(wxT(" Fit expression: "))+dVecName_+wxT(" = ") ); ClearResults(); Layout(); } void FitForm::OnIndepVectorChange( wxCommandEvent &WXUNUSED(event) ) { iVecName_ = indepCB_->GetStringSelection(); minTC_->Enable( true ); minST_->Enable( true ); maxTC_->Enable( true ); maxST_->Enable( true ); double imin, imax; iVec_ = NVariableTable::GetTable()->GetVariable( iVecName_ ); iVec_->GetData().GetMinMax( imin, imax ); wxString s; minTC_->SetValue( s<SetValue( s<GetStringSelection().ToLong( &nl ); //int type = static_cast(nl); //degreeCB_->GetStringSelection().ToLong( &nl ); //if( type==2 || type==3 || type==4 || nl>=0L )UpdateExpression(); errorST_->Enable( true ); errorCB_->Enable( true ); typeCB_->Enable( true ); typeST_->Enable( true ); FitTypeChange(); UpdateExpression(); pStartValues_.clear(); ClearResults(); } void FitForm::OnErrorVectorChange( wxCommandEvent &WXUNUSED(event) ) { eVecName_.clear(); wxString s( errorCB_->GetStringSelection() ); if( s != wxT("") )eVecName_ = s; } void FitForm::OnFitTypeChange( wxCommandEvent &WXUNUSED(event) ) { FitTypeChange(); UpdateExpression(); ClearResults(); } void FitForm::FitTypeChange() { wxString selection( typeCB_->GetStringSelection() ); if( selection == wxT("Legendre polynomials") ) { degreeST_->SetLabel( wxT("Degree of polynomial") ); degreeST_->Enable( true ); degreeCB_->Enable( true ); degreeCB_->SetSelection( 0 ); SetupParameterFields( 0, true, false, wxT("1.0") ); SetupParameterFields( 1, true, false, wxT("1.0") ); for( std::size_t i=2; i<8; ++i )SetupParameterFields( i, false, false ); if( degreeCB_->GetCount() == 8 )degreeCB_->Delete(7); exprTC_->Clear(); exprTC_->SetEditable( false ); } else if( selection == wxT("Polynomial") ) { degreeST_->SetLabel( wxT("Degree of Polynomial") ); degreeST_->Enable( true ); degreeCB_->Enable( true ); degreeCB_->SetSelection( 0 ); SetupParameterFields( 0, true, false, wxT("1.0") ); SetupParameterFields( 1, true, false, wxT("1.0") ); for( std::size_t i=2; i<8; ++i )SetupParameterFields( i, false, false ); if( degreeCB_->GetCount() == 8 )degreeCB_->Delete(7); exprTC_->Clear(); exprTC_->SetEditable( false ); } else if( selection == wxT("Gaussian") ) { degreeST_->Enable( false ); degreeCB_->Enable( false ); // SetupParameterFields( 0, true, false, wxT("1.0") ); SetupParameterFields( 1, true, false, wxT("1.0") ); SetupParameterFields( 2, true, false, wxT("1.0") ); for( std::size_t i=3; i<8; ++i )SetupParameterFields( i, false, false ); exprTC_->Clear(); exprTC_->SetEditable( false ); } else if( selection == wxT("Least squares line") ) { degreeST_->Enable( false ); degreeCB_->Enable( false ); // SetupParameterFields( 0, true, false, wxT("1.0") ); SetupParameterFields( 1, true, false, wxT("1.0") ); for( std::size_t i=2; i<8; ++i )SetupParameterFields( i, false, false ); exprTC_->Clear(); exprTC_->SetEditable( false ); } else if( selection == wxT("Constant") ) { degreeST_->Enable( false ); degreeCB_->Enable( false ); // SetupParameterFields( 0, true, false, wxT("1.0") ); for( std::size_t i=1; i<8; ++i )SetupParameterFields( i, false, false ); exprTC_->SetEditable( false ); } else // Custom { degreeST_->SetLabel( wxT("Number of parameters") ); degreeST_->Enable( true ); degreeCB_->Enable( true ); degreeCB_->SetSelection( 0 ); SetupParameterFields( 0, true, false, wxT("1.0") ); for( std::size_t i=1; i<8; ++i )SetupParameterFields( i, false, false ); if( degreeCB_->GetCount() == 7 )degreeCB_->Append( wxT("8") ); exprTC_->Clear(); exprTC_->SetEditable( true ); } pStartValues_.clear(); } void FitForm::OnDegreeChange( wxCommandEvent &WXUNUSED(event) ) { DegreeChange(); } void FitForm::DegreeChange() { long nl; degreeCB_->GetStringSelection().ToLong( &nl ); int degree = static_cast(nl); // // if custom fit, degree is number of parameters, otherwise value is degree of polynomial, // and there is one more parameter than the degree of the polynomial // wxString type( typeCB_->GetStringSelection() ); int nparams = type==wxT("Custom") ? degree : degree+1; for( int i=0; iIsChecked(); std::size_t i = 0; while ( i<8 && pnameTC_[i]->IsEnabled() ) { wxString name( pnameTC_[i]->GetValue() ); double startValue; if( !pstartTC_[i]->GetValue().ToDouble(&startValue) ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("invalid start value entered for parameter "))<ShowModal(); return; } NVariableTable::GetTable()->RemoveEntry( name ); NumericVariable *nv = NumericVariable::PutVariable( name, startValue, pvStr_ ); if( !pCkB_[i]->IsChecked() )nv->GetData().SetFit(); else presultTC_[i]->SetValue( pstartTC_[i]->GetValue() ); ++i; } } void FitForm::OnTest( wxCommandEvent &WXUNUSED(event) ) { TestTheFit(); } void FitForm::TestTheFit() { UpdateExpression(); CreateParameters(); // eVecName_.clear(); if( errorCB_->GetSelection() > 0 )eVecName_ = errorCB_->GetStringSelection(); // int nParams = 0; while ( pnameTC_[nParams]->IsEnabled() )++nParams; pStartValues_.push_back( std::vector(nParams) ); for( int i=0; iGetValue().ToDouble(&pStartValues_.back().at(i)) ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("invalid start value entered for parameter "))<ShowModal(); return; } } GRA_window *currentWindow = ExGlobals::GetGraphWindow(); // GRA_setOfCharacteristics *generalC = currentWindow->GetGeneralCharacteristics(); GRA_setOfCharacteristics *dataCurveC = currentWindow->GetDataCurveCharacteristics(); GRA_setOfCharacteristics *xAxisC = currentWindow->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = currentWindow->GetYAxisCharacteristics(); GRA_setOfCharacteristics *textC = currentWindow->GetTextCharacteristics(); // GRA_setOfCharacteristics generalCsave( *generalC ); GRA_setOfCharacteristics dataCurveCsave( *dataCurveC ); GRA_setOfCharacteristics xAxisCsave( *xAxisC ); GRA_setOfCharacteristics yAxisCsave( *yAxisC ); GRA_setOfCharacteristics textCsave( *textC ); // currentWindow->Clear(); currentWindow->Erase(); std::vector y, x, xe1, ye1, xe2, ye2; try { NumericVariable::GetVector( dVecName_, wxT("data variable"), y ); NumericVariable::GetVector( iVecName_, wxT("independent variable"), x ); if( !eVecName_.empty() )NumericVariable::GetVector( eVecName_, wxT("error variable"), ye1 ); } catch( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::size_t num = std::min( x.size(), y.size() ); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( !eVecName_.empty() ) { num = std::min( num, ye1.size() ); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( num < ye1.size() )ye1.resize( num ); } // static_cast(dataCurveC->Get(wxT("PLOTSYMBOL")))->Set( -8 ); if( num >= 200 ) static_cast(dataCurveC->Get(wxT("PLOTSYMBOLSIZE")))->SetAsPercent( 0.5 ); static_cast(dataCurveC->Get(wxT("PLOTSYMBOLCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); // static_cast(xAxisC->Get(wxT("LABEL")))->Set( iVecName_ ); static_cast(xAxisC->Get(wxT("LABELON")))->Set( true ); // static_cast(yAxisC->Get(wxT("LABEL")))->Set( dVecName_ ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( true ); // static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( true ); // std::vector x2(2), y2(2); UsefulFunctions::MinMax( x, 0, num, x2[0], x2[1] ); if( !ye1.empty() ) { for( std::size_t i=0; i y[i]-ye1[i] )y2[0] = y[i]-ye1[i]; } } else { for( std::size_t i=0; i y[i] )y2[0] = y[i]; } } GRA_cartesianAxes *cartesianAxes = 0; GRA_cartesianCurve *cartesianCurve = 0; try { cartesianAxes = new GRA_cartesianAxes(x2,y2,false,false); cartesianCurve = new GRA_cartesianCurve(x,y,xe1,ye1,xe2,ye2); cartesianAxes->Make(); cartesianCurve->Make(); } catch (EGraphicsError &e) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete cartesianAxes; delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } wxClientDC dc( ExGlobals::GetwxWindow() ); cartesianAxes->Draw( ExGlobals::GetGraphicsOutput(), dc ); cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianAxes ); currentWindow->AddDrawableObject( cartesianCurve ); ye1.erase( ye1.begin(), ye1.end() ); // static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 1 ); static_cast(textC->Get(wxT("ANGLE")))->Set( 0.0 ); static_cast(textC->Get(wxT("COLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(textC->Get(wxT("FONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 3.0 ); static_cast(textC->Get(wxT("INTERACTIVE")))->Set( false ); double yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsPercent(); double xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsPercent(); static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( xlaxis ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yuaxis+1 ); // wxString title( wxT("FIT: ") ); title += dVecName_ + wxT(" = ") + fitTitle_; GRA_drawableText *dt = new GRA_drawableText( title ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 3 ); // lower right static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 2.0 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( 98.0 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( 97.5 ); wxDateTime now = wxDateTime::Now(); wxString time = now.FormatTime(); wxString date = now.FormatDate(); dt = new GRA_drawableText( time+wxT(" ")+date ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // NumericVariable *nv = NVariableTable::GetTable()->GetVariable( dVecName_ ); if( !nv->GetOrigin().empty() ) { static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( 94.5 ); dt = new GRA_drawableText( nv->GetOrigin() ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); } static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 1 ); // lower left static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 3.0 ); // // re-evaluate the last expression // nv = NVariableTable::GetTable()->GetVariable( iVecName_ ); std::vector iVec( nv->GetData().GetData() ); double imin, imax; nv->GetData().GetMinMax( imin, imax ); int newNum = 200; double inc = (imax-imin)/(newNum-1); std::vector newX( newNum ); for( int i=0; iGetData().SetData( newX ); nv->GetData().SetDimMag( 0, newX.size() ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( xlaxis+3 ); static_cast(dataCurveC->Get(wxT("PLOTSYMBOL")))->Set( 0 ); static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 2.0 ); double yloc = yuaxis; int nTest = pStartValues_.size(); int icolor = -1; for( int i=0; iGetVariable(pnameTC_[j]->GetValue())->GetData().SetScalarValue( pStartValues_[i][j] ); Expression expr( fitExpression_ ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; nv->GetData().SetData( iVec ); nv->GetData().SetDimMag( 0, iVec.size() ); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::vector newY( expr.GetFinalAnswer().GetData() ); if( newY.size() == 1 )newY.insert( newY.begin()+1, newX.size()-1, newY[0] ); // --icolor; if( icolor == -6 )--icolor; // to not use yellow (which is hard to see) GRA_color *color = GRA_colorControl::GetColor( icolor ); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( color ); static_cast(dataCurveC->Get(wxT("CURVELINETYPE")))->Set( i+2 ); cartesianCurve = new GRA_cartesianCurve( newX, newY, xe1, ye1, xe2, ye2 ); try { cartesianCurve->Make(); } catch (EGraphicsError &e) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; nv->GetData().SetData( iVec ); nv->GetData().SetDimMag( 0, iVec.size() ); delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianCurve ); // static_cast(textC->Get(wxT("COLOR")))->Set( color ); yloc -= 3.0; static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); wxString nameList; for( int j=0; jGetValue() + wxT(" = ") + pstartTC_[j]->GetValue() + wxT(", "); nameList += pnameTC_[nParams-1]->GetValue() + wxT(" = ") + pstartTC_[nParams-1]->GetValue(); GRA_drawableText *dt = new GRA_drawableText( nameList ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; nv->GetData().SetData( iVec ); nv->GetData().SetDimMag( 0, iVec.size() ); delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); } nv->GetData().SetData( iVec ); nv->GetData().SetDimMag( 0, iVec.size() ); // ExGlobals::ReplotCurrentWindow(); // *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; // if( ExGlobals::StackIsOn() ) { wxString line( wxT("FORM FIT,") ); wxString degreeS( degreeCB_->GetStringSelection() ); wxString type( typeCB_->GetStringSelection() ); long nl; degreeS.ToLong( &nl ); int degree = static_cast( nl ); int nparams = type==wxT("Custom") ? degree : degree+1; wxString fixed( wxT("[") ); wxString start( wxT("[") ); for( int i=0; iIsChecked() ? wxT("1;") : wxT("0;"); start += pstartTC_[i]->GetValue() + wxT(";"); } fixed += pCkB_[nparams-1]->IsChecked() ? wxT("1") : wxT("0"); start += pstartTC_[nparams-1]->GetValue(); fixed += wxT("]"); start += wxT("]"); line += dVecName_ + wxT(",") + iVecName_ + wxT(",") + minTC_->GetValue() + wxT(",") + maxTC_->GetValue() + wxT(",") + eVecName_ + wxT(",'") + type + wxT("',") + degreeS + wxT(",'") + exprTC_->GetValue() + wxT("',") + fixed + wxT(",") + start + wxT(",") + legxTC_->GetValue() + wxT(",") + legyTC_->GetValue() + wxT(",'TEST THE FIT'"); ExGlobals::WriteStack( line ); } } void FitForm::OnClear( wxCommandEvent &WXUNUSED(event) ) { ClearGraphics(); } void FitForm::ClearGraphics() { ExGlobals::ClearGraphicsMonitor(); ExGlobals::ClearWindows(); pStartValues_.clear(); } void FitForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { DoTheFit(); } void FitForm::DoTheFit() { UpdateExpression(); CreateParameters(); pStartValues_.clear(); // wxString s( dataCB_->GetStringSelection() ); if( s == wxT("") ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("a data vector must be chosen"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dVecName_ = s; // s = indepCB_->GetStringSelection(); if( s == wxT("") ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("an independent vector must be chosen"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } iVecName_ = s; // eVecName_.clear(); s = errorCB_->GetStringSelection(); if( s != wxT("") )eVecName_ = s; // wxString command( wxT("FIT") ); int ntmax = 51; double tolerance = 0.00001; // std::vector xVecSave, xVec, yVec, errorVec; try { NumericVariable::GetVector( dVecName_, wxT("data variable"), yVec ); NumericVariable::GetVector( iVecName_, wxT("independent variable"), xVecSave ); if( !eVecName_.empty() ) NumericVariable::GetVector( eVecName_, wxT("data error variable"), errorVec ); } catch( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } xVec.assign( xVecSave.begin(), xVecSave.end() ); // std::size_t num = std::min( xVec.size(), yVec.size() ); if( num < xVec.size() )xVec.resize( num ); if( num < yVec.size() )yVec.resize( num ); if( eVecName_.empty() )errorVec.assign( num, 1.0 ); else { num = std::min( num, errorVec.size() ); if( num < xVec.size() )xVec.resize( num ); if( num < yVec.size() )yVec.resize( num ); if( num < errorVec.size() )errorVec.resize( num ); } if( !minTC_->GetValue().ToDouble(&minRange_) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for min"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( !maxTC_->GetValue().ToDouble(&maxRange_) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for max"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::vector newX, newY, newE; for( std::size_t i=0; i=minRange_ && xVec[i]<=maxRange_ ) { newX.push_back( xVec[i] ); newY.push_back( yVec[i] ); newE.push_back( errorVec[i] ); } } if( newX.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("there are no data values within the independent vector range"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } num = newX.size(); NumericVariable *nvX = NVariableTable::GetTable()->GetVariable( iVecName_ ); nvX->GetData().SetData( newX ); nvX->GetData().SetDimMag( 0, newX.size() ); // // decode the expression // Expression expr( fitExpression_ ); expr.SetIsaFit(); try { expr.Evaluate(); } catch ( EExpressionError &e ) { nvX->GetData().SetData( xVecSave ); nvX->GetData().SetDimMag( 0, xVecSave.size() ); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::size_t const nparam = expr.GetNumberOfFitParameters(); if( nparam == 0 ) { nvX->GetData().SetData( xVecSave ); nvX->GetData().SetDimMag( 0, xVecSave.size() ); wxMessageDialog *md = new wxMessageDialog( this, wxT("there are no fitting parameters in the expression"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( num <= nparam ) { nvX->GetData().SetData( xVecSave ); nvX->GetData().SetDimMag( 0, xVecSave.size() ); wxMessageDialog *md = new wxMessageDialog( this, wxT("number of data points <= number of parameters"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } // do the fit // std::vector pp( nparam, 0.0 ); // // initial parameter values // for( std::size_t i=0; i p1( pp ); // save original parameter values std::vector pSave( pp ); std::vector e1( nparam ), e2( nparam ); std::vector< std::vector > errmat( nparam ); for( std::size_t i=0; iGetData().SetData( xVecSave ); nvX->GetData().SetDimMag( 0, xVecSave.size() ); for( std::size_t i=0; iShowModal(); return; } catch (...) { nvX->GetData().SetData( xVecSave ); nvX->GetData().SetDimMag( 0, xVecSave.size() ); for( std::size_t i=0; iShowModal(); return; } nvX->GetData().SetData( xVecSave ); nvX->GetData().SetDimMag( 0, xVecSave.size() ); // // the fit was successful // re-evaluate the last expression and make new variable using the // calculated parameter values // Expression expr2( fitExpression_ ); try { expr2.Evaluate(); } catch ( EExpressionError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } pvStr_ = wxT("FIT: ") + dVecName_ + wxT(" = ") + fitExpression_; // // the fit is re-evaluated at every data point, // not just the points within the independent vector range // NumericData nd( expr2.GetFinalAnswer() ); wxString yfit( dVecName_+wxT("$UPDATE") ); try { switch ( nd.GetNumberOfDimensions() ) { case 0: NumericVariable::PutVariable( yfit, nd.GetScalarValue(), pvStr_ ); break; case 1: NumericVariable::PutVariable( yfit, nd.GetData(), 0, pvStr_ ); break; case 2: NumericVariable::PutVariable( yfit, nd.GetData(), nd.GetDimMag(0), nd.GetDimMag(1), pvStr_ ); } } catch ( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } // // make residual vector with xNew.size() values // wxString name; std::vector residual; std::size_t xvSize = xVec.size(); for( std::size_t i=0; i=minRange_ && xVec[i]<=maxRange_ )residual.push_back( nd.GetData()[i]-yVec[i] ); } try { name = wxT("FIT$RESIDUAL"); NumericVariable::PutVariable( name, residual, 0, pvStr_ ); name = wxT("FIT$XMIN"); NumericVariable::PutVariable( name, minRange_, pvStr_ ); name = wxT("FIT$XMAX"); NumericVariable::PutVariable( name, maxRange_, pvStr_ ); name = wxT("FIT$XRANGE"); NumericVariable::PutVariable( name, newX, 0, pvStr_ ); } catch ( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } // // update the parameters and definition table after a successful fit // pStrings_.assign( expr.GetFitParameterNames().begin(), expr.GetFitParameterNames().end() ); name = wxT("FIT$VAR"); TextVariable::PutVariable( name, pStrings_, pvStr_ ); for( std::size_t i=0; iGetValue().Upper() ) { presultTC_[j]->Clear(); *presultTC_[j] << pp[i]; break; } } pStrings_[i] += wxT(" = ") + ExGlobals::GetNiceNumber(pp[i]) + wxT(" ") + ExGlobals::GetNiceNumber(e1[i]) + wxT(" ( ") + ExGlobals::GetNiceNumber(fabs(e1[i]/pp[i]*100)) + wxT("% )"); } std::vector corr( nparam*nparam, 0.0 ); for( std::size_t i=0; i 0.0 ) { corr[j+i*nparam] = errmat[j][i]/sqrt(errmat[j][j]*errmat[i][i]); corr[i+j*nparam] = corr[j+i*nparam]; } } try { name = wxT("FIT$CORR"); NumericVariable::PutVariable( name, corr, nparam, nparam, pvStr_ ); } catch ( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } std::vector cov( nparam*nparam, 0.0 ); for( std::size_t i=0; iSetValue( ExGlobals::GetNiceNumber(chisq_) ); confTC_->SetValue( ExGlobals::GetNiceNumber(confidenceLevel_) + wxT('\%') ); degFreeTC_->SetValue( wxString()<(nFree_), pvStr_ ); } catch ( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } PlotFit(); ExGlobals::ReplotCurrentWindow(); } void FitForm::PlotFit() { GRA_window *currentWindow = ExGlobals::GetGraphWindow(); // GRA_setOfCharacteristics *generalC = currentWindow->GetGeneralCharacteristics(); GRA_setOfCharacteristics *dataCurveC = currentWindow->GetDataCurveCharacteristics(); GRA_setOfCharacteristics *xAxisC = currentWindow->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = currentWindow->GetYAxisCharacteristics(); GRA_setOfCharacteristics *textC = currentWindow->GetTextCharacteristics(); // GRA_setOfCharacteristics generalCsave( *generalC ); GRA_setOfCharacteristics dataCurveCsave( *dataCurveC ); GRA_setOfCharacteristics xAxisCsave( *xAxisC ); GRA_setOfCharacteristics yAxisCsave( *yAxisC ); GRA_setOfCharacteristics textCsave( *textC ); // currentWindow->Clear(); currentWindow->Erase(); std::vector y, x, xe1, ye1, xe2, ye2; try { NumericVariable::GetVector( dVecName_, wxT("data variable"), y ); NumericVariable::GetVector( iVecName_, wxT("independent variable"), x ); if( !eVecName_.empty() )NumericVariable::GetVector( eVecName_, wxT("error variable"), ye1 ); } catch( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::size_t num = std::min( x.size(), y.size() ); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( !eVecName_.empty() ) { num = std::min( num, ye1.size() ); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( num < ye1.size() )ye1.resize( num ); } double imin, imax; UsefulFunctions::MinMax( x, 0, num, imin, imax ); // static_cast(dataCurveC->Get(wxT("PLOTSYMBOL")))->Set( -8 ); if( num >= 200 ) static_cast(dataCurveC->Get(wxT("PLOTSYMBOLSIZE")))->SetAsPercent( 0.5 ); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(xAxisC->Get(wxT("LABEL")))->Set( iVecName_ ); static_cast(xAxisC->Get(wxT("LABELON")))->Set( true ); static_cast(yAxisC->Get(wxT("LABEL")))->Set( dVecName_ ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( true ); // static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( true ); // if( iminmaxRange_ ) { std::vector psym; for( std::size_t i=0; i(dataCurveC->Get(wxT("PLOTSYMBOLCOLOR")))->Set( psym ); } else static_cast(dataCurveC->Get(wxT("PLOTSYMBOLCOLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); // std::vector x2(2), y2(2); x2[0] = imin; x2[1] = imax; if( !ye1.empty() ) { for( std::size_t i=0; i y[i]-ye1[i] )y2[0] = y[i]-ye1[i]; } } else { for( std::size_t i=0; i y[i] )y2[0] = y[i]; } } GRA_cartesianAxes *cartesianAxes = 0; GRA_cartesianCurve *cartesianCurve = 0; try { cartesianAxes = new GRA_cartesianAxes(x2,y2,false,false); cartesianCurve = new GRA_cartesianCurve(x,y,xe1,ye1,xe2,ye2); cartesianAxes->Make(); cartesianCurve->Make(); } catch (EGraphicsError &e) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete cartesianAxes; delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } wxClientDC dc( ExGlobals::GetwxWindow() ); cartesianAxes->Draw( ExGlobals::GetGraphicsOutput(), dc ); cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianAxes ); currentWindow->AddDrawableObject( cartesianCurve ); // if( iminmaxRange_ ) { std::vector ytmp, xtmp, xe1t, ye1t, xe2t, ye2t; double ymin = static_cast(yAxisC->Get(wxT("MIN")))->Get(); double ymax = static_cast(yAxisC->Get(wxT("MAX")))->Get(); xtmp.push_back( minRange_ ); xtmp.push_back( minRange_ ); ytmp.push_back( ymin-(ymax-ymin) ); ytmp.push_back( ymax+(ymax-ymin) ); GRA_color *color = static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Get(); int linetype = static_cast(dataCurveC->Get(wxT("CURVELINETYPE")))->Get(); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( GRA_colorControl::GetColor(wxT("PURPLE")) ); static_cast(dataCurveC->Get(wxT("CURVELINETYPE")))->Set( 5 ); static_cast(dataCurveC->Get(wxT("PLOTSYMBOL")))->Set( 0 ); cartesianCurve = new GRA_cartesianCurve(xtmp,ytmp,xe1t,ye1t,xe2t,ye2t); try { cartesianCurve->Make(); } catch (EGraphicsError &e) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianCurve ); xtmp[0] = maxRange_; xtmp[1] = maxRange_; cartesianCurve = new GRA_cartesianCurve(xtmp,ytmp,xe1t,ye1t,xe2t,ye2t); try { cartesianCurve->Make(); } catch (EGraphicsError &e) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianCurve ); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( color ); static_cast(dataCurveC->Get(wxT("CURVELINETYPE")))->Set( linetype ); } ye1.erase( ye1.begin(), ye1.end() ); // // re-evaluate the last expression // wxString fitDataVec( dVecName_+wxT("$FIT") ); wxString fitIndepVec( iVecName_+wxT("$FIT") ); NumericVariable *nv = NVariableTable::GetTable()->GetVariable( iVecName_ ); std::vector iVec( nv->GetData().GetData() ); nv->GetData().GetMinMax( imin, imax ); int newNum = 500; double inc = (imax-imin)/(newNum-1); std::vector newX( newNum ); for( int i=0; iGetData().SetData( newX ); nv->GetData().SetDimMag( 0, newX.size() ); Expression expr( fitExpression_ ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; nv->GetData().SetData( iVec ); nv->GetData().SetDimMag( 0, iVec.size() ); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::vector newY( expr.GetFinalAnswer().GetData() ); if( newY.size() == 1 )newY.resize( newX.size(), newY[0] ); nv->GetData().SetData( iVec ); nv->GetData().SetDimMag( 0, iVec.size() ); try { NumericVariable::PutVariable( fitIndepVec, newX, 0, pvStr_ ); NumericVariable::PutVariable( fitDataVec, newY, 0, pvStr_ ); } catch ( EVariableError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } static_cast(dataCurveC->Get(wxT("PLOTSYMBOL")))->Set( 0 ); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( GRA_colorControl::GetColor(-2) ); cartesianCurve = new GRA_cartesianCurve(newX,newY,xe1,ye1,xe2,ye2); try { cartesianCurve->Make(); } catch (EGraphicsError &e) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianCurve ); // double const ylaxis = static_cast(yAxisC->Get(wxT("LOWERAXIS")))->GetAsPercent(); double const xlaxis = static_cast(xAxisC->Get(wxT("LOWERAXIS")))->GetAsPercent(); double const yuaxis = static_cast(yAxisC->Get(wxT("UPPERAXIS")))->GetAsPercent(); double const xuaxis = static_cast(xAxisC->Get(wxT("UPPERAXIS")))->GetAsPercent(); // static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 1 ); static_cast(textC->Get(wxT("ANGLE")))->Set( 0.0 ); static_cast(textC->Get(wxT("COLOR")))->Set( GRA_colorControl::GetColor(wxT("BLACK")) ); static_cast(textC->Get(wxT("FONT")))->Set( GRA_fontControl::GetFont(wxT("SWISS")) ); static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 3.0 ); static_cast(textC->Get(wxT("INTERACTIVE")))->Set( false ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( xlaxis ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yuaxis+1 ); // wxString title( wxT("FIT: ") ); title += dVecName_ + wxT(" = ") + fitTitle_; GRA_drawableText *dt = new GRA_drawableText( title ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 3 ); // lower right static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 1.5 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( 98.0 ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( 97.5 ); wxDateTime now = wxDateTime::Now(); wxString time = now.FormatTime(); wxString date = now.FormatDate(); dt = new GRA_drawableText( time+wxT(" ")+date ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // nv = NVariableTable::GetTable()->GetVariable( dVecName_ ); if( !nv->GetOrigin().empty() ) { static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( 94.5 ); dt = new GRA_drawableText( nv->GetOrigin() ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); } double xloc, yloc; if( !legxTC_->GetValue().ToDouble(&xloc) ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for legend x location"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( !legyTC_->GetValue().ToDouble(&yloc) ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for legend y location"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::size_t nparams = pStrings_.size(); static_cast(textC->Get(wxT("ALIGNMENT")))->Set( 1 ); // lower left static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( 2.0 ); static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( xloc ); for( std::size_t i=0; i(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); dt = new GRA_drawableText( pStrings_[i] ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); } yloc -= 6.0; static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); wxString str( wxT("Number of data points = ") ); dt = new GRA_drawableText( str<Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // yloc -= 4.0; static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); wxString astr = wxT("Fit range: ") + ExGlobals::GetNiceNumber(minRange_) + wxT(" to ") + ExGlobals::GetNiceNumber(maxRange_); dt = new GRA_drawableText( astr ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // yloc -= 4.0; static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); str = wxT("Degrees of freedom = "); dt = new GRA_drawableText( str<Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // yloc -= 4.0; static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); str = wxT("Total <^>2<_> = ") + ExGlobals::GetNiceNumber(chisq_) + wxT(", <^>2<_>/df = ") + ExGlobals::GetNiceNumber(chisq_/nFree_); dt = new GRA_drawableText( str ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // yloc -= 4.0; static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); str = wxT("Confidence level = ") + ExGlobals::GetNiceNumber(confidenceLevel_) + wxT("%"); dt = new GRA_drawableText( str ); try { dt->Parse(); } catch ( EGraphicsError &e ) { *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( dt ); // *generalC = generalCsave; *dataCurveC = dataCurveCsave; *xAxisC = xAxisCsave; *yAxisC = yAxisCsave; *textC = textCsave; // if( ExGlobals::StackIsOn() ) { wxString line( wxT("FORM FIT,") ); wxString degreeS( degreeCB_->GetStringSelection() ); wxString type( typeCB_->GetStringSelection() ); long nl; degreeS.ToLong( &nl ); int degree = static_cast( nl ); int nparams = type==wxT("Custom") ? degree : degree+1; wxString fixed( wxT("[") ); wxString start( wxT("[") ); for( int i=0; iIsChecked() ? wxT("1;") : wxT("0;"); start += pstartTC_[i]->GetValue() + wxT(";"); } fixed += pCkB_[nparams-1]->IsChecked() ? wxT("1") : wxT("0"); start += pstartTC_[nparams-1]->GetValue(); fixed += wxT("]"); start += wxT("]"); line += dVecName_ + wxT(",") + iVecName_ + wxT(",") + minTC_->GetValue() + wxT(",") + maxTC_->GetValue() + wxT(",") + eVecName_ + wxT(",'") + type + wxT("',") + degreeS + wxT(",'") + exprTC_->GetValue() + wxT("',") + fixed + wxT(",") + start + wxT(",") + legxTC_->GetValue() + wxT(",") + legyTC_->GetValue() + wxT(",'DO THE FIT'"); ExGlobals::WriteStack( line ); } } void FitForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void FitForm::Set( wxString const &dataName, wxString const &indepName, double idmin, double idmax, wxString const &errorName, wxString const &typeName, int nParams, wxString const &expression, std::vector &fixed, std::vector &start, double xloc, double yloc, wxString const &action ) { dVecName_ = dataName.Upper(); dataCB_->SetStringSelection( dVecName_ ); exprST_->SetLabel( wxString(wxT("Fit expression: "))+ dVecName_.Mid(std::min(dVecName_.Length(),size_t(10)))+wxT(" = ") ); // iVecName_ = indepName.Upper(); indepCB_->Enable( true ); indepST_->Enable( true ); indepCB_->SetStringSelection( iVecName_ ); // minST_->Enable( true ); maxST_->Enable( true ); minTC_->Enable( true ); maxTC_->Enable( true ); minTC_->SetValue( wxString() << idmin ); maxTC_->SetValue( wxString() << idmax ); // eVecName_ = errorName.Upper(); errorST_->Enable( true ); errorCB_->Enable( true ); errorCB_->SetStringSelection( eVecName_ ); // typeCB_->Enable( true ); typeST_->Enable( true ); typeCB_->SetStringSelection( typeName.Upper() ); FitTypeChange(); if( typeCB_->GetSelection()==0 || typeCB_->GetSelection()==1 ) { degreeCB_->SetSelection( nParams-2 ); DegreeChange(); } else if( typeCB_->GetSelection() == 5 ) { degreeCB_->SetSelection( nParams-1 ); DegreeChange(); } exprTC_->SetValue( expression ); UpdateExpression(); for( int i=0; iSetValue( wxString() << xloc ); legyTC_->SetValue( wxString() << yloc ); if( action == wxT("CLEAR GRAPHICS") ) { ClearGraphics(); } else if( action == wxT("TEST THE FIT") ) { TestTheFit(); } else if( action == wxT("DO THE FIT") ) { DoTheFit(); } else if( action == wxT("CLOSE") ) { Close(); } } // end of file extrema-4.4.5/src/wxForms/GraphicsPage.h0000644012702201742730000000671011332445031017151 0ustar spangspang/* Copyright (C) 2007...2010 Joseph L. Chuma 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. */ #ifndef EXTREMA_GRAPHICSPAGE #define EXTREMA_GRAPHICSPAGE #include #include "wx/notebook.h" class GRA_window; class GRA_drawableText; class GRA_outputType; class GRA_polygon; class GRA_arrow1; class GRA_arrow2; class GRA_arrow3; class GRA_ellipse; class GRA_wxWidgets; class GRA_color; class GraphicsPage : public wxNotebookPage { public: GraphicsPage( wxNotebook * ); ~GraphicsPage(); void Paint(); void OnPaint( wxPaintEvent & ); void RefreshGraphics(); //void Reset(); void InheritFrom( GraphicsPage const * ); void AddGraphWindow( GRA_window * ); void SetGraphWindow( GRA_window * ); GRA_window *GetGraphWindow(); GRA_window *GetGraphWindow( int ); GRA_window *GetGraphWindow( double, double ); void SetWindowNumber( int ); int GetWindowNumber(); int GetNumberOfWindows(); std::vector &GetGraphWindows(); void DrawGraphWindows( GRA_wxWidgets *, wxDC & ); void ResetWindows(); void EraseWindows(); void ClearWindows(); void SetWindowsDefaults(); void DisplayBackgrounds( GRA_wxWidgets *, wxDC & ); void ReplotAllWindows(); void ReplotCurrentWindow( bool ); void SetInteractiveWindowMode(); void SetInteractiveLegendMode(); void SetArrowPlacementMode(); void SetPolygonPlacementMode(); void SetEllipsePlacementMode(); void SetTextPlacementMode( GRA_drawableText * ); void SetAllModesFalse(); void SetArrowType( int ); void SetHeadsBothEnds( bool ); void SetPolygonType( int ); void SetDrawCircles( bool ); void SetPolygonAngle( int ); void SetPolygonVertices( int ); void SetFigureLineThickness( int ); void SetFigureLineColor( GRA_color * ); void SetFigureFillColor( GRA_color * ); void SavePS( wxString const & ); void SaveBitmap( wxString const &, int ); void OnMouseMove( wxMouseEvent & ); void OnMouseLeftDown( wxMouseEvent & ); void OnMouseRightDown( wxMouseEvent & ); friend std::ostream &operator<<( std::ostream &, GraphicsPage const * ); private: int currentWindowNumber_; std::vector graphWindows_; bool interactiveWindowMode_, interactiveLegendMode_; bool arrowPlacementMode_, polygonPlacementMode_, ellipsePlacementMode_; bool firstPoint_, headsBothEnds_, drawCircles_; int arrowType_, polygonType_, polygonAngle_, polygonVertices_, figureLineThickness_; GRA_color *figureLineColor_, *figureFillColor_; double xw1_, yw1_; GRA_drawableText *textToPlace_; GRA_arrow1 *currentArrow1_; GRA_arrow2 *currentArrow2_; GRA_arrow3 *currentArrow3_; GRA_polygon *currentRectangle_, *currentRegularPolygon_, *current5PtStar_; GRA_ellipse *currentEllipse_; void DeleteGraphWindows(); void SetUpDefaultWindows(); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/CommandTextCtrl.cpp0000644012702201742730000001130411274636606020231 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "CommandTextCtrl.h" #include "AnalysisCommandPanel.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them BEGIN_EVENT_TABLE( CommandTextCtrl, wxTextCtrl ) EVT_KEY_DOWN( CommandTextCtrl::OnKeyDown ) EVT_KEY_UP( CommandTextCtrl::OnKeyUp ) EVT_CHAR( CommandTextCtrl::OnChar ) END_EVENT_TABLE() CommandTextCtrl::CommandTextCtrl( AnalysisCommandPanel *parent ) : wxTextCtrl( (wxWindow*)parent, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ) { SetToolTip( wxT("enter commands here") ); commandStringsIndex_ = -1; } wxString CommandTextCtrl::GetACommand() { if( GetLineLength(0) == 0 ) // nothing was input { ExGlobals::WriteOutput( wxT(' ') ); return wxString(); // return empty string } wxString inputLine( GetLineText(0) ); ExGlobals::WriteOutput( inputLine ); // // trim leading and trailing blanks // std::size_t rTemp = inputLine.find_last_not_of( wxT(' ') ); if( rTemp != inputLine.npos ) { std::size_t lTemp = inputLine.find_first_not_of( wxT(' ') ); if( lTemp != inputLine.npos )inputLine = inputLine.substr( lTemp, rTemp-lTemp+1 ); } else inputLine = wxT(' '); // Clear(); // clear the command entry field return inputLine; } wxString CommandTextCtrl::GetPreviousCommand() { wxString s; if( commandStringsIndex_ >= 0 )s = commandStrings_[commandStringsIndex_--]; return s; } wxString CommandTextCtrl::GetNextCommand() { wxString s; if( commandStringsIndex_ < static_cast(commandStrings_.size())-1 ) s = commandStrings_[++commandStringsIndex_]; return s; } void CommandTextCtrl::AddCommandString( wxString const &s ) { commandStrings_.push_back( s ); commandStringsIndex_ = static_cast(commandStrings_.size())-1; } void CommandTextCtrl::OnKeyDown( wxKeyEvent &event ) { switch ( event.GetKeyCode() ) { case WXK_DOWN: { wxString s( GetNextCommand() ); if( s.empty() )Clear(); else { SetValue(s); SetInsertionPointEnd(); } break; } case WXK_UP: { wxString s( GetPreviousCommand() ); if( s.empty() )Clear(); else { SetValue(s); SetInsertionPointEnd(); } break; } case WXK_RETURN: { DoACommand(); break; } default: { event.Skip(); break; } } } void CommandTextCtrl::DoACommand() { static wxString command; wxString inputLine( GetACommand() ); // bool continuing = false; int len = inputLine.size(); if( inputLine[len-1] == ExGlobals::GetContinuationCharacter() ) { if( --len == 0 ) { ExGlobals::WarningMessage( wxT("continuation line is empty") ); command.clear(); return; } inputLine.erase( len, 1 ); // erase continuation character continuing = true; } command += inputLine; if( continuing )return; // go back and get the next part of the command line if( command.empty() || command==wxString(wxT(' ')) ) { if( ExGlobals::GetPausingScript() )ExGlobals::RestartScripts(); return; } ExGlobals::PreParse( command ); AddCommandString( command ); try { ExGlobals::ProcessCommand( command ); } catch ( std::runtime_error &e ) { wxMessageDialog *md = new wxMessageDialog( (wxWindow*)this, wxString(e.what(),wxConvUTF8), wxT("ERROR"), wxOK|wxICON_ERROR ); md->ShowModal(); command.clear(); return; } command.clear(); if( ExGlobals::GetExecuteCommand() ) { // the script run here must be the top level script // since it is run interactively // try { ExGlobals::RunScript(); } catch ( std::runtime_error const &e ) { ExGlobals::ShowScriptError( e.what() ); ExGlobals::StopAllScripts(); } } } // end of file extrema-4.4.5/src/wxForms/VisualizationSpeedButtonPanel.cpp0000644012702201742730000003616211332106624023153 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include #include "VisualizationSpeedButtonPanel.h" #include "VisualizationWindow.h" #include "ECommandError.h" #include "ExGlobals.h" #include "GRA_wxWidgets.h" #include "EGraphicsError.h" #include "ImportWindow.h" // the event tables connect the wxWidgets events with the // event handler functions which process them BEGIN_EVENT_TABLE( VisualizationSpeedButtonPanel, wxPanel ) EVT_BUTTON( ID_clearGraphicsPage, VisualizationSpeedButtonPanel::OnClearGraphicsPage ) EVT_BUTTON( ID_drawGraph, VisualizationSpeedButtonPanel::OnDrawGraph ) EVT_BUTTON( ID_3dplot, VisualizationSpeedButtonPanel::On3DPlot ) EVT_BUTTON( ID_drawFigure, VisualizationSpeedButtonPanel::OnDrawFigure ) EVT_BUTTON( ID_drawText, VisualizationSpeedButtonPanel::OnDrawText ) EVT_BUTTON( ID_peakFind, VisualizationSpeedButtonPanel::OnPeakFind ) EVT_BUTTON( ID_drawFigures, VisualizationSpeedButtonPanel::OnDrawFigures ) EVT_BUTTON( ID_saveDrawing, VisualizationSpeedButtonPanel::OnSaveDrawing ) EVT_BUTTON( ID_importDrawing, VisualizationSpeedButtonPanel::OnImportDrawing ) EVT_BUTTON( ID_printDrawing, VisualizationSpeedButtonPanel::OnPrintDrawing ) EVT_BUTTON( ID_newPage, VisualizationSpeedButtonPanel::OnNewPage ) EVT_BUTTON( ID_removePage, VisualizationSpeedButtonPanel::OnRemovePage ) EVT_BUTTON( ID_aspectRatio, VisualizationSpeedButtonPanel::OnSetAspectRatio ) END_EVENT_TABLE() //EVT_BUTTON( ID_lineWidth, VisualizationSpeedButtonPanel::OnLineWidth ) //EVT_BUTTON( ID_lineColor, VisualizationSpeedButtonPanel::OnLineColor ) //EVT_BUTTON( ID_fillColor, VisualizationSpeedButtonPanel::OnFillColor ) VisualizationSpeedButtonPanel::VisualizationSpeedButtonPanel( VisualizationWindow *parent ) : wxPanel( parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxRAISED_BORDER|wxTAB_TRAVERSAL ), visualizationWindow_(parent) { wxString imageDir = ExGlobals::GetImagePath(); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *clearGraphicsPageButton = new wxBitmapButton( (wxWindow*)this, ID_clearGraphicsPage, wxBitmap(imageDir+wxT("/clear.GIF"),wxBITMAP_TYPE_GIF) ); clearGraphicsPageButton->SetToolTip( wxT("clear the entire graphics page") ); sizer->Add( clearGraphicsPageButton, wxSizerFlags(0).Border(wxTOP|wxLEFT|wxRIGHT,5) ); wxBitmapButton *drawGraphButton = new wxBitmapButton( (wxWindow*)this, ID_drawGraph, wxBitmap(imageDir+wxT("/drawgraph.GIF"),wxBITMAP_TYPE_GIF) ); drawGraphButton->SetToolTip( wxT("draw a graph") ); sizer->Add( drawGraphButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); wxBitmapButton *threeDPlotButton = new wxBitmapButton( (wxWindow*)this, ID_3dplot, wxBitmap(imageDir+wxT("/3dplot.bmp"),wxBITMAP_TYPE_BMP) ); threeDPlotButton->SetToolTip( wxT("draw a 3D graph") ); sizer->Add( threeDPlotButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); wxBitmapButton *drawTextButton = new wxBitmapButton( (wxWindow*)this, ID_drawText, wxBitmap(imageDir+wxT("/drawtext.GIF"),wxBITMAP_TYPE_GIF) ); drawTextButton->SetToolTip( wxT("draw a text string in the graphics window") ); sizer->Add( drawTextButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); sizer->InsertSpacer( 3, 10 ); wxBitmapButton *peakFindButton = new wxBitmapButton( (wxWindow*)this, ID_peakFind, wxBitmap(imageDir+wxT("/peakfind.GIF"),wxBITMAP_TYPE_GIF) ); peakFindButton->SetToolTip( wxT("find peaks") ); sizer->Add( peakFindButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); wxBitmapButton *drawFigureButton = new wxBitmapButton( (wxWindow*)this, ID_drawFigure, wxBitmap(imageDir+wxT("/drawfigure.GIF"),wxBITMAP_TYPE_GIF) ); drawFigureButton->SetToolTip( wxT("draw geometric figures") ); sizer->Add( drawFigureButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); sizer->InsertSpacer( 6, 10 ); wxBitmapButton *saveDrawingButton = new wxBitmapButton( (wxWindow*)this, ID_saveDrawing, wxBitmap(imageDir+wxT("/save.GIF"),wxBITMAP_TYPE_GIF) ); saveDrawingButton->SetToolTip( wxT("save the graphics page to a file") ); sizer->Add( saveDrawingButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); wxBitmapButton *importDrawingButton = new wxBitmapButton( (wxWindow*)this, ID_importDrawing, wxBitmap(imageDir+wxT("/importdrawing.GIF"),wxBITMAP_TYPE_GIF) ); importDrawingButton->SetToolTip( wxT("import a drawing") ); sizer->Add( importDrawingButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); wxBitmapButton *printDrawingButton = new wxBitmapButton( (wxWindow*)this, ID_printDrawing, wxBitmap(imageDir+wxT("/print.GIF"),wxBITMAP_TYPE_GIF) ); printDrawingButton->SetToolTip( wxT("print the graphics page") ); sizer->Add( printDrawingButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); sizer->InsertSpacer( 10, 10 ); wxBitmapButton *newPageButton = new wxBitmapButton( (wxWindow*)this, ID_newPage, wxBitmap(imageDir+wxT("/newPage.GIF"),wxBITMAP_TYPE_GIF) ); newPageButton->SetToolTip( wxT("open a new graphics page") ); sizer->Add( newPageButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); wxBitmapButton *removePageButton = new wxBitmapButton( (wxWindow*)this, ID_removePage, wxBitmap(imageDir+wxT("/removePage.GIF"),wxBITMAP_TYPE_GIF) ); removePageButton->SetToolTip( wxT("delete the last graphics page") ); sizer->Add( removePageButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); sizer->InsertSpacer( 13, 10 ); wxBitmapButton *aspectRatioButton = new wxBitmapButton( (wxWindow*)this, ID_aspectRatio, wxBitmap(imageDir+wxT("/aspectRatio.GIF"),wxBITMAP_TYPE_GIF) ); aspectRatioButton->SetToolTip( wxT("set the graphics page aspect ratio") ); sizer->Add( aspectRatioButton, wxSizerFlags(0).Border(wxTOP|wxRIGHT,5) ); SetSizer( sizer ); } void VisualizationSpeedButtonPanel::OnImportDrawing( wxCommandEvent &WXUNUSED(event) ) { wxString wildcard( wxT("PNG (*.png)|*.png|JPEG (*.jpeg,*.jpg)|*.jpeg;*.jpg") ); wxFileDialog *fd = new wxFileDialog( this, wxT("Choose a PNG or JPEG file"), wxT(""), wxT(""), wildcard, wxFD_OPEN|wxFD_FILE_MUST_EXIST|wxFD_CHANGE_DIR|wxFD_PREVIEW ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; wxString extension( ExGlobals::GetFileExtension(filename).MakeUpper() ); // // open the png file and open a window to display it in // wxImage image = extension==wxT(".PNG") ? wxImage(filename,wxBITMAP_TYPE_PNG) : wxImage(filename,wxBITMAP_TYPE_JPEG); ImportForm *importForm = new ImportForm( this, image ); } void VisualizationSpeedButtonPanel::OnSaveDrawing( wxCommandEvent &WXUNUSED(event) ) { #ifdef __WINDOWS__ wxString wildcard( wxT("Encapsulated PostScript (*.eps)|*.eps|PNG file (*.png)|*.png|JPEG file (*.jpeg)|*.jpeg|Windows metafile (*.wmf)|*.wmf|Windows enhanced metafile (*.emf)|*.emf") ); #else wxString wildcard( wxT("Encapsulated PostScript (*.eps)|*.eps|PNG file (*.png)|*.png|JPEG file (*.jpeg)|*.jpeg") ); #endif wxFileDialog *fd = new wxFileDialog( this, wxT("Choose an output file"), wxT(""), wxT(""), wildcard, wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; wxString extension( ExGlobals::GetFileExtension(filename) ); if( extension.empty() ) { switch ( fd->GetFilterIndex() ) { case 0: extension = wxT(".eps"); break; case 1: extension = wxT(".png"); break; case 2: extension = wxT(".jpeg"); break; case 3: extension = wxT(".wmf"); break; case 4: extension = wxT(".emf"); break; } filename += extension; } std::ofstream outFile; outFile.open( filename.mb_str(wxConvUTF8), std::ios_base::out ); if( !outFile.is_open() ) { wxString message( wxT("unable to open ") ); message += filename; wxMessageBox( message, wxT("error"), wxOK|wxICON_ERROR ); return; } outFile.close(); if( extension == wxT(".eps") ) { try { visualizationWindow_->SavePS( filename ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxString(wxT("HARDCOPY\\POSTSCRIPT "))+filename ); } else if( extension == wxT(".png") ) { try { int xminM, yminM, xmaxM, ymaxM; ExGlobals::GetMonitorLimits( xminM, yminM, xmaxM, ymaxM ); visualizationWindow_->SaveBitmap( xminM, yminM, xmaxM, ymaxM, filename, wxBITMAP_TYPE_PNG ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); } if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxString(wxT("HARDCOPY\\PNG "))+filename ); } else if( extension == wxT(".jpeg") ) { try { int xminM, yminM, xmaxM, ymaxM; ExGlobals::GetMonitorLimits( xminM, yminM, xmaxM, ymaxM ); visualizationWindow_->SaveBitmap( xminM, yminM, xmaxM, ymaxM, filename, wxBITMAP_TYPE_JPEG ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); } if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxString(wxT("HARDCOPY\\JPEG "))+filename ); } else if( extension == wxT(".wmf") ) { #ifdef __WINDOWS__ if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxString(wxT("HARDCOPY\\WMF "))+filename ); #else wxMessageBox( wxT("windows metafiles only available on Windows"), wxT("error"), wxOK|wxICON_ERROR ); #endif } else if( extension == wxT(".emf") ) { #ifdef __WINDOWS__ if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxString(wxT("HARDCOPY\\EMF "))+filename ); #else wxMessageBox( wxT("windows enhanced metafiles only available on Windows"), wxT("error"), wxOK|wxICON_ERROR ); #endif } } void VisualizationSpeedButtonPanel::OnClearGraphicsPage( wxCommandEvent &event ) { visualizationWindow_->OnClearGraphicsPage( event ); } void VisualizationSpeedButtonPanel::OnDrawGraph( wxCommandEvent &event ) { visualizationWindow_->OnDrawGraph( event ); } void VisualizationSpeedButtonPanel::On3DPlot( wxCommandEvent &event ) { visualizationWindow_->On3DPlot( event ); } void VisualizationSpeedButtonPanel::OnDrawFigure( wxCommandEvent &event ) { visualizationWindow_->OnDrawFigure( event ); } void VisualizationSpeedButtonPanel::OnDrawText( wxCommandEvent &event ) { visualizationWindow_->OnDrawText( event ); } void VisualizationSpeedButtonPanel::OnPeakFind( wxCommandEvent &event ) { visualizationWindow_->OnPeakFind( event ); } void VisualizationSpeedButtonPanel::OnPrintDrawing( wxCommandEvent &WXUNUSED(event) ) { wxPrintData *printData( ExGlobals::GetPrintData() ); wxPrintDialogData printDialogData( *printData ); wxPrinter printer( &printDialogData ); MyPrintout printout( wxT("Extrema printing") ); if( !printer.Print(visualizationWindow_,&printout,true /*prompt*/) ) { //if( wxPrinter::GetLastError() == wxPRINTER_CANCELLED ) // wxMessageBox( wxT("You canceled printing"), wxT("Printing"), wxOK ); //else // wxMessageBox( // wxT("There was a problem printing.\nPerhaps your printer is not set correctly?"), // wxT("Printing"), wxOK ); } else *printData = printer.GetPrintDialogData().GetPrintData(); } bool MyPrintout::OnPrintPage( int page ) { wxDC *dc = GetDC(); if( dc ) { // Get the logical pixels per inch of screen and printer int ppiScreenX, ppiScreenY; GetPPIScreen( &ppiScreenX, &ppiScreenY ); int ppiPrinterX, ppiPrinterY; GetPPIPrinter( &ppiPrinterX, &ppiPrinterY ); // // This scales the DC so that the printout roughly represents the // the screen scaling. The text point size _should_ be the right size // but in fact is too small for some reason. This is a detail that will // need to be addressed at some point but can be fudged for the // moment. double scale = (double)ppiPrinterX/(double)ppiScreenX; // // Now we have to check in case our real page size is reduced // (e.g. because we're drawing to a print preview memory DC) int pageWidth, pageHeight; int w, h; dc->GetSize( &w, &h ); GetPageSizePixels( &pageWidth, &pageHeight ); //std::cout << "scale=" << scale << ", ppiPrinterX=" << ppiPrinterX << ", ppiScreenX=" << ppiScreenX << "\n" // << "w=" << w << ", h=" << h << "\n" // << "pageWidth=" << pageWidth << ", pageHeight=" << pageHeight << "\n"; // If printer pageWidth == current DC width, then this doesn't // change. But w might be the preview bitmap width, so scale down. double overallScale = scale*w/(double)pageWidth; dc->SetUserScale( overallScale, overallScale ); long xo=0, yo=0; dc->SetDeviceOrigin( xo, yo ); dc->SetMapMode( wxMM_TEXT ); int dch = dc->GetPPI().GetHeight(); int dcw = dc->GetPPI().GetWidth(); double xminW, yminW, xmaxW, ymaxW; ExGlobals::GetWorldLimits( xminW, yminW, xmaxW, ymaxW ); int xmin = static_cast(xminW*dch+0.5)+50; int ymin = static_cast(yminW*dcw+0.5)+50; int xmax = static_cast(0.7*xmaxW*dch+0.5)+50; int ymax = static_cast(0.7*ymaxW*dcw+0.5)+50; //std::cout << "w=" << w << ", h=" << h << "\n" // << "xmax=" << xmax << ", ymax=" << ymax << "\n"; dc->StartDoc( wxT("extrema printing...") ); GRA_wxWidgets ps( xmin, ymin, xmax, ymax ); try { ExGlobals::DrawGraphWindows( &ps, *dc ); } catch (EGraphicsError &e) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return false; } dc->EndDoc(); return true; } else return false; } void VisualizationSpeedButtonPanel::OnNewPage( wxCommandEvent &event ) { visualizationWindow_->OnNewPage( event ); } void VisualizationSpeedButtonPanel::OnRemovePage( wxCommandEvent &event ) { visualizationWindow_->OnRemovePage( event ); } void VisualizationSpeedButtonPanel::OnSetAspectRatio( wxCommandEvent &event ) { visualizationWindow_->OnSetAspectRatio( event ); } // end of file extrema-4.4.5/src/wxForms/ReadVectorsForm.h0000644012702201742730000000370711274636606017703 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_READVECTORSFORM #define EXTREMA_READVECTORSFORM #include "wx/wx.h" #include "wx/grid.h" class AnalysisWindow; class ChooseFilePanel; class ReadVectorsForm : public wxFrame { public: ReadVectorsForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnCellChange( wxGridEvent & ); void OnMakeNew( wxCommandEvent & ); void OnErrorStop( wxCommandEvent & ); void OnErrorFill( wxCommandEvent & ); void OnLineRange( wxCommandEvent & ); void OnFormat( wxCommandEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxGrid *vectorGrid_; wxCheckBox *closeBefore_, *closeAfter_, *makeNew_, *append_, *errorStop_, *errorFill_, *lineRange_, *format_, *messages_; wxTextCtrl *errorFillTextCtrl_, *formatTextCtrl_, *incrementTextCtrl_, *lastLineTextCtrl_, *firstLineTextCtrl_; wxStaticText *firstLineText_, *lastLineText_, *incrementText_; enum { ID_makeNew, ID_stopOnError, ID_errorFill, ID_lineRange, ID_format }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/GraphForm.cpp0000644012702201742730000004744111274636606017061 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "GraphForm.h" #include "VisualizationWindow.h" #include "NumericVariable.h" #include "EVariableError.h" #include "NVariableTable.h" #include "ExGlobals.h" #include "GRA_window.h" #include "GRA_intCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_colorControl.h" #include "GRA_setOfCharacteristics.h" #include "EGraphicsError.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "GRA_drawableText.h" #include "UsefulFunctions.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( GraphForm, wxFrame ) EVT_COMBOBOX( ID_ivec, GraphForm::OnIndepChange ) EVT_COMBOBOX( ID_symbol, GraphForm::OnPlotsymbolChange ) EVT_BUTTON( ID_clear, GraphForm::OnClear ) EVT_BUTTON( wxID_APPLY, GraphForm::OnDraw ) EVT_BUTTON( wxID_CLOSE, GraphForm::OnClose ) EVT_CLOSE( GraphForm::CloseEventHandler ) END_EVENT_TABLE() GraphForm::GraphForm( VisualizationWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Graph Form"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), visualizationWindow_(parent) { int const foo[] = {0,1,14,2,3,4,5,6,15,7,8,16,9,17,10,18,11,12,13}; symArray_.assign( foo, foo+(sizeof foo/sizeof *foo) ); // CreateForm(); // wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/GraphForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/GraphForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/GraphForm/WIDTH"), 555l ); int height = config->Read( wxT("/GraphForm/HEIGHT"), 200l ); SetSize( ulx, uly, width, height ); // Show( true ); // FillOutForm(); // color_ = 0; // wxString sTmp; config->Read( wxT("/GraphForm/DATA_VECTOR"), &sTmp, wxT("") ); if( dataCB_->FindString(sTmp) > 0 )dataCB_->SetStringSelection( sTmp ); sTmp.clear(); config->Read( wxT("/GraphForm/INDEPENDENT_VECTOR"), &sTmp, wxT("") ); if( indepCB_->FindString(sTmp) > 0 ) { indepCB_->SetStringSelection( sTmp ); minST_->Enable( true ); minTC_->Enable( true ); maxST_->Enable( true ); maxTC_->Enable( true ); double imin, imax; NumericVariable *vec = NVariableTable::GetTable()->GetVariable( sTmp ); vec->GetData().GetMinMax( imin, imax ); minTC_->SetValue( wxString()<SetValue( wxString()<Read( wxT("/GraphForm/ERROR_VECTOR"), &sTmp, wxT("") ); if( errorCB_->FindString(sTmp) > 0 )errorCB_->SetStringSelection( sTmp ); int ps = config->Read( wxT("/GraphForm/PLOTSYMBOL"), 18l ); symbolCB_->SetSelection( wxNOT_FOUND ); int size = symArray_.size(); for( int i=0; iSetSelection( i ); break; } } connectCkB_->SetValue( ps >= 0 ); connectCkB_->Enable( symbolCB_->GetStringSelection() != wxT("") ); Layout(); } void GraphForm::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->AddSpacer( 10 ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *topLeftPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *topLeftSizer = new wxGridSizer( 4, 2, 5, 5 ); dataST_ = new wxStaticText( topLeftPanel, wxID_ANY, wxT("Dependent vector") ); topLeftSizer->Add( dataST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); dataCB_ = new wxComboBox( topLeftPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topLeftSizer->Add( dataCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); indepST_ = new wxStaticText( topLeftPanel, wxID_ANY, wxT("Independent vector (optional)") ); topLeftSizer->Add( indepST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); indepCB_ = new wxComboBox( topLeftPanel, ID_ivec, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topLeftSizer->Add( indepCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); errorST_ = new wxStaticText( topLeftPanel, wxID_ANY, wxT("Error vector (optional)") ); topLeftSizer->Add( errorST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); errorCB_ = new wxComboBox( topLeftPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topLeftSizer->Add( errorCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); symbolST_ = new wxStaticText( topLeftPanel, wxID_ANY, wxT("Plot symbol") ); topLeftSizer->Add( symbolST_, wxSizerFlags(0).Right().Border(wxTOP,5) ); symbolCB_ = new wxComboBox( topLeftPanel, ID_symbol, wxT(""), wxDefaultPosition, wxSize(170,25), 0, 0, wxCB_READONLY ); topLeftSizer->Add( symbolCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); topLeftPanel->SetSizer( topLeftSizer ); topSizer->Add( topLeftPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); wxPanel *topRightPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topRightSizer = new wxBoxSizer( wxVERTICAL ); topRightSizer->AddSpacer( 14 ); wxPanel *rangePanel = new wxPanel( topRightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *rangeSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *minPanel = new wxPanel( rangePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *minSizer = new wxBoxSizer( wxVERTICAL ); minST_ = new wxStaticText( minPanel, wxID_ANY, wxT("Min") ); minSizer->Add( minST_, wxSizerFlags(0).Center().Border(wxALL,1) ); minTC_ = new wxTextCtrl( minPanel, wxID_ANY ); minSizer->Add( minTC_, wxSizerFlags(0).Center().Border(wxALL,1) ); minPanel->SetSizer( minSizer ); rangeSizer->Add( minPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); wxPanel *maxPanel = new wxPanel( rangePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *maxSizer = new wxBoxSizer( wxVERTICAL ); maxST_ = new wxStaticText( maxPanel, wxID_ANY, wxT("Max") ); maxSizer->Add( maxST_, wxSizerFlags(0).Center().Border(wxALL,1) ); maxTC_ = new wxTextCtrl( maxPanel, wxID_ANY ); maxSizer->Add( maxTC_, wxSizerFlags(0).Center().Border(wxALL,1) ); maxPanel->SetSizer( maxSizer ); rangeSizer->Add( maxPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); rangePanel->SetSizer( rangeSizer ); topRightSizer->Add( rangePanel, wxSizerFlags(0).Left().Border(wxALL,1) ); topRightSizer->AddSpacer( 40 ); connectCkB_ = new wxCheckBox( topRightPanel, wxID_ANY, wxT("Connect plot symbols") ); topRightSizer->Add( connectCkB_, wxSizerFlags(0).Center().Border(wxALL,1) ); topRightPanel->SetSizer( topRightSizer ); topSizer->Add( topRightPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *drawButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Draw") ); drawButton->SetToolTip( wxT("click to plot the chosen vectors") ); bottomSizer->Add( drawButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *clearButton = new wxButton( bottomPanel, ID_clear, wxT("Clear graphics") ); clearButton->SetToolTip( wxT("click to clear the visualization window") ); bottomSizer->Add( clearButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); } void GraphForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/GraphForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/GraphForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/GraphForm/WIDTH"), static_cast(width) ); config->Write( wxT("/GraphForm/HEIGHT"), static_cast(height) ); // config->Write( wxT("/GraphForm/DATA_VECTOR"), dataCB_->GetStringSelection() ); config->Write( wxT("/GraphForm/INDEPENDENT_VECTOR"), indepCB_->GetStringSelection() ); config->Write( wxT("/GraphForm/ERROR_VECTOR"), errorCB_->GetStringSelection() ); int ps = symArray_[symbolCB_->GetSelection()]; if( !connectCkB_->IsChecked() )ps *= -1; config->Write( wxT("/GraphForm/PLOTSYMBOL"), long(ps) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ visualizationWindow_->ZeroGraphForm(); Destroy(); } void GraphForm::FillOutForm() { UpdateVectors( dataCB_ ); UpdateVectors( indepCB_ ); UpdateVectors( errorCB_ ); // symbolCB_->Append( wxT("") ); symbolCB_->Append( wxT("square") ); symbolCB_->Append( wxT("square filled") ); symbolCB_->Append( wxT("cross") ); symbolCB_->Append( wxT("square with cross") ); symbolCB_->Append( wxT("plus") ); symbolCB_->Append( wxT("diamond") ); symbolCB_->Append( wxT("diamond with plus") ); symbolCB_->Append( wxT("diamond filled") ); symbolCB_->Append( wxT("asterix") ); symbolCB_->Append( wxT("triangle") ); symbolCB_->Append( wxT("triangle filled") ); symbolCB_->Append( wxT("circle") ); symbolCB_->Append( wxT("circle filled") ); symbolCB_->Append( wxT("star") ); symbolCB_->Append( wxT("star filled") ); symbolCB_->Append( wxT("point") ); symbolCB_->Append( wxT("arrow starting at data") ); symbolCB_->Append( wxT("arrow centred at data") ); // symbolCB_->SetSelection( 0 ); connectCkB_->Enable( false ); // minST_->Enable( false ); minTC_->Enable( false ); maxST_->Enable( false ); maxTC_->Enable( false ); } void GraphForm::UpdateVectors( wxComboBox *cb ) { cb->Clear(); cb->Append( wxT("") ); NVariableTable *nvTable = NVariableTable::GetTable(); int entries = nvTable->Entries(); for( int i=0; iGetEntry(i); if( nv->GetData().GetNumberOfDimensions() == 1 )cb->Append( nv->GetName() ); } } void GraphForm::OnPlotsymbolChange( wxCommandEvent &WXUNUSED(event) ) { connectCkB_->Enable( symbolCB_->GetStringSelection() != wxT("") ); } void GraphForm::OnIndepChange( wxCommandEvent &WXUNUSED(event) ) { wxString vecName( indepCB_->GetStringSelection() ); if( vecName == wxT("") ) { minTC_->Clear(); minTC_->Enable( false ); minST_->Enable( false ); maxTC_->Clear(); maxTC_->Enable( false ); maxST_->Enable( false ); } else { minTC_->Enable( true ); minST_->Enable( true ); maxTC_->Enable( true ); maxST_->Enable( true ); double imin, imax; NumericVariable *vec = NVariableTable::GetTable()->GetVariable( vecName ); vec->GetData().GetMinMax( imin, imax ); minTC_->SetValue( wxString()<SetValue( wxString()<GetGeneralCharacteristics(); GRA_setOfCharacteristics *dataCurveC = currentWindow->GetDataCurveCharacteristics(); GRA_setOfCharacteristics *xAxisC = currentWindow->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxisC = currentWindow->GetYAxisCharacteristics(); // std::vector x, y, xe1, ye1, xe2, ye2; // wxString depName( dataCB_->GetStringSelection() ); if( depName == wxT("") ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("a dependent vector must be chosen"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } try { NumericVariable::GetVector( depName, wxT("dependent variable"), y ); } catch( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } wxString indepName( indepCB_->GetStringSelection() ); double minRange, maxRange; if( indepName == wxT("") ) { std::size_t size = y.size(); for( std::size_t i=0; i(i+1) ); minRange = 1; maxRange = size; } else // x was chosen from the list { try { NumericVariable::GetVector( indepName, wxT("independent variable"), x ); } catch( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( !minTC_->GetValue().ToDouble(&minRange) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for min"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( !maxTC_->GetValue().ToDouble(&maxRange) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for max"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } wxString errorName( errorCB_->GetStringSelection() ); if( errorName != wxT("") ) { try { NumericVariable::GetVector( errorName, wxT("error vector"), ye1 ); } catch( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } std::size_t num = std::min( x.size(), y.size() ); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( !ye1.empty() ) { num = std::min( num, ye1.size() ); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( num < ye1.size() )ye1.resize( num ); } std::vector newX, newY, newE; for( std::size_t i=0; i=minRange && x[i]<=maxRange ) { newX.push_back( x[i] ); newY.push_back( y[i] ); if( !ye1.empty() )newE.push_back( ye1[i] ); } } if( newX.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("there are no data values within the specified independent vector range"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } num = newX.size(); --color_; if( color_ == -6 )--color_; // to not use yellow (which is hard to see) static_cast(generalC->Get(wxT("GRAPHBOX")))->Set( true ); // int ps = symArray_[symbolCB_->GetSelection()]; if( !connectCkB_->IsChecked() )ps *= -1; static_cast(dataCurveC->Get(wxT("PLOTSYMBOL")))->Set( ps ); // if( ps!=0 && num>=200 ) static_cast(dataCurveC->Get(wxT("PLOTSYMBOLSIZE")))->SetAsPercent( 0.5 ); static_cast(dataCurveC->Get(wxT("PLOTSYMBOLCOLOR")))->Set( GRA_colorControl::GetColor(color_) ); static_cast(dataCurveC->Get(wxT("CURVECOLOR")))->Set( GRA_colorControl::GetColor(color_) ); // if( indepName != wxT("") ) { static_cast(xAxisC->Get(wxT("LABEL")))->Set( indepName ); static_cast(xAxisC->Get(wxT("LABELON")))->Set( true ); } else static_cast(xAxisC->Get(wxT("LABELON")))->Set( false ); // static_cast(yAxisC->Get(wxT("LABEL")))->Set( depName ); static_cast(yAxisC->Get(wxT("LABELON")))->Set( true ); // std::vector x2(2), y2(2); UsefulFunctions::MinMax( newX, 0, num, x2[0], x2[1] ); if( !newE.empty() ) { for( std::size_t i=0; i newY[i]-newE[i] )y2[0] = newY[i]-newE[i]; } } else { for( std::size_t i=0; i newY[i] )y2[0] = newY[i]; } } GRA_cartesianAxes *cartesianAxes = 0; GRA_cartesianCurve *cartesianCurve = 0; try { cartesianAxes = new GRA_cartesianAxes(x2,y2,false,false); cartesianCurve = new GRA_cartesianCurve(newX,newY,xe1,newE,xe2,ye2,false); cartesianAxes->Make(); cartesianCurve->Make(); } catch (EGraphicsError &e) { delete cartesianAxes; delete cartesianCurve; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } wxClientDC dc( ExGlobals::GetwxWindow() ); cartesianAxes->Draw( ExGlobals::GetGraphicsOutput(), dc ); cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); currentWindow->AddDrawableObject( cartesianAxes ); currentWindow->AddDrawableObject( cartesianCurve ); ExGlobals::ReplotCurrentWindow(); ExGlobals::RefreshGraphics(); // if( ExGlobals::StackIsOn() ) { wxString line( wxT("FORM GRAPH,") ); int ps = symArray_[symbolCB_->GetSelection()]; if( !connectCkB_->IsChecked() )ps *= -1; if( indepName == wxT("") )indepName.clear(); if( errorName == wxT("") )errorName.clear(); line += depName + wxT(",") + indepName + wxT(",") + minTC_->GetValue() + wxT(",") + maxTC_->GetValue() + wxT(",") + errorName + wxT(",") + (wxString()<SetStringSelection( depName.Upper() ); indepCB_->SetStringSelection( indepName.Upper() ); minTC_->Enable( true ); maxTC_->Enable( true ); minST_->Enable( true ); maxST_->Enable( true ); minTC_->SetValue( wxString() << idmin ); maxTC_->SetValue( wxString() << idmax ); errorCB_->SetStringSelection( errorName.Upper() ); symbolCB_->SetSelection( wxNOT_FOUND ); int size = symArray_.size(); for( int i=0; iSetSelection( i ); break; } } connectCkB_->SetValue( ps>=0 ); if( action == wxT("CLEAR") ) { ClearGraphics(); } else if( action == wxT("DRAW") ) { Draw(); } else if( action == wxT("CLOSE") ) { Close(); } } // end of file extrema-4.4.5/src/wxForms/ReadMatrixForm.cpp0000644012702201742730000006556011274636606020062 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "ReadMatrixForm.h" #include "ChooseFilePanel.h" #include "AnalysisWindow.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "TextVariable.h" #include "ExGlobals.h" #include "CMD_read.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ReadMatrixForm, wxFrame ) EVT_BUTTON( wxID_APPLY, ReadMatrixForm::OnApply ) EVT_BUTTON( wxID_CLOSE, ReadMatrixForm::OnClose ) EVT_CHECKBOX( ID_errorFill, ReadMatrixForm::OnErrorFill ) EVT_CHECKBOX( ID_format, ReadMatrixForm::OnFormat ) EVT_CLOSE( ReadMatrixForm::CloseEventHandler ) END_EVENT_TABLE() ReadMatrixForm::ReadMatrixForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Read matrix"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, true, wxT("Choose a data file for reading"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *leftPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *leftSizer = new wxBoxSizer( wxVERTICAL ); closeBefore_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Close file before reading") ); leftSizer->Add( closeBefore_, wxSizerFlags(0).Border(wxALL,2) ); closeBefore_->SetValue( true ); closeAfter_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Close file after reading") ); leftSizer->Add( closeAfter_, wxSizerFlags(0).Border(wxALL,2) ); closeAfter_->SetValue( true ); leftSizer->Add( new wxStaticLine(leftPanel), wxSizerFlags(0).Expand().Border(wxALL,1) ); wxPanel *errorFillPanel = new wxPanel( leftPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *errorFillSizer = new wxBoxSizer( wxHORIZONTAL ); errorFill_ = new wxCheckBox( errorFillPanel, ID_errorFill, wxT("Error fill") ); errorFillSizer->Add( errorFill_, wxSizerFlags(0).Border(wxALL,2) ); errorFillTextCtrl_ = new wxTextCtrl( errorFillPanel, wxID_ANY ); errorFillTextCtrl_->SetValue( wxT("0.0") ); errorFillSizer->Add( errorFillTextCtrl_, wxSizerFlags(0).Border(wxALL,2) ); errorFillTextCtrl_->Enable( false ); errorFillPanel->SetSizer( errorFillSizer ); leftSizer->Add( errorFillPanel, wxSizerFlags(0).Border(wxALL,2) ); leftSizer->Add( new wxStaticLine(leftPanel), wxSizerFlags(0).Expand().Border(wxALL,1) ); messages_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Display messages") ); leftSizer->Add( messages_, wxSizerFlags(0).Border(wxALL,2) ); messages_->SetValue( true ); leftPanel->SetSizer( leftSizer ); midSizer->Add( leftPanel, wxSizerFlags(0).Border(wxALL,10) ); wxPanel *rightPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *rightSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *midRightPanel = new wxPanel( rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *midRightSizer = new wxGridSizer( 3, 2, 0, 0 ); midRightSizer->Add( new wxStaticText(midRightPanel,wxID_ANY,wxT("Matrix name"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ), wxSizerFlags(0).Right().Border(wxTOP,10) ); matrixNameTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); matrixNameTextCtrl_->SetValue( wxT("") ); midRightSizer->Add( matrixNameTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); midRightSizer->Add( new wxStaticText(midRightPanel,wxID_ANY,wxT("Number of rows"),wxDefaultPosition, wxDefaultSize,wxALIGN_RIGHT), wxSizerFlags(0).Right().Border(wxTOP,10) ); rowsTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); rowsTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( rowsTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); midRightSizer->Add( new wxStaticText(midRightPanel,wxID_ANY,wxT("Number of columns"),wxDefaultPosition, wxDefaultSize,wxALIGN_RIGHT), wxSizerFlags(0).Right().Border(wxTOP,10) ); columnsTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); columnsTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( columnsTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); midRightPanel->SetSizer( midRightSizer ); rightSizer->Add( midRightPanel, wxSizerFlags(0).Border(wxALL,1) ); rightSizer->Add( new wxStaticLine(rightPanel), wxSizerFlags(0).Expand().Border(wxALL,10) ); wxPanel *lineNumberPanel = new wxPanel( rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *lineNumberSizer = new wxGridSizer( 1, 2, 0, 0 ); lineNumberSizer->Add( new wxStaticText(lineNumberPanel,wxID_ANY,wxT("Starting line number"),wxDefaultPosition, wxDefaultSize,wxALIGN_RIGHT), wxSizerFlags(0).Right().Border(wxTOP,10) ); lineNumberTextCtrl_ = new wxTextCtrl( lineNumberPanel, wxID_ANY ); lineNumberTextCtrl_->SetValue( wxT("1") ); lineNumberSizer->Add( lineNumberTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); lineNumberPanel->SetSizer( lineNumberSizer ); rightSizer->Add( lineNumberPanel, wxSizerFlags(0).Border(wxALL,1) ); rightSizer->Add( new wxStaticLine(rightPanel), wxSizerFlags(0).Expand().Border(wxALL,10) ); format_ = new wxCheckBox( rightPanel, ID_format, wxT("Use format") ); rightSizer->Add( format_, wxSizerFlags(0).Center().Border(wxALL,1) ); formatTextCtrl_ = new wxTextCtrl( rightPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(175,25) ); rightSizer->Add( formatTextCtrl_, wxSizerFlags(0).Center().Border(wxALL,10) ); formatTextCtrl_->Enable( false ); rightPanel->SetSizer( rightSizer ); midSizer->Add( rightPanel, wxSizerFlags(0).Border(wxALL,10) ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( (wxWindow*)this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("read data from the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/ReadMatrixForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/ReadMatrixForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/ReadMatrixForm/WIDTH"), 545l ); int height = config->Read( wxT("/ReadMatrixForm/HEIGHT"), 400l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/ReadMatrixForm") ); Show( true ); } void ReadMatrixForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ReadMatrixForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ReadMatrixForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ReadMatrixForm/WIDTH"), static_cast(width) ); config->Write( wxT("/ReadMatrixForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/ReadMatrixForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroLoadMatrix(); Destroy(); } void ReadMatrixForm::OnFormat( wxCommandEvent &WXUNUSED(event) ) { formatTextCtrl_->Enable( format_->IsChecked() ); } void ReadMatrixForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_read *readCommand = CMD_read::Instance(); bool newFile = (readCommand->GetFilename() != fileName); readCommand->SetReadInFilename( fileName ); std::ifstream *inStream = readCommand->GetStream(); if( inStream->is_open() && (closeBefore_->IsChecked() || newFile) )inStream->close(); if( !inStream->is_open() ) { inStream->clear( std::ios::goodbit ); inStream->open( fileName.mb_str(wxConvUTF8), std::ios_base::in ); if( !inStream->is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } wxString formatString; if( format_->IsChecked() ) { formatString = formatTextCtrl_->GetValue(); if( formatString.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("expecting a format"), wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); inStream->close(); return; } } wxString matrixName( matrixNameTextCtrl_->GetValue() ); if( matrixName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("a matrix name must be entered"), wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); inStream->close(); return; } wxString stmp( rowsTextCtrl_->GetValue() ); if( stmp.empty() ) { rowsTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("the number of rows is required"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } long ltmp; if( !stmp.ToLong(<mp) || ltmp<1L ) { rowsTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for number of rows"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } int nRow = static_cast(ltmp); // int nCol; bool columnsGiven = true; stmp = columnsTextCtrl_->GetValue(); if( stmp.empty() )columnsGiven = false; else { if( !stmp.ToLong(<mp) || ltmp<1L ) { columnsTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for number of columns"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } nCol = static_cast(ltmp); } // stmp = lineNumberTextCtrl_->GetValue(); if( stmp.empty() ) { lineNumberTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("the starting line number is required"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( !stmp.ToLong(<mp) || ltmp<1L ) { lineNumberTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("line number must be > 0"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } int startingLine = static_cast(ltmp); // double errorFillValue = readCommand->GetErrorFill(); if( errorFill_->IsChecked() ) { stmp = errorFillTextCtrl_->GetValue(); if( !stmp.ToDouble(&errorFillValue) ) { errorFillTextCtrl_->SetValue( wxT("0.0") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for error fill"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } readCommand->SetErrorFill( errorFillValue ); } // // read in the initial dummy records // unsigned int recordNumber = 0; for( int i=1; iclose(); wxMessageDialog *md = new wxMessageDialog( this, wxT("end of file reached reading initial dummy records"), wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } // // finally ready to read some data // std::vector data; if( columnsGiven ) { data.resize( nRow*nCol ); if( format_->IsChecked() ) { for( int j=0; jclose(); wxString c( wxT("error reading record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } double vd[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0}; int result = sscanf( sc.c_str(), formatString.mb_str(), vd, vd+1, vd+2, vd+3, vd+5, vd+6, vd+7, vd+8, vd+9, vd+10, vd+11, vd+12, vd+13, vd+14, vd+15, vd+16, vd+17, vd+18, vd+19, vd+20, vd+21, vd+22, vd+23, vd+24, vd+25, vd+26, vd+27, vd+28, vd+29, vd+30, vd+31, vd+32, vd+33, vd+34 ); if( result==EOF || result==0 ) { inStream->close(); wxString c( wxT("error reading record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } else if( result < nRow ) { inStream->close(); wxString c( wxT("not enough values on record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // // no errors in reading // for( int k=0; kclose(); wxString c( wxT("error reading record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // // trim leading and trailing blanks // std::string const blank( " \t" ); std::size_t rTemp = sc.find_last_not_of( blank ); if( rTemp != sc.npos ) { std::size_t lTemp = sc.find_first_not_of( blank ); if( lTemp != sc.npos )sc = sc.substr( lTemp, rTemp-lTemp+1 ); } int const Classes[128] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; int const StateTable[7][3] = { // blnk , othr { 1, 2, 3 }, { 1, 2, 3 }, { 4, 6, 3 }, { 5, 7, 3 }, { 5, 7, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; std::vector reals( nRow, 0.0 ); std::vector itype( nRow, 0 ); std::vector strings( nRow ); int nf = -1; unsigned int newState = 1; unsigned int currentState = 0; bool flag = true; std::size_t scLen = sc.length(); for( std::size_t k=0; k 0 ) { for( int k=0; kIsChecked() ) { wxString c( wxT("error in field ") ); c << k+1 << wxT(", record ") << recordNumber ; ExGlobals::WarningMessage( c ); } } else data[k+j*nRow] = reals[k]; } } } } } else // number of columns not given { if( format_->IsChecked() ) { for( int j=0;; ++j ) { ++recordNumber; std::string sc; sc.clear(); if( std::getline(*inStream,sc).fail() || sc.empty() )break; double vd[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0}; int result = sscanf( sc.c_str(), formatString.mb_str(), vd, vd+1, vd+2, vd+3, vd+5, vd+6, vd+7, vd+8, vd+9, vd+10, vd+11, vd+12, vd+13, vd+14, vd+15, vd+16, vd+17, vd+18, vd+19, vd+20, vd+21, vd+22, vd+23, vd+24, vd+25, vd+26, vd+27, vd+28, vd+29, vd+30, vd+31, vd+32, vd+33, vd+34 ); if( result == EOF || result == 0 ) { inStream->close(); wxString c( wxT("error reading record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } else if( result < nRow ) { inStream->close(); wxString c( wxT("not enough values on record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // // no errors in reading // data.resize( (j+1)*nRow ); for( int k=0; k reals( nRow, 0.0 ); std::vector itype( nRow, 0 ); std::vector strings( nRow ); int nf = -1; unsigned int newState = 1; unsigned int currentState = 0; bool flag = true; std::size_t scLen = sc.length(); for( std::size_t k=0; k 0 ) { data.resize( (j+1)*nRow ); for( int k=0; kIsChecked() ) { data[k+j*nRow] = errorFillValue; if( messages_->IsChecked() )ExGlobals::WarningMessage( c ); } else { inStream->close(); wxString c( wxT("error reading record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c, wxT("Fatal error: no matrix was modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } else data[k+j*nRow] = reals[k]; } } } } } if( closeAfter_->IsChecked() )inStream->close(); // // Successful read // TVariableTable::GetTable()->RemoveEntry( matrixName ); NVariableTable::GetTable()->RemoveEntry( matrixName ); NumericVariable *nv = NumericVariable::PutVariable( matrixName, data, static_cast(nRow), static_cast(nCol), wxString(wxT("from gui")) ); nv->SetOrigin( fileName ); if( messages_->IsChecked() ) { wxString s( wxT("matrix ") ); ExGlobals::WriteOutput( s << matrixName << wxT(" has been created with ") << nRow << wxT(" rows and ") << nCol << wxT(" columns") ); } } void ReadMatrixForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void ReadMatrixForm::OnErrorFill( wxCommandEvent &WXUNUSED(event) ) { errorFillTextCtrl_->Enable( errorFill_->IsChecked() ); } // end of file extrema-4.4.5/src/wxForms/AnalysisCommandPanel.cpp0000644012702201742730000000435011274636606021226 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "AnalysisCommandPanel.h" #include "CommandTextCtrl.h" #include "AnalysisWindow.h" // the event tables connect the wxWidgets events with the // event handler functions which process them BEGIN_EVENT_TABLE( AnalysisCommandPanel, wxPanel ) EVT_BUTTON( ID_processCommand, AnalysisCommandPanel::OnProcessCommand ) END_EVENT_TABLE() AnalysisCommandPanel::AnalysisCommandPanel( AnalysisWindow *parent ) : wxPanel(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize) { // this panel will expand horizontally but not vertically // wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( new wxStaticText((wxWindow*)this,-1,wxT("Command (input field):")), wxSizerFlags(0).Border(wxTOP,10) ); commandTextCtrl_ = new CommandTextCtrl(this); sizer->Add( commandTextCtrl_, wxSizerFlags(0).Align(0).Expand().Border(wxALL,1) ); wxButton *processCommandButton = new wxButton( (wxWindow*)this, ID_processCommand, wxT("Process Command") ); processCommandButton->SetToolTip( wxT("click here to enter command or just hit the enter key") ); sizer->Add( processCommandButton, wxSizerFlags(0).Center().Border(wxALL,5) ); SetSizer( sizer ); } void AnalysisCommandPanel::OnProcessCommand( wxCommandEvent &WXUNUSED(event) ) { commandTextCtrl_->DoACommand(); } void AnalysisCommandPanel::AddCommandString( wxString const &s ) { commandTextCtrl_->AddCommandString( s ); } std::vector &AnalysisCommandPanel::GetCommandStrings() { return commandTextCtrl_->GetCommandStrings(); } // end of file extrema-4.4.5/src/wxForms/ThreeDPlotForm.h0000644012702201742730000000472311322763104017457 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #ifndef EXTREMA_THREE_D_PLOT_FORM #define EXTREMA_THREE_D_PLOT_FORM #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class GRA_threeDPlot; class VisualizationWindow; class ThreeDPlotForm : public wxFrame { public: ThreeDPlotForm( VisualizationWindow * ); ~ThreeDPlotForm() {} void ZeroPlot() { threeDPlot_ = 0; } private: void CreateForm(); void UpdateVectors( wxComboBox * ); void GetDataVectors( std::vector &, std::vector &, std::vector & ); void ReDraw(); // event handlers void OnAngleIncChange( wxCommandEvent & ); void OnEye2ObjChange( wxCommandEvent & ); void OnLeft( wxCommandEvent & ); void OnRight( wxCommandEvent & ); void OnUp( wxCommandEvent & ); void OnDown( wxCommandEvent & ); void OnZoomIn( wxCommandEvent & ); void OnZoomOut( wxCommandEvent & ); void OnDraw( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); VisualizationWindow *visualizationWindow_; GRA_threeDPlot *threeDPlot_; wxComboBox *xVecComboBox_, *yVecComboBox_, *zVecComboBox_; wxTextCtrl *angleIncTextCtrl_, *eye2objTextCtrl_; double angleIncrement_, eye2obj_; enum { ID_angleInc, ID_eye2obj, ID_draw, ID_left, ID_right, ID_up, ID_down, ID_zoomIn, ID_zoomOut }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/BasicColors.cpp0000644012702201742730000000706511274636606017375 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "BasicColors.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( BasicColors, wxDialog ) EVT_CLOSE( BasicColors::CloseEventHandler ) END_EVENT_TABLE() BasicColors::BasicColors( wxWindow *parent ) : wxDialog(parent,wxID_ANY,wxT("Basic colors"),wxDefaultPosition,wxDefaultSize,wxCAPTION) { wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( sizer ); wxPanel *mainPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainPanel->SetSizer( mainSizer ); sizer->Add( mainPanel, wxSizerFlags(1).Center().Border(wxALL,2) ); for( int j=0; j<4; ++j ) { wxPanel *pnl = new wxPanel( mainPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *szr = new wxBoxSizer( wxHORIZONTAL ); pnl->SetSizer( szr ); mainSizer->Add( pnl, wxSizerFlags(1).Expand().Border(wxALL,1) ); for( int i=j*5; i<(j+1)*5; ++i ) { ColorButton *cb = new ColorButton( pnl, this, -i ); szr->Add( cb, wxSizerFlags(1).Border(wxALL,1) ); } } wxConfigBase *config = wxConfigBase::Get(); int width = config->Read( wxT("/BasicColors/WIDTH"), 165l ); int height = config->Read( wxT("/BasicColors/HEIGHT"), 140l ); SetSize( 0, 0, width, height ); Show( true ); } void BasicColors::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int width, height; GetSize( &width, &height ); config->Write( wxT("/BasicColors/WIDTH"), static_cast(width) ); config->Write( wxT("/BasicColors/HEIGHT"), static_cast(height) ); } // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ Destroy(); } //--------------------------------------------------------------------------------- BEGIN_EVENT_TABLE( ColorButton, wxButton ) EVT_BUTTON( ID_button, ColorButton::OnClick ) END_EVENT_TABLE() ColorButton::ColorButton( wxPanel *parent, BasicColors *owner, int colorCode ) : wxButton(parent,ID_button,wxT(""),wxDefaultPosition,wxSize(30,30),wxRAISED_BORDER), colorCode_(colorCode), owner_(owner) { GRA_color *color = GRA_colorControl::GetColor( colorCode_ ); SetBackgroundColour( ExGlobals::GetwxColor(color) ); SetToolTip( color->GetName() ); } void ColorButton::OnClick( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::SetWorkingColorFlag( true ); ExGlobals::SetWorkingColor( colorCode_ ); owner_->Close(); } // end of file extrema-4.4.5/src/wxForms/GenerateVectorForm.h0000644012702201742730000000325311274636606020373 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_GENERATEVECTORFORM #define EXTREMA_GENERATEVECTORFORM #include "wx/wx.h" #include "wx/grid.h" class AnalysisWindow; class ChooseFilePanel; class GenerateVectorForm : public wxFrame { public: GenerateVectorForm( AnalysisWindow * ); void Set( wxString const &, int, double, double, double, int, wxString const & ); void Defaults(); void Apply(); private: void SetUp(); // event handlers void OnChoose( wxCommandEvent & ); void OnDefaults( wxCommandEvent & ); void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); AnalysisWindow *analysisWindow_; wxRadioBox *choicesRB_; wxTextCtrl *nameTC_, *minValueTC_, *incValueTC_, *maxValueTC_, *numValueTC_; wxStaticText *minLabel_, *incLabel_, *maxLabel_, *numLabel_; enum { ID_defaults, ID_choose }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/StackDialog.cpp0000644012702201742730000001404211274636606017350 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "StackDialog.h" #include "ChooseFilePanel.h" #include "AnalysisWindow.h" #include "ParseLine.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( StackDialog, wxFrame ) EVT_RADIOBOX( ID_onoff, StackDialog::OnOffToggle ) EVT_BUTTON( wxID_APPLY, StackDialog::OnApply ) EVT_BUTTON( wxID_CLOSE, StackDialog::OnClose ) EVT_CLOSE( StackDialog::CloseEventHandler ) END_EVENT_TABLE() StackDialog::StackDialog( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("record commands to a script"), wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); wxString choices[2] = { wxT("ON"), wxT("OFF") }; onOffRB_ = new wxRadioBox( topPanel, ID_onoff, wxT("Command recording"), wxDefaultPosition, wxDefaultSize, 2, choices, 2, wxRA_SPECIFY_COLS ); topSizer->Add( onOffRB_, wxSizerFlags(0).Border(wxALL,1) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(1).Centre().Border(wxALL,1) ); chooseFilePanel_ = new ChooseFilePanel( this, false, wxT("Browse folders"), wxT("stack file|*.stk|any file|*.*") ); mainSizer->Add( chooseFilePanel_, wxSizerFlags(1).Expand().Border(wxALL,1) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); appendCkB_ = new wxCheckBox( midPanel, wxID_ANY, wxT("Append to file") ); midSizer->Add( appendCkB_, wxSizerFlags(0).Center().Border(wxALL,1) ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(1).Expand().Centre().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("click to turn command recording on/off") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(1).Expand().Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/StackDialog/UPPERLEFTX"), 650l ); int uly = config->Read( wxT("/StackDialog/UPPERLEFTY"), 90l ); int width = config->Read( wxT("/StackDialog/WIDTH"), 560l ); int height = config->Read( wxT("/StackDialog/HEIGHT"), 200l ); SetSize( ulx, uly, width, height ); chooseFilePanel_->GetFilenames( config, wxT("/StackDialog") ); Show( true ); if( ExGlobals::StackIsOn() ) { onOffRB_->SetSelection( 0 ); chooseFilePanel_->SetFile( ExGlobals::GetStackFile() ); chooseFilePanel_->Enable( true ); } else { onOffRB_->SetSelection( 1 ); chooseFilePanel_->Enable( false ); } } void StackDialog::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/StackDialog/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/StackDialog/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/StackDialog/WIDTH"), static_cast(width) ); config->Write( wxT("/StackDialog/HEIGHT"), static_cast(height) ); chooseFilePanel_->SaveFilenames( config, wxT("/StackDialog") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroStackDialog(); Destroy(); } void StackDialog::OnOffToggle( wxCommandEvent &WXUNUSED(event) ) { Toggle(); } void StackDialog::Toggle() { chooseFilePanel_->Enable( onOffRB_->GetSelection()==0 ); } void StackDialog::OnApply( wxCommandEvent &WXUNUSED(event) ) { if( onOffRB_->GetSelection() == 1 ) { ExGlobals::SetStackOff(); } else { wxString fileName( chooseFilePanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Warning"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( !ExGlobals::SetStackOn(fileName,appendCkB_->IsChecked()) ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("could not open "))+fileName, wxT("Warning"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } } void StackDialog::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/InquireYNDialog.h0000644012702201742730000000233511274636606017635 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_INQUIREYN_DIALOG #define EXTREMA_INQUIREYN_DIALOG #include "wx/wx.h" class InquireYNDialog : public wxDialog { public: InquireYNDialog(); void SetLabel( wxString const & ); // event handlers void OnYes( wxCommandEvent & ); void OnNo( wxCommandEvent & ); void OnStopAll( wxCommandEvent& ); void CloseEventHandler( wxCloseEvent & ); private: wxStaticText *messageCtrl_; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/AnalysisSpeedButtonPanel.h0000644012702201742730000000367611274636606021563 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_ANALYSIS_SPEED_BUTTON_PANEL #define EXTREMA_ANALYSIS_SPEED_BUTTON_PANEL #include #include "wx/wx.h" #include "wx/html/helpctrl.h" #include "extrema.h" DECLARE_APP(extrema) // The AnalysisWindow is the main extrema window. It contains the command history // and message text control and the command input text control, as well as various // menus and speed buttons. class AnalysisWindow; class AnalysisSpeedButtonPanel : public wxPanel { public: AnalysisSpeedButtonPanel( AnalysisWindow * ); void OnConstants( wxCommandEvent & ); void OnClearMessages( wxCommandEvent & ); void OnExit( wxCommandEvent & ); void OnShowVariables( wxCommandEvent & ); void OnExecute( wxCommandEvent & ); void OnGenerateVector( wxCommandEvent & ); void OnFit( wxCommandEvent & ); void OnHelp( wxCommandEvent & ); void OnStackToggle( wxCommandEvent & ); void OnSaveSession( wxCommandEvent & ); void OnRestoreSession( wxCommandEvent & ); private: AnalysisWindow *analysisWindow_; enum { ID_execute, ID_show, ID_fit, ID_generate, ID_constants, ID_saveSession, ID_restoreSession, ID_clearMessages, ID_stackToggle }; DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ExecuteDialog.h0000644012702201742730000000256211274636606017356 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_EXECUTE_DIALOG #define EXTREMA_EXECUTE_DIALOG #include "wx/wx.h" class AnalysisWindow; class ChooseFilePanel; class ExecuteDialog : public wxFrame { public: ExecuteDialog( AnalysisWindow * ); void Set( wxString const &, wxString const &, wxString const & ); private: void Apply(); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); AnalysisWindow *analysisWindow_; wxTextCtrl *parameterTextCtrl_; ChooseFilePanel *chooseFilePanel_; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/FontChooser.cpp0000644012702201742730000004050511332146514017404 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/config.h" #include "wx/stattext.h" #include "FontChooser.h" #include "ExGlobals.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_colorControl.h" #include "GRA_colorMap.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( FontChooser, wxDialog ) EVT_RADIOBUTTON( ID_white, FontChooser::OnWhite ) EVT_RADIOBUTTON( ID_purple, FontChooser::OnPurple ) EVT_RADIOBUTTON( ID_salmon, FontChooser::OnSalmon ) EVT_RADIOBUTTON( ID_maroon, FontChooser::OnMaroon ) EVT_RADIOBUTTON( ID_black, FontChooser::OnBlack ) EVT_RADIOBUTTON( ID_yellow, FontChooser::OnYellow ) EVT_RADIOBUTTON( ID_sienna, FontChooser::OnSienna ) EVT_RADIOBUTTON( ID_navy, FontChooser::OnNavy ) EVT_RADIOBUTTON( ID_red, FontChooser::OnRed ) EVT_RADIOBUTTON( ID_cyan, FontChooser::OnCyan ) EVT_RADIOBUTTON( ID_tan, FontChooser::OnTan ) EVT_RADIOBUTTON( ID_olive, FontChooser::OnOlive ) EVT_RADIOBUTTON( ID_green, FontChooser::OnGreen ) EVT_RADIOBUTTON( ID_brown, FontChooser::OnBrown ) EVT_RADIOBUTTON( ID_fuchsia, FontChooser::OnFuchsia ) EVT_RADIOBUTTON( ID_silver, FontChooser::OnSilver ) EVT_RADIOBUTTON( ID_blue, FontChooser::OnBlue ) EVT_RADIOBUTTON( ID_coral, FontChooser::OnCoral ) EVT_RADIOBUTTON( ID_lime, FontChooser::OnLime ) EVT_RADIOBUTTON( ID_teal, FontChooser::OnTeal ) EVT_GRID_SELECT_CELL( FontChooser::OnMap ) EVT_COMBOBOX( ID_font, FontChooser::OnFont ) EVT_BUTTON( wxID_OK, FontChooser::OnOK ) EVT_BUTTON( wxID_CANCEL, FontChooser::OnCancel ) EVT_CLOSE( FontChooser::CloseEventHandler ) END_EVENT_TABLE() FontChooser::FontChooser( wxWindow *parent ) : wxDialog(parent,wxID_ANY,wxT("Font chooser"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSTAY_ON_TOP), parent_(parent) { CreateForm(); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/FontChooser/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/FontChooser/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/FontChooser/WIDTH"), 480l ); int height = config->Read( wxT("/FontChooser/HEIGHT"), 410l ); SetSize( ulx, uly, width, height ); Show( true ); long lTmp; config->Read( wxT("/FontChooser/FONTCODE"), &lTmp, 12l ); fontCode_ = static_cast(lTmp); fontCB_->SetSelection( fontCode_ ); wxString sTmp; config->Read( wxT("/FontChooser/TEXTHEIGHT"), &sTmp, wxT("") ); heightTC_->SetValue( sTmp ); sTmp.clear(); config->Read( wxT("/FontChooser/ANGLE"), &sTmp, wxT("") ); angleTC_->SetValue( sTmp ); sTmp.clear(); config->Read( wxT("/FontChooser/COLORCODE"), &lTmp, -1l ); colorCode_ = static_cast(lTmp); Layout(); SetFontSample(); } void FontChooser::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); topSizer->AddSpacer( 20 ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Font ")), wxSizerFlags(0).Right().Border(wxTOP,5) ); // int nf = GRA_fontControl::GetCount(); wxString choices[nf]; for( int i=0; iGetFontName(); fontCB_ = new wxComboBox( topPanel, ID_font, wxT(""), wxDefaultPosition, wxSize(200,25), nf, choices, wxCB_READONLY ); topSizer->Add( fontCB_, wxSizerFlags(1).Left().Border(wxALL,2) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Expand().Border(wxALL,2) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); midSizer->AddSpacer( 5 ); midSizer->Add( new wxStaticText(midPanel,wxID_ANY,wxT("Sample ")), wxSizerFlags(0).Right().Border(wxTOP,5) ); sampleText_ = new MySampleText( midPanel ); midSizer->Add( sampleText_, wxSizerFlags(1).Left().Border(wxALL,2) ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(0).Expand().Border(wxALL,2) ); colorNB_ = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP ); namedPage_ = new wxPanel( colorNB_, wxID_ANY ); wxGridSizer *namedSizer = new wxGridSizer( 8, 3, 1, 1 ); mainSizer->AddSpacer( 10 ); namedRB_[0] = new wxRadioButton( namedPage_, ID_white, wxT("White"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); namedSizer->Add( namedRB_[0], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[5] = new wxRadioButton( namedPage_, ID_purple, wxT("Purple") ); namedSizer->Add( namedRB_[5], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[10] = new wxRadioButton( namedPage_, ID_salmon, wxT("Salmon") ); namedSizer->Add( namedRB_[10], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[15] = new wxRadioButton( namedPage_, ID_maroon, wxT("Maroon") ); namedSizer->Add( namedRB_[15], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[1] = new wxRadioButton( namedPage_, ID_black, wxT("Black") ); namedSizer->Add( namedRB_[1], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[6] = new wxRadioButton( namedPage_, ID_yellow, wxT("Yellow") ); namedSizer->Add( namedRB_[6], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[11] = new wxRadioButton( namedPage_, ID_sienna, wxT("Sienna") ); namedSizer->Add( namedRB_[11], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[16] = new wxRadioButton( namedPage_, ID_navy, wxT("Navy") ); namedSizer->Add( namedRB_[16], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[2] = new wxRadioButton( namedPage_, ID_red, wxT("Red") ); namedSizer->Add( namedRB_[2], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[7] = new wxRadioButton( namedPage_, ID_cyan, wxT("Cyan") ); namedSizer->Add( namedRB_[7], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[12] = new wxRadioButton( namedPage_, ID_tan, wxT("Tan") ); namedSizer->Add( namedRB_[12], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[17] = new wxRadioButton( namedPage_, ID_olive, wxT("Olive") ); namedSizer->Add( namedRB_[17], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[3] = new wxRadioButton( namedPage_, ID_green, wxT("Green") ); namedSizer->Add( namedRB_[3], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[8] = new wxRadioButton( namedPage_, ID_brown, wxT("Brown") ); namedSizer->Add( namedRB_[8], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[13] = new wxRadioButton( namedPage_, ID_fuchsia, wxT("Fuchsia") ); namedSizer->Add( namedRB_[13], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[18] = new wxRadioButton( namedPage_, ID_silver, wxT("Silver") ); namedSizer->Add( namedRB_[18], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[4] = new wxRadioButton( namedPage_, ID_blue, wxT("Blue") ); namedSizer->Add( namedRB_[4], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[9] = new wxRadioButton( namedPage_, ID_coral, wxT("Coral") ); namedSizer->Add( namedRB_[9], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[14] = new wxRadioButton( namedPage_, ID_lime, wxT("Lime") ); namedSizer->Add( namedRB_[14], wxSizerFlags(0).Left().Border(wxALL,2) ); namedRB_[19] = new wxRadioButton( namedPage_, ID_teal, wxT("Teal") ); namedSizer->Add( namedRB_[19], wxSizerFlags(0).Left().Border(wxALL,2) ); namedPage_->SetSizer( namedSizer ); colorNB_->AddPage( namedPage_, wxT("Named colours"), true ); mapPage_ = new wxPanel( colorNB_, wxID_ANY ); wxBoxSizer *mapSizer = new wxBoxSizer( wxHORIZONTAL ); mapGrid_ = new wxGrid( mapPage_, ID_map, wxDefaultPosition, wxSize(400,200), wxSIMPLE_BORDER ); int nColors = GRA_colorControl::GetColorMap()->GetSize(); int ncols = static_cast( sqrt(static_cast(nColors))+0.5 ); int nrows = nColors/ncols; while( ncols*nrows < nColors )++nrows; mapGrid_->CreateGrid( nrows, ncols ); mapGrid_->BeginBatch(); bool done = false; for( int j=0; jSetColSize( j, 20 ); mapGrid_->SetColLabelValue( j, wxString()<<(j+1) ); } for( int i=0; iSetRowSize( i, 20 ); for( int j=0; jSetReadOnly( i, j, true ); if( (j+1)+i*ncols > nColors ) { done = true; break; } mapGrid_->SetCellBackgroundColour( i, j, ExGlobals::GetwxColor(j+i*ncols+1) ); } if( done )break; } mapGrid_->EndBatch(); mapGrid_->ForceRefresh(); mapSizer->Add( mapGrid_, wxSizerFlags(0).Center().Border(wxALL,2) ); mapPage_->SetSizer( mapSizer ); colorNB_->AddPage( mapPage_, wxT("Colour map"), false ); mainSizer->Add( colorNB_, wxSizerFlags(0).Center().Border(wxALL,2) ); mainSizer->AddSpacer( 10 ); wxPanel *haPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *haSizer = new wxBoxSizer( wxHORIZONTAL ); haSizer->Add( new wxStaticText(haPanel,wxID_ANY,wxT("%Height")), wxSizerFlags(0).Right().Border(wxTOP,5) ); heightTC_ = new wxTextCtrl( haPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150,25) ); haSizer->Add( heightTC_, wxSizerFlags(1).Left().Border(wxALL,2) ); haSizer->AddSpacer( 10 ); haSizer->Add( new wxStaticText(haPanel,wxID_ANY,wxT("Angle")), wxSizerFlags(0).Right().Border(wxTOP,5) ); angleTC_ = new wxTextCtrl( haPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150,25) ); haSizer->Add( angleTC_, wxSizerFlags(1).Left().Border(wxALL,2) ); haPanel->SetSizer( haSizer ); mainSizer->Add( haPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *okButton = new wxButton( bottomPanel, wxID_OK, wxT("OK") ); okButton->SetToolTip( wxT("accept the font as chosen") ); bottomSizer->Add( okButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *cancelButton = new wxButton( bottomPanel, wxID_CANCEL, wxT("Cancel") ); cancelButton->SetToolTip( wxT("close this form making no changes to the current font") ); bottomSizer->Add( cancelButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); } void FontChooser::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/FontChooser/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/FontChooser/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/FontChooser/WIDTH"), static_cast(width) ); config->Write( wxT("/FontChooser/HEIGHT"), static_cast(height) ); // config->Write( wxT("/FontChooser/FONTCODE"), static_cast(fontCode_) ); config->Write( wxT("/FontChooser/TEXTHEIGHT"), heightTC_->GetValue() ); config->Write( wxT("/FontChooser/ANGLE"), angleTC_->GetValue() ); config->Write( wxT("/FontChooser/COLORCODE"), static_cast(colorCode_) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ Destroy(); } void FontChooser::SetFontSample() { sampleText_->SetText( GRA_fontControl::GetFont(fontCode_)->GetwxFont(), ExGlobals::GetwxColor(colorCode_) ); } void FontChooser::SetFont( int fontCode, int colorCode, double height, double angle ) { fontCode_ = fontCode; fontCB_->SetSelection( fontCode_ ); colorCode_ = colorCode; if( colorCode_ > 0 )colorNB_->SetSelection( 1 ); else { colorNB_->SetSelection( 0 ); namedRB_[-1*colorCode]->SetValue( true ); } heightTC_->Clear(); *heightTC_ << height; angleTC_->Clear(); *angleTC_ << angle; SetFontSample(); } void FontChooser::OnFont( wxCommandEvent &WXUNUSED(event) ) { fontCode_ = GRA_fontControl::GetFontCode( fontCB_->GetStringSelection() ); SetFontSample(); } void FontChooser::OnMap( wxGridEvent &event ) { int row = event.GetRow(); int col = event.GetCol(); colorCode_ = col+row*mapGrid_->GetNumberCols() + 1; SetFontSample(); } void FontChooser::OnWhite( wxCommandEvent &event ) { colorCode_ = 0; SetFontSample(); } void FontChooser::OnBlack( wxCommandEvent &event ) { colorCode_ = -1; SetFontSample(); } void FontChooser::OnRed( wxCommandEvent &event ) { colorCode_ = -2; SetFontSample(); } void FontChooser::OnGreen( wxCommandEvent &event ) { colorCode_ = -3; SetFontSample(); } void FontChooser::OnBlue( wxCommandEvent &event ) { colorCode_ = -4; SetFontSample(); } void FontChooser::OnPurple( wxCommandEvent &event ) { colorCode_ = -5; SetFontSample(); } void FontChooser::OnYellow( wxCommandEvent &event ) { colorCode_ = -6; SetFontSample(); } void FontChooser::OnCyan( wxCommandEvent &event ) { colorCode_ = -7; SetFontSample(); } void FontChooser::OnBrown( wxCommandEvent &event ) { colorCode_ = -8; SetFontSample(); } void FontChooser::OnCoral( wxCommandEvent &event ) { colorCode_ = -9; SetFontSample(); } void FontChooser::OnSalmon( wxCommandEvent &event ) { colorCode_ = -10; SetFontSample(); } void FontChooser::OnSienna( wxCommandEvent &event ) { colorCode_ = -11; SetFontSample(); } void FontChooser::OnTan( wxCommandEvent &event ) { colorCode_ = -12; SetFontSample(); } void FontChooser::OnFuchsia( wxCommandEvent &event ) { colorCode_ = -13; SetFontSample(); } void FontChooser::OnLime( wxCommandEvent &event ) { colorCode_ = -14; SetFontSample(); } void FontChooser::OnMaroon( wxCommandEvent &event ) { colorCode_ = -15; SetFontSample(); } void FontChooser::OnNavy( wxCommandEvent &event ) { colorCode_ = -16; SetFontSample(); } void FontChooser::OnOlive( wxCommandEvent &event ) { colorCode_ = -17; SetFontSample(); } void FontChooser::OnSilver( wxCommandEvent &event ) { colorCode_ = -18; SetFontSample(); } void FontChooser::OnTeal( wxCommandEvent &event ) { colorCode_ = -19; SetFontSample(); } void FontChooser::OnOK( wxCommandEvent &WXUNUSED(event) ) { double height; if( !heightTC_->GetValue().ToDouble(&height) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value for text height"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } double angle; if( !angleTC_->GetValue().ToDouble(&angle) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value for text angle"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } ExGlobals::SetWorkingFont( fontCode_, colorCode_, height, angle ); Close(); } void FontChooser::OnCancel( wxCommandEvent &WXUNUSED(event) ) { Close(); } BEGIN_EVENT_TABLE( MySampleText, wxWindow ) EVT_PAINT( MySampleText::OnPaint ) END_EVENT_TABLE() MySampleText::MySampleText( wxWindow *parent ) : wxWindow( parent, wxID_ANY, wxDefaultPosition, wxSize(300,25), wxRAISED_BORDER ), font_(wxNullFont), colour_(wxNullColour) {} void MySampleText::OnPaint( wxPaintEvent &event ) { if( font_.Ok() && colour_.Ok() ) { font_.SetPointSize( 10 ); wxPaintDC dc( this ); //PrepareDC( dc ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); dc.SetFont( font_ ); dc.SetTextForeground( colour_ ); dc.DrawText( wxT("AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"), 1, 5 ); } } void MySampleText::SetText( wxFont &font, wxColour colour ) { font_ = font; colour_ = colour; // font.SetPointSize( 10 ); wxClientDC dc( this ); //PrepareDC( dc ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); dc.SetFont( font ); dc.SetTextForeground( colour ); dc.DrawText( wxT("AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"), 1, 5 ); } // end of file extrema-4.4.5/src/wxForms/ImportWindow.cpp0000644012702201742730000005447411274636606017642 0ustar spangspang/* Copyright (C) 2008 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "wx/dcbuffer.h" #include "ImportWindow.h" #include "NumericVariable.h" #include "EVariableError.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ImportForm, wxFrame ) EVT_CLOSE( ImportForm::CloseEventHandler ) EVT_BUTTON( ID_digitize, ImportForm::OnDigitize ) EVT_BUTTON( wxID_CLOSE, ImportForm::OnClose ) END_EVENT_TABLE() ImportForm::ImportForm( wxWindow *parent, wxImage &image ) : wxFrame( parent,wxID_ANY,wxT("Import Window"), wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE ) { digitizing_ = false; picking_ = false; digitizeForm_ = 0; bitmap_ = new wxBitmap( image ); //if( !bitmap_->IsOk() )std::cerr << "bitmap not OK\n"; int ulx = 0; int uly = 0; int width = bitmap_->GetWidth() + 5; int height = bitmap_->GetHeight() + 50; //std::cout << "width=" << width << ", height=" << height << "\n"; SetSize( ulx, uly, width, height ); // for a vertical sizer: // proportion = 0 means no vertical expansion // proportion > 0 allows for vertical expansion // Expand() allows for horizontal expansion wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); wxPanel *panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); wxBoxSizer *panelSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *digitizeButton = new wxButton( panel, ID_digitize, wxT("Digitize"), wxDefaultPosition, wxDefaultSize ); panelSizer->Add( digitizeButton, wxSizerFlags(0).Border(wxTOP|wxLEFT|wxRIGHT,5) ); wxButton *closeButton = new wxButton( panel, wxID_CLOSE, wxT("Close"), wxDefaultPosition, wxDefaultSize ); panelSizer->Add( closeButton, wxSizerFlags(0).Border(wxTOP|wxLEFT|wxRIGHT,5).Right() ); panel->SetSizer( panelSizer ); sizer->Add( panel, wxSizerFlags(0).Expand().Border(wxALL,1) ); window_ = new ImportWindow( this, bitmap_ ); sizer->Add( window_, wxSizerFlags(1).Expand().Border(wxALL,1) ); SetSizer( sizer ); // Show the window. // Frames, unlike simple controls, are not shown when created initially. Show( true ); } void ImportForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void ImportForm::OnDigitize( wxCommandEvent &WXUNUSED(event) ) { if( digitizeForm_ )digitizeForm_->Raise(); else { digitizeForm_ = new DigitizeForm( this ); digitizeForm_->Show(); } } void ImportForm::StartDigitizing() { digitizing_ = true; } void ImportForm::StopDigitizing() { digitizing_ = false; } bool ImportForm::IsDigitizing() const { return digitizing_; } void ImportForm::SetDigitized( int x, int y ) { digitizeForm_->SetDigitized( x, y ); } void ImportForm::StartPicking() { picking_ = true; } void ImportForm::StopPicking() { picking_ = false; } bool ImportForm::IsPicking() const { return picking_; } void ImportForm::SetPicked( int x, int y ) { digitizeForm_->SetPicked( x, y ); } void ImportForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { delete bitmap_; Destroy(); } void ImportForm::ZeroDigitizeForm() { digitizeForm_ = 0; } void ImportForm::SetPoints( double x, double y ) { if( digitizeForm_ )digitizeForm_->SetPoints(x,y); } BEGIN_EVENT_TABLE( ImportWindow, wxWindow ) EVT_CLOSE( ImportWindow::CloseEventHandler ) EVT_PAINT( ImportWindow::OnPaint ) EVT_LEFT_DOWN( ImportWindow::OnMouseLeftDown ) END_EVENT_TABLE() ImportWindow::ImportWindow( ImportForm *parent, wxBitmap *bitmap ) : wxWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE ), parent_(parent), bitmap_(bitmap) { SetBackgroundColour( *wxBLACK ); SetCursor( *wxCROSS_CURSOR ); int width = bitmap_->GetWidth() + 5; int height = bitmap_->GetHeight() + 50; SetClientSize( width, height ); } void ImportWindow::OnMouseLeftDown( wxMouseEvent &event ) { long xl, yl; event.GetPosition( &xl, &yl ); int x = static_cast(xl); int y = static_cast(yl); if( parent_->IsPicking() ) { parent_->SetPicked( x, y ); new GetCoordinates(this,x,y); } else if( parent_->IsDigitizing() ) { parent_->SetDigitized( x, y ); } } void ImportWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxPaintDC dc( this ); dc.Clear(); dc.DrawBitmap( *bitmap_, 0, 0 ); } void ImportWindow::SetPoints( double x, double y ) { parent_->SetPoints(x,y); } void ImportWindow::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { Destroy(); } BEGIN_EVENT_TABLE( DigitizeForm, wxFrame ) EVT_CLOSE( DigitizeForm::CloseEventHandler ) EVT_BUTTON( ID_start, DigitizeForm::OnStartStop ) END_EVENT_TABLE() DigitizeForm::DigitizeForm( ImportForm *parent ) : wxFrame((wxWindow*)parent,wxID_ANY,wxT("Digitize Form"), wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE ), parent_(parent) { wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/DigitizeForm/UPPERLEFTX"), 10l ); int uly = config->Read( wxT("/DigitizeForm/UPPERLEFTY"), 10l ); int width = config->Read( wxT("/DigitizeForm/WIDTH"), 400l ); int height = config->Read( wxT("/DigitizeForm/HEIGHT"), 270l ); SetSize( ulx, uly, width, height ); wxFont font( GetFont() ); font.SetFamily( wxFONTFAMILY_TELETYPE ); wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); wxPanel *xPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( xPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *xSizer = new wxBoxSizer( wxHORIZONTAL ); xPanel->SetSizer( xSizer ); xSizer->Add( new wxStaticText(xPanel,wxID_ANY,wxT("X output vector name:")), wxSizerFlags(0).Left().Border(wxTOP,2) ); xTC_ = new wxTextCtrl( xPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(250,25) ); xTC_->SetToolTip( wxT("enter the name for the independent vector to be created") ); xSizer->Add( xTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *yPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( yPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *ySizer = new wxBoxSizer( wxHORIZONTAL ); yPanel->SetSizer( ySizer ); ySizer->Add( new wxStaticText(yPanel,wxID_ANY,wxT("Y output vector name:")), wxSizerFlags(0).Left().Border(wxTOP,2) ); yTC_ = new wxTextCtrl( yPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(250,25) ); yTC_->SetToolTip( wxT("enter the name for the dependent vector to be created") ); ySizer->Add( yTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *fpPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( fpPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *fpSizer = new wxBoxSizer( wxHORIZONTAL ); fpPanel->SetSizer( fpSizer ); wxStaticText *fpText = new wxStaticText( fpPanel, wxID_ANY, wxT("First point :") ); fpText->SetFont( font ); fpText->SetSize( 200, wxDefaultCoord ); fpSizer->Add( fpText, wxSizerFlags(0).Left().Border(wxTOP,2) ); fpST_ = new wxStaticText( fpPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); fpST_->SetFont( font ); fpSizer->Add( fpST_,wxSizerFlags(0).Left().Border(wxTOP,2) ); wxPanel *spPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( spPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *spSizer = new wxBoxSizer( wxHORIZONTAL ); spPanel->SetSizer( spSizer ); wxStaticText *spText = new wxStaticText( spPanel, wxID_ANY, wxT("Second point :") ); spText->SetFont( font ); spText->SetSize( 200, wxDefaultCoord ); spSizer->Add( spText, wxSizerFlags(0).Left().Border(wxTOP,2) ); spST_ = new wxStaticText( spPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); spST_->SetFont( font ); spSizer->Add( spST_,wxSizerFlags(0).Left().Border(wxTOP,2) ); wxPanel *tpPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( tpPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *tpSizer = new wxBoxSizer( wxHORIZONTAL ); tpPanel->SetSizer( tpSizer ); wxStaticText *tpText = new wxStaticText( tpPanel, wxID_ANY, wxT("Third point :") ); tpText->SetFont( font ); tpText->SetSize( 200, wxDefaultCoord ); tpSizer->Add( tpText, wxSizerFlags(0).Left().Border(wxTOP,2) ); tpST_ = new wxStaticText( tpPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); tpST_->SetFont( font ); tpSizer->Add( tpST_,wxSizerFlags(0).Left().Border(wxTOP,2) ); wxPanel *numPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( numPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *numSizer = new wxBoxSizer( wxHORIZONTAL ); numPanel->SetSizer( numSizer ); wxStaticText *numText = new wxStaticText( numPanel, wxID_ANY, wxT("Number of digitized points :") ); numText->SetFont( font ); numText->SetSize( 200, wxDefaultCoord ); numSizer->Add( numText, wxSizerFlags(0).Left().Border(wxTOP,2) ); numST_ = new wxStaticText( numPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); numST_->SetFont( font ); numSizer->Add( numST_,wxSizerFlags(0).Left().Border(wxTOP,2) ); wxPanel *lastPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( lastPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *lastSizer = new wxBoxSizer( wxHORIZONTAL ); lastPanel->SetSizer( lastSizer ); wxStaticText *lastText = new wxStaticText( lastPanel, wxID_ANY, wxT("Last point digitized :") ); lastText->SetFont( font ); lastText->SetSize( 200, wxDefaultCoord ); lastSizer->Add( lastText, wxSizerFlags(0).Left().Border(wxTOP,2) ); lastST_ = new wxStaticText( lastPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); lastST_->SetFont( font ); lastSizer->Add( lastST_,wxSizerFlags(0).Left().Border(wxTOP,2) ); startStopB_ = new wxButton( this, ID_start, wxT("Start digitizing") ); mainSizer->Add( startStopB_, wxSizerFlags(0).Centre().Border(wxTOP,10) ); Show( true ); digitizing_ = false; digitizeInfo_ = 0; } void DigitizeForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/DigitizeForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/DigitizeForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/DigitizeForm/WIDTH"), static_cast(width) ); config->Write( wxT("/DigitizeForm/HEIGHT"), static_cast(height) ); } parent_->ZeroDigitizeForm(); Destroy(); } void DigitizeForm::ZeroDigitizeInfo() { digitizeInfo_ = 0; } void DigitizeForm::OnStartStop( wxCommandEvent &WXUNUSED(event) ) { if( !digitizing_ ) { nPick_ = 0; parent_->StartPicking(); if( digitizeInfo_ ) { digitizeInfo_->Close(); digitizeInfo_ = 0; } digitizeInfo_ = new DigitizeInfo(this); } else { if( !xTC_->GetValue().empty() ) { try { NumericVariable::PutVariable( xTC_->GetValue(), xd_, 0, wxT("from digitizing") ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } if( !yTC_->GetValue().empty() ) { try { NumericVariable::PutVariable( yTC_->GetValue(), yd_, 0, wxT("from digitizing") ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } Close(); } } void DigitizeForm::StartPicking() { parent_->StartPicking(); } void DigitizeForm::StartDigitizing() { //std::cout << "StartDigitizing\n"; digitizing_ = true; startStopB_->SetLabel( wxT("Stop digitizing") ); SetupCoordinateTransform(); parent_->StartDigitizing(); nDigitized_ = 0; numST_->SetLabel( wxString()<().swap( xd_ ); std::vector().swap( yd_ ); } void DigitizeForm::AbortDigitizing() { //std::cout << "AbortDigitizing\n"; startStopB_->SetLabel( wxT("Start digitizing") ); std::vector().swap( xd_ ); std::vector().swap( yd_ ); } void DigitizeForm::SetPicked( int x, int y ) { xImage_[nPick_] = x; yImage_[nPick_] = y; if( nPick_ == 2 )parent_->StopPicking(); } void DigitizeForm::SetDigitized( int x, int y ) { //std::cout << "SetDigitized\n"; numST_->SetLabel( wxString()<<(++nDigitized_) ); double xx = a_ + b_*x + c_*y; double yy = d_ + e_*x + f_*y; lastST_->SetLabel( wxString()<ShowModal(); return; } a_ = (xImage_[2]*(yImage_[0]*xUser_[1] - yImage_[1]*xUser_[0]) - yImage_[2]*(xImage_[0]*xUser_[1] - xImage_[1]*xUser_[0]) + xUser_[2]*(xImage_[0]*yImage_[1] - xImage_[1]*yImage_[0]))/denom; b_ = (-yImage_[0]*xUser_[1] + yImage_[1]*xUser_[0] + yImage_[2]*(xUser_[1]-xUser_[0]) - xUser_[2]*(yImage_[1]-yImage_[0]))/denom; c_ = (xImage_[0]*xUser_[1] - xImage_[1]*xUser_[0] - xImage_[2]*(xUser_[1]-xUser_[0]) + xUser_[2]*(xImage_[1]-xImage_[0]))/denom; d_ = (xImage_[2]*(yImage_[0]*yUser_[1] - yImage_[1]*yUser_[0]) - yImage_[2]*(xImage_[0]*yUser_[1] - xImage_[1]*yUser_[0]) + yUser_[2]*(xImage_[0]*yImage_[1] - xImage_[1]*yImage_[0]))/denom; e_ = (-yImage_[0]*yUser_[1] + yImage_[1]*yUser_[0] + yImage_[2]*(yUser_[1]-yUser_[0]) - yUser_[2]*(yImage_[1]-yImage_[0]))/denom; f_ = (xImage_[0]*yUser_[1] - xImage_[1]*yUser_[0] - xImage_[2]*(yUser_[1]-yUser_[0]) + yUser_[2]*(xImage_[1]-xImage_[0]))/denom; } BEGIN_EVENT_TABLE( DigitizeInfo, wxFrame ) EVT_CLOSE( DigitizeInfo::CloseEventHandler ) EVT_BUTTON( ID_abort, DigitizeInfo::OnAbort ) END_EVENT_TABLE() DigitizeInfo::DigitizeInfo( DigitizeForm *parent ) : wxFrame((wxWindow*)parent,wxID_ANY,wxT("Digitize Info"), wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE ), parent_(parent) { wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/DigitizeInfo/UPPERLEFTX"), 10l ); int uly = config->Read( wxT("/DigitizeInfo/UPPERLEFTY"), 10l ); int width = config->Read( wxT("/DigitizeInfo/WIDTH"), 500l ); int height = config->Read( wxT("/DigitizeInfo/HEIGHT"), 150l ); SetSize( ulx, uly, width, height ); wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); wxPanel *infoPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( infoPanel, wxSizerFlags(1).Expand().Border(wxALL,5) ); wxBoxSizer *infoSizer = new wxBoxSizer( wxHORIZONTAL ); infoPanel->SetSizer( infoSizer ); infoST_ = new wxStaticText( infoPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT|wxST_NO_AUTORESIZE ); infoSizer->Add( infoST_, wxSizerFlags(0).Left().Border(wxTOP,2) ); abortB_ = new wxButton( this, ID_abort, wxT("Abort") ); mainSizer->Add( abortB_, wxSizerFlags(0).Centre().Border(wxALL,5) ); wxString label( wxT("Click with the left mouse button on a location\n") ); label += wxT("on the imported drawing where you know the coordinates\n"); label += wxT("then enter the coordinates on the pop-up form"); infoST_->SetLabel( label ); nPoints_ = 0; parent_->StartPicking(); Show( true ); } void DigitizeInfo::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/DigitizeInfo/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/DigitizeInfo/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/DigitizeInfo/WIDTH"), static_cast(width) ); config->Write( wxT("/DigitizeInfo/HEIGHT"), static_cast(height) ); } parent_->ZeroDigitizeInfo(); Destroy(); } void DigitizeInfo::OnAbort( wxCommandEvent &WXUNUSED(event) ) { nPoints_ == 3 ? parent_->StartDigitizing() : parent_->AbortDigitizing(); Close(); } void DigitizeInfo::Next() { switch (nPoints_++) { case 0: infoST_->SetLabel( wxString() << wxT("Next, click with the left mouse button on another\n") << wxT("location on the imported drawing where you know the coordinates") ); break; case 1: infoST_->SetLabel( wxString() << wxT("Finally, click with the left mouse button on a\n") << wxT("non-colinear location on the imported drawing where you know the coordinates") ); break; case 2: infoST_->SetLabel( wxString() << wxT("Now, close this form and then digitize by clicking\n") << wxT("with the left mouse button on the imported drawing") ); abortB_->SetLabel( wxT("Close") ); break; } } BEGIN_EVENT_TABLE( GetCoordinates, wxFrame ) EVT_CLOSE( GetCoordinates::CloseEventHandler ) EVT_BUTTON( wxID_OK, GetCoordinates::OnOK ) END_EVENT_TABLE() GetCoordinates::GetCoordinates( ImportWindow *parent, int x, int y ) : wxFrame((wxWindow*)parent,wxID_ANY,wxT("Get Coordinates"), wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE ), parent_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); wxPanel *xPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( xPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *xSizer = new wxBoxSizer( wxHORIZONTAL ); xPanel->SetSizer( xSizer ); xSizer->Add( new wxStaticText(xPanel,wxID_ANY,wxT("X :")), wxSizerFlags(0).Left().Border(wxTOP,2) ); xTC_ = new wxTextCtrl( xPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(250,25) ); xTC_->SetToolTip( wxT("enter the x coordinate value") ); xSizer->Add( xTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *yPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE ); mainSizer->Add( yPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); wxBoxSizer *ySizer = new wxBoxSizer( wxHORIZONTAL ); yPanel->SetSizer( ySizer ); ySizer->Add( new wxStaticText(yPanel,wxID_ANY,wxT("Y :")), wxSizerFlags(0).Left().Border(wxTOP,2) ); yTC_ = new wxTextCtrl( yPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(250,25) ); yTC_->SetToolTip( wxT("enter the y coordinate value") ); ySizer->Add( yTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxButton *okB = new wxButton( this, wxID_OK, wxT("OK") ); mainSizer->Add( okB, wxSizerFlags(0).Centre().Border(wxALL,5) ); int width = 350; int height = 130; //GetSize( &width, &height ); SetSize( x, y, width, height ); Show( true ); SetFocus(); } void GetCoordinates::OnOK( wxCommandEvent &WXUNUSED(event) ) { double x, y; if( !GetValues(x,y) )return; parent_->SetPoints( x, y ); Close(); } bool GetCoordinates::GetValues( double &x, double &y ) { if( xTC_->GetValue().empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("Please enter an x-coordinate value"), wxT("Error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return false; } if( yTC_->GetValue().empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("Please enter an y-coordinate value"), wxT("Error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return false; } if( !xTC_->GetValue().ToDouble(&x) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid number entered as x-coordinate"), wxT("Error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return false; } if( !yTC_->GetValue().ToDouble(&y) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid number entered as y-coordinate"), wxT("Error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return false; } return true; } void GetCoordinates::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { Destroy(); } // end of file extrema-4.4.5/src/wxForms/WriteScalarsForm.cpp0000644012702201742730000001557411274636606020425 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "WriteScalarsForm.h" #include "AnalysisWindow.h" #include "ChooseFilePanel.h" #include "EVariableError.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "CMD_write.h" BEGIN_EVENT_TABLE( WriteScalarsForm, wxFrame ) EVT_BUTTON( wxID_APPLY, WriteScalarsForm::OnApply ) EVT_BUTTON( wxID_CLOSE, WriteScalarsForm::OnClose ) EVT_BUTTON( wxID_REFRESH, WriteScalarsForm::OnRefresh ) EVT_CLOSE( WriteScalarsForm::CloseEventHandler ) END_EVENT_TABLE() WriteScalarsForm::WriteScalarsForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Write scalars"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, false, wxT("Choose a data file for writing"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); variableList_ = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_MULTIPLE|wxLB_EXTENDED|wxLB_NEEDED_SB ); FillList(); mainSizer->Add( variableList_, wxSizerFlags(1).Expand().Border(wxALL,5) ); append_ = new wxCheckBox( this, wxID_ANY, wxT("Append data to the file") ); mainSizer->Add( append_, wxSizerFlags(0).Border(wxALL,5) ); append_->SetValue( false ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *refreshButton = new wxButton( bottomPanel, wxID_REFRESH, wxT("Refresh") ); refreshButton->SetToolTip( wxT("update the list of scalars above") ); bottomSizer->Add( refreshButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("write data to the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/WriteScalarsForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/WriteScalarsForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/WriteScalarsForm/WIDTH"), 550l ); int height = config->Read( wxT("/WriteScalarsForm/HEIGHT"), 300l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/WriteScalarsForm") ); Show( true ); } void WriteScalarsForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/WriteScalarsForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/WriteScalarsForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/WriteScalarsForm/WIDTH"), static_cast(width) ); config->Write( wxT("/WriteScalarsForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/WriteScalarsForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroWriteScalars(); Destroy(); } void WriteScalarsForm::OnRefresh( wxCommandEvent &WXUNUSED(event) ) { FillList(); } void WriteScalarsForm::FillList() { variableList_->Clear(); NVariableTable *nvTable = NVariableTable::GetTable(); int end = nvTable->Entries(); for( int i=0; iGetEntry( i ); if( nv->GetData().GetNumberOfDimensions() == 0 )variableList_->Append( nv->GetName() ); } } void WriteScalarsForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was written"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_write *writeCommand = CMD_write::Instance(); writeCommand->SetFilename( fileName ); std::ofstream *outStream = writeCommand->GetStream(); if( outStream->is_open() )outStream->close(); outStream->clear( std::ios::goodbit ); if( append_->IsChecked() )outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out|std::ios::app ); else outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out ); if( !outStream->is_open() ) { outStream->clear( std::ios::goodbit ); wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } int count = variableList_->GetCount(); for( int i=0; iIsChecked(i) )continue; int ndm; double value; std::vector d; int dimSizes[3]; wxString name( variableList_->GetString(i) ); try { NumericVariable::GetVariable( name, ndm, value, d, dimSizes ); } catch( EVariableError const &e ) { outStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxString(wxT("Fatal error: scalar "))+name+wxT(" was not written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } (*outStream) << value << "\n"; } outStream->close(); } void WriteScalarsForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/AxisPopup.cpp0000644012702201742730000007421211274636606017120 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "wx/radiobox.h" #include "AxisPopup.h" #include "GraphicsPage.h" #include "GRA_window.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "ExGlobals.h" #include "GRA_intCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "BasicColors.h" #include "EGraphicsError.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( AxisPopup, wxFrame ) EVT_CHECKBOX( ID_drawAxis, AxisPopup::OnDrawAxis ) EVT_CHECKBOX( ID_drawGraphBox, AxisPopup::OnDrawGraphBox ) EVT_RADIOBOX( ID_gridLines, AxisPopup::OnGridLines ) EVT_RADIOBOX( ID_logBase, AxisPopup::OnLogBase ) EVT_CHECKBOX( ID_logStyle, AxisPopup::OnLogStyle ) EVT_CHECKBOX( ID_drawTics, AxisPopup::OnDrawTics ) EVT_RADIOBOX( ID_ticDirection, AxisPopup::OnTicDirection ) EVT_CHECKBOX( ID_drawNumbers, AxisPopup::OnDrawNumbers ) EVT_CHECKBOX( ID_drawLabel, AxisPopup::OnDrawLabel ) EVT_COMBOBOX( ID_numbersFont, AxisPopup::OnNumbersFont ) EVT_TEXT( ID_label, AxisPopup::OnLabel ) EVT_TEXT_ENTER( ID_label2, AxisPopup::OnLabelEnter ) EVT_COMBOBOX( ID_labelFont, AxisPopup::OnLabelFont ) EVT_BUTTON( ID_applyScales, AxisPopup::OnApplyScales ) EVT_BUTTON( wxID_CLOSE, AxisPopup::OnClose ) EVT_CLOSE( AxisPopup::CloseEventHandler ) END_EVENT_TABLE() AxisPopup::AxisPopup( GraphicsPage *parent ) : wxFrame(parent,wxID_ANY,wxT("Axis Popup"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), page_(parent) { setup_ = true; CreateForm(); // wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/AxisPopup/UPPERLEFTX"), 950l ); int uly = config->Read( wxT("/AxisPopup/UPPERLEFTY"), 150l ); int width = config->Read( wxT("/AxisPopup/WIDTH"), 320l ); int height = config->Read( wxT("/AxisPopup/HEIGHT"), 430l ); SetSize( ulx, uly, width, height ); int page = config->Read( wxT("/AxisPopup/PAGE"), 0l ); #if wxMINOR_VERSION < 8 notebook_->SetSelection( std::max(0,std::min(4,page)) ); #else notebook_->ChangeSelection( std::max(0,std::min(4,page)) ); #endif Show( true ); // Layout(); } void AxisPopup::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); notebook_ = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP ); mainSizer->Add( notebook_, wxSizerFlags(0).Left().Border(wxALL,5) ); // MakeAxisPanel(); MakeNumbersPanel(); MakeLabelPanel(); MakeLocationPanel(); MakeAxisScalesPanel(); // closeBTN_ = new wxButton( this, wxID_CLOSE, wxT("Close") ); mainSizer->Add( closeBTN_, wxSizerFlags(0).Center().Border(wxALL,2) ); } void AxisPopup::MakeAxisPanel() { wxPanel *panel = new wxPanel( notebook_ ); notebook_->AddPage( panel, wxT("Axis"), true ); wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); panel->SetSizer( sizer ); wxPanel *topPanel = new wxPanel( panel ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); topPanel->SetSizer( topSizer ); sizer->Add( topPanel, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *topLeftPanel = new wxPanel( topPanel ); wxBoxSizer *topLeftSizer = new wxBoxSizer( wxVERTICAL ); topLeftPanel->SetSizer( topLeftSizer ); topSizer->Add( topLeftPanel, wxSizerFlags(0).Left().Border(wxALL,2) ); drawAxisCB_ = new wxCheckBox( topLeftPanel, ID_drawAxis, wxT("Draw axis") ); drawAxisCB_->SetToolTip( wxT("toggle display of axis") ); topLeftSizer->Add( drawAxisCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); drawGraphBoxCB_ = new wxCheckBox( topLeftPanel, ID_drawGraphBox, wxT("Draw graph box") ); drawGraphBoxCB_->SetToolTip( wxT("toggle display of the graph box") ); topLeftSizer->Add( drawGraphBoxCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *tlBotPanel = new wxPanel( topLeftPanel ); wxBoxSizer *tlbSizer = new wxBoxSizer( wxHORIZONTAL ); tlBotPanel->SetSizer( tlbSizer ); topLeftSizer->Add( tlBotPanel, wxSizerFlags(0).Left().Border(wxALL,2) ); axisColor_ = new ExColorCtrl( tlBotPanel, wxT("Axis color"), this, &AxisPopup::OnAxisColor ); axisColor_->SetToolTip( wxT("change the axis color") ); tlbSizer->Add( axisColor_, wxSizerFlags(0).Left().Border(wxALL,2) ); lineWidthSC_ = new ExSpinCtrlI( tlBotPanel, wxT("Line width"), 1, 10, this, &AxisPopup::OnLineWidth ); lineWidthSC_->SetToolTip( wxT("set the line width for the axis") ); tlbSizer->Add( lineWidthSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *topRightPanel = new wxPanel( topPanel ); wxBoxSizer *topRightSizer = new wxBoxSizer( wxVERTICAL ); topRightPanel->SetSizer( topRightSizer ); topSizer->Add( topRightPanel, wxSizerFlags(0).Right().Border(wxALL,2) ); wxString choices[3]; choices[0] = wxT("None"); choices[1] = wxT("At major tics"); choices[2] = wxT("At all tics"); gridLinesRB_ = new wxRadioBox( topRightPanel,ID_gridLines,wxT("Grid lines"),wxDefaultPosition,wxDefaultSize,3,choices ); gridLinesRB_->SetToolTip( wxT("draw axis grid lines") ); topRightSizer->Add( gridLinesRB_, wxSizerFlags(0).Center().Border(wxALL,2) ); lineTypeSC_ = new ExSpinCtrlI( topRightPanel, wxT("Grid line type"), 1, 10, this, &AxisPopup::OnLineType ); lineTypeSC_->SetToolTip( wxT("set the line type for the grid lines") ); topRightSizer->Add( lineTypeSC_, wxSizerFlags(0).Center().Border(wxALL,2) ); drawTicsCB_ = new wxCheckBox( panel, ID_drawTics, wxT("Draw tics") ); drawTicsCB_->SetToolTip( wxT("toggle display of tic marks") ); sizer->Add( drawTicsCB_, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *midPanel = new wxPanel( panel ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); midPanel->SetSizer( midSizer ); sizer->Add( midPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); choices[0] = wxT("Inside"); choices[1] = wxT("Outside"); choices[2] = wxT("Both"); ticDirectionRB_ = new wxRadioBox( midPanel, ID_ticDirection, wxT("Tics"), wxDefaultPosition, wxDefaultSize, 3, choices ); ticDirectionRB_->SetToolTip( wxT("choose tic mark direction") ); midSizer->Add( ticDirectionRB_, wxSizerFlags(0).Left().Border(wxALL,5) ); minorIncsSC_ = new ExSpinCtrlI( midPanel, wxT("# minor incs"), 0, 50, this, &AxisPopup::OnMinorIncs ); minorIncsSC_->SetToolTip( wxT("set the number of minor divisions (between major tics)") ); midSizer->Add( minorIncsSC_, wxSizerFlags(0).Right().Border(wxALL,5) ); wxPanel *botPanel = new wxPanel( panel ); wxBoxSizer *botSizer = new wxBoxSizer( wxHORIZONTAL ); botPanel->SetSizer( botSizer ); sizer->Add( botPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); majorTicLenSC_ = new ExSpinCtrlD( botPanel, wxT("Major tic length (%)"), this, &AxisPopup::OnMajorTicLen ); majorTicLenSC_->SetToolTip( wxT("set the length of the major tics (as a % of the window)") ); botSizer->Add( majorTicLenSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); minorTicLenSC_ = new ExSpinCtrlD( botPanel, wxT("Minor tic length (%)"), this, &AxisPopup::OnMinorTicLen ); majorTicLenSC_->SetToolTip( wxT("set the length of the minor tics (as a % of the window)") ); botSizer->Add( minorTicLenSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); } void AxisPopup::MakeNumbersPanel() { wxPanel *panel = new wxPanel( notebook_ ); notebook_->AddPage( panel, wxT("Numbering"), true ); wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); panel->SetSizer( sizer ); drawNumbersCB_ = new wxCheckBox( panel, ID_drawNumbers, wxT("Draw axis values") ); drawNumbersCB_->SetToolTip( wxT("toggle display of the axis numbering") ); sizer->Add( drawNumbersCB_, wxSizerFlags(0).Left().Border(wxALL,5) ); sizer->Add( new wxStaticText(panel,wxID_ANY,wxT("Font ")), wxSizerFlags(0).Left().Border(wxTOP,5) ); int nf = GRA_fontControl::GetCount(); wxString choices[nf]; for( int i=0; iGetFontName(); nFontCB_ = new wxComboBox( panel, ID_numbersFont, wxT(""), wxDefaultPosition, wxSize(200,25), nf, choices, wxCB_READONLY ); nFontCB_->SetToolTip( wxT("choose the axis numbers font") ); sizer->Add( nFontCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *botPanel = new wxPanel( panel ); wxBoxSizer *botSizer = new wxBoxSizer( wxHORIZONTAL ); botPanel->SetSizer( botSizer ); sizer->Add( botPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); numbersColor_ = new ExColorCtrl( botPanel, wxT("Color"), this, &AxisPopup::OnNumbersColor ); numbersColor_->SetToolTip( wxT("click to set the color for the axis numbering") ); botSizer->Add( numbersColor_, wxSizerFlags(0).Left().Border(wxALL,5) ); numbersHeightSC_ = new ExSpinCtrlD( botPanel, wxT("Height (%)"), this, &AxisPopup::OnNumbersHeight ); numbersHeightSC_->SetToolTip( wxT("set the height for the axis numbering (as a % of the window)") ); botSizer->Add( numbersHeightSC_, wxSizerFlags(0).Left().Border(wxALL,5) ); numbersAngleSC_ = new ExSpinCtrlI( botPanel, wxT("Angle (degrees)"), 0, 360, this, &AxisPopup::OnNumbersAngle ); numbersAngleSC_->SetToolTip( wxT("set the angle for the axis numbering (0 to 360 degrees)") ); botSizer->Add( numbersAngleSC_, wxSizerFlags(0).Left().Border(wxALL,5) ); logStyleCB_ = new wxCheckBox( panel, ID_logStyle, wxT("Exponential style numbers") ); logStyleCB_->SetToolTip( wxT("toggle decimal or exponential style numbers (logarithmic axis only)") ); sizer->Add( logStyleCB_, wxSizerFlags(0).Center().Border(wxALL,5) ); } void AxisPopup::MakeLabelPanel() { wxPanel *panel = new wxPanel( notebook_ ); notebook_->AddPage( panel, wxT("Label"), true ); wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); panel->SetSizer( sizer ); wxPanel *topPanel = new wxPanel( panel ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); topPanel->SetSizer( topSizer ); sizer->Add( topPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); drawLabelCB_ = new wxCheckBox( topPanel, ID_drawLabel, wxT("Draw label") ); drawLabelCB_->SetToolTip( wxT("toggle display of the axis label") ); topSizer->Add( drawLabelCB_, wxSizerFlags(0).Left().Border(wxALL,5) ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Axis label")), wxSizerFlags(0).Left().Border(wxTOP,5) ); labelTC_ = new wxTextCtrl( topPanel, ID_label, wxT(""), wxDefaultPosition, wxSize(200,25), wxTE_LEFT|wxTE_PROCESS_ENTER ); labelTC_->SetToolTip( wxT("enter the axis label (hit Enter key to accept label)") ); topSizer->Add( labelTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Font ")), wxSizerFlags(0).Left().Border(wxTOP,5) ); int nf = GRA_fontControl::GetCount(); wxString choices[nf]; for( int i=0; iGetFontName(); lFontCB_ = new wxComboBox( topPanel, ID_labelFont, wxT(""), wxDefaultPosition, wxSize(200,25), nf, choices, wxCB_READONLY ); lFontCB_->SetToolTip( wxT("choose the axis label font") ); topSizer->Add( lFontCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *botPanel = new wxPanel( panel ); wxBoxSizer *botSizer = new wxBoxSizer( wxHORIZONTAL ); botPanel->SetSizer( botSizer ); sizer->Add( botPanel, wxSizerFlags(0).Left().Border(wxALL,5) ); labelColor_ = new ExColorCtrl( botPanel, wxT("Color"), this, &AxisPopup::OnLabelColor ); labelColor_->SetToolTip( wxT("click to set the color for the axis label") ); botSizer->Add( labelColor_, wxSizerFlags(0).Left().Border(wxALL,5) ); labelHeightSC_ = new ExSpinCtrlD( botPanel, wxT("Height (%)"), this, &AxisPopup::OnLabelHeight ); labelHeightSC_->SetToolTip( wxT("set the axis label height (as a % of the window)") ); botSizer->Add( labelHeightSC_, wxSizerFlags(0).Left().Border(wxALL,5) ); } void AxisPopup::MakeLocationPanel() { wxPanel *panel = new wxPanel( notebook_ ); notebook_->AddPage( panel, wxT("Location"), true ); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); panel->SetSizer( sizer ); lowAxisSC_ = new ExSpinCtrlD( panel, wxT("Lower axis (%)"), this, &AxisPopup::OnLowAxis ); lowAxisSC_->SetToolTip( wxT("set the location of the lower axis (as a % of the window)") ); sizer->Add( lowAxisSC_, wxSizerFlags(0).Left().Border(wxALL,10) ); upAxisSC_ = new ExSpinCtrlD( panel, wxT("Upper axis (%)"), this, &AxisPopup::OnUpAxis ); upAxisSC_->SetToolTip( wxT("set the location of the upper axis (as a % of the window)") ); sizer->Add( upAxisSC_, wxSizerFlags(0).Left().Border(wxALL,10) ); } void AxisPopup::MakeAxisScalesPanel() { wxPanel *panel = new wxPanel( notebook_ ); notebook_->AddPage( panel, wxT("Scales"), true ); wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); panel->SetSizer( sizer ); wxPanel *topPanel = new wxPanel( panel ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); topPanel->SetSizer( topSizer ); sizer->Add( topPanel, wxSizerFlags(0).Left().Border(wxALL,2) ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Min")), wxSizerFlags(0).Left().Border(wxALL,2) ); minTC_ = new wxTextCtrl( topPanel, wxID_ANY ); minTC_->SetToolTip( wxT("set the axis minimum value") ); topSizer->Add( minTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Max")), wxSizerFlags(0).Left().Border(wxALL,2) ); maxTC_ = new wxTextCtrl( topPanel, wxID_ANY ); maxTC_->SetToolTip( wxT("set the axis maximum value") ); topSizer->Add( maxTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); wxString choices[4]; choices[0] = wxT("Linear axis"); choices[1] = wxT("Log base 2"); choices[2] = wxT("Log base e"); choices[3] = wxT("Log base 10"); logBaseRB_ = new wxRadioBox( panel, ID_logBase, wxT(""), wxDefaultPosition, wxDefaultSize, 4, choices ); logBaseRB_->SetToolTip( wxT("choose linear or logarithmic axis") ); sizer->Add( logBaseRB_, wxSizerFlags(0).Center().Border(wxALL,2) ); applyScalesBTN_ = new wxButton( panel, ID_applyScales, wxT("Apply scales") ); sizer->Add( applyScalesBTN_, wxSizerFlags(0).Center().Border(wxALL,10) ); } void AxisPopup::Setup( GRA_window *window, char const which ) { setup_ = true; window_ = window; which_ = which; axisChars_ = which_=='X' ? window_->GetXAxisCharacteristics() : window_->GetYAxisCharacteristics(); // // set up the axis panel // drawAxisCB_->SetValue( static_cast(axisChars_->Get(wxT("AXISON")))->Get() ); drawGraphBoxCB_->SetValue( static_cast(window_->GetGeneralCharacteristics()->Get(wxT("GRAPHBOX")))->Get() ); axisColor_->SetColor( static_cast(axisChars_->Get(wxT("AXISCOLOR")))->Get() ); lineWidthSC_->SetValue( static_cast(axisChars_->Get(wxT("LINEWIDTH")))->Get() ); int grid = static_cast(axisChars_->Get(wxT("GRID")))->Get(); if( grid == 0 )gridLinesRB_->SetSelection(0); else if( grid > 0 )gridLinesRB_->SetSelection(1); else gridLinesRB_->SetSelection(2); lineTypeSC_->SetValue( static_cast(window_->GetGeneralCharacteristics()->Get(wxT("GRIDLINETYPE")))->Get() ); drawTicsCB_->SetValue( static_cast(axisChars_->Get(wxT("TICSON")))->Get() ); double ticAngle = static_cast(axisChars_->Get(wxT("TICANGLE")))->Get(); if( static_cast(axisChars_->Get(wxT("TICSBOTHSIDES")))->Get() ) ticDirectionRB_->SetSelection( 2 ); else { if( which_ == 'X' )ticDirectionRB_->SetSelection( ticAngle>=0.0&&ticAngle<=180.0 ? 0 : 1 ); else ticDirectionRB_->SetSelection( ticAngle>=0.0&&ticAngle<=180.0 ? 1 : 0 ); } // majorTicLenSC_->SetValue( static_cast(axisChars_->Get(wxT("LARGETICLENGTH")))->GetAsPercent() ); minorIncsSC_->SetValue( static_cast(axisChars_->Get(wxT("NSINCS")))->Get() ); minorTicLenSC_->SetValue( static_cast(axisChars_->Get(wxT("SMALLTICLENGTH")))->GetAsPercent() ); // // set up the numbering panel // drawNumbersCB_->SetValue( static_cast(axisChars_->Get(wxT("NUMBERSON")))->Get() ); nFontCB_->SetValue( static_cast(axisChars_->Get(wxT("NUMBERSFONT")))->Get()->GetFontName() ); numbersColor_->SetColor( static_cast(axisChars_->Get(wxT("NUMBERSCOLOR")))->Get() ); numbersHeightSC_->SetValue( static_cast(axisChars_->Get(wxT("NUMBERSHEIGHT")))->GetAsPercent() ); numbersAngleSC_->SetValue( static_cast(static_cast(axisChars_->Get(wxT("NUMBERSANGLE")))->Get()) ); logStyleCB_->SetValue( static_cast(axisChars_->Get(wxT("LOGSTYLE")))->Get() ); double base = static_cast(axisChars_->Get(wxT("LOGBASE")))->Get(); logStyleCB_->Enable( base>1.0 ); // // set up the label panel // drawLabelCB_->SetValue( static_cast(axisChars_->Get(wxT("LABELON")))->Get() ); labelTC_->SetValue( static_cast(axisChars_->Get(wxT("LABEL")))->Get() ); lFontCB_->SetValue( static_cast(axisChars_->Get(wxT("LABELFONT")))->Get()->GetFontName() ); labelColor_->SetColor( static_cast(axisChars_->Get(wxT("LABELCOLOR")))->Get() ); labelHeightSC_->SetValue( static_cast(axisChars_->Get(wxT("LABELHEIGHT")))->GetAsPercent() ); // // set up the location panel // lowAxisSC_->SetValue( static_cast(axisChars_->Get(wxT("LOWERAXIS")))->GetAsPercent() ); upAxisSC_->SetValue( static_cast(axisChars_->Get(wxT("UPPERAXIS")))->GetAsPercent() ); // // set up the axis scales panel // minTC_->SetValue( wxString()<(axisChars_->Get(wxT("MIN")))->Get() ); maxTC_->SetValue( wxString()<(axisChars_->Get(wxT("MAX")))->Get() ); // // this will have problems if the log base is other than 2, e, or 10 int idx = 0; if( fabs(base-2.0) < 0.01 )idx = 1; else if( fabs(base-exp(1.0)) < 0.01 )idx = 2; else if( fabs(base-10.0) < 0.01 )idx = 3; logBaseRB_->SetSelection( idx ); setup_ = false; } void AxisPopup::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/AxisPopup/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/AxisPopup/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/AxisPopup/WIDTH"), static_cast(width) ); config->Write( wxT("/AxisPopup/HEIGHT"), static_cast(height) ); // config->Write( wxT("/AxisPopup/PAGE"), static_cast(notebook_->GetSelection()) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ Destroy(); ExGlobals::ZeroAxisPopup(); } void AxisPopup::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void AxisPopup::OnMajorTicLen( double length ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LARGETICLENGTH")))->SetAsPercent( length ); ReDraw(); } void AxisPopup::OnMinorTicLen( double length ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("SMALLTICLENGTH")))->SetAsPercent( length ); ReDraw(); } void AxisPopup::OnNumbersHeight( double height ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("NUMBERSHEIGHT")))->SetAsPercent( height ); ReDraw(); } void AxisPopup::OnLabelHeight( double height ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LABELHEIGHT")))->SetAsPercent( height ); ReDraw(); } void AxisPopup::OnLowAxis( double val ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LOWERAXIS")))->SetAsPercent( val ); ReDraw(); } void AxisPopup::OnUpAxis( double val ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("UPPERAXIS")))->SetAsPercent( val ); ReDraw(); } void AxisPopup::OnLineWidth( int val ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LINEWIDTH")))->Set( val ); ReDraw(); } void AxisPopup::OnLineType( int val ) { if( setup_ )return; static_cast(window_->GetGeneralCharacteristics()-> Get(wxT("GRIDLINETYPE")))->Set( val ); ReDraw(); } void AxisPopup::OnMinorIncs( int val ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("NSINCS")))->Set( val ); ReDraw(); } void AxisPopup::OnNumbersAngle( int val ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("NUMBERSANGLE")))->Set( static_cast(val) ); ReDraw(); } void AxisPopup::OnAxisColor( GRA_color *color ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("AXISCOLOR")))->Set( color ); ReDraw(); } void AxisPopup::OnNumbersColor( GRA_color *color ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("NUMBERSCOLOR")))->Set( color ); ReDraw(); } void AxisPopup::OnLabelColor( GRA_color *color ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LABELCOLOR")))->Set( color ); ReDraw(); } void AxisPopup::OnDrawAxis( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("AXISON")))->Set( drawAxisCB_->IsChecked() ); ReDraw(); } void AxisPopup::OnDrawGraphBox( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(window_->GetGeneralCharacteristics()-> Get(wxT("GRAPHBOX")))->Set( drawGraphBoxCB_->IsChecked() ); ReDraw(); } void AxisPopup::OnGridLines( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; switch ( gridLinesRB_->GetSelection() ) { case 0: static_cast(axisChars_->Get(wxT("GRID")))->Set( 0 ); break; case 1: static_cast(axisChars_->Get(wxT("GRID")))->Set( 1 ); break; case 2: static_cast(axisChars_->Get(wxT("GRID")))->Set( -1 ); break; } ReDraw(); } void AxisPopup::OnDrawTics( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("TICSON")))->Set( drawTicsCB_->IsChecked() ); ReDraw(); } void AxisPopup::OnTicDirection( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; switch ( ticDirectionRB_->GetSelection() ) { case 0: if( which_ == 'X' )static_cast(axisChars_->Get(wxT("TICANGLE")))->Set( 90.0 ); else static_cast(axisChars_->Get(wxT("TICANGLE")))->Set( 270.0 ); static_cast(axisChars_->Get(wxT("TICSBOTHSIDES")))->Set( false ); break; case 1: if( which_ == 'X' )static_cast(axisChars_->Get(wxT("TICANGLE")))->Set( 270.0 ); else static_cast(axisChars_->Get(wxT("TICANGLE")))->Set( 90.0 ); static_cast(axisChars_->Get(wxT("TICSBOTHSIDES")))->Set( false ); break; case 2: static_cast(axisChars_->Get(wxT("TICSBOTHSIDES")))->Set( true ); break; } ReDraw(); } void AxisPopup::OnDrawNumbers( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("NUMBERSON")))->Set( drawNumbersCB_->IsChecked() ); ReDraw(); } void AxisPopup::OnDrawLabel( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LABELON")))->Set( drawLabelCB_->IsChecked() ); ReDraw(); } void AxisPopup::OnNumbersFont( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("NUMBERSFONT")))-> Set(GRA_fontControl::GetFont(nFontCB_->GetValue())); ReDraw(); } void AxisPopup::OnLabel( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LABEL")))->Set( labelTC_->GetValue() ); } void AxisPopup::OnLabelEnter( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LABEL")))->Set( labelTC_->GetValue() ); if( drawLabelCB_->IsChecked() )ReDraw(); } void AxisPopup::OnLabelFont( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LABELFONT")))-> Set(GRA_fontControl::GetFont(lFontCB_->GetValue())); if( drawLabelCB_->IsChecked() )ReDraw(); } void AxisPopup::OnApplyScales( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; double min; if( !minTC_->GetValue().ToDouble(&min) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for axis minimum"), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } double max; if( !maxTC_->GetValue().ToDouble(&max) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for axis maximum"), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } GRA_setOfCharacteristics *general = window_->GetGeneralCharacteristics(); GRA_stringCharacteristic *autoscale = static_cast(general->Get(wxT("AUTOSCALE"))); GRA_doubleCharacteristic *axisMin = static_cast(axisChars_->Get(wxT("MIN"))); GRA_doubleCharacteristic *axisMax = static_cast(axisChars_->Get(wxT("MAX"))); GRA_doubleCharacteristic *axisVMin = static_cast(axisChars_->Get(wxT("VIRTUALMIN"))); GRA_doubleCharacteristic *axisVMax = static_cast(axisChars_->Get(wxT("VIRTUALMAX"))); GRA_intCharacteristic *axisNlincs = static_cast(axisChars_->Get(wxT("NLINCS"))); autoscale->Set(wxT("OFF")); axisMin->Set( min ); axisMax->Set( max ); axisVMin->Set( min ); axisVMax->Set( max ); axisNlincs->Set( 0 ); ReDraw(); } void AxisPopup::OnLogStyle( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; static_cast(axisChars_->Get(wxT("LOGSTYLE")))->Set( logStyleCB_->IsChecked() ); ReDraw(); } void AxisPopup::OnLogBase( wxCommandEvent &WXUNUSED(event) ) { if( setup_ )return; double currentBase = static_cast(axisChars_->Get(wxT("LOGBASE")))->Get(); double currentMin = static_cast(axisChars_->Get(wxT("MIN")))->Get(); double currentMax = static_cast(axisChars_->Get(wxT("MAX")))->Get(); double axisMin = currentMin; double axisMax = currentMax; if( currentBase > 1.0 ) { axisMin = pow(currentBase,currentMin); axisMax = pow(currentBase,currentMax); } int idx = logBaseRB_->GetSelection(); if( (idx>0) && (axisMin<0.0 || axisMax<0.0) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("logarithmic axis not possible with negative values"), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); logBaseRB_->SetSelection( 0 ); return; } switch (idx) { case 0: // linear axis static_cast(axisChars_->Get(wxT("LOGBASE")))->Set( 1.0 ); minTC_->SetValue( wxString()<SetValue( wxString()<Enable( false ); break; case 1: // logarithmic base 2 static_cast(axisChars_->Get(wxT("LOGBASE")))->Set( 2.0 ); minTC_->SetValue( axisMin==0.0 ? wxString()<<(-1) : wxString()<SetValue( wxString()<Enable( true ); break; case 2: // logarithmic base e static_cast(axisChars_->Get(wxT("LOGBASE")))->Set( exp(1.0) ); minTC_->SetValue( axisMin==0.0 ? wxString()<<(-1) : wxString()<SetValue( wxString()<Enable( true ); break; case 3: // logarithmic base 10 static_cast(axisChars_->Get(wxT("LOGBASE")))->Set( 10.0 ); minTC_->SetValue( axisMin==0.0 ? wxString()<<(-1) : wxString()<SetValue( wxString()<Enable( true ); break; } } void AxisPopup::ReDraw() { if( setup_ )return; try { page_->SetGraphWindow( window_ ); page_->ReplotCurrentWindow( true ); } catch ( EGraphicsError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } // end of file extrema-4.4.5/src/wxForms/ChooseFilePanel.cpp0000644012702201742730000001344011274636606020164 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "ChooseFilePanel.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ChooseFilePanel, wxPanel ) EVT_BUTTON( ID_chooseFile, ChooseFilePanel::OnChooseFile ) EVT_BUTTON( ID_clearList, ChooseFilePanel::OnClearList ) EVT_BUTTON( ID_removeFilename, ChooseFilePanel::OnRemoveFilename ) END_EVENT_TABLE() ChooseFilePanel::ChooseFilePanel( wxWindow *parent, bool read, wxString const &message, wxString const &fileType ) : wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ), read_(read), message_(message), fileType_(fileType) { wxString imageDir = ExGlobals::GetImagePath(); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *chooseFileButton = new wxButton( this, ID_chooseFile, wxT("Browse"), wxDefaultPosition, wxSize(100,25) ); chooseFileButton->SetToolTip( wxT("click to open a file browser") ); sizer->Add( chooseFileButton, wxSizerFlags(0).Border(wxALL,5) ); filenameComboBox_ = new wxComboBox( this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(350,25), 0, 0, wxCB_READONLY ); sizer->Add( filenameComboBox_, wxSizerFlags(1).Border(wxALL,5) ); wxBitmapButton *clearListButton = new wxBitmapButton( this, ID_clearList, wxBitmap(imageDir+wxT("/executeClearList.GIF"),wxBITMAP_TYPE_GIF) ); clearListButton->SetToolTip( wxT("remove all files from the list") ); sizer->Add( clearListButton, wxSizerFlags(0).Border(wxALL,5) ); wxBitmapButton *removeFilenameButton = new wxBitmapButton( this, ID_removeFilename, wxBitmap(imageDir+wxT("/executeRemoveFilename.GIF"),wxBITMAP_TYPE_GIF) ); removeFilenameButton->SetToolTip( wxT("remove the displayed file from the list") ); sizer->Add( removeFilenameButton, wxSizerFlags(0).Border(wxALL,5) ); SetSizer( sizer ); } void ChooseFilePanel::GetFilenames( wxConfigBase *config, wxString const &iniString ) { int count = config->Read( iniString+wxT("/FILECOUNT"), 0l ); int currentIndex = config->Read( iniString+wxT("/CURRENTINDEX"), 0l ); for( int i=0; iRead((iniString+wxT("/FILE"))<Append( name ); else std::cerr << "not ok\n"; } filenameComboBox_->SetSelection( currentIndex ); } void ChooseFilePanel::SaveFilenames( wxConfigBase *config, wxString const &iniString ) { int currentIndex = filenameComboBox_->GetSelection(); config->Write( iniString+wxT("/CURRENTINDEX"), static_cast(currentIndex) ); int count = filenameComboBox_->GetCount(); if( count == 0 ) { int oldCount = config->Read( iniString+wxT("/FILECOUNT"), 0l ); for( int i=0; iDeleteEntry( (iniString+wxT("/FILE"))<Write( iniString+wxT("/FILECOUNT"), static_cast(count) ); for( int i=0; iSetSelection( i ); config->Write( (iniString+wxT("/FILE"))<GetValue() ); } } void ChooseFilePanel::OnChooseFile( wxCommandEvent &WXUNUSED(event) ) { wxFileDialog *fd; std::ios_base::openmode mode; if( read_ ) { fd = new wxFileDialog( this, message_, wxT(""), wxT(""), fileType_, wxOPEN|wxFILE_MUST_EXIST|wxCHANGE_DIR ); mode = std::ios_base::in; } else { fd = new wxFileDialog( this, message_, wxT(""), wxT(""), fileType_, wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); mode = std::ios_base::out; } wxString filename; if( fd->ShowModal() == wxID_OK )filename = fd->GetPath(); if( filename.empty() )return; std::fstream f( filename.mb_str(wxConvUTF8), mode ); if( !f.is_open() ) { wxMessageDialog *md = new wxMessageDialog( (wxWindow*)this, wxString(wxT("could not open "))+filename, wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } f.close(); SetFile( filename ); } void ChooseFilePanel::SetFile( wxString const &filename ) { int count = filenameComboBox_->GetCount(); for( int i=0; iGetString(i) ) // filename is already in the list { filenameComboBox_->SetSelection( i ); return; } } filenameComboBox_->Append( filename ); filenameComboBox_->SetSelection( filenameComboBox_->GetCount()-1 ); } void ChooseFilePanel::OnClearList( wxCommandEvent &WXUNUSED(event) ) { filenameComboBox_->Clear(); filenameComboBox_->SetValue( wxT("") ); } void ChooseFilePanel::OnRemoveFilename( wxCommandEvent &WXUNUSED(event) ) { RemoveFilename(); } void ChooseFilePanel::RemoveFilename() { if( filenameComboBox_->IsEmpty() )return; int i = filenameComboBox_->GetSelection(); filenameComboBox_->Delete( i ); i > 0 ? filenameComboBox_->SetSelection(i-1) : filenameComboBox_->SetSelection(0); if( filenameComboBox_->IsEmpty() )filenameComboBox_->SetValue( wxT("") ); } wxString ChooseFilePanel::GetSelection() { return filenameComboBox_->GetValue(); } // end of file extrema-4.4.5/src/wxForms/WriteVectorsForm.h0000644012702201742730000000260711274636606020120 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_WRITEVECTORSFORM #define EXTREMA_WRITEVECTORSFORM #include "wx/wx.h" #include "wx/checklst.h" class AnalysisWindow; class ChooseFilePanel; class WriteVectorsForm : public wxFrame { public: WriteVectorsForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void OnRefresh( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxCheckListBox *variableList_; wxCheckBox *append_; void FillList(); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/InquireDialog.cpp0000644012702201742730000001030011274636606017710 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "InquireDialog.h" #include "ExGlobals.h" #include "CMD_inquire.h" #include "ECommandError.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( InquireDialog, wxDialog ) EVT_BUTTON( wxID_OK, InquireDialog::OnOK ) EVT_BUTTON( wxID_STOP, InquireDialog::OnStopAll ) EVT_CLOSE( InquireDialog::CloseEventHandler ) END_EVENT_TABLE() InquireDialog::InquireDialog() : wxDialog( (wxWindow*)NULL,wxID_ANY,wxT("inquire"),wxDefaultPosition,wxDefaultSize ) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); messageCtrl_ = new wxStaticText( topPanel, -1, wxT(" ") ); topSizer->Add( messageCtrl_, wxSizerFlags(0).Border(wxALL,10) ); textCtrl_ = new wxTextCtrl( topPanel, -1 ); topSizer->Add( textCtrl_, wxSizerFlags(0).Expand().Border(wxALL,5) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(1).Expand().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *OKButton = new wxButton( bottomPanel, wxID_OK, wxT("OK") ); OKButton->SetToolTip( wxT("click to accept the inquiry response to the inquiry") ); bottomSizer->Add( OKButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *stopAllButton = new wxButton( bottomPanel, wxID_STOP, wxT("Stop all scripts") ); stopAllButton->SetToolTip( wxT("click to stop all active scripts") ); bottomSizer->Add( stopAllButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(1).Expand().Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/InquireDialog/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/InquireDialog/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/InquireDialog/WIDTH"), 570l ); int height = config->Read( wxT("/InquireDialog/HEIGHT"), 145l ); SetSize( ulx, uly, width, height ); Show( true ); } void InquireDialog::SetLabel( wxString const &message ) { messageCtrl_->SetLabel( message ); } void InquireDialog::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/InquireDialog/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/InquireDialog/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/InquireDialog/WIDTH"), static_cast(width) ); config->Write( wxT("/InquireDialog/HEIGHT"), static_cast(height) ); } Destroy(); } void InquireDialog::OnOK( wxCommandEvent &WXUNUSED(event) ) { try { CMD_inquire::Instance()->ProcessString( textCtrl_->GetValue() ); } catch ( ECommandError const &e ) { ExGlobals::StopAllScripts(); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); } Close(); } void InquireDialog::OnStopAll( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::StopAllScripts(); Close(); } // end of file extrema-4.4.5/src/wxForms/CurvePopup.h0000644012702201742730000000437411274636606016747 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_CURVEPOPUP #define EXTREMA_CURVEPOPUP #include "wx/wx.h" #include "ExSpinCtrlD.h" #include "ExSpinCtrlI.h" #include "ExColorCtrl.h" class GraphicsPage; class GRA_window; class GRA_setOfCharacteristics; class GRA_color; class GRA_cartesianCurve; class CurvePopup : public wxFrame { public: CurvePopup( GraphicsPage * ); void Setup( GRA_window *, GRA_cartesianCurve * ); void OnCurveColor( GRA_color * ); void OnAreafillColor( GRA_color * ); void OnPlotsymbolColor( GRA_color * ); void OnPlotsymbolCode( int ); void OnCurveLineWidth( int ); void OnCurveLineType( int ); void OnPlotsymbolAngle( int ); void OnPlotsymbolSize( double ); void Disconnect(); private: void CreateForm(); void ReDraw(); // event handlers void OnCurveType( wxCommandEvent & ); void OnConnect( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); bool setup_; GraphicsPage *page_; GRA_window *window_; GRA_cartesianCurve *curve_; GRA_setOfCharacteristics *curveChars_; wxRadioBox *histogramRB_; ExColorCtrl *curveColor_, *areafillColor_, *plotsymbolColor_; ExSpinCtrlI *lineWidthSC_, *lineTypeSC_; ExSpinCtrlI *plotsymbolCodeSC_, *plotsymbolAngleSC_; ExSpinCtrlD *plotsymbolSizeSC_; wxCheckBox *connectCB_; wxPanel *plotsymbolPanel_; wxButton *closeBTN_; enum { ID_curveType, ID_connect }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/AnalysisSpeedButtonPanel.cpp0000644012702201742730000002230011274636606022077 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "AnalysisSpeedButtonPanel.h" #include "AnalysisWindow.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them BEGIN_EVENT_TABLE( AnalysisSpeedButtonPanel, wxPanel ) EVT_BUTTON( ID_execute, AnalysisSpeedButtonPanel::OnExecute ) EVT_BUTTON( ID_show, AnalysisSpeedButtonPanel::OnShowVariables ) EVT_BUTTON( ID_fit, AnalysisSpeedButtonPanel::OnFit ) EVT_BUTTON( ID_generate, AnalysisSpeedButtonPanel::OnGenerateVector ) EVT_BUTTON( ID_constants, AnalysisSpeedButtonPanel::OnConstants ) EVT_BUTTON( ID_saveSession, AnalysisSpeedButtonPanel::OnSaveSession ) EVT_BUTTON( ID_restoreSession, AnalysisSpeedButtonPanel::OnRestoreSession ) EVT_BUTTON( ID_clearMessages, AnalysisSpeedButtonPanel::OnClearMessages ) EVT_BUTTON( ID_stackToggle, AnalysisSpeedButtonPanel::OnStackToggle ) EVT_BUTTON( wxID_HELP, AnalysisSpeedButtonPanel::OnHelp ) EVT_BUTTON( wxID_EXIT, AnalysisSpeedButtonPanel::OnExit ) END_EVENT_TABLE() AnalysisSpeedButtonPanel::AnalysisSpeedButtonPanel( AnalysisWindow *parent ) : wxPanel(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxRAISED_BORDER|wxTAB_TRAVERSAL), analysisWindow_(parent) { wxString imageDir = ExGlobals::GetImagePath(); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *executeButton = new wxBitmapButton( this, ID_execute, wxBitmap(imageDir+wxT("/execute.GIF"),wxBITMAP_TYPE_GIF) ); executeButton->SetToolTip( wxT("execute a command script") ); sizer->Add( executeButton, wxSizerFlags(0).Border(wxALL,2) ); wxBitmapButton *showButton = new wxBitmapButton( this, ID_show, wxBitmap(imageDir+wxT("/show.GIF"),wxBITMAP_TYPE_GIF) ); showButton->SetToolTip( wxT("show existing variables") ); sizer->Add( showButton, wxSizerFlags(0).Border(wxTOP|wxBOTTOM|wxRIGHT,2) ); wxBitmapButton *fitButton = new wxBitmapButton( this, ID_fit, wxBitmap(imageDir+wxT("/fit.GIF"),wxBITMAP_TYPE_GIF) ); fitButton->SetToolTip( wxT("fit a function to data") ); sizer->Add( fitButton, wxSizerFlags(0).Border(wxTOP|wxBOTTOM|wxRIGHT,2) ); wxBitmapButton *generateButton = new wxBitmapButton( this, ID_generate, wxBitmap(imageDir+wxT("/generate.GIF"),wxBITMAP_TYPE_GIF) ); generateButton->SetToolTip( wxT("generate a vector") ); sizer->Add( generateButton, wxSizerFlags(0).Border(wxTOP|wxBOTTOM|wxRIGHT,2) ); wxBitmapButton *constantsButton = new wxBitmapButton( this, ID_constants, wxBitmap(imageDir+wxT("/constants.GIF"),wxBITMAP_TYPE_GIF) ); constantsButton->SetToolTip( wxT("define mathematical and physical constants") ); sizer->Add( constantsButton, wxSizerFlags(0).Border(wxTOP|wxBOTTOM|wxRIGHT,2) ); sizer->InsertStretchSpacer( 5, 1 ); wxBitmapButton *stackToggleButton = new wxBitmapButton( this, ID_stackToggle, wxBitmap(imageDir+wxT("/stack.GIF"),wxBITMAP_TYPE_GIF) ); stackToggleButton->SetToolTip( wxT("toggle recording of commands on/off") ); sizer->Add( stackToggleButton, wxSizerFlags(0).Right().Border(wxTOP|wxBOTTOM|wxLEFT,2) ); wxBitmapButton *saveSessionButton = new wxBitmapButton( this, ID_saveSession, wxBitmap(imageDir+wxT("/save.GIF"),wxBITMAP_TYPE_GIF) ); saveSessionButton->SetToolTip( wxT("save the current session to a file") ); sizer->Add( saveSessionButton, wxSizerFlags(0).Right().Border(wxTOP|wxBOTTOM|wxLEFT,2) ); wxBitmapButton *restoreSessionButton = new wxBitmapButton( this, ID_restoreSession, wxBitmap(imageDir+wxT("/restore.GIF"),wxBITMAP_TYPE_GIF) ); restoreSessionButton->SetToolTip( wxT("restore a previously saved session") ); sizer->Add( restoreSessionButton, wxSizerFlags(0).Right().Border(wxTOP|wxBOTTOM|wxLEFT,2) ); wxBitmapButton *clearMessagesButton = new wxBitmapButton( this, ID_clearMessages, wxBitmap(imageDir+wxT("/clear.GIF"),wxBITMAP_TYPE_GIF) ); clearMessagesButton->SetToolTip( wxT("clear the message window") ); sizer->Add( clearMessagesButton, wxSizerFlags(0).Right().Border(wxTOP|wxBOTTOM|wxLEFT,2) ); wxBitmapButton *helpButton = new wxBitmapButton( this, wxID_HELP, wxBitmap(imageDir+wxT("/help.GIF"),wxBITMAP_TYPE_GIF) ); helpButton->SetToolTip( wxT("help contents") ); sizer->Add( helpButton, wxSizerFlags(0).Right().Border(wxTOP|wxBOTTOM|wxLEFT,2) ); wxBitmapButton *exitButton = new wxBitmapButton( this, wxID_EXIT, wxBitmap(imageDir+wxT("/exit.GIF"),wxBITMAP_TYPE_GIF) ); exitButton->SetToolTip( wxT("quit the program (with confirmation)") ); sizer->Add( exitButton, wxSizerFlags(0).Right().Border(wxALL,2) ); SetSizer( sizer ); } void AnalysisSpeedButtonPanel::OnConstants( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::DefineConstants(); wxMessageBox( wxT("Many mathematical and physical constants are now available"), wxT("info"), wxOK ); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("DEFINE\\CONSTANTS") ); } void AnalysisSpeedButtonPanel::OnClearMessages( wxCommandEvent &WXUNUSED(event) ) { analysisWindow_->ClearOutput(); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("CLEAR\\HISTORY") ); } void AnalysisSpeedButtonPanel::OnExit( wxCommandEvent &WXUNUSED(event) ) { wxMessageDialog *md = new wxMessageDialog( (wxWindow*)this, wxT("Do you really want to quit?"), wxT("Confirm quit"), wxYES_NO|wxICON_QUESTION ); if( md->ShowModal() == wxID_YES ) { if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("QUIT") ); GetParent()->Close(true); } } void AnalysisSpeedButtonPanel::OnShowVariables( wxCommandEvent &event ) { analysisWindow_->OnShowVariables( event ); } void AnalysisSpeedButtonPanel::OnExecute( wxCommandEvent &event ) { analysisWindow_->OnExecute( event ); } void AnalysisSpeedButtonPanel::OnGenerateVector( wxCommandEvent &event ) { analysisWindow_->OnGenerateVector( event ); } void AnalysisSpeedButtonPanel::OnFit( wxCommandEvent &event ) { analysisWindow_->OnFit( event ); } void AnalysisSpeedButtonPanel::OnHelp( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::StartHelp(); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("HELP") ); } void AnalysisSpeedButtonPanel::OnStackToggle( wxCommandEvent &event ) { analysisWindow_->OnStackToggle( event ); } void AnalysisSpeedButtonPanel::OnSaveSession( wxCommandEvent &WXUNUSED(event) ) { wxFileDialog *fd; fd = new wxFileDialog( this, wxT("Save session"), wxT(""), wxT(""), wxT("xml files (*.xml)|*.xml"), wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); wxString filename; if( fd->ShowModal() == wxID_OK )filename = fd->GetPath(); if( filename.empty() )return; if( filename.find_last_of(wxT('.')) == filename.npos )filename += wxT(".xml"); std::ofstream f( filename.mb_str(wxConvUTF8), std::ios_base::out ); if( !f.is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString()<ShowModal(); return; } f.close(); try { ExGlobals::SaveSession( filename ); } catch ( std::runtime_error const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } void AnalysisSpeedButtonPanel::OnRestoreSession( wxCommandEvent &WXUNUSED(event) ) { wxFileDialog *fd; fd = new wxFileDialog( this, wxT("Save session"), wxT(""), wxT(""), wxT("xml files (*.xml)|*.xml"), wxOPEN|wxFILE_MUST_EXIST|wxCHANGE_DIR ); wxString filename; if( fd->ShowModal() == wxID_OK )filename = fd->GetPath(); if( filename.empty() )return; std::ofstream f( filename.mb_str(wxConvUTF8), std::ios_base::in ); if( !f.is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString()<ShowModal(); return; } f.close(); try { ExGlobals::RestoreSession( filename ); } catch ( std::runtime_error const &e ) { std::cout << "error: |" << e.what() << "|\n"; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } // end of file extrema-4.4.5/src/wxForms/CommandTextCtrl.h0000644012702201742730000000300311274636606017673 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_COMMAND_TEXT_CTRL #define EXTREMA_COMMAND_TEXT_CTRL #include #include "wx/wx.h" // The CommandTextCtrl is the command entry field in the analysis window. class AnalysisCommandPanel; class CommandTextCtrl : public wxTextCtrl { public: CommandTextCtrl( AnalysisCommandPanel * ); void OnKeyDown( wxKeyEvent & ); void OnKeyUp( wxKeyEvent &event ) { event.Skip(); } void OnChar( wxKeyEvent &event ) { event.Skip(); } void DoACommand(); void AddCommandString( wxString const & ); std::vector &GetCommandStrings() { return commandStrings_; } private: std::vector commandStrings_; int commandStringsIndex_; wxString GetACommand(); wxString GetPreviousCommand(); wxString GetNextCommand(); DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ShowVariablesForm.h0000644012702201742730000000257211274636606020232 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_SHOWVARIABLESFORM #define EXTREMA_SHOWVARIABLESFORM #include "wx/wx.h" #include "wx/grid.h" class AnalysisWindow; class VarInfoForm; class ShowVariablesForm : public wxFrame { public: ShowVariablesForm( AnalysisWindow * ); void ZeroVarInfoForm(); // event handlers void OnRefresh( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnSelectCell( wxGridEvent & ); private: AnalysisWindow *analysisWindow_; wxGrid *varGrid_; VarInfoForm *varInfoForm_; void FillGrid(); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/AnalysisCommandPanel.h0000644012702201742730000000272711274636606020701 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_ANALYSIS_COMMAND_PANEL #define EXTREMA_ANALYSIS_COMMAND_PANEL #include #include "wx/wx.h" // IDs for the controls and the menu commands // The AnalysisWindow is the main extrema window. It contains the command history // and message text control and the command input text control, as well as various // menus and speed buttons. class AnalysisWindow; class CommandTextCtrl; class AnalysisCommandPanel : public wxPanel { public: AnalysisCommandPanel( AnalysisWindow * ); void OnProcessCommand( wxCommandEvent & ); void AddCommandString( wxString const & ); std::vector &GetCommandStrings(); private: CommandTextCtrl *commandTextCtrl_; enum { ID_processCommand }; DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/AnalysisWindow.cpp0000644012702201742730000003321411440762610020126 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include "wx/config.h" #include "AnalysisWindow.h" #include "AnalysisSpeedButtonPanel.h" #include "AnalysisMessagePanel.h" #include "AnalysisCommandPanel.h" #include "VisualizationWindow.h" #include "ExecuteDialog.h" #include "ReadVectorsForm.h" #include "ReadScalarsForm.h" #include "ReadMatrixForm.h" #include "ReadTextForm.h" #include "WriteVectorsForm.h" #include "WriteScalarsForm.h" #include "WriteMatrixForm.h" #include "WriteTextForm.h" #include "ShowVariablesForm.h" #include "GenerateVectorForm.h" #include "FitForm.h" #include "StackDialog.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // // it is important for the id corresponding to the "About" command to have // this standard value as otherwise it won't be handled properly under Mac // (where it is special and put into the "Apple" menu) // BEGIN_EVENT_TABLE( AnalysisWindow, wxFrame ) EVT_MENU( wxID_EXIT, AnalysisWindow::OnQuit ) EVT_MENU( wxID_ABOUT, AnalysisWindow::OnAbout ) EVT_MENU( wxID_HELP, AnalysisWindow::OnHelp ) EVT_MENU( ID_execute, AnalysisWindow::OnExecute ) EVT_MENU( ID_loadVectors, AnalysisWindow::OnLoadVectors ) EVT_MENU( ID_loadScalars, AnalysisWindow::OnLoadScalars ) EVT_MENU( ID_loadMatrix, AnalysisWindow::OnLoadMatrix ) EVT_MENU( ID_loadText, AnalysisWindow::OnLoadText ) EVT_MENU( ID_writeVectors, AnalysisWindow::OnWriteVectors ) EVT_MENU( ID_writeScalars, AnalysisWindow::OnWriteScalars ) EVT_MENU( ID_writeMatrix, AnalysisWindow::OnWriteMatrix ) EVT_MENU( ID_writeText, AnalysisWindow::OnWriteText ) EVT_CLOSE( AnalysisWindow::CloseEventHandler ) END_EVENT_TABLE() AnalysisWindow::AnalysisWindow( extrema *extrema ) : wxFrame( (wxWindow*)NULL,wxID_ANY,wxT("Analysis Window"), wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), extrema_(extrema) { wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/AnalysisWindow/UPPERLEFTX"), 500l ); int uly = config->Read( wxT("/AnalysisWindow/UPPERLEFTY"), 500l ); int width = config->Read( wxT("/AnalysisWindow/WIDTH"), 700l ); int height = config->Read( wxT("/AnalysisWindow/HEIGHT"), 500l ); SetSize( ulx, uly, width, height ); executeDialog_ = 0; showVariablesForm_ = 0; readVectorsForm_ = 0; readScalarsForm_ = 0; readMatrixForm_ = 0; readTextForm_ = 0; writeVectorsForm_ = 0; writeScalarsForm_ = 0; writeMatrixForm_ = 0; writeTextForm_ = 0; fitForm_ = 0; stackDialog_ = 0; generateVectorForm_ = 0; wxMenu *fileMenu = new wxMenu(); fileMenu->Append( ID_execute, wxT("&Execute"), wxT("execute an extrema script") ); fileMenu->AppendSeparator(); wxMenu *loadDataMenu = new wxMenu(); loadDataMenu->Append( ID_loadVectors, wxT("Vectors"), wxT("read vector data from a file") ); loadDataMenu->Append( ID_loadScalars, wxT("Scalars"), wxT("read scalar data from a file") ); loadDataMenu->Append( ID_loadMatrix, wxT("Matrix"), wxT("read matrix data from a file") ); loadDataMenu->Append( ID_loadText, wxT("Text"), wxT("read character data from a file") ); fileMenu->Append( wxID_ANY, wxT("Read data"), loadDataMenu, wxT("read data from a file") ); fileMenu->AppendSeparator(); wxMenu *writeDataMenu = new wxMenu(); writeDataMenu->Append( ID_writeVectors, wxT("Vectors"), wxT("write vector data to a file") ); writeDataMenu->Append( ID_writeScalars, wxT("Scalars"), wxT("write scalar data to a file") ); writeDataMenu->Append( ID_writeMatrix, wxT("Matrices"), wxT("write matrix data to a file") ); writeDataMenu->Append( ID_writeText, wxT("Text variables"), wxT("write string data to a file") ); fileMenu->Append( wxID_ANY, wxT("Write data"), writeDataMenu, wxT("write data to a file") ); fileMenu->AppendSeparator(); fileMenu->Append( wxID_EXIT, wxT("E&xit"), wxT("Quit this program") ); wxMenu *helpMenu = new wxMenu(); helpMenu->Append( wxID_HELP, wxT("&Help contents"), wxT("Open the help facility") ); helpMenu->Append( wxID_ABOUT, wxT("&About"), wxT("Show the about dialog") ); wxMenuBar *menuBar = new wxMenuBar(); menuBar->Append( fileMenu, wxT("&File") ); menuBar->Append( helpMenu, wxT("&Help") ); SetMenuBar( menuBar ); // // for a vertical sizer: // proportion = 0 means no vertical expansion // proportion > 0 allows for vertical expansion // Expand() allows for horizontal expansion // wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( new AnalysisSpeedButtonPanel(this), wxSizerFlags(0).Expand().Border(wxALL,1) ); messagePanel_ = new AnalysisMessagePanel(this); sizer->Add( messagePanel_, wxSizerFlags(1).Expand().Border(wxALL,1) ); commandPanel_ = new AnalysisCommandPanel(this); sizer->Add( commandPanel_, wxSizerFlags(0).Expand().Border(wxALL,1) ); SetSizer( sizer ); CreateStatusBar( 1 ); SetStatusText( wxT("Welcome to extrema!") ); // Show the main window. // Frames, unlike simple controls, are not shown when created initially. Show( true ); ExGlobals::SetAnalysisWindow( this ); // create the main visualization window, with the analysis window as its parent VisualizationWindow *visualizationWindow = new VisualizationWindow( (wxWindow*)this ); if( !visualizationWindow )Close(true); ExGlobals::SetVisualizationWindow( visualizationWindow ); } void AnalysisWindow::WriteOutput( wxString const &s ) { messagePanel_->WriteOutput( s ); } void AnalysisWindow::ClearOutput() { messagePanel_->ClearOutput(); } void AnalysisWindow::AddCommandString( wxString const &s ) { commandPanel_->AddCommandString( s ); } std::vector &AnalysisWindow::GetCommandStrings() { commandPanel_->GetCommandStrings(); } void AnalysisWindow::OnQuit( wxCommandEvent &WXUNUSED(event) ) { extrema_->QuitApp(); } void AnalysisWindow::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { ExGlobals::DeleteStuff(); // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/AnalysisWindow/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/AnalysisWindow/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/AnalysisWindow/WIDTH"), static_cast(width) ); config->Write( wxT("/AnalysisWindow/HEIGHT"), static_cast(height) ); } Destroy(); } void AnalysisWindow::OnHelp( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::StartHelp(); } void AnalysisWindow::OnAbout( wxCommandEvent &WXUNUSED(event) ) { wxDialog dg( this, wxID_ANY, wxT("Extrema"), wxDefaultPosition, wxDefaultSize ); wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); wxTextCtrl *textCtrl = new wxTextCtrl( &dg, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); wxTextAttr ta( *wxRED, wxNullColour, wxNullFont, wxTEXT_ALIGNMENT_CENTRE ); textCtrl->SetDefaultStyle( ta ); textCtrl->AppendText( wxT(" \n") ); textCtrl->AppendText( wxT("EXTREMA\n") ); textCtrl->AppendText( wxT(" \n") ); wxTextAttr ta2( *wxBLACK, wxNullColour, wxNullFont, wxTEXT_ALIGNMENT_CENTRE ); textCtrl->SetDefaultStyle( ta2 ); textCtrl->AppendText( wxString()<AppendText( wxT(" \n") ); textCtrl->AppendText( wxT("Copyright 2005,...,2010 by Joseph L. Chuma\n") ); textCtrl->AppendText( wxT(" \n") ); textCtrl->AppendText( wxT("Extrema comes with ABSOLUTELY NO WARRANTY\n") ); textCtrl->AppendText( wxT("This is free software, distributed under the\n") ); textCtrl->AppendText( wxT("GNU General Public License, version 2 or greater,\n") ); textCtrl->AppendText( wxT("as published by the FSF.\n") ); sizer->Add( textCtrl, wxSizerFlags(1).Align(0).Expand().Border(wxALL,1) ); wxButton *ok = new wxButton( &dg, wxID_OK, wxT("OK") ); sizer->Add( ok, wxSizerFlags(0).Centre().Border(wxALL,2) ); dg.SetSizer( sizer ); dg.ShowModal(); } void AnalysisWindow::ZeroExecuteDialog() { executeDialog_ = 0; } ExecuteDialog *AnalysisWindow::GetExecuteDialog() { return executeDialog_; } void AnalysisWindow::SetExecuteDialog( ExecuteDialog *ed ) { executeDialog_ = ed; } void AnalysisWindow::ZeroShowVariables() { showVariablesForm_ = 0; } void AnalysisWindow::ZeroLoadVectors() { readVectorsForm_ = 0; } void AnalysisWindow::ZeroLoadScalars() { readScalarsForm_ = 0; } void AnalysisWindow::ZeroLoadMatrix() { readMatrixForm_ = 0; } void AnalysisWindow::ZeroLoadText() { readTextForm_ = 0; } void AnalysisWindow::ZeroWriteVectors() { writeVectorsForm_ = 0; } void AnalysisWindow::ZeroWriteScalars() { writeScalarsForm_ = 0; } void AnalysisWindow::ZeroWriteMatrix() { writeMatrixForm_ = 0; } void AnalysisWindow::ZeroWriteText() { writeTextForm_ = 0; } void AnalysisWindow::ZeroGenerateVector() { generateVectorForm_ = 0; } void AnalysisWindow::ZeroFit() { fitForm_ = 0; } void AnalysisWindow::ZeroStackDialog() { stackDialog_ = 0; } FitForm *AnalysisWindow::GetFitForm() { return fitForm_; } void AnalysisWindow::SetFitForm( FitForm *fitForm ) { fitForm_ = fitForm; } GenerateVectorForm *AnalysisWindow::GetGenerateVectorForm() { return generateVectorForm_; } void AnalysisWindow::SetGenerateVectorForm( GenerateVectorForm *form ) { generateVectorForm_ = form; } void AnalysisWindow::OnExecute( wxCommandEvent &WXUNUSED(event) ) { if( executeDialog_ )executeDialog_->Raise(); else { executeDialog_ = new ExecuteDialog( this ); executeDialog_->Show(); } } void AnalysisWindow::OnShowVariables( wxCommandEvent &WXUNUSED(event) ) { if( showVariablesForm_ )showVariablesForm_->Raise(); else { showVariablesForm_ = new ShowVariablesForm( this ); showVariablesForm_->Show(); } } void AnalysisWindow::OnLoadVectors( wxCommandEvent &WXUNUSED(event) ) { if( readVectorsForm_ )readVectorsForm_->Raise(); else { readVectorsForm_ = new ReadVectorsForm( this ); readVectorsForm_->Show(); } } void AnalysisWindow::OnLoadScalars( wxCommandEvent &WXUNUSED(event) ) { if( readScalarsForm_ )readScalarsForm_->Raise(); else { readScalarsForm_ = new ReadScalarsForm( this ); readScalarsForm_->Show(); } } void AnalysisWindow::OnLoadMatrix( wxCommandEvent &WXUNUSED(event) ) { if( readMatrixForm_ )readMatrixForm_->Raise(); else { readMatrixForm_ = new ReadMatrixForm( this ); readMatrixForm_->Show(); } } void AnalysisWindow::OnLoadText( wxCommandEvent &WXUNUSED(event) ) { if( readTextForm_ )readTextForm_->Raise(); else { readTextForm_ = new ReadTextForm( this ); readTextForm_->Show(); } } void AnalysisWindow::OnWriteVectors( wxCommandEvent &WXUNUSED(event) ) { if( writeVectorsForm_ )writeVectorsForm_->Raise(); else { writeVectorsForm_ = new WriteVectorsForm( this ); writeVectorsForm_->Show(); } } void AnalysisWindow::OnWriteScalars( wxCommandEvent &WXUNUSED(event) ) { if( writeScalarsForm_ )writeScalarsForm_->Raise(); else { writeScalarsForm_ = new WriteScalarsForm( this ); writeScalarsForm_->Show(); } } void AnalysisWindow::OnWriteMatrix( wxCommandEvent &WXUNUSED(event) ) { if( writeMatrixForm_ )writeMatrixForm_->Raise(); else { writeMatrixForm_ = new WriteMatrixForm( this ); writeMatrixForm_->Show(); } } void AnalysisWindow::OnWriteText( wxCommandEvent &WXUNUSED(event) ) { if( writeTextForm_ )writeTextForm_->Raise(); else { writeTextForm_ = new WriteTextForm( this ); writeTextForm_->Show(); } } void AnalysisWindow::OnGenerateVector( wxCommandEvent &WXUNUSED(event) ) { if( generateVectorForm_ )generateVectorForm_->Raise(); else { generateVectorForm_ = new GenerateVectorForm( this ); generateVectorForm_->Show(); } } void AnalysisWindow::OnFit( wxCommandEvent &WXUNUSED(event) ) { if( fitForm_ )fitForm_->Raise(); else { fitForm_ = new FitForm( this ); fitForm_->Show(); } } void AnalysisWindow::OnStackToggle( wxCommandEvent &WXUNUSED(event) ) { if( stackDialog_ )stackDialog_->Raise(); else { stackDialog_ = new StackDialog( this ); stackDialog_->Show(); } } std::ostream &operator<<( std::ostream &out, AnalysisWindow const *aw ) { int ulx, uly; aw->GetPosition( &ulx, &uly ); int width, height; aw->GetSize( &width, &height ); out << "\n"; out << "messagePanel_->GetValue().mb_str(wxConvUTF8) << "]]>\n"; std::vector strings( aw->commandPanel_->GetCommandStrings() ); int size = strings.size(); out << "\n"; for( int i=0; i" << strings[i].mb_str(wxConvUTF8) << "\n"; out << "\n"; out << "\n"; return out; } // end of file extrema-4.4.5/src/wxForms/VisualizationWindow.h0000644012702201742730000001232211327733570020655 0ustar spangspang/* Copyright (C) 2005...2010 Joseph L. Chuma 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. */ #ifndef EXTREMA_VISUALIZATION_WINDOW #define EXTREMA_VISUALIZATION_WINDOW #include #include #include "wx/wx.h" #include "wx/dcbuffer.h" #include "wx/notebook.h" class GraphForm; class TextForm; class PeakFindForm; class GRA_drawableText; class VisualizationSpeedButtonPanel; class GRA_wxWidgets; class MyStatusBar; class GRA_window; class SetAspectRatioForm; class GraphicsPage; class ThreeDPlotForm; class FigureForm; // The VisualizationWindow is the main extrema graphics window. It contains the // graphics canvas as well as various menus and speed buttons. class VisualizationWindow : public wxFrame { public: VisualizationWindow( wxWindow * ); void ZeroGraphForm(); GraphForm *GetGraphForm(); void SetGraphForm( GraphForm * ); void ZeroThreeDPlotForm(); ThreeDPlotForm *GetThreeDPlotForm(); void SetThreeDPlotForm( ThreeDPlotForm * ); void ZeroFigureForm(); FigureForm *GetFigureForm(); void SetFigureForm( FigureForm * ); MyStatusBar *GetStatusBar(); void ZeroTextForm(); TextForm *GetTextForm(); void SetTextForm( TextForm * ); void SetInteractiveText( GRA_drawableText * ); void SaveBitmap( int, int, int, int, wxString const &, int ); void SavePS( wxString const & ); void ClearWindows(); void ReplotAllWindows(); void ReplotCurrentWindow( bool ); void DisplayBackgrounds( GRA_wxWidgets *, wxDC & ); void RefreshGraphics(); void ResetPages(); void ResetWindows(); void ClearAllPages(); void DeleteAllPages(); void MakeFirstPage(); int GetNumberOfPages(); wxWindow *GetPage(); GraphicsPage *GetPage( int ); void NewPage( int ); void SetPage( int ); void SetPage( GraphicsPage * ); void InheritPage( int ); void ZeroPeakFindForm(); void ZeroSetAspectRatioForm(); GRA_window *GetGraphWindow(); GRA_window *GetGraphWindow( int ); GRA_window *GetGraphWindow( double, double ); void SetWindowNumber( int ); int GetWindowNumber(); int GetNumberOfWindows(); std::vector &GetGraphWindows(); void AddGraphWindow( GRA_window * ); void DrawGraphWindows( GRA_wxWidgets *, wxDC & ); // event handlers void CloseEventHandler( wxCloseEvent & ); void OnSize( wxSizeEvent & ); void OnImportPNG( wxCommandEvent & ); void OnImportJPEG( wxCommandEvent & ); void OnSavePS( wxCommandEvent & ); void OnSavePNG( wxCommandEvent & ); void OnSaveJPEG( wxCommandEvent & ); void OnDrawGraph( wxCommandEvent & ); void OnDrawFigure( wxCommandEvent & ); void On3DPlot( wxCommandEvent & ); void OnDrawText( wxCommandEvent & ); void OnPeakFind( wxCommandEvent & ); void OnPrint( wxCommandEvent & ); void OnClearGraphicsPage( wxCommandEvent & ); void OnClearWindow( wxCommandEvent & ); void OnReplotAll( wxCommandEvent & ); void OnReplotCurrent( wxCommandEvent & ); void OnZerolinesH( wxCommandEvent & ); void OnZerolinesV( wxCommandEvent & ); void OnZerolinesB( wxCommandEvent & ); void OnResetDefaults( wxCommandEvent & ); void OnNewPage( wxCommandEvent & ); void OnRemovePage( wxCommandEvent & ); void OnConfigureWindow( wxCommandEvent & ); void OnSetAspectRatio( wxCommandEvent & ); friend std::ostream &operator<<( std::ostream &, VisualizationWindow const * ); private: GraphForm *graphForm_; ThreeDPlotForm *threeDPlotForm_; FigureForm *figureForm_; TextForm *textForm_; SetAspectRatioForm *setAspectRatioForm_; PeakFindForm *peakFindForm_; GRA_drawableText *textToPlace_; VisualizationSpeedButtonPanel *visualizationSpeedButtonPanel_; wxNotebook *notebook_; MyStatusBar *statusBar_; enum { ID_importPNG, ID_importJPEG, ID_savePS, ID_savePNG, ID_saveJPEG, ID_print, ID_clearGraphicsPage, ID_clearWindow, ID_drawGraph, ID_3DPlot, ID_drawFigure, ID_drawText, ID_replotAll, ID_replotCurrent, ID_zerolinesH, ID_zerolinesV, ID_zerolinesB, ID_resetDefaults, ID_configureWindow, ID_newPage, ID_removePage, ID_aspectRatio }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; class MyStatusBar : public wxStatusBar { public: MyStatusBar( VisualizationWindow * ); virtual ~MyStatusBar() {} int GetUnitsType(); void OnChangeUnits( wxCommandEvent & ); void OnSize( wxSizeEvent & ); private: void SetButtonSize(); int unitsType_; // 0=graph, 1=world, 2=percentages, 3=pixels wxString units_[4]; wxButton *unitsButton_; enum { ID_changeUnits }; DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/FontChooser.h0000644012702201742730000000555611274636606017073 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_FONTCHOOSER #define EXTREMA_FONTCHOOSER #include "wx/wx.h" #include "wx/grid.h" #include "wx/notebook.h" class MySampleText; class FontChooser : public wxDialog { public: FontChooser( wxWindow * ); void SetFont( int, int, double, double ); private: void CreateForm(); void SetFontSample(); // event handlers void OnWhite( wxCommandEvent & ); void OnPurple( wxCommandEvent & ); void OnSalmon( wxCommandEvent & ); void OnMaroon( wxCommandEvent & ); void OnBlack( wxCommandEvent & ); void OnYellow( wxCommandEvent & ); void OnSienna( wxCommandEvent & ); void OnNavy( wxCommandEvent & ); void OnRed( wxCommandEvent & ); void OnCyan( wxCommandEvent & ); void OnTan( wxCommandEvent & ); void OnOlive( wxCommandEvent & ); void OnGreen( wxCommandEvent & ); void OnBrown( wxCommandEvent & ); void OnFuchsia( wxCommandEvent & ); void OnSilver( wxCommandEvent & ); void OnBlue( wxCommandEvent & ); void OnCoral( wxCommandEvent & ); void OnLime( wxCommandEvent & ); void OnTeal( wxCommandEvent & ); void OnFont( wxCommandEvent & ); void OnMap( wxGridEvent & ); void OnOK( wxCommandEvent & ); void OnCancel( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); int colorCode_, fontCode_; wxWindow *parent_; MySampleText *sampleText_; wxRadioButton *namedRB_[20]; wxTextCtrl *heightTC_, *angleTC_; wxComboBox *fontCB_; wxNotebook *colorNB_; wxNotebookPage *namedPage_, *mapPage_; wxGrid *mapGrid_; enum { ID_font, ID_map, ID_white, ID_purple, ID_salmon, ID_maroon, ID_black, ID_yellow, ID_sienna, ID_navy, ID_red, ID_cyan, ID_tan, ID_olive, ID_green, ID_brown, ID_fuchsia, ID_silver, ID_blue, ID_coral, ID_lime, ID_teal }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; class MySampleText : public wxWindow { public: MySampleText( wxWindow * ); void SetText( wxFont &, wxColour ); private: wxFont font_; wxColour colour_; void OnPaint( wxPaintEvent & ); DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/SetAspectRatioForm.cpp0000644012702201742730000001677011274636606020713 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/textctrl.h" #include "SetAspectRatioForm.h" #include "VisualizationWindow.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( SetAspectRatioForm, wxFrame ) EVT_BUTTON( wxID_OK, SetAspectRatioForm::OnOK ) EVT_BUTTON( wxID_CANCEL, SetAspectRatioForm::OnCancel ) EVT_CLOSE( SetAspectRatioForm::CloseEventHandler ) END_EVENT_TABLE() SetAspectRatioForm::SetAspectRatioForm( VisualizationWindow *parent ) : wxFrame((wxWindow*)parent,wxID_ANY,wxT("Aspect ratio"),wxDefaultPosition,wxSize(215,130)) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *heightPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *heightSizer = new wxBoxSizer( wxHORIZONTAL ); heightSizer->Add( new wxStaticText(heightPanel,-1,wxT("Height")), wxSizerFlags(0).Border(wxALL,5) ); heightTC_ = new wxTextCtrl( heightPanel, -1 ); heightSizer->Add( heightTC_, wxSizerFlags(0).Border(wxALL,5) ); heightPanel->SetSizer( heightSizer ); topSizer->Add( heightPanel, wxSizerFlags(0).Border(wxALL,5) ); topSizer->Add( new wxStaticLine(topPanel), wxSizerFlags(0).Expand().Border(wxALL,1) ); wxPanel *widthPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *widthSizer = new wxBoxSizer( wxHORIZONTAL ); widthSizer->Add( new wxStaticText(widthPanel,-1,wxT(" Width")), wxSizerFlags(0).Border(wxALL,5) ); widthTC_ = new wxTextCtrl( widthPanel, -1 ); widthSizer->Add( widthTC_, wxSizerFlags(0).Border(wxALL,5) ); widthPanel->SetSizer( widthSizer ); topSizer->Add( widthPanel, wxSizerFlags(0).Border(wxALL,5) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *OKButton = new wxButton( bottomPanel, wxID_OK, wxT("OK") ); OKButton->SetToolTip( wxT("click to accept the height and width as entered and close this form") ); bottomSizer->Add( OKButton, wxSizerFlags(0).Border(wxALL,2) ); wxButton *cancelButton = new wxButton( bottomPanel, wxID_CANCEL, wxT("Cancel") ); cancelButton->SetToolTip( wxT("click to close this form without changing the aspect ratio") ); bottomSizer->Add( cancelButton, wxSizerFlags(0).Border(wxALL,2) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/SetAspectRatioForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/SetAspectRatioForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/SetAspectRatioForm/WIDTH"), 220l ); int height = config->Read( wxT("/SetAspectRatioForm/HEIGHT"), 130l ); SetSize( ulx, uly, width, height ); double ar = ExGlobals::GetAspectRatio(); #if wxMINOR_VERSION < 8 if( ar > 1.0 ) { heightTC_->SetValue( wxString()<SetValue( wxT("1") ); } else { heightTC_->SetValue( wxT("1") ); widthTC_->SetValue( wxString()<<(1./ar) ); } #else if( ar > 1.0 ) { heightTC_->ChangeValue( wxString()<ChangeValue( wxT("1") ); } else { heightTC_->ChangeValue( wxT("1") ); widthTC_->ChangeValue( wxString()<<(1./ar) ); } #endif Show( true ); } void SetAspectRatioForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/SetAspectRatioForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/SetAspectRatioForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/SetAspectRatioForm/WIDTH"), static_cast(width) ); config->Write( wxT("/SetAspectRatioForm/HEIGHT"), static_cast(height) ); } ExGlobals::GetVisualizationWindow()->ZeroSetAspectRatioForm(); Destroy(); } void SetAspectRatioForm::OnOK( wxCommandEvent &WXUNUSED(event) ) { double height, width; if( !GetValues(height,width) )return; ExGlobals::SetAspectRatio( height/width ); ExGlobals::GetVisualizationWindow()->ResetPages(); ExGlobals::GetVisualizationWindow()->ResetWindows(); Close(); } void SetAspectRatioForm::OnCancel( wxCommandEvent &WXUNUSED(event) ) { Close(); } bool SetAspectRatioForm::GetValues( double &height, double &width ) { if( heightTC_->GetValue().empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("No value was entered for height")), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return false; } if( !heightTC_->GetValue().ToDouble(&height) ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Invalid value entered for height")), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); #if wxMINOR_VERSION < 8 heightTC_->SetValue( wxT("") ); #else heightTC_->ChangeValue( wxT("") ); #endif return false; } if( height <= 0.0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Height must be > 0")), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); #if wxMINOR_VERSION < 8 heightTC_->SetValue( wxT("") ); #else heightTC_->ChangeValue( wxT("") ); #endif return false; } if( widthTC_->GetValue().empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("No value was entered for width")), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return false; } if( !widthTC_->GetValue().ToDouble(&width) ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Invalid value entered for width")), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); #if wxMINOR_VERSION < 8 widthTC_->SetValue( wxT("") ); #else widthTC_->ChangeValue( wxT("") ); #endif return false; } if( width <= 0.0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Width must be > 0")), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); #if wxMINOR_VERSION < 8 widthTC_->SetValue( wxT("") ); #else widthTC_->ChangeValue( wxT("") ); #endif return false; } return true; } // end of file extrema-4.4.5/src/wxForms/ExColorCtrl.h0000644012702201742730000000524311331467001017014 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_COLORCTRL #define EXTREMA_COLORCTRL #include "wx/wx.h" #include "wx/sizer.h" #include "wx/button.h" #include "GRA_color.h" #include "ExGlobals.h" #include "BasicColors.h" #include "GRA_colorControl.h" template class ExColorCtrl : public wxPanel { public: ExColorCtrl( wxPanel *parent, wxString const &title, T *popup, void (T::*memFunc)(GRA_color *) ) : wxPanel(parent), popup_(popup), memFunc_(memFunc) { wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( sizer ); sizer->Add( new wxStaticText(this,wxID_ANY,title), 0,wxALIGN_CENTER|wxALL,2 ); //wxSizerFlags flags(0); //sizer->Add( new wxStaticText(this,wxID_ANY,title), flags.Center().Border(wxALL,2) ); button_ = new wxButton( this, ID_button, wxT(""), wxDefaultPosition, wxSize(25,25), wxRAISED_BORDER ); sizer->Add( button_, 0,wxALIGN_CENTER|wxALL,1 ); //sizer->Add( button_, flags.Center().Border(wxALL,1) ); Connect( ID_button, wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&ExColorCtrl::OnClick ); } void SetColor( GRA_color *color ) { button_->SetBackgroundColour( ExGlobals::GetwxColor(color) ); } int GetColorCode() const { wxColour wxc = button_->GetBackgroundColour(); int red = wxc.Red(); int green = wxc.Green(); int blue = wxc.Blue(); return GRA_colorControl::GetColorCode( red, green, blue ); } private: void OnClick( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::SetWorkingColorFlag( false ); BasicColors *bc = new BasicColors( this ); bc->ShowModal(); if( ExGlobals::GetWorkingColorFlag() ) { GRA_color *color = ExGlobals::GetWorkingColor(); (popup_->*memFunc_)( color ); button_->SetBackgroundColour( ExGlobals::GetwxColor(color) ); } } wxButton *button_; T *popup_; void (T::*memFunc_)(GRA_color *); enum { ID_button }; }; #endif extrema-4.4.5/src/wxForms/ExSlider.h0000644012702201742730000000467611274636606016363 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_SLIDER #define EXTREMA_SLIDER #include "wx/wx.h" #include "wx/slider.h" template class ExSlider : public wxPanel { public: ExSlider( wxPanel *parent, wxString const &label, T *popup, void (T::*memFunc)(double) ) : wxPanel(parent), popup_(popup), memFunc_(memFunc) { wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( sizer ); sizer->Add( new wxStaticText(this,wxID_ANY,label), wxSizerFlags(0).Center().Border(wxALL,2) ); slider_ = new wxSlider( this, ID_slider, 0, 0, 100, wxDefaultPosition, wxSize(100,wxDefaultCoord), wxSL_HORIZONTAL|wxSL_AUTOTICKS|wxSL_BOTTOM ); slider_->SetLineSize( 1 ); slider_->SetPageSize( 10 ); sizer->Add( slider_, wxSizerFlags(0).Center().Border(wxALL,2) ); value_ = new wxStaticText( this, wxID_ANY, wxT("") ); sizer->Add( value_, wxSizerFlags(0).Center().Border(wxALL,2) ); Connect( ID_slider, wxID_ANY, wxEVT_SCROLL_CHANGED, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&ExSlider::OnSliderChange ); //wxEVT_SCROLL_LINEUP|wxEVT_SCROLL_LINEDOWN|wxEVT_SCROLL_PAGEUP|wxEVT_SCROLL_PAGEDOWN|wxEVT_SCROLL_THUMBTRACK, } void SetValue( double val ) { int ival = static_cast(val+0.5); slider_->SetValue( ival ); value_->SetLabel( wxString()<GetValue(); value_->SetLabel( wxString()<*memFunc_)( static_cast(val) ); } wxSlider *slider_; wxStaticText *value_; T *popup_; void (T::* memFunc_)(double); enum { ID_slider }; }; #endif extrema-4.4.5/src/wxForms/ImportWindow.h0000644012702201742730000000737211274636606017302 0ustar spangspang/* Copyright (C) 2008 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_IMPORT_WINDOW #define EXTREMA_IMPORT_WINDOW #include #include #include "wx/wx.h" #include "wx/dcbuffer.h" class DigitizeForm; class DigitizeInfo; class ImportWindow; class GetCoordinates; // The ImportForm is created when a file (png, jpeg, etc.) is imported // (initiated from the VisualizationWindow). It contains in ImportWindow, // the graphics canvas, as well as a button for digitizing. class ImportForm : public wxFrame { public: ImportForm( wxWindow *, wxImage & ); void ZeroDigitizeForm(); void StartDigitizing(); void StopDigitizing(); bool IsDigitizing() const; void SetDigitized( int, int ); void StartPicking(); void StopPicking(); bool IsPicking() const; void SetPicked( int, int ); void SetPoints( double, double ); // event handlers void CloseEventHandler( wxCloseEvent & ); void OnPaint( wxPaintEvent & ); void OnDigitize( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void OnMouseLeftDown( wxMouseEvent & ); private: DigitizeForm *digitizeForm_; wxBitmap *bitmap_; ImportWindow *window_; bool digitizing_, picking_; enum { ID_digitize }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; class ImportWindow : public wxWindow { public: ImportWindow( ImportForm *, wxBitmap * ); // event handlers void CloseEventHandler( wxCloseEvent & ); void OnPaint( wxPaintEvent & ); void OnMouseLeftDown( wxMouseEvent & ); void SetPoints( double, double ); private: ImportForm *parent_; wxBitmap *bitmap_; DECLARE_EVENT_TABLE() }; class DigitizeForm : public wxFrame { public: DigitizeForm( ImportForm * ); void StartPicking(); void StartDigitizing(); void AbortDigitizing(); void SetPicked( int, int ); void SetDigitized( int, int ); void SetPoints( double, double ); void ZeroDigitizeInfo(); void OnStartStop( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnClose( wxCommandEvent & ); private: void SetupCoordinateTransform(); ImportForm *parent_; DigitizeInfo *digitizeInfo_; wxButton *startStopB_; wxTextCtrl *xTC_, *yTC_; wxStaticText *fpST_, *spST_, *tpST_, *numST_, *lastST_; bool digitizing_; int nPick_, nDigitized_; double xUser_[3], yUser_[3]; int xImage_[3], yImage_[3]; double a_, b_, c_, d_, e_, f_; std::vector xd_, yd_; enum { ID_start }; DECLARE_EVENT_TABLE() }; class DigitizeInfo : public wxFrame { public: DigitizeInfo( DigitizeForm * ); void Next(); void CloseEventHandler( wxCloseEvent & ); void OnAbort( wxCommandEvent & ); private: DigitizeForm *parent_; wxStaticText *infoST_; wxButton *abortB_; int nPoints_; enum { ID_abort }; DECLARE_EVENT_TABLE() }; class GetCoordinates : public wxFrame { public: GetCoordinates( ImportWindow *, int, int ); void OnOK( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); private: bool GetValues( double &, double & ); ImportWindow *parent_; wxTextCtrl *xTC_, *yTC_; DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/FigureForm.cpp0000644012702201742730000010331111333122365017212 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include "wx/config.h" #include "wx/string.h" #include "wx/stattext.h" #include "wx/gdicmn.h" #include "wx/font.h" #include "wx/colour.h" #include "wx/settings.h" #include "wx/bitmap.h" #include "wx/image.h" #include "wx/icon.h" #include "wx/statbmp.h" #include "wx/sizer.h" #include "wx/panel.h" #include "wx/checkbox.h" #include "wx/button.h" #include "wx/textctrl.h" #include "wx/notebook.h" #include "wx/bmpbuttn.h" #include "wx/frame.h" #include "FigureForm.h" #include "ExGlobals.h" #include "VisualizationWindow.h" #include "GraphicsPage.h" #include "GRA_colorControl.h" #include "GRA_window.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( FigureForm, wxFrame ) EVT_BUTTON( ID_arrow1, FigureForm::OnArrow1 ) EVT_BUTTON( ID_arrow2, FigureForm::OnArrow2 ) EVT_BUTTON( ID_arrow3, FigureForm::OnArrow3 ) EVT_CHECKBOX( ID_twoHeads, FigureForm::OnTwoHeads ) EVT_CHECKBOX( ID_circle, FigureForm::OnCircle ) EVT_BUTTON( ID_drawArrow, FigureForm::OnDrawArrow ) EVT_BUTTON( ID_eraseArrow, FigureForm::OnEraseArrow ) EVT_BUTTON( ID_rectangle, FigureForm::OnRectangle ) EVT_BUTTON( ID_regular, FigureForm::OnRegular ) EVT_BUTTON( ID_star, FigureForm::OnStar ) EVT_BUTTON( ID_drawPolygon, FigureForm::OnDrawPolygon ) EVT_BUTTON( ID_erasePolygon, FigureForm::OnErasePolygon ) EVT_BUTTON( ID_drawEllipse, FigureForm::OnDrawEllipse ) EVT_BUTTON( ID_eraseEllipse, FigureForm::OnEraseEllipse ) EVT_BUTTON( wxID_CLOSE, FigureForm::OnClose ) EVT_CLOSE( FigureForm::CloseEventHandler ) END_EVENT_TABLE() FigureForm::FigureForm( VisualizationWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Draw Figures"),wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL), visualizationWindow_(parent) { CreateForm(); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/FigureForm/UPPERLEFTX"), 980l ); int uly = config->Read( wxT("/FigureForm/UPPERLEFTY"), 60l ); int width = config->Read( wxT("/FigureForm/WIDTH"), 370l ); int height = config->Read( wxT("/FigureForm/HEIGHT"), 430l ); SetSize( ulx, uly, width, height ); Show( true ); arrowType_ = config->Read( wxT("/FigureForm/ARROWTYPE"), 1l ); polygonType_ = config->Read( wxT("/FigureForm/POLYGONTYPE"), 1l ); int polygonAngle = config->Read( wxT("/FigureForm/POLYGONANGLE"), 0l ); int polygonVertices = config->Read( wxT("/FigureForm/POLYGONVERTICES"), 3l ); bool twoHeads = false; config->Read( wxT("/FigureDrawForm/HEADSBOTHENDS"), &twoHeads ); bool drawCircles = false; config->Read( wxT("/FigureDrawForm/DRAWCIRCLES"), &drawCircles ); int lt = config->Read( wxT("/FigureForm/LINETHICKNESS"), 1l ); int lc = config->Read( wxT("/FigureForm/LINECOLOR"), -1l ); int fc = config->Read( wxT("/FigureForm/FILLCOLOR"), 0l ); FillOutForm( polygonAngle, polygonVertices, twoHeads, drawCircles, lt, lc, fc ); } void FigureForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/FigureForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/FigureForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/FigureForm/WIDTH"), static_cast(width) ); config->Write( wxT("/FigureForm/HEIGHT"), static_cast(height) ); // config->Write( wxT("/FigureForm/ARROWTYPE"), static_cast(arrowType_) ); config->Write( wxT("/FigureForm/POLYGONTYPE"), static_cast(polygonType_) ); config->Write( wxT("/FigureForm/POLYGONANGLE"), static_cast(polygonAngleSC_->GetValue()) ); config->Write( wxT("/FigureForm/POLYGONVERTICES"), static_cast(polygonVerticesSC_->GetValue()) ); config->Write( wxT("/FigureForm/HEADSBOTHENDS"), twoHeadsCheckBox_->GetValue() ); config->Write( wxT("/FigureForm/DRAWCIRCLES"), makeCircleCheckBox_->GetValue() ); config->Write( wxT("/FigureForm/LINETHICKNESS"), static_cast(lineThicknessSC_->GetValue()) ); config->Write( wxT("/FigureForm/LINECOLOR"), static_cast(lineColorCC_->GetColorCode()) ); if( fillColorCC_ ) config->Write( wxT("/FigureForm/FILLCOLOR"), static_cast(fillColorCC_->GetColorCode()) ); else config->Write( wxT("/FigureForm/FILLCOLOR"), 0l ); } visualizationWindow_->ZeroFigureForm(); Destroy(); } void FigureForm::CreateForm() { SetSizeHints( wxDefaultSize, wxDefaultSize ); wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *topPanelSizer = new wxBoxSizer( wxHORIZONTAL ); wxNotebook *figureNotebook = new wxNotebook( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); wxPanel *arrowPanel = new wxPanel( figureNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *apSizer = new wxBoxSizer( wxVERTICAL ); wxStaticText *chooseArrowStaticText = new wxStaticText( arrowPanel, wxID_ANY, wxT("Choose arrow type"), wxDefaultPosition, wxDefaultSize, 0 ); chooseArrowStaticText->Wrap( -1 ); apSizer->Add( chooseArrowStaticText, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 15 ); wxPanel *arrowImagesPanel = new wxPanel( arrowPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* arrowImagesSizer = new wxBoxSizer( wxHORIZONTAL ); wxString imageDir = ExGlobals::GetImagePath(); arrow1_ = new wxBitmapButton( arrowImagesPanel, ID_arrow1, wxBitmap(imageDir+wxT("/arrow1.bmp"),wxBITMAP_TYPE_BMP) ); arrow1_->SetToolTip( wxT("click to choose this arrow type") ); arrowImagesSizer->Add( arrow1_, 0, wxALL, 1 ); arrow2_ = new wxBitmapButton( arrowImagesPanel, ID_arrow2, wxBitmap(imageDir+wxT("/arrow2.bmp"),wxBITMAP_TYPE_BMP) ); arrow2_->SetToolTip( wxT("click to choose this arrow type") ); arrowImagesSizer->Add( arrow2_, 0, wxALL, 1 ); arrow3_ = new wxBitmapButton( arrowImagesPanel, ID_arrow3, wxBitmap(imageDir+wxT("/arrow3.bmp"),wxBITMAP_TYPE_BMP) ); arrow3_->SetToolTip( wxT("click to choose this arrow type") ); arrowImagesSizer->Add( arrow3_, 0, wxALL, 1 ); arrowImagesPanel->SetSizer( arrowImagesSizer ); arrowImagesPanel->Layout(); arrowImagesSizer->Fit( arrowImagesPanel ); apSizer->Add( arrowImagesPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); twoHeadsCheckBox_ = new wxCheckBox( arrowPanel, ID_twoHeads, wxT("Heads on both ends"), wxDefaultPosition, wxDefaultSize, 0 ); apSizer->Add( twoHeadsCheckBox_, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxTOP, 15 ); wxPanel *arrowButtonPanel = new wxPanel( arrowPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* arrowButtonSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *eraseArrowButton = new wxButton( arrowButtonPanel, ID_eraseArrow, wxT("Erase"), wxDefaultPosition, wxDefaultSize, 0 ); eraseArrowButton->SetToolTip( wxT("click to erase the last drawn arrow") ); arrowButtonSizer->Add( eraseArrowButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 15 ); wxButton *drawArrowButton = new wxButton( arrowButtonPanel, ID_drawArrow, wxT("Draw"), wxDefaultPosition, wxDefaultSize, 0 ); drawArrowButton->SetToolTip( wxT("click to interactively draw the choosen arrow type") ); arrowButtonSizer->Add( drawArrowButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 15 ); arrowButtonPanel->SetSizer( arrowButtonSizer ); arrowButtonPanel->Layout(); arrowButtonSizer->Fit( arrowButtonPanel ); apSizer->Add( arrowButtonPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); arrowPanel->SetSizer( apSizer ); arrowPanel->Layout(); apSizer->Fit( arrowPanel ); figureNotebook->AddPage( arrowPanel, wxT("Arrows"), false ); wxPanel *polygonPanel = new wxPanel( figureNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* ppSizer = new wxBoxSizer( wxVERTICAL ); wxStaticText *choosePolyStaticText = new wxStaticText( polygonPanel, wxID_ANY, wxT("Choose polygon type"), wxDefaultPosition, wxDefaultSize, 0 ); choosePolyStaticText->Wrap( -1 ); ppSizer->Add( choosePolyStaticText, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 15 ); wxPanel *polygonImagesPanel = new wxPanel( polygonPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* polygonImagesSizer = new wxBoxSizer( wxHORIZONTAL ); rectangle_ = new wxBitmapButton( polygonImagesPanel, ID_rectangle, wxBitmap(imageDir+wxT("/rectangle.bmp"),wxBITMAP_TYPE_BMP) ); rectangle_->SetToolTip( wxT("click to choose a rectangle") ); polygonImagesSizer->Add( rectangle_, 0, wxALL, 1 ); regular_ = new wxBitmapButton( polygonImagesPanel, ID_regular, wxBitmap(imageDir+wxT("/regularPolygon.bmp"),wxBITMAP_TYPE_BMP) ); regular_->SetToolTip( wxT("click to choose a regular polygon") ); polygonImagesSizer->Add( regular_, 0, wxALL, 1 ); star_ = new wxBitmapButton( polygonImagesPanel, ID_star, wxBitmap(imageDir+wxT("/star.bmp"),wxBITMAP_TYPE_BMP) ); star_->SetToolTip( wxT("click to choose a star shape") ); polygonImagesSizer->Add( star_, 0, wxALL, 1 ); polygonImagesPanel->SetSizer( polygonImagesSizer ); polygonImagesPanel->Layout(); polygonImagesSizer->Fit( polygonImagesPanel ); ppSizer->Add( polygonImagesPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); wxPanel *polyPropertiesPanel = new wxPanel( polygonPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *polyPropertiesSizer = new wxBoxSizer( wxVERTICAL ); polygonVerticesSC_ = new ExSpinCtrlI( polyPropertiesPanel, wxT("Number of vertices"), 3, 999, this, &FigureForm::OnPolygonVertices ); polygonVerticesSC_->SetToolTip( wxT("set the number of vertices for the regular polygon (3 to 999)") ); polyPropertiesSizer->Add( polygonVerticesSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); polygonVerticesSC_->Show(true); polygonAngleSC_ = new ExSpinCtrlI( polyPropertiesPanel, wxT("Angle (degrees)"), 0, 360, this, &FigureForm::OnPolygonAngle ); polygonAngleSC_->SetToolTip( wxT("set the angle for the polygon figure (0 to 360 degrees)") ); polyPropertiesSizer->Add( polygonAngleSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); polyPropertiesPanel->SetSizer( polyPropertiesSizer ); polyPropertiesPanel->Layout(); polyPropertiesSizer->Fit( polyPropertiesPanel ); ppSizer->Add( polyPropertiesPanel, 0, wxEXPAND|wxTOP, 50 ); wxPanel *polyButtonPanel = new wxPanel( polygonPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *polyButtonSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *erasePolygonButton = new wxButton( polyButtonPanel, ID_erasePolygon, wxT("Erase"), wxDefaultPosition, wxDefaultSize, 0 ); erasePolygonButton->SetToolTip( wxT("click to erase the last drawn polygon") ); polyButtonSizer->Add( erasePolygonButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 15 ); wxButton *drawPolygonButton = new wxButton( polyButtonPanel, ID_drawPolygon, wxT("Draw"), wxDefaultPosition, wxDefaultSize, 0 ); drawPolygonButton->SetToolTip( wxT("click to interactively draw the choosen polygonal shape") ); polyButtonSizer->Add( drawPolygonButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 15 ); polyButtonPanel->SetSizer( polyButtonSizer ); polyButtonPanel->Layout(); polyButtonSizer->Fit( polyButtonPanel ); ppSizer->Add( polyButtonPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); polygonPanel->SetSizer( ppSizer ); polygonPanel->Layout(); ppSizer->Fit( polygonPanel ); figureNotebook->AddPage( polygonPanel, wxT("Polygons"), false ); wxPanel *ellipsePanel = new wxPanel( figureNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *epSizer = new wxBoxSizer( wxVERTICAL ); makeCircleCheckBox_ = new wxCheckBox( ellipsePanel, ID_circle, wxT("Make it a circle"), wxDefaultPosition, wxDefaultSize, 0 ); epSizer->Add( makeCircleCheckBox_, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 70 ); wxPanel *ellipseButtonPanel = new wxPanel( ellipsePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *ellipseButtonSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *eraseEllipseButton = new wxButton( ellipseButtonPanel, ID_eraseEllipse, wxT("Erase"), wxDefaultPosition, wxDefaultSize, 0 ); eraseEllipseButton->SetToolTip( wxT("click to erase the last drawn ellipse") ); ellipseButtonSizer->Add( eraseEllipseButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 15 ); wxButton *drawEllipseButton = new wxButton( ellipseButtonPanel, ID_drawEllipse, wxT("Draw"), wxDefaultPosition, wxDefaultSize, 0 ); drawEllipseButton->SetToolTip( wxT("click to interactively draw the ellipse (or circle)") ); ellipseButtonSizer->Add( drawEllipseButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 15 ); ellipseButtonPanel->SetSizer( ellipseButtonSizer ); ellipseButtonPanel->Layout(); ellipseButtonSizer->Fit( ellipseButtonPanel ); epSizer->Add( ellipseButtonPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); ellipsePanel->SetSizer( epSizer ); ellipsePanel->Layout(); epSizer->Fit( ellipsePanel ); figureNotebook->AddPage( ellipsePanel, wxT("Ellipses"), false ); topPanelSizer->Add( figureNotebook, 0, wxALL, 1 ); wxPanel *propertiesPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer *propertiesPanelSizer = new wxBoxSizer( wxVERTICAL ); lineThicknessSC_ = new ExSpinCtrlI( propertiesPanel, wxT("Line width"), 1, 10, this, &FigureForm::OnLineThickness ); lineThicknessSC_->SetToolTip( wxT("set the line thickness for the figure") ); propertiesPanelSizer->Add( lineThicknessSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); lineColorCC_ = new ExColorCtrl( propertiesPanel, wxT("Line color"), this, &FigureForm::OnLineColor ); lineColorCC_->SetToolTip( wxT("change the line color") ); propertiesPanelSizer->Add( lineColorCC_, wxSizerFlags(0).Left().Border(wxALL,5) ); fillColorCC_ = new ExColorCtrl( propertiesPanel, wxT("Fill color"), this, &FigureForm::OnFillColor ); propertiesPanelSizer->Add( fillColorCC_, wxSizerFlags(0).Left().Border(wxALL,5) ); propertiesPanel->SetSizer( propertiesPanelSizer ); propertiesPanel->Layout(); propertiesPanelSizer->Fit( propertiesPanel ); topPanelSizer->Add( propertiesPanel, 0, wxEXPAND | wxALL, 1 ); topPanel->SetSizer( topPanelSizer ); topPanel->Layout(); topPanelSizer->Fit( topPanel ); mainSizer->Add( topPanel, 0, wxEXPAND | wxALL, 1 ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* bpSizer = new wxBoxSizer( wxVERTICAL ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close"), wxDefaultPosition, wxDefaultSize, 0 ); bpSizer->Add( closeButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); bottomPanel->SetSizer( bpSizer ); bottomPanel->Layout(); bpSizer->Fit( bottomPanel ); mainSizer->Add( bottomPanel, 0, wxEXPAND | wxALL, 1 ); SetSizer( mainSizer ); Layout(); mainSizer->Fit( this ); } void FigureForm::FillOutForm( int polygonAngle, int polygonVertices, bool twoHeads, bool drawCircles, int lineThickness, int lineColor, int fillColor ) { lineThicknessSC_->SetValue( lineThickness ); lineColorCC_->SetColor( GRA_colorControl::GetColor(lineColor) ); fillColorCC_->SetColor( GRA_colorControl::GetColor(fillColor) ); polygonAngleSC_->SetValue( polygonAngle ); polygonVerticesSC_->SetValue( polygonVertices ); twoHeadsCheckBox_->SetValue( twoHeads ); makeCircleCheckBox_->SetValue( drawCircles ); wxString imageDir = ExGlobals::GetImagePath(); switch( arrowType_ ) { case 1: if( twoHeads ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow12.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow23.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow33.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow1.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow21.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow31.bmp"),wxBITMAP_TYPE_BMP)); } break; case 2: if( twoHeads ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow13.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow22.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow33.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow11.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow2.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow31.bmp"),wxBITMAP_TYPE_BMP)); } break; case 3: if( twoHeads ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow13.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow23.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow32.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow11.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow21.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow3.bmp"),wxBITMAP_TYPE_BMP)); } break; } GraphicsPage *page = dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage()); page->SetFigureLineThickness( lineThickness ); page->SetFigureLineColor( GRA_colorControl::GetColor(lineColor) ); if( fillColor == 0 ) page->SetFigureFillColor( 0 ); else page->SetFigureFillColor( GRA_colorControl::GetColor(fillColor) ); page->SetArrowType( arrowType_ ); page->SetHeadsBothEnds( twoHeads ); page->SetDrawCircles( drawCircles ); switch( polygonType_ ) { case 1: // rectangle rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle.bmp"),wxBITMAP_TYPE_BMP)); regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon1.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star1.bmp"),wxBITMAP_TYPE_BMP)); polygonVerticesSC_->Show( false ); break; case 2: // regular polygon rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle1.bmp"),wxBITMAP_TYPE_BMP)); regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star1.bmp"),wxBITMAP_TYPE_BMP)); polygonVerticesSC_->Show( true ); break; case 3: // 5 pt star rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle1.bmp"),wxBITMAP_TYPE_BMP)); regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon1.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star.bmp"),wxBITMAP_TYPE_BMP)); polygonVerticesSC_->Show( false ); break; } page->SetPolygonType( polygonType_ ); page->SetPolygonAngle( polygonAngle ); page->SetPolygonVertices( polygonVertices ); } void FigureForm::OnArrow1( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch( arrowType_ ) { case 1: break; case 2: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow12.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow23.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow1.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow21.bmp"),wxBITMAP_TYPE_BMP)); } break; case 3: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow12.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow33.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow1.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow31.bmp"),wxBITMAP_TYPE_BMP)); } break; } arrowType_ = 1; dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetArrowType( arrowType_ ); } void FigureForm::OnArrow2( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch( arrowType_ ) { case 1: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow13.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow22.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow11.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow2.bmp"),wxBITMAP_TYPE_BMP)); } break; case 2: break; case 3: if( twoHeadsCheckBox_->IsChecked() ) { arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow22.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow33.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow2.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow31.bmp"),wxBITMAP_TYPE_BMP)); } break; } arrowType_ = 2; dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetArrowType( arrowType_ ); } void FigureForm::OnArrow3( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch( arrowType_ ) { case 1: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow13.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow32.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow11.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow3.bmp"),wxBITMAP_TYPE_BMP)); } break; case 2: if( twoHeadsCheckBox_->IsChecked() ) { arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow23.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow32.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow21.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow3.bmp"),wxBITMAP_TYPE_BMP)); } break; case 3: break; } arrowType_ = 3; dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetArrowType( arrowType_ ); } void FigureForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void FigureForm::OnTwoHeads( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch( arrowType_ ) { case 1: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow12.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow23.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow33.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow1.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow21.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow31.bmp"),wxBITMAP_TYPE_BMP)); } break; case 2: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow13.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow22.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow33.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow11.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow2.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow31.bmp"),wxBITMAP_TYPE_BMP)); } break; case 3: if( twoHeadsCheckBox_->IsChecked() ) { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow13.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow23.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow32.bmp"),wxBITMAP_TYPE_BMP)); } else { arrow1_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow11.bmp"),wxBITMAP_TYPE_BMP)); arrow2_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow21.bmp"),wxBITMAP_TYPE_BMP)); arrow3_->SetBitmapLabel(wxBitmap(imageDir+wxT("/arrow3.bmp"),wxBITMAP_TYPE_BMP)); } break; } dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())-> SetHeadsBothEnds( twoHeadsCheckBox_->IsChecked() ); } void FigureForm::OnRectangle( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch (polygonType_) { case 1: break; case 2: rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle.bmp"),wxBITMAP_TYPE_BMP)); regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon1.bmp"),wxBITMAP_TYPE_BMP)); break; case 3: rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star1.bmp"),wxBITMAP_TYPE_BMP)); break; } dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetPolygonType( 1 ); polygonType_ = 1; polygonVerticesSC_->Show( false ); } void FigureForm::OnRegular( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch (polygonType_) { case 1: rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle1.bmp"),wxBITMAP_TYPE_BMP)); regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon.bmp"),wxBITMAP_TYPE_BMP)); break; case 2: break; case 3: regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star1.bmp"),wxBITMAP_TYPE_BMP)); break; } dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetPolygonType( 2 ); polygonType_ = 2; polygonVerticesSC_->Show( true ); } void FigureForm::OnStar( wxCommandEvent &WXUNUSED(event) ) { wxString imageDir = ExGlobals::GetImagePath(); switch (polygonType_) { case 1: rectangle_->SetBitmapLabel(wxBitmap(imageDir+wxT("/rectangle1.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star.bmp"),wxBITMAP_TYPE_BMP)); break; case 2: regular_->SetBitmapLabel(wxBitmap(imageDir+wxT("/regularPolygon1.bmp"),wxBITMAP_TYPE_BMP)); star_->SetBitmapLabel(wxBitmap(imageDir+wxT("/star.bmp"),wxBITMAP_TYPE_BMP)); break; case 3: break; } dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetPolygonType( 3 ); polygonType_ = 3; polygonVerticesSC_->Show( false ); } void FigureForm::OnPolygonAngle( int angle ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())-> SetPolygonAngle( angle ); } void FigureForm::OnPolygonVertices( int vertices ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())-> SetPolygonVertices( vertices ); } void FigureForm::OnCircle( wxCommandEvent &WXUNUSED(event) ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())-> SetDrawCircles( makeCircleCheckBox_->IsChecked() ); } void FigureForm::OnDrawArrow( wxCommandEvent &WXUNUSED(event) ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetArrowPlacementMode(); std::vector lines; lines.push_back( wxString(wxT("Left click in the visualization window to choose the arrow base,")) ); lines.push_back( wxString(wxT("then left click again to choose the arrow end point")) ); ExGlobals::ShowHint( lines ); } void FigureForm::OnEraseArrow( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::GetGraphWindow()->RemoveLastArrow(); dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->Paint(); ExGlobals::GetwxWindow()->Refresh(); ExGlobals::GetwxWindow()->Update(); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM FIGURE,ARROW,ERASE") ); } void FigureForm::OnDrawPolygon( wxCommandEvent &WXUNUSED(event) ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetPolygonPlacementMode(); std::vector lines; switch( polygonType_ ) { case 1: lines.push_back( wxString(wxT("Left click in the visualization window to choose a corner of the rectangle,")) ); lines.push_back( wxString(wxT("then left click again to choose the diagonally opposite corner")) ); break; case 2: lines.push_back( wxString(wxT("Left click in the visualization window to choose the centre of the polygon,")) ); lines.push_back( wxString(wxT("then left click again to choose the radius of the circumscribed circle")) ); break; case 3: lines.push_back( wxString(wxT("Left click in the visualization window to choose the centre of the star,")) ); lines.push_back( wxString(wxT("then left click again to choose the radius of the circumscribed circle")) ); break; } ExGlobals::ShowHint( lines ); } void FigureForm::OnErasePolygon( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::GetGraphWindow()->RemoveLastPolygon(); dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->Paint(); ExGlobals::GetwxWindow()->Refresh(); ExGlobals::GetwxWindow()->Update(); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM FIGURE,POLYGON,ERASE") ); } void FigureForm::OnDrawEllipse( wxCommandEvent &WXUNUSED(event) ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetEllipsePlacementMode(); std::vector lines; if( makeCircleCheckBox_->IsChecked() ) { lines.push_back( wxString(wxT("Left click in the visualization window to choose the circle centre,")) ); lines.push_back( wxString(wxT("then left click again to choose the radius")) ); } else { lines.push_back( wxString(wxT("Left click in the visualization window to choose a corner of the bounding rectangle,")) ); lines.push_back( wxString(wxT("then left click again to choose the diagonally opposite corner")) ); } ExGlobals::ShowHint( lines ); } void FigureForm::OnEraseEllipse( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::GetGraphWindow()->RemoveLastEllipse(); dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->Paint(); ExGlobals::GetwxWindow()->Refresh(); ExGlobals::GetwxWindow()->Update(); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM FIGURE,ELLIPSE,ERASE") ); } void FigureForm::OnLineThickness( int val ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetFigureLineThickness( val ); } void FigureForm::OnLineColor( GRA_color *color ) { dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetFigureLineColor( color ); } void FigureForm::OnFillColor( GRA_color *color ) { if( GRA_colorControl::GetColorCode(color) == 0 )color = 0; dynamic_cast(ExGlobals::GetVisualizationWindow()->GetPage())->SetFigureFillColor( color ); } extrema-4.4.5/src/wxForms/LegendPopup.h0000644012702201742730000000443711274636606017061 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_LEGENDPOPUP #define EXTREMA_LEGENDPOPUP #include "wx/wx.h" #include "ExSlider.h" #include "ExSpinCtrlD.h" #include "ExColorCtrl.h" class GraphicsPage; class GRA_window; class GRA_setOfCharacteristics; class GRA_color; class GRA_legend; class LegendPopup : public wxFrame { public: LegendPopup( GraphicsPage * ); void Setup( GRA_window *, GRA_legend * ); void OnFrameColor( GRA_color * ); void OnTitleColor( GRA_color * ); void OnTitleHeight( double ); void OnMoveH( double ); void OnMoveV( double ); void OnExpandH( double ); void OnExpandV( double ); void Disconnect(); private: void CreateForm(); void ReDraw(); // event handlers void OnTitleEnter( wxCommandEvent & ); void OnTitleFont( wxCommandEvent & ); void OnDrawLegend( wxCommandEvent & ); void OnDrawFrame( wxCommandEvent & ); void OnDrawTitle( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); bool setup_; GraphicsPage *page_; GRA_window *window_; GRA_legend *legend_; GRA_setOfCharacteristics *legChars_; ExColorCtrl *frameColor_, *titleColor_; ExSpinCtrlD *titleHeightSC_; ExSlider *moveH_, *moveV_, *expandH_, *expandV_; wxComboBox *titleFontCB_; wxTextCtrl *titleTC_; wxCheckBox *drawLegendCB_, *drawFrameCB_, *drawTitleCB_; wxButton *closeBTN_; enum { ID_font, ID_title, ID_drawLegend, ID_drawFrame, ID_drawTitle }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/WriteMatrixForm.h0000644012702201742730000000260311274636606017733 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_WRITEMATRIXFORM #define EXTREMA_WRITEMATRIXFORM #include "wx/wx.h" #include "wx/checklst.h" class AnalysisWindow; class ChooseFilePanel; class WriteMatrixForm : public wxFrame { public: WriteMatrixForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void OnRefresh( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxCheckListBox *variableList_; wxCheckBox *append_; void FillList(); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ExSpinCtrlI.h0000644012702201742730000000674611274636606017010 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_SPINCTRLI #define EXTREMA_SPINCTRLI #include "wx/wx.h" #include "wx/sizer.h" #include "wx/spinbutt.h" #include "wx/textctrl.h" template class ExSpinCtrlI : public wxPanel { public: ExSpinCtrlI( wxPanel *parent, wxString const &label, int min, int max, T *popup, void (T::*memFunc)(int) ) : wxPanel(parent), popup_(popup), memFunc_(memFunc) { wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( sizer ); sizer->Add( new wxStaticText(this,wxID_ANY,label), 0,wxALIGN_LEFT|wxALL,2 ); //wxSizerFlags flags(0); //sizer->Add( new wxStaticText(this,wxID_ANY,label), flags.Left().Border(wxALL,2) ); wxPanel *panel2 = new wxPanel( this ); wxBoxSizer *sizer2 = new wxBoxSizer( wxHORIZONTAL ); panel2->SetSizer( sizer2 ); sizer->Add( panel2, 0,wxALIGN_CENTER|wxALL,2 ); //sizer->Add( panel2, flags.Center().Border(wxALL,2) ); textCtrl_ = new wxTextCtrl( panel2, ID_text ); sizer2->Add( textCtrl_, 0,wxALIGN_LEFT|wxALL,1 ); //sizer2->Add( textCtrl_, flags.Left().Border(wxALL,1) ); spinButton_ = new wxSpinButton( panel2, ID_spin ); spinButton_->SetRange( min, max ); sizer2->Add( spinButton_, 0,wxALIGN_LEFT|wxALL,1 ); //sizer2->Add( spinButton_, flags.Left().Border(wxALL,1) ); Connect( ID_spin, wxID_ANY, wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&ExSpinCtrlI::OnSpinChange ); Connect( ID_text, wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&ExSpinCtrlI::OnTextChange ); } void SetValue( int val ) { spinButton_->SetValue( val ); textCtrl_->SetValue( wxString()<GetValue().ToLong(&i); return static_cast(i); } private: void OnSpinChange( wxSpinEvent &WXUNUSED(event) ) { int val = spinButton_->GetValue(); textCtrl_->SetValue( wxString()<*memFunc_)( val ); } void OnTextChange( wxCommandEvent &WXUNUSED(event) ) { wxString text( textCtrl_->GetValue() ); if( text.empty() )return; long val; if( !text.ToLong(&val) || valGetMin() || val>spinButton_->GetMax() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered"), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } (popup_->*memFunc_)( static_cast(val) ); } wxSpinButton *spinButton_; wxTextCtrl *textCtrl_; T *popup_; void (T::* memFunc_)(int); enum { ID_spin, ID_text }; //DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/HintForm.cpp0000644012702201742730000000507011274636606016712 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "wx/gdicmn.h" #include "HintForm.h" HintForm::HintForm() : wxFrame((wxWindow*)NULL,wxID_ANY,wxT(""),wxDefaultPosition,wxDefaultSize, wxSYSTEM_MENU|wxRESIZE_BORDER|wxCAPTION&~(wxMINIMIZE_BOX|wxMAXIMIZE_BOX)) { int screenWidth, screenHeight; ::wxDisplaySize( &screenWidth, &screenHeight ); wxConfigBase *config = wxConfigBase::Get(); int width = config->Read( wxT("/HintForm/WIDTH"), 320l ); int height = config->Read( wxT("/HintForm/HEIGHT"), 60l ); int ulx = config->Read( wxT("/HintForm/UPPERLEFTX"), static_cast((screenWidth-width)/2) ); int uly = config->Read( wxT("/HintForm/UPPERLEFTY"), static_cast((screenHeight-height)/2) ); SetSize( ulx, uly, width, height ); // wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); textLabel_ = new wxStaticText( this, wxID_ANY, wxT("") ); mainSizer->Add( textLabel_, wxSizerFlags(1).Centre().Border(wxALL,20) ); SetSizer( mainSizer ); SetBackgroundColour( wxColour(255,250,205) ); Layout(); } void HintForm::ShowHint( std::vector const &lines ) { wxString text; for( std::size_t i=0; iSetLabel( text ); Layout(); Show( true ); Raise(); } void HintForm::HideHint() { Show( false ); } HintForm::~HintForm() { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/HintForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/HintForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/HintForm/WIDTH"), static_cast(width) ); config->Write( wxT("/HintForm/HEIGHT"), static_cast(height) ); } } // end of file extrema-4.4.5/src/wxForms/TextPopup.h0000644012702201742730000000372111274636606016602 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_TEXTPOPUP #define EXTREMA_TEXTPOPUP #include "wx/wx.h" #include "ExSpinCtrlD.h" #include "ExSpinCtrlI.h" #include "ExColorCtrl.h" class GraphicsPage; class GRA_window; class GRA_setOfCharacteristics; class GRA_color; class GRA_drawableText; class TextPopup : public wxFrame { public: TextPopup( GraphicsPage * ); void Setup( GRA_window *, GRA_drawableText * ); void OnColor( GRA_color * ); void OnHeight( double ); void OnAngle( int ); void OnXLocation( double ); void OnYLocation( double ); void Disconnect(); private: void CreateForm(); void ReDraw(); // event handlers void OnStringEnter( wxCommandEvent & ); void OnFont( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); bool setup_; GraphicsPage *page_; GRA_window *window_; GRA_drawableText *drawableText_; GRA_setOfCharacteristics *textChars_; ExColorCtrl *color_; ExSpinCtrlI *angleSC_; ExSpinCtrlD *heightSC_, *xLocSC_, *yLocSC_; wxComboBox *fontCB_; wxTextCtrl *stringTC_; wxButton *closeBTN_; enum { ID_font, ID_string }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/VarInfoForm.h0000644012702201742730000000246711274636606017030 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_VARINFOFORM #define EXTREMA_VARINFOFORM #include "wx/wx.h" class ShowVariablesForm; class VarInfoForm : public wxFrame { public: VarInfoForm( ShowVariablesForm * ); void DisplayInfo( wxString const & ); private: ShowVariablesForm *showVariablesForm_; wxTextCtrl *textCtrl_; wxString name_; enum { ID_refresh }; // event handlers void OnRefresh( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/WriteVectorsForm.cpp0000644012702201742730000001715311274636606020455 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "WriteVectorsForm.h" #include "AnalysisWindow.h" #include "ChooseFilePanel.h" #include "EVariableError.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "CMD_write.h" BEGIN_EVENT_TABLE( WriteVectorsForm, wxFrame ) EVT_BUTTON( wxID_APPLY, WriteVectorsForm::OnApply ) EVT_BUTTON( wxID_CLOSE, WriteVectorsForm::OnClose ) EVT_BUTTON( wxID_REFRESH, WriteVectorsForm::OnRefresh ) EVT_CLOSE( WriteVectorsForm::CloseEventHandler ) END_EVENT_TABLE() WriteVectorsForm::WriteVectorsForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Write vectors"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, false, wxT("Choose a data file for writing"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); variableList_ = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_MULTIPLE|wxLB_EXTENDED|wxLB_NEEDED_SB ); FillList(); mainSizer->Add( variableList_, wxSizerFlags(1).Expand().Border(wxALL,5) ); append_ = new wxCheckBox( this, wxID_ANY, wxT("Append data to the file") ); mainSizer->Add( append_, wxSizerFlags(0).Border(wxALL,5) ); append_->SetValue( false ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *refreshButton = new wxButton( bottomPanel, wxID_REFRESH, wxT("Refresh") ); refreshButton->SetToolTip( wxT("update the list of vectors above") ); bottomSizer->Add( refreshButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("write data to the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/WriteVectorsForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/WriteVectorsForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/WriteVectorsForm/WIDTH"), 550l ); int height = config->Read( wxT("/WriteVectorsForm/HEIGHT"), 300l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/WriteVectorsForm") ); Show( true ); } void WriteVectorsForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/WriteVectorsForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/WriteVectorsForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/WriteVectorsForm/WIDTH"), static_cast(width) ); config->Write( wxT("/WriteVectorsForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/WriteVectorsForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroWriteVectors(); Destroy(); } void WriteVectorsForm::OnRefresh( wxCommandEvent &WXUNUSED(event) ) { FillList(); } void WriteVectorsForm::FillList() { variableList_->Clear(); NVariableTable *nvTable = NVariableTable::GetTable(); int end = nvTable->Entries(); for( int i=0; iGetEntry( i ); if( nv->GetData().GetNumberOfDimensions() == 1 )variableList_->Append( nv->GetName() ); } } void WriteVectorsForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was written"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_write *writeCommand = CMD_write::Instance(); writeCommand->SetFilename( fileName ); std::ofstream *outStream = writeCommand->GetStream(); if( outStream->is_open() )outStream->close(); outStream->clear( std::ios::goodbit ); if( append_->IsChecked() )outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out|std::ios::app ); else outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out ); if( !outStream->is_open() ) { outStream->clear( std::ios::goodbit ); wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::vector names; std::vector< std::vector > data; std::vector d; std::vector nd1; int count = variableList_->GetCount(); for( int i=0; iIsChecked(i) )continue; int ndm; double value; int dimSizes[3]; std::vector().swap( d ); wxString name( variableList_->GetString(i) ); try { NumericVariable::GetVariable( name, ndm, value, d, dimSizes ); } catch( EVariableError const &e ) { outStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } names.push_back( name ); data.push_back( d ); nd1.push_back( dimSizes[0] ); } if( names.empty() ) { outStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("no vectors were chosen"), wxT("Warning: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::vector mm( names.size(), 0 ); for( ;; ) { std::vector().swap( d ); std::size_t end = names.size(); for( std::size_t i=0; iclose(); } void WriteVectorsForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/WriteTextForm.h0000644012702201742730000000257311274636606017421 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_WRITETEXTFORM #define EXTREMA_WRITETEXTFORM #include "wx/wx.h" #include "wx/checklst.h" class AnalysisWindow; class ChooseFilePanel; class WriteTextForm : public wxFrame { public: WriteTextForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void OnRefresh( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxCheckListBox *variableList_; wxCheckBox *append_; void FillList(); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/AnalysisMessagePanel.cpp0000644012702201742730000000676411274636606021247 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/fontutil.h" #include "AnalysisMessagePanel.h" #include "AnalysisWindow.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them BEGIN_EVENT_TABLE( AnalysisMessagePanel, wxPanel ) END_EVENT_TABLE() AnalysisMessagePanel::AnalysisMessagePanel( AnalysisWindow *parent ) : wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize) { // this panel will expand both horizontally and vertically // wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( new wxStaticText(this,-1,wxT("Messages (output field):")), wxSizerFlags(0).Border(wxTOP,10) ); cmndHistoryWindow_= new CommandHistoryWindow( this ); sizer->Add( cmndHistoryWindow_, wxSizerFlags(1).Align(0).Expand().Border(wxALL,1) ); SetSizer( sizer ); } void AnalysisMessagePanel::WriteOutput( wxString const &s ) { cmndHistoryWindow_->WriteOutput(s); } void AnalysisMessagePanel::ClearOutput() { cmndHistoryWindow_->Clear(); } wxString AnalysisMessagePanel::GetValue() { return cmndHistoryWindow_->GetValue(); } //---------------------------------------------------------------------------------------- BEGIN_EVENT_TABLE( CommandHistoryWindow, wxTextCtrl ) EVT_RIGHT_DOWN( CommandHistoryWindow::OnMouseRightDown ) END_EVENT_TABLE() CommandHistoryWindow::CommandHistoryWindow( AnalysisMessagePanel *amp ) : wxTextCtrl( amp, ID_commandHistory, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL ) { SetToolTip( wxT("command history and message window\nright click to save to a file\nCTRL^C to copy selected to clipboard\nCTRL^A to select all") ); wxTextAttr ta( GetDefaultStyle() ); wxFont f( 10, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ); ta.SetFont( f ); SetDefaultStyle( ta ); } void CommandHistoryWindow::WriteOutput( wxString const &s ) { (*this) << s << wxT('\n'); } void CommandHistoryWindow::OnMouseRightDown( wxMouseEvent &event ) { event.Skip(); wxFileDialog *fd; std::ios_base::openmode mode; fd = new wxFileDialog( this, wxT("Save command history"), wxT(""), wxT(""), wxT("Text files (*.txt)|*.txt|Any file (*.*)|*.*"), wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); mode = std::ios_base::out; wxString filename; if( fd->ShowModal() == wxID_OK )filename = fd->GetPath(); if( filename.empty() )return; std::ofstream f( filename.mb_str(wxConvUTF8), mode ); if( !f.is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString()<ShowModal(); return; } f << GetValue().mb_str(wxConvUTF8); f.close(); } // end of file extrema-4.4.5/src/wxForms/AnalysisMessagePanel.h0000644012702201742730000000317511274636606020705 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_ANALYSIS_MESSAGE_PANEL #define EXTREMA_ANALYSIS_MESSAGE_PANEL #include "wx/wx.h" // The AnalysisWindow is the main extrema window. It contains the command history // and message text control and the command input text control, as well as various // menus and speed buttons. class AnalysisWindow; class CommandHistoryWindow; class AnalysisMessagePanel : public wxPanel { public: AnalysisMessagePanel( AnalysisWindow * ); void WriteOutput( wxString const & ); void ClearOutput(); wxString GetValue(); private: void OnMouseLeftDown( wxMouseEvent & ); CommandHistoryWindow *cmndHistoryWindow_; DECLARE_EVENT_TABLE() }; class CommandHistoryWindow : public wxTextCtrl { public: CommandHistoryWindow( AnalysisMessagePanel * ); void WriteOutput( wxString const & ); private: void OnMouseRightDown( wxMouseEvent & ); enum { ID_commandHistory, }; DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/InquireDialog.h0000644012702201742730000000231411274636606017363 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_INQUIRE_DIALOG #define EXTREMA_INQUIRE_DIALOG #include "wx/wx.h" class InquireDialog : public wxDialog { public: InquireDialog(); void SetLabel( wxString const & ); // event handlers void OnOK( wxCommandEvent & ); void OnStopAll( wxCommandEvent& ); void CloseEventHandler( wxCloseEvent & ); private: wxStaticText *messageCtrl_; wxTextCtrl *textCtrl_; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/WriteScalarsForm.h0000644012702201742730000000260711274636606020063 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_WRITESCALARSFORM #define EXTREMA_WRITESCALARSFORM #include "wx/wx.h" #include "wx/checklst.h" class AnalysisWindow; class ChooseFilePanel; class WriteScalarsForm : public wxFrame { public: WriteScalarsForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void OnRefresh( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxCheckListBox *variableList_; wxCheckBox *append_; void FillList(); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/TextPopup.cpp0000644012702201742730000002304711274636606017140 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "TextPopup.h" #include "GraphicsPage.h" #include "GRA_window.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "ExGlobals.h" #include "GRA_setOfCharacteristics.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "BasicColors.h" #include "EGraphicsError.h" #include "GRA_drawableText.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( TextPopup, wxFrame ) EVT_COMBOBOX( ID_font, TextPopup::OnFont ) EVT_TEXT_ENTER( ID_string, TextPopup::OnStringEnter ) EVT_BUTTON( wxID_CLOSE, TextPopup::OnClose ) EVT_CLOSE( TextPopup::CloseEventHandler ) END_EVENT_TABLE() TextPopup::TextPopup( GraphicsPage *parent ) : wxFrame(parent,wxID_ANY,wxT("Text Popup"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), page_(parent) { setup_ = true; CreateForm(); // wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/TextPopup/UPPERLEFTX"), 950l ); int uly = config->Read( wxT("/TextPopup/UPPERLEFTY"), 150l ); int width = config->Read( wxT("/TextPopup/WIDTH"), 270l ); int height = config->Read( wxT("/TextPopup/HEIGHT"), 285l ); SetSize( ulx, uly, width, height ); Show( true ); // Layout(); } void TextPopup::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); wxPanel *sPanel = new wxPanel( this ); wxBoxSizer *sSizer = new wxBoxSizer( wxVERTICAL ); sPanel->SetSizer( sSizer ); mainSizer->Add( sPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); sSizer->Add( new wxStaticText(sPanel,wxID_ANY,wxT("String")), wxSizerFlags(0).Left().Border(wxTOP,2) ); stringTC_ = new wxTextCtrl( sPanel, ID_string, wxT(""), wxDefaultPosition, wxSize(250,25), wxTE_LEFT|wxTE_PROCESS_ENTER ); stringTC_->SetToolTip( wxT("enter the new text string (hit Enter key to accept string)") ); sSizer->Add( stringTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); // wxPanel *topPanel = new wxPanel( this ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); // color_ = new ExColorCtrl( topPanel, wxT("Color"), this, &TextPopup::OnColor ); color_->SetToolTip( wxT("change the text color") ); topSizer->Add( color_, wxSizerFlags(0).Left().Border(wxALL,2) ); // heightSC_ = new ExSpinCtrlD( topPanel, wxT("Height (%)"), this, &TextPopup::OnHeight ); heightSC_->SetToolTip( wxT("set the text height (as a % of the window)") ); topSizer->Add( heightSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); // angleSC_ = new ExSpinCtrlI( topPanel, wxT("Angle (degrees)"), 0, 360, this, &TextPopup::OnAngle ); angleSC_->SetToolTip( wxT("set the text angle (0 to 360 degrees)") ); topSizer->Add( angleSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *fPanel = new wxPanel( this ); wxBoxSizer *fSizer = new wxBoxSizer( wxVERTICAL ); fPanel->SetSizer( fSizer ); mainSizer->Add( fPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); // fSizer->Add( new wxStaticText(fPanel,wxID_ANY,wxT("Font")), wxSizerFlags(0).Left().Border(wxTOP,2) ); int nf = GRA_fontControl::GetCount(); wxString choices[nf]; for( int i=0; iGetFontName(); fontCB_ = new wxComboBox( fPanel, ID_font, wxT(""), wxDefaultPosition, wxSize(200,25), nf, choices, wxCB_READONLY ); fontCB_->SetToolTip( wxT("choose the text font") ); fSizer->Add( fontCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *botPanel = new wxPanel( this ); wxBoxSizer *botSizer = new wxBoxSizer( wxHORIZONTAL ); botPanel->SetSizer( botSizer ); mainSizer->Add( botPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); xLocSC_ = new ExSpinCtrlD( botPanel, wxT("X-location (%)"), this, &TextPopup::OnXLocation ); xLocSC_->SetToolTip( wxT("set the text x location (as a % of the window)") ); botSizer->Add( xLocSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); // yLocSC_ = new ExSpinCtrlD( botPanel, wxT("Y-location (%)"), this, &TextPopup::OnYLocation ); yLocSC_->SetToolTip( wxT("set the text y location (as a % of the window)") ); botSizer->Add( yLocSC_, wxSizerFlags(0).Left().Border(wxALL,2) ); // closeBTN_ = new wxButton( this, wxID_CLOSE, wxT("Close") ); mainSizer->Add( closeBTN_, wxSizerFlags(0).Center().Border(wxALL,2) ); } void TextPopup::Setup( GRA_window *window, GRA_drawableText *dt ) { setup_ = true; window_ = window; drawableText_ = dt; drawableText_->SetPopup(); textChars_ = window_->GetTextCharacteristics(); stringTC_->SetValue( drawableText_->GetString() ); fontCB_->SetValue( drawableText_->GetFont()->GetFontName() ); color_->SetColor( drawableText_->GetColor() ); double heightW = drawableText_->GetHeight(); double height, dummy; window_->WorldToPercent( 0.0, heightW, dummy, height ); heightSC_->SetValue( height ); angleSC_->SetValue( static_cast(drawableText_->GetAngle()) ); double xlocW = drawableText_->GetX(); double ylocW = drawableText_->GetY(); double xloc, yloc; window_->WorldToPercent( xlocW, ylocW, xloc, yloc ); xLocSC_->SetValue( xloc ); yLocSC_->SetValue( yloc ); setup_ = false; } void TextPopup::OnColor( GRA_color *color ) { if( setup_ || !drawableText_ )return; static_cast(textChars_->Get(wxT("COLOR")))->Set( color ); drawableText_->SetColor( color ); ReDraw(); } void TextPopup::OnHeight( double height ) { if( setup_ || !drawableText_ )return; static_cast(textChars_->Get(wxT("HEIGHT")))->SetAsPercent( height ); drawableText_->SetHeight( static_cast(textChars_->Get(wxT("HEIGHT")))->GetAsWorld() ); ReDraw(); } void TextPopup::OnAngle( int angle ) { if( setup_ || !drawableText_ )return; static_cast(textChars_->Get(wxT("ANGLE")))->Set( angle ); drawableText_->SetAngle( angle ); ReDraw(); } void TextPopup::OnXLocation( double loc ) { if( setup_ || !drawableText_ )return; static_cast(textChars_->Get(wxT("XLOCATION")))->SetAsPercent( loc ); drawableText_->SetX( static_cast(textChars_->Get(wxT("XLOCATION")))->GetAsWorld() ); ReDraw(); } void TextPopup::OnYLocation( double loc ) { if( setup_ || !drawableText_ )return; static_cast(textChars_->Get(wxT("YLOCATION")))->SetAsPercent( loc ); drawableText_->SetY( static_cast(textChars_->Get(wxT("YLOCATION")))->GetAsWorld() ); ReDraw(); } void TextPopup::OnStringEnter( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !drawableText_ )return; drawableText_->SetString( stringTC_->GetValue() ); ReDraw(); } void TextPopup::OnFont( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !drawableText_ )return; static_cast(textChars_->Get(wxT("FONT")))->Set( GRA_fontControl::GetFont(fontCB_->GetValue())); drawableText_->SetFont( static_cast(textChars_->Get(wxT("FONT")))->Get() ); ReDraw(); } void TextPopup::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/TextPopup/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/TextPopup/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/TextPopup/WIDTH"), static_cast(width) ); config->Write( wxT("/TextPopup/HEIGHT"), static_cast(height) ); } if( drawableText_ )drawableText_->Disconnect(); // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ Destroy(); ExGlobals::ZeroTextPopup(); } void TextPopup::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void TextPopup::Disconnect() { drawableText_ = 0; } void TextPopup::ReDraw() { if( setup_ || !drawableText_ )return; try { drawableText_->Parse(); page_->SetGraphWindow( window_ ); page_->ReplotCurrentWindow( true ); } catch ( EGraphicsError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } // end of file extrema-4.4.5/src/wxForms/PeakFindForm.cpp0000644012702201742730000004414111274636606017473 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "PeakFindForm.h" #include "VisualizationWindow.h" #include "GRA_arrow3.h" #include "GRA_cartesianCurve.h" #include "GRA_window.h" #include "NumericVariable.h" #include "EVariableError.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "GRA_setOfCharacteristics.h" #include "GRA_doubleCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_colorControl.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( PeakFindForm, wxFrame ) EVT_BUTTON( ID_save, PeakFindForm::OnSave ) EVT_BUTTON( ID_left, PeakFindForm::OnLeft ) EVT_BUTTON( ID_right, PeakFindForm::OnRight ) EVT_BUTTON( ID_initialize, PeakFindForm::OnInitialize ) EVT_BUTTON( wxID_CLOSE, PeakFindForm::OnClose ) EVT_CLOSE( PeakFindForm::CloseEventHandler ) END_EVENT_TABLE() // : wxFrame(parent,wxID_ANY,wxT("Peak Finding"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), PeakFindForm::PeakFindForm( VisualizationWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Peak Finding")), visualizationWindow_(parent) { wxString imageDir = ExGlobals::GetImagePath(); wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 2 ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topTopPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topTopSizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *leftButton = new wxBitmapButton( topTopPanel, ID_left, wxBitmap(imageDir+wxT("/leftArrow.GIF"),wxBITMAP_TYPE_GIF) ); leftButton->SetToolTip( wxT("scan to the left for peaks") ); topTopSizer->Add( leftButton, wxSizerFlags(0).Border(wxTOP,15) ); topTopSizer->InsertSpacer( 1, 10 ); wxBitmapButton *rightButton = new wxBitmapButton( topTopPanel, ID_right, wxBitmap(imageDir+wxT("/rightArrow.GIF"),wxBITMAP_TYPE_GIF) ); rightButton->SetToolTip( wxT("scan to the right for peaks") ); topTopSizer->Add( rightButton, wxSizerFlags(0).Border(wxTOP,15) ); topTopSizer->InsertSpacer( 3, 10 ); wxString maxMinArray[] = { wxT("Maxima"), wxT("Minima") }; wxArrayString maxMin( 2, maxMinArray ); maxMinRB_ = new wxRadioBox( topTopPanel, wxID_ANY, wxT("Search for"), wxDefaultPosition, wxDefaultSize, maxMin, 2, wxRA_SPECIFY_COLS ); maxMinRB_->SetSelection( 0 ); topTopSizer->Add( maxMinRB_, wxSizerFlags(0).Border(wxALL,5) ); topTopPanel->SetSizer( topTopSizer ); topSizer->Add( topTopPanel, wxSizerFlags(0).Border(wxALL,10) ); wxPanel *midTopPanel = new wxPanel( topPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *midTopSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *midTopLeftPanel = new wxPanel( midTopPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *midTopLeftSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *pxPanel = new wxPanel( midTopLeftPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *pxSizer = new wxBoxSizer( wxHORIZONTAL ); pxSizer->Add( new wxStaticText(pxPanel,wxID_ANY,wxT("Peak x-coordinate"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ), wxSizerFlags(0).Right().Border(wxTOP,10) ); pxTC_ = new wxTextCtrl( pxPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); pxTC_->SetValue( wxT("") ); pxSizer->Add( pxTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); pxPanel->SetSizer( pxSizer ); midTopLeftSizer->Add( pxPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *pyPanel = new wxPanel( midTopLeftPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *pySizer = new wxBoxSizer( wxHORIZONTAL ); pySizer->Add( new wxStaticText(pyPanel,wxID_ANY,wxT("Peak y-coordinate"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ), wxSizerFlags(0).Right().Border(wxTOP,10) ); pyTC_ = new wxTextCtrl( pyPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); pyTC_->SetValue( wxT("") ); pySizer->Add( pyTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); pyPanel->SetSizer( pySizer ); midTopLeftSizer->Add( pyPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); midTopLeftPanel->SetSizer( midTopLeftSizer ); midTopSizer->Add( midTopLeftPanel, wxSizerFlags(0).Left().Border(wxALL,2) ); wxButton *saveButton = new wxButton( midTopPanel, ID_save, wxT("Save"), wxDefaultPosition, wxSize(50,60) ); saveButton->SetToolTip( wxT("save the currently chosen peak's coordinates to vectors PEAK$X and PEAK$Y") ); midTopSizer->Add( saveButton, wxSizerFlags(0).Border(wxALL,10) ); midTopPanel->SetSizer( midTopSizer ); topSizer->Add( midTopPanel, wxSizerFlags(0).Centre().Border(wxALL,2) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *initializeButton = new wxButton( bottomPanel, ID_initialize, wxT("Initialize") ); initializeButton->SetToolTip( wxT("start again with the latest curve drawn") ); bottomSizer->Add( initializeButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form and create PEAK$X and PEAK$Y if non-empty") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/PeakFindForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/PeakFindForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/PeakFindForm/WIDTH"), 300l ); int height = config->Read( wxT("/PeakFindForm/HEIGHT"), 215l ); SetSize( ulx, uly, width, height ); Show( true ); Initialize(); } void PeakFindForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { EraseLastArrow(); wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/PeakFindForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/PeakFindForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/PeakFindForm/WIDTH"), static_cast(width) ); config->Write( wxT("/PeakFindForm/HEIGHT"), static_cast(height) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ visualizationWindow_->ZeroPeakFindForm(); Destroy(); } void PeakFindForm::OnInitialize( wxCommandEvent &WXUNUSED(event) ) { EraseLastArrow(); xData_.clear(); yData_.clear(); Initialize(); } void PeakFindForm::Initialize() { first_ = true; currentArrow_ = 0; GRA_window *gw = ExGlobals::GetGraphWindow(); std::vector objs( gw->GetDrawableObjects() ); curve_ = 0; int size = objs.size(); for( int i=size-1; i>=0; --i ) { if( objs[i]->IsaCartesianCurve() ) { curve_ = static_cast(objs[i]); break; } } if( curve_ ) { xData_.assign( curve_->GetXData().begin(), curve_->GetXData().end() ); yData_.assign( curve_->GetYData().begin(), curve_->GetYData().end() ); npts_ = xData_.size(); // GRA_setOfCharacteristics *xaxis = gw->GetXAxisCharacteristics(); xLogBase_ = static_cast(xaxis->Get(wxT("LOGBASE")))->Get(); xMin_ = static_cast(xaxis->Get(wxT("MIN")))->Get(); xMax_ = static_cast(xaxis->Get(wxT("MAX")))->Get(); GRA_setOfCharacteristics *yaxis = gw->GetYAxisCharacteristics(); double ylaxis = static_cast(yaxis->Get(wxT("LOWERAXIS")))->GetAsWorld(); double yuaxis = static_cast(yaxis->Get(wxT("UPPERAXIS")))->GetAsWorld(); yLogBase_ = static_cast(yaxis->Get(wxT("LOGBASE")))->Get(); yMin_ = static_cast(yaxis->Get(wxT("MIN")))->Get(); yMax_ = static_cast(yaxis->Get(wxT("MAX")))->Get(); arrowLength_ = 0.05*(yuaxis-ylaxis); yRange_ = fabs( yMax_-yMin_ ); } } void PeakFindForm::EraseLastArrow() { if( currentArrow_ ) { wxClientDC dc( ExGlobals::GetwxWindow() ); currentArrow_->SetLineColor( GRA_colorControl::GetColor(wxT("WHITE")) ); currentArrow_->Draw( ExGlobals::GetGraphicsOutput(), dc ); delete currentArrow_; currentArrow_ = 0; } } void PeakFindForm::DrawArrow() { if( currentArrow_ ) { wxClientDC dc( ExGlobals::GetwxWindow() ); currentArrow_->SetLineColor( GRA_colorControl::GetColor(wxT("RED")) ); currentArrow_->Draw( ExGlobals::GetGraphicsOutput(), dc ); } } void PeakFindForm::OnSave( wxCommandEvent &WXUNUSED(event) ) { xVec_.push_back( xLogBase_>1.0 ? pow(xLogBase_,xCurrent_) : xCurrent_ ); yVec_.push_back( yLogBase_>1.0 ? pow(yLogBase_,yCurrent_) : yCurrent_ ); } void PeakFindForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { if( !xVec_.empty() ) { try { wxString name; name = wxT("PEAK$X"); NumericVariable::PutVariable( name, xVec_, 0, wxT("from PEAK FIND gui") ); name = wxT("PEAK$Y"); NumericVariable::PutVariable( name, yVec_, 0, wxT("from PEAK FIND gui") ); } catch ( EVariableError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } Close(); } void PeakFindForm::OnLeft( wxCommandEvent &WXUNUSED(event) ) { if( !curve_ ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("There is no curve drawn in the current window"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } EraseLastArrow(); if( first_ ) { xCurrent_ = xMin_; yCurrent_ = yMin_; first_ = false; } double xLo = xCurrent_ - 0.002*(xMax_-xMin_); double xHi = xCurrent_ + 0.002*(xMax_-xMin_); if( xLogBase_ > 1.0 ) { xHi = pow(xLogBase_,xHi); xLo = pow(xLogBase_,xLo); } int searchType = maxMinRB_->GetSelection()==0 ? 1 : -1; // // Find the next peak (or minimum) to the left. Assume that the plotted // x-coordinates are monotonically increasing. // // The following section codes the "tolerance" peak-finding algorithm. // Basically, this finds the maximum (or minimum) value of the curve // between consecutive crossings of the line Y=YTOL, which is set to // a y-value that is sufficiently large (or small) to avoid finding // extraneous peaks. // int nj =0, icr =0, dcr =0; bool peakFound = false; for( int j=npts_-1; j>=0; --j ) { if( xData_[j] <= xHi ) { if( ++nj > 1 ) { double s = UsefulFunctions::Sign( 1.0001, yData_[j]-yData_[j+1] ); s > 0 ? icr=j+1 : dcr=j+1; // s>0 -> increasing y, s<0 -> decreasing values } } // Check whether an extremum has been located. This is done by finding an increasing // crossing of the yTolerance value eventually followed by a decreasing crossing for // a maximum, or vice-versa for a minimum. The desired extremum lies between these // two intervals, and is found by selecting the extreme value, maximum or minimum, // over this region. icr and dcr refer to the j-indices of increasing and decreasing // crossing respectively, and are initialized to zero. // if( dcr*icr == 0 )continue; // // The y=yTolerance crossings bounding the extremum have been found. // Check whether these are consistent with the type of extremum // (maximum or minimum) desired. // if( UsefulFunctions::Sign(1,icr-dcr) != searchType )continue; // // Loop over the points between these crossings and locate the extreme value // if( searchType == 1 ) // maximum sought { double ycmax = yData_[icr-1]; jPeak_ = icr; for( int k=icr; k>=dcr+1; --k ) { if( yData_[k-1] > ycmax ) { ycmax = yData_[k-1]; jPeak_ = k; } } peakFound = true; break; } else // minimum sought { double ycmin = yData_[dcr-1]; jPeak_ = dcr; for( int k=dcr; k>=icr+1; --k ) { if( yData_[k-1] < ycmin ) { ycmin = yData_[k-1]; jPeak_ = k; } } peakFound = true; break; } } if( !peakFound ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no peak found"), wxT("Info"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // Found a peak at index jPeak_-1 // xCurrent_ = xData_[jPeak_-1]; yCurrent_ = yData_[jPeak_-1]; // ShowValues(); } void PeakFindForm::OnRight( wxCommandEvent &WXUNUSED(event) ) { if( !curve_ ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("There is no curve drawn in the current window"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } EraseLastArrow(); if( first_ ) { xCurrent_ = xMin_; yCurrent_ = yMin_; first_ = false; } double xLo = xCurrent_ - 0.002*(xMax_-xMin_); double xHi = xCurrent_ + 0.002*(xMax_-xMin_); if( xLogBase_ > 1.0 ) { xHi = pow(xLogBase_,xHi); xLo = pow(xLogBase_,xLo); } int searchType = maxMinRB_->GetSelection()==0 ? 1 : -1; // // Find the next peak (or minimum) to the left. Assume that the plotted // x-coordinates are monotonically increasing. // // The following section codes the "tolerance" peak-finding algorithm. // Basically, this finds the maximum (or minimum) value of the curve // between consecutive crossings of the line Y=YTOL, which is set to // a y-value that is sufficiently large (or small) to avoid finding // extraneous peaks. // int nj =0, icr =0, dcr =0; bool peakFound = false; for( int j=0; j= xLo ) { if( ++nj > 1 ) { double s = UsefulFunctions::Sign( 1.0001, yData_[j]-yData_[j-1] ); s > 0 ? icr=j+1 : dcr=j+1; // s>0 -> increasing y, s<0 -> decreasing values } } // Check whether an extremum has been located. This is done by finding an increasing // crossing of the yTolerance value eventually followed by a decreasing crossing for // a maximum, or vice-versa for a minimum. The desired extremum lies between these // two intervals, and is found by selecting the extreme value, maximum or minimum, // over this region. icr and dcr refer to the j-indices of increasing and decreasing // crossing respectively, and are initialized to zero. // if( dcr*icr == 0 )continue; // // The y=yTolerance crossings bounding the extremum have been found. // Check whether these are consistent with the type of extremum // (maximum or minimum) desired. // if( UsefulFunctions::Sign(1,dcr-icr) != searchType )continue; // // Loop over the points between these crossings and locate the extreme value // if( searchType == 1 ) // maximum sought { double ycmax = yData_[icr-1]; jPeak_ = icr; for( int k=icr; k<=dcr-1; ++k ) { if( yData_[k-1] > ycmax ) { ycmax = yData_[k-1]; jPeak_ = k; } } peakFound = true; break; } else // minimum sought { double ycmin = yData_[dcr-1]; jPeak_ = dcr; for( int k=dcr; k<=icr-1; ++k ) { if( yData_[k-1] < ycmin ) { ycmin = yData_[k-1]; jPeak_ = k; } } peakFound = true; break; } } if( !peakFound ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no peak found"), wxT("Info"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // Found a peak at index jPeak_-1 // xCurrent_ = xData_[jPeak_-1]; yCurrent_ = yData_[jPeak_-1]; // ShowValues(); } void PeakFindForm::ShowValues() { pxTC_->SetValue( wxString()<SetValue( wxString()<GraphToWorld( xCurrent_, yCurrent_, xw, yw, true ); if( xLogBase_ > 1.0 )xCurrent_ = log(xCurrent_)/log(xLogBase_); if( yLogBase_ > 1.0 )yCurrent_ = log(yCurrent_)/log(yLogBase_); if( xMin_<=xCurrent_ && xCurrent_<=xMax_ ) { EraseLastArrow(); if( maxMinRB_->GetSelection() == 0 ) // maxima currentArrow_ = new GRA_arrow3(xw,yw,xw,yw+arrowLength_,false); else currentArrow_ = new GRA_arrow3(xw,yw,xw,yw-arrowLength_,false); DrawArrow(); } else { wxMessageDialog *md = new wxMessageDialog( this, wxT("extremum found outside plot range"), wxT("Info"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } // end of file extrema-4.4.5/src/wxForms/FigureForm.h0000644012702201742730000000530511332453023016660 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #ifndef EXTREMA_FIGUREFORM #define EXTREMA_FIGUREFORM #include "wx/wx.h" #include "ExSpinCtrlI.h" #include "ExColorCtrl.h" class VisualizationWindow; class GRA_color; class FigureForm : public wxFrame { public: FigureForm( VisualizationWindow * ); private: void CreateForm(); void FillOutForm( int, int, bool, bool, int, int, int ); void OnArrow1( wxCommandEvent & ); void OnArrow2( wxCommandEvent & ); void OnArrow3( wxCommandEvent & ); void OnRectangle( wxCommandEvent & ); void OnRegular( wxCommandEvent & ); void OnStar( wxCommandEvent & ); void OnDrawArrow( wxCommandEvent & ); void OnEraseArrow( wxCommandEvent & ); void OnTwoHeads( wxCommandEvent & ); void OnCircle( wxCommandEvent & ); void OnPolygonAngle( int ); void OnPolygonVertices( int ); void OnDrawPolygon( wxCommandEvent & ); void OnErasePolygon( wxCommandEvent & ); void OnDrawEllipse( wxCommandEvent & ); void OnEraseEllipse( wxCommandEvent & ); void OnLineThickness( int ); void OnLineColor( GRA_color * ); void OnFillColor( GRA_color * ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); wxBitmapButton *arrow1_, *arrow2_, *arrow3_, *rectangle_, *regular_, *star_; wxCheckBox *twoHeadsCheckBox_, *makeCircleCheckBox_; ExSpinCtrlI *lineThicknessSC_, *polygonAngleSC_, *polygonVerticesSC_; ExColorCtrl *lineColorCC_, *fillColorCC_; VisualizationWindow *visualizationWindow_; int arrowType_, polygonType_, polygonVertices_; double polygonAngle_; enum { ID_arrow1, ID_arrow2, ID_arrow3, ID_rectangle, ID_regular, ID_star, ID_twoHeads, ID_circle, ID_angle, ID_vertices, ID_drawArrow, ID_eraseArrow, ID_drawPolygon, ID_erasePolygon, ID_drawEllipse, ID_eraseEllipse, ID_linethickness, ID_linecolor, ID_fillcolor }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/GraphicsPage.cpp0000644012702201742730000006704111440747170017521 0ustar spangspang/* Copyright (C) 2007...2010 Joseph L. Chuma 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. */ #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 3 || \ (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ >= 0))) #include #else #include #endif #include #include "GraphicsPage.h" #include "EGraphicsError.h" #include "ExGlobals.h" #include "GRA_color.h" #include "GRA_window.h" #include "GRA_drawableObject.h" #include "GRA_drawableText.h" #include "VisualizationWindow.h" #include "GRA_wxWidgets.h" #include "GRA_arrow1.h" #include "GRA_arrow2.h" #include "GRA_arrow3.h" #include "GRA_polygon.h" #include "GRA_ellipse.h" #include "GRA_rectangle.h" #include "GRA_star5pt.h" #include "GRA_setOfCharacteristics.h" #include "GRA_colorCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_postscript.h" #include "GRA_point.h" #include "GRA_polyline.h" #include "GRA_plotSymbol.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "GRA_legend.h" #include "GRA_contourLine.h" #include "GRA_boxPlot.h" #include "GRA_diffusionPlot.h" #include "GRA_ditheringPlot.h" #include "GRA_gradientPlot.h" #include "GRA_polarAxes.h" #include "GRA_polarCurve.h" #include "GRA_axis.h" #include "AxisPopup.h" #include "CurvePopup.h" #include "TextPopup.h" #include "LegendPopup.h" #include "GRA_stringCharacteristic.h" #include "GRA_bitmap.h" #include "GRA_colorControl.h" BEGIN_EVENT_TABLE( GraphicsPage, wxNotebookPage ) EVT_PAINT( GraphicsPage::OnPaint ) EVT_LEFT_DOWN( GraphicsPage::OnMouseLeftDown ) EVT_RIGHT_DOWN( GraphicsPage::OnMouseRightDown ) EVT_MOTION( GraphicsPage::OnMouseMove ) END_EVENT_TABLE() GraphicsPage::GraphicsPage( wxNotebook *nb ) : wxNotebookPage(nb,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxRAISED_BORDER) { int pageCount = nb->GetPageCount(); nb->AddPage( this, wxString()<currentWindowNumber_ << "\">\n"; for( std::size_t i=0; igraphWindows_.size(); ++i )out << *gp->graphWindows_[i]; return out << "\n"; } void GraphicsPage::DeleteGraphWindows() { while( !graphWindows_.empty() ) { delete graphWindows_.back(); graphWindows_.pop_back(); } } void GraphicsPage::Paint() { wxPaintDC dc( this ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); DrawGraphWindows( ExGlobals::GetGraphicsOutput(), dc ); } void GraphicsPage::OnPaint( wxPaintEvent &event ) { Paint(); } void GraphicsPage::RefreshGraphics() { Refresh(); } void GraphicsPage::SetUpDefaultWindows() { while( !graphWindows_.empty() ) { delete graphWindows_.back(); graphWindows_.pop_back(); } currentWindowNumber_ = 0; graphWindows_.push_back( new GRA_window( 0, 0.0, 0.0, 100.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 1, 0.0, 0.0, 50.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 2, 50.0, 0.0, 100.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 3, 0.0, 50.0, 100.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 4, 0.0, 0.0, 100.0, 50.0 ) ); graphWindows_.push_back( new GRA_window( 5, 0.0, 50.0, 50.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 6, 0.0, 0.0, 50.0, 50.0 ) ); graphWindows_.push_back( new GRA_window( 7, 50.0, 50.0, 100.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 8, 50.0, 0.0, 100.0, 50.0 ) ); graphWindows_.push_back( new GRA_window( 9, 10.0, 10.0, 90.0, 90.0 ) ); graphWindows_.push_back( new GRA_window( 10, 25.0, 50.0, 75.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 11, 25.0, 0.0, 75.0, 50.0 ) ); graphWindows_.push_back( new GRA_window( 12, 0.0, 75.0, 50.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 13, 50.0, 75.0, 100.0, 100.0 ) ); graphWindows_.push_back( new GRA_window( 14, 0.0, 50.0, 50.0, 75.0 ) ); graphWindows_.push_back( new GRA_window( 15, 50.0, 50.0, 100.0, 75.0 ) ); } //void GraphicsPage::Reset() //{} void GraphicsPage::InheritFrom( GraphicsPage const *inherit ) { DeleteGraphWindows(); int mWindows = inherit->graphWindows_.size(); for( int i=0; i(inherit)->GetGraphWindow(i); double xlo, ylo, xhi, yhi; window->GetDimensions( xlo, ylo, xhi, yhi ); graphWindows_.push_back( new GRA_window(i,xlo,ylo,xhi,yhi) ); graphWindows_.back()->InheritFrom( window ); } } void GraphicsPage::AddGraphWindow( GRA_window *gw ) { int n = gw->GetNumber(); int maxWindow = graphWindows_.size(); if( n >= maxWindow ) { int i = maxWindow-1; while( ++i < n )graphWindows_.push_back( new GRA_window(i) ); graphWindows_.push_back( gw ); } else { delete graphWindows_[n]; graphWindows_[n] = gw; } } void GraphicsPage::SetGraphWindow( GRA_window *gw ) { ExGlobals::GetVisualizationWindow()->SetPage( this ); currentWindowNumber_ = std::distance( graphWindows_.begin(), std::find(graphWindows_.begin(),graphWindows_.end(),gw) ); } GRA_window *GraphicsPage::GetGraphWindow() { return graphWindows_[currentWindowNumber_]; } GRA_window *GraphicsPage::GetGraphWindow( int n ) { GRA_window *gw = 0; if( n < static_cast(graphWindows_.size()) )gw = graphWindows_[n]; return gw; } GRA_window *GraphicsPage::GetGraphWindow( double x, double y ) { std::vector::const_iterator GWend = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=GWend; ++i ) if( (*i)->InsideWindow(x,y) )return *i; return 0; } void GraphicsPage::SetWindowNumber( int n ) { currentWindowNumber_ = n; } int GraphicsPage::GetWindowNumber() { return currentWindowNumber_; } int GraphicsPage::GetNumberOfWindows() { return static_cast(graphWindows_.size()); } std::vector &GraphicsPage::GetGraphWindows() { return graphWindows_; } void GraphicsPage::DrawGraphWindows( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { GRA_window *gw = graphWindows_[currentWindowNumber_]; try { std::vector::const_iterator end = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=end; ++i ) { SetGraphWindow( *i ); (*i)->Draw( graphicsOutput, dc ); } } catch ( EGraphicsError const &e ) { SetGraphWindow( gw ); throw; } SetGraphWindow( gw ); } void GraphicsPage::ResetWindows() { std::vector::const_iterator end = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=end; ++i ) (*i)->Reset(); } void GraphicsPage::EraseWindows() { // do not destroy any drawableObjects, just erase the window // std::vector::const_iterator gwEnd = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=gwEnd; ++i ) (*i)->Erase(); } void GraphicsPage::ClearWindows() { // destroy all drawableObjects in all graph windows on this page // std::vector::const_iterator gwEnd = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=gwEnd; ++i ) (*i)->Clear(); } void GraphicsPage::SetWindowsDefaults() { // reset defaults in all graph windows // std::vector::const_iterator gwEnd = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=gwEnd; ++i ) (*i)->SetDefaults(); } void GraphicsPage::DisplayBackgrounds( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { std::vector::const_iterator gwEnd = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=gwEnd; ++i ) (*i)->DisplayBackground( graphicsOutput, dc ); } void GraphicsPage::ReplotAllWindows() { std::size_t const nSave = currentWindowNumber_; std::size_t const size = graphWindows_.size(); try { for( std::size_t i=0; iGetDrawableObjects().empty() )return; graphWindows_[currentWindowNumber_]->Erase(); try { graphWindows_[currentWindowNumber_]->Replot(); } catch ( EGraphicsError const &e ) { throw; } if( repaint )Paint(); } void GraphicsPage::OnMouseLeftDown( wxMouseEvent &event ) { GRA_wxWidgets *graphicsOutput = ExGlobals::GetGraphicsOutput(); if( textToPlace_ ) { GRA_window *gw = graphWindows_[currentWindowNumber_]; long xl, yl; event.GetPosition( &xl, &yl ); double x, y; graphicsOutput->OutputTypeToWorld( static_cast(xl), static_cast(yl), x, y ); // wxClientDC dc( this ); //PrepareDC( dc ); // textToPlace_->SetX( x ); textToPlace_->SetY( y ); textToPlace_->Draw( graphicsOutput, dc ); gw->AddDrawableObject( textToPlace_ ); ExGlobals::HideHint(); if( ExGlobals::StackIsOn() ) { ExGlobals::WriteStack( wxString(wxT("SET TEXTALIGN "))+(wxString()<GetAlignment()) ); ExGlobals::WriteStack( wxString(wxT("SET XTEXTLOCATION "))+(wxString()<GetString()+wxT("'") ); ExGlobals::WriteStack( wxT("SET TEXTINTERACTIVE 1") ); } textToPlace_ = 0; ExGlobals::RestartScripts(); } else if( arrowPlacementMode_ || polygonPlacementMode_ || ellipsePlacementMode_ ) { if( firstPoint_ ) { firstPoint_ = false; long xl, yl; event.GetPosition( &xl, &yl ); graphicsOutput->OutputTypeToWorld( static_cast(xl), static_cast(yl), xw1_, yw1_ ); } else { firstPoint_ = true; if( arrowPlacementMode_ ) { arrowPlacementMode_ = false; wxClientDC dc( this ); dc.SetLogicalFunction( wxCOPY ); switch (arrowType_) { case 1: { currentArrow1_->Draw( graphicsOutput, dc ); GRA_arrow1 *a1 = new GRA_arrow1( *currentArrow1_ ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a1 ); delete currentArrow1_; currentArrow1_ = 0; break; } case 2: { currentArrow2_->Draw( graphicsOutput, dc ); GRA_arrow2 *a2 = new GRA_arrow2( *currentArrow2_ ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a2 ); delete currentArrow2_; currentArrow2_ = 0; break; } case 3: { currentArrow3_->Draw( graphicsOutput, dc ); GRA_arrow3 *a3 = new GRA_arrow3( *currentArrow3_ ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a3 ); delete currentArrow3_; currentArrow3_ = 0; break; } } } else if( polygonPlacementMode_ ) { polygonPlacementMode_ = false; wxClientDC dc( this ); dc.SetLogicalFunction( wxCOPY ); switch (polygonType_) { case 1: { currentRectangle_->Draw( graphicsOutput, dc ); GRA_rectangle *a1 = new GRA_rectangle( *static_cast(currentRectangle_) ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a1 ); delete currentRectangle_; currentRectangle_ = 0; break; } case 2: { currentRegularPolygon_->Draw( graphicsOutput, dc ); GRA_polygon *a2 = new GRA_polygon( *currentRegularPolygon_ ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a2 ); delete currentRegularPolygon_; currentRegularPolygon_ = 0; break; } case 3: { current5PtStar_->Draw( graphicsOutput, dc ); GRA_star5pt *a3 = new GRA_star5pt( *static_cast(current5PtStar_) ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a3 ); delete current5PtStar_; current5PtStar_ = 0; break; } } } else if( ellipsePlacementMode_ ) { ellipsePlacementMode_ = false; wxClientDC dc( this ); dc.SetLogicalFunction( wxCOPY ); currentEllipse_->Draw( graphicsOutput, dc ); GRA_ellipse *a1 = new GRA_ellipse( *currentEllipse_ ); graphWindows_[currentWindowNumber_]->AddDrawableObject( a1 ); delete currentEllipse_; currentEllipse_ = 0; } Refresh(); Update(); } } } void GraphicsPage::OnMouseRightDown( wxMouseEvent &event ) { long xl, yl; event.GetPosition( &xl, &yl ); double xW, yW; ExGlobals::GetGraphicsOutput()->OutputTypeToWorld( static_cast(xl), static_cast(yl), xW, yW ); // // loop over all GRA_window's on the page std::vector::const_iterator GWend = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=GWend; ++i ) { // loop over all drawable objects in each GRA_window std::vector::const_iterator DOend = (*i)->GetDrawableObjects().end(); for( std::vector::const_iterator j=(*i)->GetDrawableObjects().begin(); j!=DOend; ++j ) { if( (*j)->IsaCartesianAxes() ) { GRA_axis *x=0, *y=0, *boxX=0, *boxY=0; static_cast(*j)->GetAxes(x,y,boxX,boxY); if( x && x->Inside(xW,yW) ) { AxisPopup *axisPopup = ExGlobals::GetAxisPopup( this ); axisPopup->Setup( *i, 'X' ); return; } if( y && y->Inside(xW,yW) ) { AxisPopup *axisPopup = ExGlobals::GetAxisPopup( this ); axisPopup->Setup( *i, 'Y' ); return; } } else if( (*j)->IsaCartesianCurve() ) { GRA_cartesianCurve *cc = static_cast(*j); if( cc->Inside(xW,yW) ) { CurvePopup *curvePopup = ExGlobals::GetCurvePopup( this ); curvePopup->Setup( *i, cc ); return; } } else if( (*j)->IsaDrawableText() ) { GRA_drawableText *dt = static_cast(*j); if( dt->Inside(xW,yW) ) { TextPopup *textPopup = ExGlobals::GetTextPopup( this ); textPopup->Setup( *i, dt ); return; } } else if( (*j)->IsaGraphLegend() ) { GRA_legend *legend = static_cast(*j); if( legend->Inside(xW,yW) ) { LegendPopup *legendPopup = ExGlobals::GetLegendPopup( this ); legendPopup->Setup( *i, legend ); return; } } } } } void GraphicsPage::OnMouseMove( wxMouseEvent &event ) { GRA_wxWidgets *graphicsOutput = ExGlobals::GetGraphicsOutput(); MyStatusBar *statusBar = dynamic_cast(ExGlobals::GetVisualizationWindow()->GetStatusBar()); switch ( statusBar->GetUnitsType() ) { case 0: // graph units { double xw, yw, xg, yg; graphicsOutput->OutputTypeToWorld( (int)event.GetX(), (int)event.GetY(), xw, yw ); ExGlobals::GetGraphWindow()->WorldToGraph( xw, yw, xg, yg, true ); statusBar->SetStatusText( wxString(wxT("x = "))<SetStatusText( wxString(wxT("y = "))<OutputTypeToWorld( (int)event.GetX(), (int)event.GetY(), xw, yw ); statusBar->SetStatusText( wxString(wxT("x = "))<SetStatusText( wxString(wxT("y = "))<OutputTypeToWorld( (int)event.GetX(), (int)event.GetY(), xw, yw ); ExGlobals::GetGraphWindow()->WorldToPercent( xw, yw, xp, yp ); statusBar->SetStatusText( wxString(wxT("%x = "))<SetStatusText( wxString(wxT("%y = "))<SetStatusText( wxString(wxT("x = "))<SetStatusText( wxString(wxT("y = "))<OutputTypeToWorld( static_cast(xl), static_cast(yl), xw2, yw2 ); GRA_setOfCharacteristics *genC = ExGlobals::GetGraphWindow()->GetGeneralCharacteristics(); double headWidth = static_cast(genC->Get(wxT("ARROWHEADWIDTH")))->Get(); double headLength = static_cast(genC->Get(wxT("ARROWHEADLENGTH")))->Get(); switch (arrowType_) { case 1: { if( currentArrow1_ ) { ExGlobals::HideHint(); currentArrow1_->Draw( graphicsOutput, dc ); delete currentArrow1_; } currentArrow1_ = new GRA_arrow1( xw2, yw2, xw1_, yw1_, headsBothEnds_, figureLineColor_, figureFillColor_, figureLineThickness_, headWidth, headLength ); currentArrow1_->Draw( graphicsOutput, dc ); break; } case 2: { if( currentArrow2_ ) { ExGlobals::HideHint(); currentArrow2_->Draw( graphicsOutput, dc ); delete currentArrow2_; } currentArrow2_ = new GRA_arrow2( xw2, yw2, xw1_, yw1_, headsBothEnds_, figureLineColor_, figureFillColor_, figureLineThickness_, headWidth, headLength ); currentArrow2_->Draw( graphicsOutput, dc ); break; } case 3: { if( currentArrow3_ ) { ExGlobals::HideHint(); currentArrow3_->Draw( graphicsOutput, dc ); delete currentArrow3_; } currentArrow3_ = new GRA_arrow3( xw2, yw2, xw1_, yw1_, headsBothEnds_, figureLineColor_, figureLineThickness_, headWidth, headLength ); currentArrow3_->Draw( graphicsOutput, dc ); } } } else if( polygonPlacementMode_ ) { wxClientDC dc( this ); dc.SetLogicalFunction( wxINVERT ); long xl, yl; event.GetPosition( &xl, &yl ); double xw2, yw2; graphicsOutput->OutputTypeToWorld( static_cast(xl), static_cast(yl), xw2, yw2 ); switch (polygonType_) { case 1: { if( currentRectangle_ ) { ExGlobals::HideHint(); currentRectangle_->Draw( graphicsOutput, dc ); delete currentRectangle_; } currentRectangle_ = new GRA_rectangle( xw1_, yw1_, xw2, yw2, polygonAngle_, false, figureLineColor_, figureFillColor_, figureLineThickness_ ); currentRectangle_->Draw( graphicsOutput, dc ); break; } case 2: { if( currentRegularPolygon_ ) { ExGlobals::HideHint(); currentRegularPolygon_->Draw( graphicsOutput, dc ); delete currentRegularPolygon_; } double radius = sqrt((xw1_-xw2)*(xw1_-xw2)+(yw1_-yw2)*(yw1_-yw2)); currentRegularPolygon_ = new GRA_polygon( xw1_, yw1_, polygonAngle_, radius, polygonVertices_, figureLineColor_, figureFillColor_, figureLineThickness_ ); currentRegularPolygon_->Draw( graphicsOutput, dc ); break; } case 3: { if( current5PtStar_ ) { ExGlobals::HideHint(); current5PtStar_->Draw( graphicsOutput, dc ); delete current5PtStar_; } double radius = sqrt((xw1_-xw2)*(xw1_-xw2)+(yw1_-yw2)*(yw1_-yw2)); current5PtStar_ = new GRA_star5pt( xw1_, yw1_, 2*radius, polygonAngle_, figureLineColor_, figureFillColor_, figureLineThickness_ ); current5PtStar_->Draw( graphicsOutput, dc ); } } } else if( ellipsePlacementMode_ ) { wxClientDC dc( this ); dc.SetLogicalFunction( wxINVERT ); long xl, yl; event.GetPosition( &xl, &yl ); double xw2, yw2; graphicsOutput->OutputTypeToWorld( static_cast(xl), static_cast(yl), xw2, yw2 ); if( currentEllipse_ ) { ExGlobals::HideHint(); currentEllipse_->Draw( graphicsOutput, dc ); delete currentEllipse_; } if( drawCircles_ ) { double radius = sqrt((xw1_-xw2)*(xw1_-xw2)+(yw1_-yw2)*(yw1_-yw2)); currentEllipse_ = new GRA_ellipse( xw1_-radius, yw1_-radius, xw1_+radius, yw1_+radius, true, figureLineColor_, figureFillColor_, figureLineThickness_ ); } else { currentEllipse_ = new GRA_ellipse( xw1_, yw1_, xw2, yw2, false, figureLineColor_, figureFillColor_, figureLineThickness_ ); } currentEllipse_->Draw( graphicsOutput, dc ); } } void GraphicsPage::SetInteractiveWindowMode() { SetAllModesFalse(); interactiveWindowMode_ = true; } void GraphicsPage::SetInteractiveLegendMode() { SetAllModesFalse(); interactiveLegendMode_ = true; } void GraphicsPage::SetArrowPlacementMode() { SetAllModesFalse(); arrowPlacementMode_ = true; } void GraphicsPage::SetPolygonPlacementMode() { SetAllModesFalse(); polygonPlacementMode_ = true; } void GraphicsPage::SetEllipsePlacementMode() { SetAllModesFalse(); ellipsePlacementMode_ = true; } void GraphicsPage::SetTextPlacementMode( GRA_drawableText *dt ) { SetAllModesFalse(); textToPlace_ = dt; } void GraphicsPage::SetAllModesFalse() { interactiveWindowMode_ = false; interactiveLegendMode_ = false; arrowPlacementMode_ = false; polygonPlacementMode_ = false; ellipsePlacementMode_ = false; if( textToPlace_ ) { delete textToPlace_; textToPlace_ = 0; } } void GraphicsPage::SetArrowType( int i ) { arrowType_ = i; } void GraphicsPage::SetHeadsBothEnds( bool b ) { headsBothEnds_ = b; } void GraphicsPage::SetPolygonType( int i ) { polygonType_ = i; } void GraphicsPage::SetPolygonAngle( int angle ) { polygonAngle_ = angle; } void GraphicsPage::SetPolygonVertices( int vertices ) { polygonVertices_ = vertices; } void GraphicsPage::SetDrawCircles( bool b ) { drawCircles_ = b; } void GraphicsPage::SetFigureLineThickness( int i ) { figureLineThickness_ = i; } void GraphicsPage::SetFigureLineColor( GRA_color *c ) { figureLineColor_ = c; } void GraphicsPage::SetFigureFillColor( GRA_color *c ) { figureFillColor_ = c; } void GraphicsPage::SavePS( wxString const &filename ) { GRA_postscript ps; try { ps.Initialize( filename ); } catch( EGraphicsError const &e ) { throw; } int gwSave = currentWindowNumber_; try { std::vector::const_iterator end = graphWindows_.end(); for( std::vector::const_iterator i=graphWindows_.begin(); i!=end; ++i ) { currentWindowNumber_ = std::distance( graphWindows_.begin(), std::find(graphWindows_.begin(),graphWindows_.end(),*i) ); ps.DisplayBackground( *i ); // std::vector::const_iterator endObj = (*i)->GetDrawableObjects().end(); for( std::vector::const_iterator j=(*i)->GetDrawableObjects().begin(); j!=endObj; ++j ) { if( (*j)->IsaPoint() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaPolyline() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaEllipse() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaPolygon() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaMultilineFigure() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaPlotsymbol() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaDrawableText() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaCartesianAxes() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaCartesianCurve() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaGraphLegend() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaContour() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaBoxPlot() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaDiffusionPlot() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaDitheringPlot() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaGradientPlot() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaPolarAxes() )ps.Draw( static_cast(*j) ); else if( (*j)->IsaPolarCurve() )ps.Draw( static_cast(*j) ); //else if( (*j)->IsaAxis() )ps.Draw( static_cast(*j) ); //else if( (*j)->IsaThreeDFigure() )ps.Draw( static_cast(*j) ); //else if( (*j)->IsaSurfacePlot() )ps.Draw( static_cast(*j) ); } } } catch( EGraphicsError const &e ) { currentWindowNumber_ = gwSave; throw; } ps.EndDoc(); currentWindowNumber_ = gwSave; } void GraphicsPage::SaveBitmap( wxString const &filename, int type ) { int xmin, ymin, xmax, ymax; ExGlobals::GetMonitorLimits( xmin, ymin, xmax, ymax ); GRA_wxWidgets ps( xmin, ymin, xmax, ymax ); wxBitmap tempBM( xmax-xmin, ymax-ymin ); wxMemoryDC dc; dc.SelectObject( tempBM ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); dc.StartDoc( wxT("produced by EXTREMA") ); try { DrawGraphWindows( &ps, dc ); } catch (EGraphicsError &e) { throw; } dc.EndDoc(); wxImage image( tempBM.ConvertToImage() ); image.SaveFile( filename, type ); } extrema-4.4.5/src/wxForms/ReadTextForm.h0000644012702201742730000000310411274636606017171 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_READTEXTFORM #define EXTREMA_READTEXTFORM #include "wx/wx.h" #include "wx/grid.h" class AnalysisWindow; class ChooseFilePanel; class ReadTextForm : public wxFrame { public: ReadTextForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnLineRange( wxCommandEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxGrid *vectorGrid_; wxCheckBox *closeBefore_, *closeAfter_, *lineRange_, *messages_; wxTextCtrl *varNameTextCtrl_, *incrementTextCtrl_, *lastLineTextCtrl_, *firstLineTextCtrl_; wxStaticText *firstLineText_, *lastLineText_, *incrementText_; enum { ID_lineRange }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/GenerateVectorForm.cpp0000644012702201742730000004142711274636606020733 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "GenerateVectorForm.h" #include "AnalysisWindow.h" #include "NumericVariable.h" #include "EVariableError.h" #include "ExGlobals.h" #include "UsefulFunctions.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( GenerateVectorForm, wxFrame ) EVT_RADIOBOX( ID_choose, GenerateVectorForm::OnChoose ) EVT_BUTTON( ID_defaults, GenerateVectorForm::OnDefaults ) EVT_BUTTON( wxID_APPLY, GenerateVectorForm::OnApply ) EVT_BUTTON( wxID_CLOSE, GenerateVectorForm::OnClose ) EVT_CLOSE( GenerateVectorForm::CloseEventHandler ) END_EVENT_TABLE() GenerateVectorForm::GenerateVectorForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Generate a vector"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Generated vector name"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ), wxSizerFlags(0).Right().Border(wxTOP,10) ); nameTC_ = new wxTextCtrl( topPanel, wxID_ANY ); nameTC_->SetValue( wxT("") ); topSizer->Add( nameTC_, wxSizerFlags(0).Left().Border(wxALL,5) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *leftPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *leftSizer = new wxBoxSizer( wxVERTICAL ); wxString choicesArray[] = { wxT("random values"), wxT("minimum increment maximum"), wxT("minimum increment number"), wxT("minimum maximum number") }; wxArrayString choices( 4, choicesArray ); choicesRB_ = new wxRadioBox( leftPanel, ID_choose, wxT("Choices"), wxDefaultPosition, wxDefaultSize, choices, 4, wxRA_SPECIFY_ROWS ); choicesRB_->SetSelection( 1 ); leftSizer->Add( choicesRB_, wxSizerFlags(0).Border(wxALL,2) ); leftPanel->SetSizer( leftSizer ); midSizer->Add( leftPanel, wxSizerFlags(0).Border(wxALL,10) ); wxPanel *rightPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxGridSizer *rightSizer = new wxGridSizer( 4, 2, 5, 5 ); minLabel_ = new wxStaticText(rightPanel,wxID_ANY,wxT("Minimum value"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ); rightSizer->Add( minLabel_, wxSizerFlags(0).Right().Border(wxTOP,5) ); minValueTC_ = new wxTextCtrl( rightPanel, wxID_ANY ); minValueTC_->SetValue( wxT("") ); rightSizer->Add( minValueTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); incLabel_ = new wxStaticText(rightPanel,wxID_ANY,wxT("Increment"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ); rightSizer->Add( incLabel_, wxSizerFlags(0).Right().Border(wxTOP,5) ); incValueTC_ = new wxTextCtrl( rightPanel, wxID_ANY ); incValueTC_->SetValue( wxT("") ); rightSizer->Add( incValueTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); maxLabel_ = new wxStaticText(rightPanel,wxID_ANY,wxT("Maximum value"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ); rightSizer->Add( maxLabel_, wxSizerFlags(0).Right().Border(wxTOP,5) ); maxValueTC_ = new wxTextCtrl( rightPanel, wxID_ANY ); maxValueTC_->SetValue( wxT("") ); rightSizer->Add( maxValueTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); numLabel_ = new wxStaticText(rightPanel,wxID_ANY,wxT(" Number of values"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT ); rightSizer->Add( numLabel_, wxSizerFlags(0).Right().Border(wxTOP,5) ); numValueTC_ = new wxTextCtrl( rightPanel, wxID_ANY ); numValueTC_->SetValue( wxT("") ); rightSizer->Add( numValueTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); rightPanel->SetSizer( rightSizer ); midSizer->Add( rightPanel, wxSizerFlags(0).Border(wxALL,10) ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *defaultsButton = new wxButton( bottomPanel, ID_defaults, wxT("Reset") ); defaultsButton->SetToolTip( wxT("clear all fields") ); bottomSizer->Add( defaultsButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("create the vector") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/GenerateVectorForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/GenerateVectorForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/GenerateVectorForm/WIDTH"), 535l ); int height = config->Read( wxT("/GenerateVectorForm/HEIGHT"), 255l ); SetSize( ulx, uly, width, height ); wxString s; config->Read( wxT("/GenerateVectorForm/NAME"), &s, wxT("") ); nameTC_->SetValue( s ); s.clear(); config->Read( wxT("/GenerateVectorForm/MIN"), &s, wxT("") ); minValueTC_->SetValue( s ); s.clear(); config->Read( wxT("/GenerateVectorForm/INC"), &s, wxT("") ); incValueTC_->SetValue( s ); s.clear(); config->Read( wxT("/GenerateVectorForm/MAX"), &s, wxT("") ); maxValueTC_->SetValue( s ); s.clear(); config->Read( wxT("/GenerateVectorForm/NUM"), &s ,wxT("") ); numValueTC_->SetValue( s ); choicesRB_->SetSelection( config->Read(wxT("/GenerateVectorForm/CHOICE"),1l) ); SetUp(); Show( true ); } void GenerateVectorForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/GenerateVectorForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/GenerateVectorForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/GenerateVectorForm/WIDTH"), static_cast(width) ); config->Write( wxT("/GenerateVectorForm/HEIGHT"), static_cast(height) ); // config->Write( wxT("/GenerateVectorForm/NAME"), nameTC_->GetValue() ); config->Write( wxT("/GenerateVectorForm/MIN"), minValueTC_->GetValue() ); config->Write( wxT("/GenerateVectorForm/INC"), incValueTC_->GetValue() ); config->Write( wxT("/GenerateVectorForm/MAX"), maxValueTC_->GetValue() ); config->Write( wxT("/GenerateVectorForm/NUM"), numValueTC_->GetValue() ); config->Write( wxT("/GenerateVectorForm/CHOICE"), static_cast(choicesRB_->GetSelection()) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroGenerateVector(); Destroy(); } void GenerateVectorForm::OnDefaults( wxCommandEvent &WXUNUSED(event) ) { Defaults(); } void GenerateVectorForm::Defaults() { nameTC_->Clear(); minValueTC_->Clear(); incValueTC_->Clear(); maxValueTC_->Clear(); numValueTC_->Clear(); choicesRB_->SetSelection( 1 ); SetUp(); // if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM GENERATE,DEFAULTS") ); } void GenerateVectorForm::OnChoose( wxCommandEvent &WXUNUSED(event) ) { SetUp(); } void GenerateVectorForm::SetUp() { minValueTC_->Enable( true ); minLabel_->Enable( true ); incValueTC_->Enable( true ); incLabel_->Enable( true ); maxValueTC_->Enable( true ); maxLabel_->Enable( true ); numValueTC_->Enable( true ); numLabel_->Enable( true ); switch ( choicesRB_->GetSelection() ) { case 0: case 3: incValueTC_->Enable( false ); incLabel_->Enable( false ); break; case 1: numValueTC_->Enable( false ); numLabel_->Enable( false ); break; case 2: maxValueTC_->Enable( false ); maxLabel_->Enable( false ); break; } } void GenerateVectorForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { Apply(); } void GenerateVectorForm::Apply() { wxString name( nameTC_->GetValue() ); if( name.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no output vector has been specified"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } double vMin, vMax, vInc; int vNum; std::vector x; wxString minString( minValueTC_->GetValue() ); wxString incString( incValueTC_->GetValue() ); wxString maxString( maxValueTC_->GetValue() ); wxString numString( numValueTC_->GetValue() ); int choice = choicesRB_->GetSelection(); int order = 0; if( choice == 0 ) { if( minString.empty() || maxString.empty() || numString.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("min, max and number of values must be provided"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } try { NumericVariable::GetScalar( minString, wxT("minimum value"), vMin ); NumericVariable::GetScalar( maxString, wxT("maximum value"), vMax ); double d; NumericVariable::GetScalar( numString, wxT("number of values"), d ); vNum = static_cast(d); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( vNum <= 0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("number of values must be > 0"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } double delv = vMax - vMin; x.reserve( vNum ); for( int i=0; iShowModal(); return; } break; case 2: if( minString.empty() || incString.empty() || numString.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("min, increment and number of elements must be provided"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } break; case 3: if( minString.empty() || maxString.empty() || numString.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("min, max and number of elements must be provided"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } break; } try { NumericVariable::GetScalar( minString, wxT("minimum value"), vMin ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( choice==1 || choice==2 ) { try { NumericVariable::GetScalar( incString, wxT("increment"), vInc ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( vInc == 0.0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("increment must not be 0"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } if( choice==1 || choice==3 ) { try { NumericVariable::GetScalar( maxString, wxT("max value"), vMax ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } if( choice==2 || choice==3 ) { try { double d; NumericVariable::GetScalar( numString, wxT("number of values"), d ); vNum = static_cast(d); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( vNum <= 0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("number of values must be > 0"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } if( choice == 1 ) { vNum = static_cast( (vMax-vMin)/vInc ) + 1; if( vNum <= 0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("number of values must be > 0"), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } x.reserve( vNum ); for( int i=0; i fabs(vMax*0.000001) ) { wxString s( wxT("GENERATE: calculated maximum = ") ); s << x.back() << wxT(", given maximum = ") << vMax; ExGlobals::WarningMessage( s ); } } else if( choice == 2 ) { x.reserve( vNum ); for( int i=0; i1 ? (vMax-vMin)/(vNum-1) : 0.0; x.reserve( vNum ); for( int i=0; i0.0 ? 1 : 2; } try { NumericVariable::PutVariable( name, x, order, wxT("from GENERATE VECTOR gui") ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // if( ExGlobals::StackIsOn() ) { wxString line( wxT("FORM GENERATE,") ); line += nameTC_->GetValue() + wxT(",") + (wxString()<GetSelection()) + wxT(",") + minValueTC_->GetValue() + wxT(",") + incValueTC_->GetValue() + wxT(",") + maxValueTC_->GetValue() + wxT(",") + numValueTC_->GetValue() + wxT(",APPLY"); ExGlobals::WriteStack( line ); } } void GenerateVectorForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM GENERATE,CLOSE") ); Close(); } void GenerateVectorForm::Set( wxString const &name, int choice, double min, double inc, double max, int number, wxString const &action ) { nameTC_->SetValue( name ); choicesRB_->SetSelection( choice ); minValueTC_->SetValue( wxString()<SetValue( wxString()<SetValue( wxString()<SetValue( wxString()< # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libwxforms.la libwxforms_la_SOURCES = \ AnalysisCommandPanel.cpp AnalysisCommandPanel.h \ AnalysisMessagePanel.cpp AnalysisMessagePanel.h \ AnalysisSpeedButtonPanel.cpp AnalysisSpeedButtonPanel.h \ AnalysisWindow.cpp AnalysisWindow.h \ AxisPopup.cpp AxisPopup.h \ BasicColors.cpp BasicColors.h \ ChooseFilePanel.cpp ChooseFilePanel.h \ CommandTextCtrl.cpp CommandTextCtrl.h \ CurvePopup.cpp CurvePopup.h \ ExecuteDialog.cpp ExecuteDialog.h \ FigureForm.cpp FigureForm.h \ FitForm.cpp FitForm.h \ FontChooser.cpp FontChooser.h \ GenerateVectorForm.cpp GenerateVectorForm.h \ GraphForm.cpp GraphForm.h \ GraphicsPage.cpp GraphicsPage.h \ HintForm.cpp HintForm.h \ ImportWindow.cpp ImportWindow.h \ InquireYNDialog.cpp InquireYNDialog.h \ InquireDialog.cpp InquireDialog.h \ LegendPopup.cpp LegendPopup.h \ PeakFindForm.cpp PeakFindForm.h \ ReadVectorsForm.cpp ReadVectorsForm.h \ ReadScalarsForm.cpp ReadScalarsForm.h \ ReadMatrixForm.cpp ReadMatrixForm.h \ ReadTextForm.cpp ReadTextForm.h \ SetAspectRatioForm.cpp SetAspectRatioForm.h \ ShowVariablesForm.cpp ShowVariablesForm.h \ StackDialog.cpp StackDialog.h \ TextForm.cpp TextForm.h \ TextPopup.cpp TextPopup.h \ ThreeDPlotForm.cpp ThreeDPlotForm.h \ VarInfoForm.cpp VarInfoForm.h \ VisualizationSpeedButtonPanel.cpp VisualizationSpeedButtonPanel.h \ VisualizationWindow.cpp VisualizationWindow.h \ WriteVectorsForm.cpp WriteVectorsForm.h \ WriteScalarsForm.cpp WriteScalarsForm.h \ WriteMatrixForm.cpp WriteMatrixForm.h \ WriteTextForm.cpp WriteTextForm.h extrema-4.4.5/src/wxForms/VarInfoForm.cpp0000644012702201742730000001522411274636606017356 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "VarInfoForm.h" #include "ShowVariablesForm.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "NumericVariable.h" #include "TextVariable.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( VarInfoForm, wxFrame ) EVT_BUTTON( ID_refresh, VarInfoForm::OnRefresh ) EVT_BUTTON( wxID_CLOSE, VarInfoForm::OnClose ) EVT_CLOSE( VarInfoForm::CloseEventHandler ) END_EVENT_TABLE() VarInfoForm::VarInfoForm( ShowVariablesForm *parent ) : wxFrame(parent,wxID_ANY,wxT("variable info"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), showVariablesForm_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); textCtrl_ = new wxTextCtrl( this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxSUNKEN_BORDER ); mainSizer->Add( textCtrl_, wxSizerFlags(1).Expand().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *refreshButton = new wxButton( bottomPanel, ID_refresh, wxT("Refresh") ); refreshButton->SetToolTip( wxT("refresh the variable names") ); bottomSizer->Add( refreshButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/VarInfoForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/VarInfoForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/VarInfoForm/WIDTH"), 570l ); int height = config->Read( wxT("/VarInfoForm/HEIGHT"), 145l ); SetSize( ulx, uly, width, height ); Show( true ); } void VarInfoForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/VarInfoForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/VarInfoForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/VarInfoForm/WIDTH"), static_cast(width) ); config->Write( wxT("/VarInfoForm/HEIGHT"), static_cast(height) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ showVariablesForm_->ZeroVarInfoForm(); Destroy(); } void VarInfoForm::OnRefresh( wxCommandEvent &WXUNUSED(event) ) { if( !name_.empty() )DisplayInfo( name_ ); } void VarInfoForm::DisplayInfo( wxString const &name ) { textCtrl_->Clear(); // name_ = name; // NumericVariable *nv = NVariableTable::GetTable()->GetVariable( name ); TextVariable *tv = TVariableTable::GetTable()->GetVariable( name ); if( nv ) { NumericData nd( nv->GetData() ); wxString s( nv->GetName() ); wxString type; int ndim = nd.GetNumberOfDimensions(); switch ( ndim ) { case 0: { textCtrl_->AppendText( nv->GetName()+wxT(" is a scalar\n") ); if( nd.IsFit() )textCtrl_->AppendText( wxT("allowed to vary in a fit\n") ); wxString s( wxT("value = ") ); textCtrl_->AppendText( s << nd.GetScalarValue() << wxT("\n") ); break; } case 1: { textCtrl_->AppendText( nv->GetName()+wxT(" is a vector\n") ); wxString s( wxT("length = ") ); textCtrl_->AppendText( s << nd.GetDimMag(0) << wxT("\n") ); break; } case 2: { textCtrl_->AppendText( nv->GetName()+wxT(" is a matrix\n") ); wxString s( wxT("number of rows = ") ); textCtrl_->AppendText( s << nd.GetDimMag(0) << wxT(", number of columns = ") << nd.GetDimMag(1) << wxT("\n") ); break; } case 3: { textCtrl_->AppendText( nv->GetName()+wxT(" is a tensor\n") ); wxString s( wxT("number of rows = ") ); textCtrl_->AppendText( s << nd.GetDimMag(0) << wxT(", number of columns = ") << nd.GetDimMag(1) << wxT(", number of planes = ") << nd.GetDimMag(2) << wxT("\n") ); break; } } textCtrl_->AppendText( wxT("History (most recent at the top)\n") ); textCtrl_->AppendText( wxT("----------------------------------------\n") ); std::deque nvH( nv->GetHistory() ); std::size_t size = nvH.size(); for( std::size_t i=0; iAppendText( nvH[i]+wxT("\n") ); } else if( tv ) { TextData td( tv->GetData() ); int ndim = td.GetNumberOfDimensions(); if( ndim == 0 ) { textCtrl_->AppendText( tv->GetName()+wxT(" is a text scalar\n") ); wxString s( wxT("number of characters = ") ); textCtrl_->AppendText( s << td.GetScalarValue().size() << wxT("\n") ); } else { textCtrl_->AppendText( tv->GetName()+wxT(" is a text vector\n") ); wxString s( wxT("number of strings = ") ); textCtrl_->AppendText( s << td.GetData().size() << wxT("\n") ); } textCtrl_->AppendText( wxT("History (most recent at the top)\n") ); textCtrl_->AppendText( wxT("----------------------------------------\n") ); std::deque tvH( tv->GetHistory() ); std::size_t size = tvH.size(); for( std::size_t i=0; iAppendText( tvH[i]+wxT("\n") ); } else textCtrl_->AppendText( wxT("variable no longer exists\n") ); } void VarInfoForm::OnClose( wxCommandEvent &event ) { Close(); } // end of file extrema-4.4.5/src/wxForms/ThreeDPlotForm.cpp0000644012702201742730000003762111322766356020031 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include "wx/config.h" #include "ThreeDPlotForm.h" #include "GRA_threeDPlot.h" #include "VisualizationWindow.h" #include "NumericVariable.h" #include "EVariableError.h" #include "NVariableTable.h" #include "ExGlobals.h" #include "GRA_window.h" #include "GRA_intCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_colorControl.h" #include "GRA_setOfCharacteristics.h" #include "EGraphicsError.h" #include "GRA_drawableText.h" #include "UsefulFunctions.h" #include "GraphicsPage.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ThreeDPlotForm, wxFrame ) EVT_TEXT( ID_angleInc, ThreeDPlotForm::OnAngleIncChange ) EVT_TEXT( ID_eye2obj, ThreeDPlotForm::OnEye2ObjChange ) EVT_BUTTON( ID_draw, ThreeDPlotForm::OnDraw ) EVT_BUTTON( ID_left, ThreeDPlotForm::OnLeft ) EVT_BUTTON( ID_right, ThreeDPlotForm::OnRight ) EVT_BUTTON( ID_up, ThreeDPlotForm::OnUp ) EVT_BUTTON( ID_down, ThreeDPlotForm::OnDown ) EVT_BUTTON( ID_zoomIn, ThreeDPlotForm::OnZoomIn ) EVT_BUTTON( ID_zoomOut, ThreeDPlotForm::OnZoomOut ) EVT_BUTTON( wxID_CLOSE, ThreeDPlotForm::OnClose ) EVT_CLOSE( ThreeDPlotForm::CloseEventHandler ) END_EVENT_TABLE() ThreeDPlotForm::ThreeDPlotForm( VisualizationWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("3D Plot"),wxDefaultPosition,wxSize(-1,-1), wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL), visualizationWindow_(parent) { CreateForm(); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/3DPlotForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/3DPlotForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/3DPlotForm/WIDTH"), 350l ); int height = config->Read( wxT("/3DPlotForm/HEIGHT"), 430l ); SetSize( ulx, uly, width, height ); Show( true ); UpdateVectors( xVecComboBox_ ); UpdateVectors( yVecComboBox_ ); UpdateVectors( zVecComboBox_ ); wxString sTmp; config->Read( wxT("/3DPlotForm/X_VECTOR"), &sTmp, wxT("") ); if( xVecComboBox_->FindString(sTmp) > 0 )xVecComboBox_->SetStringSelection( sTmp ); sTmp.clear(); config->Read( wxT("/3DPlotForm/Y_VECTOR"), &sTmp, wxT("") ); if( yVecComboBox_->FindString(sTmp) > 0 )yVecComboBox_->SetStringSelection( sTmp ); sTmp.clear(); config->Read( wxT("/3DPlotForm/Z_VECTOR"), &sTmp, wxT("") ); if( zVecComboBox_->FindString(sTmp) > 0 )zVecComboBox_->SetStringSelection( sTmp ); sTmp.clear(); config->Read( wxT("/3DPlotForm/ANGLE_INC"), &sTmp, wxT("5") ); angleIncTextCtrl_->ChangeValue( sTmp ); angleIncTextCtrl_->GetValue().ToDouble( &angleIncrement_ ); sTmp.clear(); config->Read( wxT("/3DPlotForm/EYE_TO_OBJECT"), &sTmp, wxT("100") ); eye2objTextCtrl_->ChangeValue( sTmp ); } void ThreeDPlotForm::CreateForm() { wxString imageDir = ExGlobals::GetImagePath(); SetSizeHints( wxDefaultSize, wxDefaultSize ); wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *xVecSizer = new wxBoxSizer( wxHORIZONTAL ); wxStaticText *xVecText = new wxStaticText( topPanel, wxID_ANY, wxT("X"), wxDefaultPosition, wxDefaultSize, 0 ); xVecText->Wrap( -1 ); xVecSizer->Add( xVecText, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); xVecComboBox_ = new wxComboBox( topPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); xVecSizer->Add( xVecComboBox_, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL, 5 ); topSizer->Add( xVecSizer, 0, wxALIGN_CENTER_HORIZONTAL, 1 ); wxBoxSizer *yVecSizer = new wxBoxSizer( wxHORIZONTAL ); wxStaticText *yVecText = new wxStaticText( topPanel, wxID_ANY, wxT("Y"), wxDefaultPosition, wxDefaultSize, 0 ); yVecText->Wrap( -1 ); yVecSizer->Add( yVecText, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); yVecComboBox_ = new wxComboBox( topPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); yVecSizer->Add( yVecComboBox_, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL, 5 ); topSizer->Add( yVecSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxTOP, 5 ); wxBoxSizer* zVecSizer = new wxBoxSizer( wxHORIZONTAL ); wxStaticText *zVecText = new wxStaticText( topPanel, wxID_ANY, wxT("Z"), wxDefaultPosition, wxDefaultSize, 0 ); zVecText->Wrap( -1 ); zVecSizer->Add( zVecText, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); zVecComboBox_ = new wxComboBox( topPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); zVecSizer->Add( zVecComboBox_, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL, 5 ); topSizer->Add( zVecSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxTOP, 5 ); wxButton *drawButton = new wxButton( topPanel, ID_draw, wxT("Draw"), wxDefaultPosition, wxDefaultSize, 0 ); topSizer->Add( drawButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10 ); topPanel->SetSizer( topSizer ); topPanel->Layout(); topSizer->Fit( topPanel ); mainSizer->Add( topPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER&wxTAB_TRAVERSAL ); wxBoxSizer* bottomSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* rotateSizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *leftButton = new wxBitmapButton( bottomPanel, ID_left, wxBitmap(imageDir+wxT("/leftarrow.bmp"),wxBITMAP_TYPE_BMP), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); leftButton->SetToolTip( wxT("rotate left 1 angle increment") ); rotateSizer->Add( leftButton, 0, wxALL, 5 ); wxBitmapButton *rightButton = new wxBitmapButton( bottomPanel, ID_right, wxBitmap(imageDir+wxT("/rightarrow.bmp"),wxBITMAP_TYPE_BMP), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); rotateSizer->Add( rightButton, 0, wxALL, 5 ); wxBitmapButton *upButton = new wxBitmapButton( bottomPanel, ID_up, wxBitmap(imageDir+wxT("/uparrow.bmp"),wxBITMAP_TYPE_BMP), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); rotateSizer->Add( upButton, 0, wxALL, 5 ); wxBitmapButton *downButton = new wxBitmapButton( bottomPanel, ID_down, wxBitmap(imageDir+wxT("/downarrow.bmp"),wxBITMAP_TYPE_BMP), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); rotateSizer->Add( downButton, 0, wxALL, 5 ); bottomSizer->Add( rotateSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxTOP, 10 ); wxBoxSizer* zoomSizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *zoomInButton = new wxBitmapButton( bottomPanel, ID_zoomIn, wxBitmap(imageDir+wxT("/zoomin.bmp"),wxBITMAP_TYPE_BMP), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); zoomInButton->SetToolTip( wxT("click to zoom in") ); zoomSizer->Add( zoomInButton, 0, wxALL, 5 ); wxBitmapButton *zoomOutButton = new wxBitmapButton( bottomPanel, ID_zoomOut, wxBitmap(imageDir+wxT("/zoomout.bmp"),wxBITMAP_TYPE_BMP), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); zoomOutButton->SetToolTip( wxT("click to zoom out") ); zoomSizer->Add( zoomOutButton, 0, wxALL, 5 ); bottomSizer->Add( zoomSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxTOP, 5 ); wxBoxSizer* inputSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* angleIncSizer = new wxBoxSizer( wxHORIZONTAL ); wxStaticText *angleIncText = new wxStaticText( bottomPanel, wxID_ANY, wxT(" Angle increment (degrees)"), wxDefaultPosition, wxDefaultSize, 0 ); angleIncText->Wrap( -1 ); angleIncSizer->Add( angleIncText, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); angleIncTextCtrl_ = new wxTextCtrl( bottomPanel, ID_angleInc, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); angleIncTextCtrl_->SetToolTip( wxT("enter the angle increment for rotating the image (degrees)") ); angleIncSizer->Add( angleIncTextCtrl_, 0, wxALIGN_LEFT|wxALL, 5 ); inputSizer->Add( angleIncSizer, 1, 0, 5 ); wxBoxSizer* eye2objSizer = new wxBoxSizer( wxHORIZONTAL ); wxStaticText *eye2objText = new wxStaticText( bottomPanel, wxID_ANY, wxT("Eye to object distance scale factor"), wxDefaultPosition, wxDefaultSize, 0 ); eye2objText->Wrap( -1 ); eye2objSizer->Add( eye2objText, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); eye2objTextCtrl_ = new wxTextCtrl( bottomPanel, ID_eye2obj, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); eye2objTextCtrl_->SetToolTip( wxT("Enter the eye to object distance scale factor") ); eye2objSizer->Add( eye2objTextCtrl_, 0, wxALIGN_LEFT|wxALL, 5 ); inputSizer->Add( eye2objSizer, 1, 0, 5 ); bottomSizer->Add( inputSizer, 1, 0, 5 ); bottomPanel->SetSizer( bottomSizer ); bottomPanel->Layout(); bottomSizer->Fit( bottomPanel ); mainSizer->Add( bottomPanel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); wxButton *closeButton = new wxButton( this, wxID_CLOSE, wxT("Close"), wxDefaultPosition, wxDefaultSize, 0 ); mainSizer->Add( closeButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); SetSizer( mainSizer ); Layout(); mainSizer->Fit( this ); } void ThreeDPlotForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void ThreeDPlotForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ThreeDPlotForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ThreeDPlotForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ThreeDPlotForm/WIDTH"), static_cast(width) ); config->Write( wxT("/ThreeDPlotForm/HEIGHT"), static_cast(height) ); config->Write( wxT("/ThreeDPlotForm/X_VECTOR"), xVecComboBox_->GetStringSelection() ); config->Write( wxT("/ThreeDPlotForm/Y_VECTOR"), yVecComboBox_->GetStringSelection() ); config->Write( wxT("/ThreeDPlotForm/Z_VECTOR"), zVecComboBox_->GetStringSelection() ); config->Write( wxT("/ThreeDPlotForm/ANGLE_INC"), angleIncTextCtrl_->GetValue() ); config->Write( wxT("/ThreeDPlotForm/EYE_TO_OBJECT"), eye2objTextCtrl_->GetValue() ); } visualizationWindow_->ZeroThreeDPlotForm(); Destroy(); } void ThreeDPlotForm::UpdateVectors( wxComboBox *cb ) { cb->Clear(); NVariableTable *nvTable = NVariableTable::GetTable(); int entries = nvTable->Entries(); for( int i=0; iGetEntry(i); if( nv->GetData().GetNumberOfDimensions() == 1 )cb->Append( nv->GetName() ); } } void ThreeDPlotForm::OnDraw( wxCommandEvent &WXUNUSED(event) ) { std::vector x, y, z; try { GetDataVectors( x, y, z ); } catch( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } GRA_window *gw = ExGlobals::GetGraphWindow(); wxClientDC dc( ExGlobals::GetwxWindow() ); gw->Clear(); gw->Erase(); dynamic_cast(visualizationWindow_->GetPage())->Paint(); threeDPlot_ = new GRA_threeDPlot( this, x, y, z ); double e2o; eye2objTextCtrl_->GetValue().ToDouble( &e2o ); threeDPlot_->SetEye2Object( e2o ); threeDPlot_->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( threeDPlot_ ); } void ThreeDPlotForm::GetDataVectors( std::vector &x, std::vector &y, std::vector &z ) { wxString xVecName( xVecComboBox_->GetStringSelection() ); wxString yVecName( yVecComboBox_->GetStringSelection() ); wxString zVecName( zVecComboBox_->GetStringSelection() ); try { NumericVariable::GetVector( xVecName, wxT("x variable"), x ); NumericVariable::GetVector( yVecName, wxT("y variable"), y ); NumericVariable::GetVector( zVecName, wxT("z variable"), z ); } catch( EVariableError const &e ) { throw; } std::size_t npt = std::min( std::min(x.size(),y.size()), z.size() ); x.resize( npt ); y.resize( npt ); z.resize( npt ); } void ThreeDPlotForm::ReDraw() { if( !threeDPlot_ )return; GRA_threeDPlot *tmp = new GRA_threeDPlot( *threeDPlot_ ); GRA_window *gw = ExGlobals::GetGraphWindow(); wxClientDC dc( ExGlobals::GetwxWindow() ); gw->Clear(); gw->Erase(); dynamic_cast(visualizationWindow_->GetPage())->Paint(); threeDPlot_ = tmp; threeDPlot_->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( threeDPlot_ ); } void ThreeDPlotForm::OnAngleIncChange( wxCommandEvent &WXUNUSED(event) ) { if( angleIncTextCtrl_->GetValue().IsEmpty() )return; double ai; if( !angleIncTextCtrl_->GetValue().ToDouble(&ai) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for angle incrment"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); angleIncTextCtrl_->ChangeValue( wxString() << angleIncrement_ ); return; } angleIncrement_ = ai; } void ThreeDPlotForm::OnEye2ObjChange( wxCommandEvent &WXUNUSED(event) ) { if( eye2objTextCtrl_->GetValue().IsEmpty() )return; double e2o; if( !eye2objTextCtrl_->GetValue().ToDouble(&e2o) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for eye to object distance factor"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); eye2objTextCtrl_->ChangeValue( wxString() << eye2obj_ ); return; } if( threeDPlot_ ) { threeDPlot_->SetEye2Object( e2o ); ReDraw(); } } void ThreeDPlotForm::OnLeft( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlot_ ) { threeDPlot_->RotateY( -angleIncrement_ ); ReDraw(); } } void ThreeDPlotForm::OnRight( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlot_ ) { threeDPlot_->RotateY( angleIncrement_ ); ReDraw(); } } void ThreeDPlotForm::OnUp( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlot_ ) { threeDPlot_->RotateX( -angleIncrement_ ); ReDraw(); } } void ThreeDPlotForm::OnDown( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlot_ ) { threeDPlot_->RotateX( angleIncrement_ ); ReDraw(); } } void ThreeDPlotForm::OnZoomIn( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlot_ ) { threeDPlot_->ScaleDS( 1.05 ); ReDraw(); } } void ThreeDPlotForm::OnZoomOut( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlot_ ) { threeDPlot_->ScaleDS( 0.95 ); ReDraw(); } } extrema-4.4.5/src/wxForms/VisualizationWindow.cpp0000644012702201742730000006725111327734077021226 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #include #include #include "wx/config.h" #include "wx/dcbuffer.h" #include "wx/notebook.h" #include "VisualizationWindow.h" #include "VisualizationSpeedButtonPanel.h" #include "GRA_window.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "GraphForm.h" #include "TextForm.h" #include "PeakFindForm.h" #include "GRA_drawableText.h" #include "GraphicsPage.h" #include "SetAspectRatioForm.h" #include "ImportWindow.h" #include "ThreeDPlotForm.h" #include "FigureForm.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( VisualizationWindow, wxFrame ) EVT_MENU( ID_importPNG, VisualizationWindow::OnImportPNG ) EVT_MENU( ID_importJPEG, VisualizationWindow::OnImportJPEG ) EVT_MENU( ID_savePS, VisualizationWindow::OnSavePS ) EVT_MENU( ID_savePNG, VisualizationWindow::OnSavePNG ) EVT_MENU( ID_saveJPEG, VisualizationWindow::OnSaveJPEG ) EVT_MENU( ID_print, VisualizationWindow::OnPrint ) EVT_MENU( ID_clearGraphicsPage, VisualizationWindow::OnClearGraphicsPage ) EVT_MENU( ID_clearWindow, VisualizationWindow::OnClearWindow ) EVT_MENU( ID_drawGraph, VisualizationWindow::OnDrawGraph ) EVT_MENU( ID_3DPlot, VisualizationWindow::On3DPlot ) EVT_MENU( ID_drawFigure, VisualizationWindow::OnDrawFigure ) EVT_MENU( ID_drawText, VisualizationWindow::OnDrawText ) EVT_MENU( ID_replotAll, VisualizationWindow::OnReplotAll ) EVT_MENU( ID_replotCurrent, VisualizationWindow::OnReplotCurrent ) EVT_MENU( ID_zerolinesH, VisualizationWindow::OnZerolinesH ) EVT_MENU( ID_zerolinesV, VisualizationWindow::OnZerolinesV ) EVT_MENU( ID_zerolinesB, VisualizationWindow::OnZerolinesB ) EVT_MENU( ID_resetDefaults, VisualizationWindow::OnResetDefaults ) EVT_MENU( ID_configureWindow, VisualizationWindow::OnConfigureWindow ) EVT_MENU( ID_newPage, VisualizationWindow::OnNewPage ) EVT_MENU( ID_removePage, VisualizationWindow::OnRemovePage ) EVT_MENU( ID_aspectRatio, VisualizationWindow::OnSetAspectRatio ) EVT_CLOSE( VisualizationWindow::CloseEventHandler ) EVT_SIZE( VisualizationWindow::OnSize ) END_EVENT_TABLE() //EVT_SET_FOCUS( VisualizationWindow::OnSetFocus ) //EVT_KILL_FOCUS( VisualizationWindow::OnKillFocus ) VisualizationWindow::VisualizationWindow( wxWindow *parent ) : wxFrame( parent,wxID_ANY,wxT("Visualization Window"), wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE&~wxCLOSE_BOX ) { graphForm_ = 0; threeDPlotForm_ = 0; figureForm_ = 0; textForm_ = 0; peakFindForm_ = 0; textToPlace_ = 0; setAspectRatioForm_ = 0; ExGlobals::SetVisualizationWindow( this ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/VisualizationWindow/UPPERLEFTX"), 10l ); int uly = config->Read( wxT("/VisualizationWindow/UPPERLEFTY"), 10l ); int width = config->Read( wxT("/VisualizationWindow/WIDTH"), 700l ); int height = config->Read( wxT("/VisualizationWindow/HEIGHT"), 500l ); double aspectRatio; config->Read( wxT("/VisualizationWindow/ASPECTRATIO"), &aspectRatio, ExGlobals::GetAspectRatio() ); //SetSize( ulx, uly, std::max(400,width), std::max(250,height) ); SetSize( ulx, uly, width, height ); wxMenu *fileMenu = new wxMenu(); wxMenu *importMenu = new wxMenu(); importMenu->Append( ID_importPNG, wxT("PNG"), wxT("import a PNG file") ); //importMenu->Enable( ID_importPNG, false ); importMenu->Append( ID_importJPEG, wxT("JPEG"), wxT("import a JPEG file") ); //importMenu->Enable( ID_importJPEG, false ); fileMenu->Append( wxID_ANY, wxT("Import"), importMenu, wxT("import a graphics file") ); wxMenu *saveMenu = new wxMenu(); saveMenu->Append( ID_savePS, wxT("PostScript"), wxT("save the graphics to a PostScript file") ); saveMenu->Append( ID_savePNG, wxT("PNG"), wxT("save the graphics to a PNG file") ); saveMenu->Append( ID_saveJPEG, wxT("JPEG"), wxT("save the graphics to a JPEG file") ); fileMenu->Append( wxID_ANY, wxT("Save drawing"), saveMenu, wxT("save the graphics to a file") ); fileMenu->Append( ID_print, wxT("Print"), wxT("send graphics to a printer") ); wxMenu *drawingMenu = new wxMenu(); wxMenu *clearMenu = new wxMenu(); clearMenu->Append( ID_clearGraphicsPage, wxT("Clear graphics page"), wxT("clear the graphics page") ); clearMenu->Append( ID_clearWindow, wxT("Clear current window"), wxT("clear the current window") ); drawingMenu->Append( wxID_ANY, wxT("Clear"), clearMenu, wxT("clear the graphics") ); drawingMenu->Append( ID_drawGraph, wxT("Draw a graph"), wxT("draw a graph") ); drawingMenu->Append( ID_3DPlot, wxT("Draw a 3D graph"), wxT("draw a 3D graph") ); drawingMenu->Append( ID_drawFigure, wxT("Draw a figure"), wxT("draw a figure") ); drawingMenu->Append( ID_drawText, wxT("Draw text"), wxT("draw text") ); wxMenu *replotMenu = new wxMenu(); replotMenu->Append( ID_replotAll, wxT("Replot all windows"), wxT("replot all windows") ); replotMenu->Append( ID_replotCurrent, wxT("Replot current window"), wxT("replot just the current window") ); drawingMenu->Append( wxID_ANY, wxT("Replot"), replotMenu, wxT("replot the graphics") ); wxMenu *zerolinesMenu = new wxMenu(); zerolinesMenu->Append( ID_zerolinesH, wxT("Horizontal"), wxT("draw horizontal line through (0,0)") ); zerolinesMenu->Append( ID_zerolinesV, wxT("Vertical"), wxT("draw vertical line through (0,0)") ); zerolinesMenu->Append( ID_zerolinesB, wxT("Both"), wxT("draw horizontal and vertical lines through (0,0)") ); drawingMenu->Append( wxID_ANY, wxT("Draw zerolines"), zerolinesMenu, wxT("draw lines through (0,0)") ); wxMenu *setupMenu = new wxMenu(); setupMenu->Append( ID_resetDefaults, wxT("Reset extrema defaults"), wxT("reset program defaults") ); setupMenu->Append( ID_configureWindow, wxT("Configure subwindow"), wxT("configure graphics subwindow") ); setupMenu->Enable( ID_configureWindow, false ); setupMenu->Append( ID_aspectRatio, wxT("Set the graphics page aspect ratio"), wxT("set graphics page aspect ratio") ); setupMenu->Enable( ID_aspectRatio, false ); wxMenu *pagesMenu = new wxMenu(); pagesMenu->Append( ID_newPage, wxT("New page"), wxT("make new graphics page") ); pagesMenu->Append( ID_removePage, wxT("Remove last page"), wxT("remove the last graphcis page") ); wxMenuBar *menuBar = new wxMenuBar(); menuBar->Append( fileMenu, wxT("&File") ); menuBar->Append( drawingMenu, wxT("&Drawing") ); menuBar->Append( setupMenu, wxT("&Setup") ); menuBar->Append( pagesMenu, wxT("&Pages") ); SetMenuBar( menuBar ); // for a vertical sizer: // proportion = 0 means no vertical expansion // proportion > 0 allows for vertical expansion // Expand() allows for horizontal expansion wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); visualizationSpeedButtonPanel_ = new VisualizationSpeedButtonPanel(this); sizer->Add( visualizationSpeedButtonPanel_, wxSizerFlags(0).Expand().Border(wxALL,1) ); double ratio = static_cast(height)/static_cast(width); ratio > aspectRatio ? height = static_cast(aspectRatio*width+0.5) : width = static_cast(height/aspectRatio+0.5); notebook_ = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_RIGHT ); sizer->Add( notebook_, wxSizerFlags(1).Expand().Center().Border(wxALL,5) ); SetSizer( sizer ); GraphicsPage *page = new GraphicsPage(notebook_); statusBar_ = new MyStatusBar( this ); SetStatusBar( statusBar_ ); ExGlobals::SetMonitorLimits( 0, 0, width, height ); ExGlobals::SetAspectRatio( aspectRatio ); page->ResetWindows(); wxClientDC dc( page ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); // Show the window. // Frames, unlike simple controls, are not shown when created initially. Show( true ); } void VisualizationWindow::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/VisualizationWindow/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/VisualizationWindow/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/VisualizationWindow/WIDTH"), static_cast(width) ); config->Write( wxT("/VisualizationWindow/HEIGHT"), static_cast(height) ); config->Write( wxT("/VisualizationWindow/ASPECTRATIO"), ExGlobals::GetAspectRatio() ); } Destroy(); } void VisualizationWindow::RefreshGraphics() { static_cast(notebook_->GetCurrentPage())->RefreshGraphics(); } void VisualizationWindow::ClearWindows() { // destroy all drawableObjects in all graph windows on the current page // static_cast(notebook_->GetCurrentPage())->ClearWindows(); wxClientDC dc( notebook_->GetCurrentPage() ); static_cast(notebook_->GetCurrentPage())-> DisplayBackgrounds( ExGlobals::GetGraphicsOutput(), dc ); } void VisualizationWindow::ReplotAllWindows() { static_cast(notebook_->GetCurrentPage())->ReplotAllWindows(); } void VisualizationWindow::ReplotCurrentWindow( bool repaint ) { static_cast(notebook_->GetCurrentPage())->ReplotCurrentWindow(repaint); } void VisualizationWindow::DisplayBackgrounds( GRA_wxWidgets *graphicsOutput, wxDC &dc ) { static_cast(notebook_->GetCurrentPage())->DisplayBackgrounds( graphicsOutput, dc ); } void VisualizationWindow::SetInteractiveText( GRA_drawableText *dt ) { static_cast(notebook_->GetCurrentPage())->SetTextPlacementMode( dt ); SetFocus(); Raise(); // std::vector lines; lines.push_back( wxString(wxT("text: "))+dt->GetString() ); lines.push_back( wxT(" ") ); lines.push_back( wxT("click in the visualization window to place the string") ); ExGlobals::ShowHint( lines ); } void VisualizationWindow::SaveBitmap( int xmin, int ymin, int xmax, int ymax, wxString const &filename, int type ) { GRA_wxWidgets ps( xmin, ymin, xmax, ymax ); wxBitmap tempBM( xmax-xmin, ymax-ymin ); wxMemoryDC dc; dc.SelectObject( tempBM ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); dc.StartDoc( wxT("produced by EXTREMA") ); try { static_cast(notebook_->GetCurrentPage())->DrawGraphWindows(&ps,dc); } catch ( EGraphicsError const &e ) { throw; } dc.EndDoc(); wxImage image( tempBM.ConvertToImage() ); image.SaveFile( filename, type ); } void VisualizationWindow::SavePS( wxString const &filename ) { try { static_cast(notebook_->GetCurrentPage())->SavePS( filename ); } catch ( EGraphicsError const &e ) { throw; } } void VisualizationWindow::ResetPages() { GraphicsPage *currentPage = static_cast(notebook_->GetCurrentPage()); Layout(); wxSize size( notebook_->GetClientSize() ); // // the 50 below takes care of the width of the tab on the notebook int width = size.GetWidth() - 50; int height = size.GetHeight(); double ratio = static_cast(height)/static_cast(width); double aspectRatio = ExGlobals::GetAspectRatio(); ratio > aspectRatio ? height = static_cast(aspectRatio*width+0.5) : width = static_cast(height/aspectRatio+0.5); ExGlobals::SetMonitorLimits( 0, 0, width, height ); notebook_->SetClientSize( width+50, height ); int nPages = notebook_->GetPageCount(); for( int i=0; iGetPage(i)->SetClientSize( width, height ); //static_cast(notebook_->GetPage(i))->Paint(); } currentPage->Paint(); SetPage( currentPage ); } void VisualizationWindow::ClearAllPages() { for( int i=0; iGetPageCount(); ++i ) { static_cast(notebook_->GetPage(i))->ClearWindows(); wxClientDC dc( notebook_->GetPage(i) ); dc.SetBackground( wxBrush(wxT("WHITE"),wxSOLID) ); dc.Clear(); } } void VisualizationWindow::ResetWindows() { for( int i=0; iGetPageCount(); ++i ) static_cast(notebook_->GetPage(i))->ResetWindows(); } int VisualizationWindow::GetNumberOfPages() { return notebook_->GetPageCount(); } wxWindow *VisualizationWindow::GetPage() { return notebook_->GetCurrentPage(); } GraphicsPage *VisualizationWindow::GetPage( int n ) { return static_cast(notebook_->GetPage(n-1)); } void VisualizationWindow::MakeFirstPage() { new GraphicsPage(notebook_); } void VisualizationWindow::DeleteAllPages() { notebook_->DeleteAllPages(); } void VisualizationWindow::SetWindowNumber( int n ) { static_cast(notebook_->GetCurrentPage())->SetWindowNumber(n); } int VisualizationWindow::GetWindowNumber() { return static_cast(notebook_->GetCurrentPage())->GetWindowNumber(); } int VisualizationWindow::GetNumberOfWindows() { return static_cast(notebook_->GetCurrentPage())->GetNumberOfWindows(); } std::vector &VisualizationWindow::GetGraphWindows() { return static_cast(notebook_->GetCurrentPage())->GetGraphWindows(); } GRA_window *VisualizationWindow::GetGraphWindow() { return static_cast(notebook_->GetCurrentPage())->GetGraphWindow(); } GRA_window *VisualizationWindow::GetGraphWindow( int n ) { return static_cast(notebook_->GetCurrentPage())->GetGraphWindow(n); } GRA_window *VisualizationWindow::GetGraphWindow( double x, double y ) { return static_cast(notebook_->GetCurrentPage())->GetGraphWindow(x,y); } void VisualizationWindow::AddGraphWindow( GRA_window *gw ) { static_cast(notebook_->GetCurrentPage())->AddGraphWindow(gw); } void VisualizationWindow::DrawGraphWindows( GRA_wxWidgets *output, wxDC &dc ) { static_cast(notebook_->GetCurrentPage())->DrawGraphWindows(output,dc); } void VisualizationWindow::OnClearGraphicsPage( wxCommandEvent &WXUNUSED(event) ) { wxWindow *page = notebook_->GetCurrentPage(); wxClientDC dc( page ); dc.Clear(); static_cast(page)->ClearWindows(); static_cast(page)->DisplayBackgrounds( ExGlobals::GetGraphicsOutput(), dc ); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("CLEAR") ); } void VisualizationWindow::OnClearWindow( wxCommandEvent &WXUNUSED(event) ) { GRA_window *gw = static_cast(notebook_->GetCurrentPage())->GetGraphWindow(); gw->Erase(); gw->Clear(); static_cast(notebook_->GetCurrentPage())->Paint(); } void VisualizationWindow::OnReplotAll( wxCommandEvent &WXUNUSED(event) ) { GraphicsPage *graphicsPage = static_cast(notebook_->GetCurrentPage()); bool nothingToReplot = true; std::size_t numWindows = graphicsPage->GetNumberOfWindows(); for( std::size_t i=0; iGetGraphWindow(i)->GetDrawableObjects().empty() ) { nothingToReplot = false; break; } } if( nothingToReplot ) { wxMessageBox( wxT("there is nothing to replot in any window"), wxT("warning"), wxOK|wxICON_ERROR ); return; } try { graphicsPage->ReplotAllWindows(); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnReplotCurrent( wxCommandEvent &WXUNUSED(event) ) { GraphicsPage *graphicsPage = static_cast(notebook_->GetCurrentPage()); if( graphicsPage->GetGraphWindow()->GetDrawableObjects().empty() ) { wxMessageBox( wxT("there is nothing to replot in the current window"), wxT("error"), wxOK|wxICON_ERROR ); return; } try { graphicsPage->ReplotCurrentWindow( true ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnSize( wxSizeEvent &event ) { SetSize( event.GetSize() ); ResetPages(); } void VisualizationWindow::OnImportPNG( wxCommandEvent &WXUNUSED(event) ) { wxString wildcard( wxT("PNG (*.png)|*.png") ); wxFileDialog *fd = new wxFileDialog( this, wxT("Choose a PNG file"), wxT(""), wxT(""), wildcard, wxFD_OPEN|wxFD_FILE_MUST_EXIST|wxFD_CHANGE_DIR|wxFD_PREVIEW ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; // // open the png file and open a window to display it in // wxImage image( filename, wxBITMAP_TYPE_PNG ); ImportForm *importForm = new ImportForm( this, image ); } void VisualizationWindow::OnImportJPEG( wxCommandEvent &WXUNUSED(event) ) { wxString wildcard( wxT("JPEG and JPG (*.jpeg;*.jpg)|*.jpeg;*.jpg") ); wxFileDialog *fd = new wxFileDialog( this, wxT("Choose a JPEG file"), wxT(""), wxT(""), wildcard, wxFD_OPEN|wxFD_FILE_MUST_EXIST|wxFD_CHANGE_DIR|wxFD_PREVIEW ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; // wxString ext( ExGlobals::GetFileExtension(filename).MakeUpper() ); // // open the file and open a window to display it in // wxImage image( filename, wxBITMAP_TYPE_JPEG ); ImportForm *importForm = new ImportForm( this, image ); } void VisualizationWindow::OnSavePS( wxCommandEvent &WXUNUSED(event) ) { wxString wildcard( wxT("PostScript (*.eps)|*.eps") ); wxFileDialog *fd = new wxFileDialog( this, wxT("Choose an output file"), wxT(""), wxT(""), wildcard, wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; if( filename.find_last_of(wxT('.')) == filename.npos )filename += wxT(".eps"); std::ofstream outFile; outFile.open( filename.mb_str(wxConvUTF8), std::ios_base::out ); if( !outFile.is_open() ) { wxMessageBox( wxString(wxT("unable to open "))+filename, wxT("error"), wxOK|wxICON_ERROR ); return; } outFile.close(); try { static_cast(notebook_->GetCurrentPage())->SavePS( filename ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnSavePNG( wxCommandEvent &WXUNUSED(event) ) { wxString wildcard( wxT("PNG (*.png)|*.png") ); wxFileDialog *fd = new wxFileDialog( this, wxT("Choose an output file"), wxT(""), wxT(""), wildcard, wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; if( filename.find_last_of(wxT('.')) == filename.npos )filename += wxT(".png"); std::ofstream outFile; outFile.open( filename.mb_str(wxConvUTF8), std::ios_base::out ); if( !outFile.is_open() ) { wxMessageBox( wxString(wxT("unable to open "))+filename, wxT("error"), wxOK|wxICON_ERROR ); return; } outFile.close(); try { int xminM, yminM, xmaxM, ymaxM; ExGlobals::GetMonitorLimits( xminM, yminM, xmaxM, ymaxM ); SaveBitmap( xminM, yminM, xmaxM, ymaxM, filename, wxBITMAP_TYPE_PNG ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnSaveJPEG( wxCommandEvent &WXUNUSED(event) ) { wxString wildcard( wxT("JPEG (*.jpeg)|*.jpeg") ); wxFileDialog *fd = new wxFileDialog( this, wxT("Choose an output file"), wxT(""), wxT(""), wildcard, wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR ); if( fd->ShowModal() != wxID_OK )return; wxString filename( fd->GetFilename() ); if( filename.empty() )return; if( filename.find_last_of(wxT('.')) == filename.npos )filename += wxT(".jpeg"); std::ofstream outFile; outFile.open( filename.mb_str(wxConvUTF8), std::ios_base::out ); if( !outFile.is_open() ) { wxMessageBox( wxString(wxT("unable to open "))+filename, wxT("error"), wxOK|wxICON_ERROR ); return; } outFile.close(); try { int xminM, yminM, xmaxM, ymaxM; ExGlobals::GetMonitorLimits( xminM, yminM, xmaxM, ymaxM ); SaveBitmap( xminM, yminM, xmaxM, ymaxM, filename, wxBITMAP_TYPE_JPEG ); } catch ( EGraphicsError const &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnPrint( wxCommandEvent &event ) { visualizationSpeedButtonPanel_->OnPrintDrawing( event ); } void VisualizationWindow::OnNewPage( wxCommandEvent &WXUNUSED(event) ) { new GraphicsPage(notebook_); } void VisualizationWindow::OnRemovePage( wxCommandEvent &WXUNUSED(event) ) { int nPages = notebook_->GetPageCount(); if( nPages > 1 )notebook_->RemovePage( nPages-1 ); } void VisualizationWindow::NewPage( int n ) { // this function is only called for n > maxPage // int maxPage = notebook_->GetPageCount(); int i = maxPage-1; while( ++i < n ) { new GraphicsPage(notebook_); } } void VisualizationWindow::SetPage( int n ) { #if wxMINOR_VERSION < 8 notebook_->SetSelection( n-1 ); #else notebook_->ChangeSelection( n-1 ); #endif } void VisualizationWindow::SetPage( GraphicsPage *p ) { int np = notebook_->GetPageCount(); for( int i=0; iGetPage(i) == p ) { SetPage(i+1); return; } } } void VisualizationWindow::InheritPage( int m ) { static_cast(notebook_->GetCurrentPage())-> InheritFrom( static_cast(notebook_->GetPage(m-1)) ); } void VisualizationWindow::ZeroGraphForm() { graphForm_ = 0; } GraphForm *VisualizationWindow::GetGraphForm() { return graphForm_; } void VisualizationWindow::SetGraphForm( GraphForm *graphForm ) { graphForm_ = graphForm; } void VisualizationWindow::ZeroThreeDPlotForm() { threeDPlotForm_ = 0; } ThreeDPlotForm *VisualizationWindow::GetThreeDPlotForm() { return threeDPlotForm_; } void VisualizationWindow::SetThreeDPlotForm( ThreeDPlotForm *threeDPlotForm ) { threeDPlotForm_ = threeDPlotForm; } void VisualizationWindow::ZeroFigureForm() { figureForm_ = 0; } FigureForm *VisualizationWindow::GetFigureForm() { return figureForm_; } void VisualizationWindow::SetFigureForm( FigureForm *figureForm ) { figureForm_ = figureForm; } void VisualizationWindow::ZeroTextForm() { textForm_ = 0; } TextForm *VisualizationWindow::GetTextForm() { return textForm_; } void VisualizationWindow::SetTextForm( TextForm *textForm ) { textForm_ = textForm; } MyStatusBar *VisualizationWindow::GetStatusBar() { return statusBar_; } void VisualizationWindow::ZeroPeakFindForm() { peakFindForm_ = 0; } void VisualizationWindow::ZeroSetAspectRatioForm() { setAspectRatioForm_ = 0; } void VisualizationWindow::OnPeakFind( wxCommandEvent &WXUNUSED(event) ) { if( peakFindForm_ )peakFindForm_->Raise(); else { peakFindForm_ = new PeakFindForm( this ); peakFindForm_->Show(); } } void VisualizationWindow::OnDrawGraph( wxCommandEvent &WXUNUSED(event) ) { if( graphForm_ )graphForm_->Raise(); else { graphForm_ = new GraphForm( this ); graphForm_->Show(); } } void VisualizationWindow::On3DPlot( wxCommandEvent &WXUNUSED(event) ) { if( threeDPlotForm_ )threeDPlotForm_->Raise(); else { threeDPlotForm_ = new ThreeDPlotForm( this ); threeDPlotForm_->Show(); } } void VisualizationWindow::OnDrawFigure( wxCommandEvent &WXUNUSED(event) ) { if( figureForm_ )figureForm_->Raise(); else { figureForm_ = new FigureForm( this ); figureForm_->Show(); } } void VisualizationWindow::OnDrawText( wxCommandEvent &WXUNUSED(event) ) { if( textForm_ )textForm_->Raise(); else { textForm_ = new TextForm( this ); textForm_->Show(); } } void VisualizationWindow::OnZerolinesH( wxCommandEvent &WXUNUSED(event) ) { try { ExGlobals::GetGraphWindow()->DrawZerolines( true, false ); } catch ( EGraphicsError &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnZerolinesV( wxCommandEvent &WXUNUSED(event) ) { try { ExGlobals::GetGraphWindow()->DrawZerolines( false, true ); } catch ( EGraphicsError &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnZerolinesB( wxCommandEvent &WXUNUSED(event) ) { try { ExGlobals::GetGraphWindow()->DrawZerolines( true, true ); } catch ( EGraphicsError &e ) { wxMessageBox( wxString(e.what(),wxConvUTF8), wxT("error"), wxOK|wxICON_ERROR ); return; } } void VisualizationWindow::OnResetDefaults( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::GetGraphWindow()->SetDefaults(); } void VisualizationWindow::OnConfigureWindow( wxCommandEvent &WXUNUSED(event) ) {} void VisualizationWindow::OnSetAspectRatio( wxCommandEvent &WXUNUSED(event) ) { if( setAspectRatioForm_ )setAspectRatioForm_->Raise(); else { setAspectRatioForm_ = new SetAspectRatioForm( this ); setAspectRatioForm_->Show(); } } std::ostream &operator<<( std::ostream &out, VisualizationWindow const *vw ) { int ulx, uly; vw->GetPosition( &ulx, &uly ); int width, height; vw->GetSize( &width, &height ); out << "notebook_->GetSelection() << "\"/>\n"; return out; } BEGIN_EVENT_TABLE( MyStatusBar, wxStatusBar ) EVT_BUTTON( ID_changeUnits, MyStatusBar::OnChangeUnits ) EVT_SIZE( MyStatusBar::OnSize ) END_EVENT_TABLE() MyStatusBar::MyStatusBar( VisualizationWindow *parent ) : wxStatusBar( (wxWindow*)parent, wxID_ANY ) { unitsType_ = 0; units_[0] = wxT("graph units"); units_[1] = wxT("world units"); units_[2] = wxT("percentages"); units_[3] = wxT("pixels"); int widths[] = { 150, -1, -1 }; SetFieldsCount( 3, widths ); int sbStyles[3]; sbStyles[0] = wxSB_FLAT; sbStyles[1] = wxSB_NORMAL; sbStyles[2] = wxSB_NORMAL; SetStatusStyles( 3, sbStyles ); unitsButton_ = new wxButton( this, ID_changeUnits, units_[0] ); wxFont f( unitsButton_->GetFont() ); f.SetPointSize( 7 ); unitsButton_->SetFont( f ); SetButtonSize(); } int MyStatusBar::GetUnitsType() { return unitsType_; } void MyStatusBar::OnChangeUnits( wxCommandEvent &WXUNUSED(event) ) { if( ++unitsType_ == 4 )unitsType_ = 0; unitsButton_->SetLabel( units_[unitsType_] ); } void MyStatusBar::OnSize( wxSizeEvent &WXUNUSED(event) ) { SetButtonSize(); } void MyStatusBar::SetButtonSize() { wxRect rect; GetFieldRect( 0, rect ); unitsButton_->SetSize( rect.x, rect.y-1, rect.width, rect.height+2 ); } // end of file extrema-4.4.5/src/wxForms/ChooseFilePanel.h0000644012702201742730000000306111274636606017627 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_CHOOSEFILEPANEL #define EXTREMA_CHOOSEFILEPANEL #include #include "wx/wx.h" class ChooseFilePanel : public wxPanel { public: ChooseFilePanel( wxWindow *, bool, wxString const &, wxString const & ); void GetFilenames( wxConfigBase *, wxString const & ); void SaveFilenames( wxConfigBase *, wxString const & ); wxString GetSelection(); void SetFile( wxString const & ); // event handlers void OnChooseFile( wxCommandEvent & ); void OnClearList( wxCommandEvent & ); void OnRemoveFilename( wxCommandEvent& ); private: wxComboBox *filenameComboBox_; bool read_; wxString message_, fileType_; void RemoveFilename(); enum { ID_chooseFile, ID_clearList, ID_removeFilename }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ReadVectorsForm.cpp0000644012702201742730000007113411274636606020235 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "wx/filename.h" #include "ReadVectorsForm.h" #include "ChooseFilePanel.h" #include "AnalysisWindow.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "TextVariable.h" #include "EVariableError.h" #include "ExGlobals.h" #include "CMD_read.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ReadVectorsForm, wxFrame ) EVT_BUTTON( wxID_APPLY, ReadVectorsForm::OnApply ) EVT_BUTTON( wxID_CLOSE, ReadVectorsForm::OnClose ) EVT_GRID_CELL_CHANGE( ReadVectorsForm::OnCellChange ) EVT_CHECKBOX( ID_makeNew, ReadVectorsForm::OnMakeNew ) EVT_CHECKBOX( ID_stopOnError, ReadVectorsForm::OnErrorStop ) EVT_CHECKBOX( ID_errorFill, ReadVectorsForm::OnErrorFill ) EVT_CHECKBOX( ID_lineRange, ReadVectorsForm::OnLineRange ) EVT_CHECKBOX( ID_format, ReadVectorsForm::OnFormat ) EVT_CLOSE( ReadVectorsForm::CloseEventHandler ) END_EVENT_TABLE() ReadVectorsForm::ReadVectorsForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Read vectors"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, true, wxT("Choose a data file for reading"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); wxPanel *gridPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *gridSizer = new wxBoxSizer( wxHORIZONTAL ); // create the vector name/column grid // column 0 is "vector name", column 1 is "column number" vectorGrid_ = new wxGrid( gridPanel, wxID_ANY, wxDefaultPosition, wxSize(375,250), wxSUNKEN_BORDER|wxVSCROLL ); vectorGrid_->CreateGrid( 100, 2 ); vectorGrid_->SetColFormatNumber( 1 ); vectorGrid_->SetColLabelValue( 0, wxT("vector name") ); vectorGrid_->SetColLabelValue( 1, wxT("column") ); vectorGrid_->SetColSize( 0, 210 ); vectorGrid_->SetColSize( 1, 60 ); gridSizer->Add( vectorGrid_, wxSizerFlags(0).Border(wxALL,2) ); gridPanel->SetSizer( gridSizer ); mainSizer->Add( gridPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *leftPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *leftSizer = new wxBoxSizer( wxVERTICAL ); closeBefore_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Close file before reading") ); leftSizer->Add( closeBefore_, wxSizerFlags(0).Border(wxALL,5).Border(wxLEFT|wxRIGHT|wxBOTTOM,2) ); closeBefore_->SetValue( true ); closeAfter_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Close file after reading") ); leftSizer->Add( closeAfter_, wxSizerFlags(0).Border(wxALL,2) ); closeAfter_->SetValue( true ); leftSizer->Add( new wxStaticLine(leftPanel), wxSizerFlags(0).Expand().Border(wxALL,1) ); makeNew_ = new wxCheckBox( leftPanel, ID_makeNew, wxT("Create new vectors") ); leftSizer->Add( makeNew_, wxSizerFlags(0).Border(wxALL,2) ); append_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Append data") ); leftSizer->Add( append_, wxSizerFlags(0).Border(wxALL,2) ); leftSizer->Add( new wxStaticLine(leftPanel), wxSizerFlags(0).Expand().Border(wxALL,2) ); errorStop_ = new wxCheckBox( leftPanel, ID_stopOnError, wxT("Stop on error") ); leftSizer->Add( errorStop_, wxSizerFlags(0).Border(wxALL,2) ); errorStop_->SetValue( true ); wxPanel *errorFillPanel = new wxPanel( leftPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *errorFillSizer = new wxBoxSizer( wxHORIZONTAL ); errorFill_ = new wxCheckBox( errorFillPanel, ID_errorFill, wxT("Error fill") ); errorFillSizer->Add( errorFill_, wxSizerFlags(0).Border(wxALL,2) ); errorFillTextCtrl_ = new wxTextCtrl( errorFillPanel, wxID_ANY ); errorFillTextCtrl_->SetValue( wxT("0.0") ); errorFillSizer->Add( errorFillTextCtrl_, wxSizerFlags(0).Border(wxALL,2) ); errorFillTextCtrl_->Enable( false ); errorFillPanel->SetSizer( errorFillSizer ); leftSizer->Add( errorFillPanel, wxSizerFlags(0).Border(wxALL,2) ); leftSizer->Add( new wxStaticLine(leftPanel), wxSizerFlags(0).Expand().Border(wxALL,2) ); messages_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Display messages") ); leftSizer->Add( messages_, wxSizerFlags(0).Border(wxALL,2) ); messages_->SetValue( true ); leftPanel->SetSizer( leftSizer ); midSizer->Add( leftPanel, wxSizerFlags(0).Border(wxALL,1) ); wxPanel *rightPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *rightSizer = new wxBoxSizer( wxVERTICAL ); lineRange_ = new wxCheckBox( rightPanel, ID_lineRange, wxT("Use line range") ); rightSizer->Add( lineRange_, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *midRightPanel = new wxPanel( rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *midRightSizer = new wxGridSizer( 3, 2, 0, 0 ); firstLineText_ = new wxStaticText( midRightPanel, wxID_ANY, wxT("First line to read"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); midRightSizer->Add( firstLineText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); firstLineTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); firstLineTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( firstLineTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); lastLineText_ = new wxStaticText( midRightPanel, wxID_ANY, wxT("Last line to read"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); midRightSizer->Add( lastLineText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); lastLineTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); lastLineTextCtrl_->SetValue( wxT("") ); midRightSizer->Add( lastLineTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); incrementText_ = new wxStaticText( midRightPanel, wxID_ANY, wxT("Increment"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); midRightSizer->Add( incrementText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); incrementTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); incrementTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( incrementTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); midRightPanel->SetSizer( midRightSizer ); rightSizer->Add( midRightPanel, wxSizerFlags(0).Border(wxALL,1) ); firstLineTextCtrl_->Enable( false ); lastLineTextCtrl_->Enable( false ); incrementTextCtrl_->Enable( false ); firstLineText_->Enable( false ); lastLineText_->Enable( false ); incrementText_->Enable( false ); rightSizer->Add( new wxStaticLine(rightPanel), wxSizerFlags(0).Expand().Border(wxALL,10) ); format_ = new wxCheckBox( rightPanel, ID_format, wxT("Use format") ); rightSizer->Add( format_, wxSizerFlags(0).Center().Border(wxALL,1) ); formatTextCtrl_ = new wxTextCtrl( rightPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(175,25) ); rightSizer->Add( formatTextCtrl_, wxSizerFlags(0).Center().Border(wxALL,10) ); formatTextCtrl_->Enable( false ); rightPanel->SetSizer( rightSizer ); midSizer->Add( rightPanel, wxSizerFlags(0).Border(wxALL,10) ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( (wxWindow*)this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("read data from the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/ReadVectorsForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/ReadVectorsForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/ReadVectorsForm/WIDTH"), 550l ); int height = config->Read( wxT("/ReadVectorsForm/HEIGHT"), 620l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/ReadVectorsForm") ); Show( true ); } void ReadVectorsForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ReadVectorsForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ReadVectorsForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ReadVectorsForm/WIDTH"), static_cast(width) ); config->Write( wxT("/ReadVectorsForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/ReadVectorsForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroLoadVectors(); Destroy(); } void ReadVectorsForm::OnCellChange( wxGridEvent &WXUNUSED(event) ) { if( vectorGrid_->GetGridCursorCol() == 0 ) { int row = vectorGrid_->GetGridCursorRow(); wxString s; vectorGrid_->SetCellValue( row, 1, s<<(row+1) ); } } void ReadVectorsForm::OnMakeNew( wxCommandEvent &WXUNUSED(event) ) { append_->Enable( !makeNew_->IsChecked() ); } void ReadVectorsForm::OnErrorStop( wxCommandEvent &WXUNUSED(event) ) { errorFill_->Enable( !errorStop_->IsChecked() ); errorFillTextCtrl_->Enable( errorFill_->IsEnabled() ); } void ReadVectorsForm::OnErrorFill( wxCommandEvent &WXUNUSED(event) ) { errorFillTextCtrl_->Enable( errorFill_->IsChecked() ); format_->Enable( !errorFill_->IsEnabled() ); formatTextCtrl_->Enable( !errorFill_->IsEnabled() ); } void ReadVectorsForm::OnLineRange( wxCommandEvent &WXUNUSED(event) ) { bool const lrc = lineRange_->IsChecked(); firstLineTextCtrl_->Enable( lrc ); lastLineTextCtrl_->Enable( lrc ); incrementTextCtrl_->Enable( lrc ); firstLineText_->Enable( lrc ); lastLineText_->Enable( lrc ); incrementText_->Enable( lrc ); } void ReadVectorsForm::OnFormat( wxCommandEvent &WXUNUSED(event) ) { formatTextCtrl_->Enable( format_->IsChecked() ); } void ReadVectorsForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_read *readCommand = CMD_read::Instance(); bool newFile = (readCommand->GetFilename() != fileName); std::ifstream *inStream = readCommand->GetStream(); if( inStream->is_open() && (closeBefore_->IsChecked() || newFile) )inStream->close(); if( !inStream->is_open() ) { inStream->clear( std::ios::goodbit ); inStream->open( fileName.mb_str(wxConvUTF8), std::ios_base::in ); if( !inStream->is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } readCommand->SetReadInFilename( fileName ); // wxFileName wxfn( fileName ); ExGlobals::SetCurrentPath( wxfn.GetPath() ); // std::vector names; std::vector columnNumbers; int numberOfNames = vectorGrid_->GetNumberRows(); int maxColumnNumber = 0; for( int i=0; iGetCellValue(i,0) ); if( name.empty() )break; // // determine if the vector name has a field count prefix // names.push_back( name ); wxString colm( vectorGrid_->GetCellValue(i,1) ); if( colm.empty() || format_->IsChecked() )columnNumbers.push_back(i+1); else { long ltmp; if( !colm.ToLong(<mp) || ltmp<1L ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("column number must be an integer > 0"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } columnNumbers.push_back( static_cast(ltmp) ); if( maxColumnNumber < columnNumbers.back() )maxColumnNumber = columnNumbers.back(); } } if( names.empty() ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("expecting some output vector names"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } numberOfNames = names.size(); if( numberOfNames > 100 ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("Maximum number of vectors that can be read is 100"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } std::vector< std::vector > data( maxColumnNumber ); std::vector nloc( numberOfNames, 0 ); // number of values to read for( std::size_t j=0; jGetVariable( names[j] ); if( tv ) // text variable exists already { TVariableTable::GetTable()->RemoveEntry( names[j] ); continue; } NumericVariable *nv = NVariableTable::GetTable()->GetVariable( names[j] ); if( nv ) // variable already exists { if( makeNew_->IsChecked() || nv->GetData().GetNumberOfDimensions()!=1 ) NVariableTable::GetTable()->RemoveEntry( nv ); else { nloc[j] = nv->GetData().GetDimMag(0); if( append_->IsChecked() ) data[j].assign( nv->GetData().GetData().begin(), nv->GetData().GetData().end() ); } } } std::vector fill( numberOfNames, true ); // int startingLine = 1; int lastLine = -1; int increment = 1; wxString stmp; long ltmp; if( lineRange_->IsChecked() ) { stmp = firstLineTextCtrl_->GetValue(); if( !stmp.ToLong(<mp) || ltmp<1L ) { firstLineTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("first line must be > 0"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } startingLine = static_cast(ltmp); stmp = lastLineTextCtrl_->GetValue(); if( !stmp.empty() ) { if( !stmp.ToLong(<mp) ) { lastLineTextCtrl_->SetValue( wxT("") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for last line"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } lastLine = static_cast(ltmp); if( lastLine < startingLine ) { lastLineTextCtrl_->SetValue( wxT("") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("last line must be >= first line"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } stmp = incrementTextCtrl_->GetValue(); if( !stmp.ToLong(<mp) || ltmp<1L ) { incrementTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("increment must be > 0"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } increment = static_cast(ltmp); } double errorFillValue = readCommand->GetErrorFill(); if( errorFill_->IsChecked() ) { stmp = errorFillTextCtrl_->GetValue(); if( !stmp.ToDouble(&errorFillValue) ) { errorFillTextCtrl_->SetValue( wxT("0.0") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for error fill"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } readCommand->SetErrorFill( errorFillValue ); } // // read in the initial dummy records // int last = startingLine+1; // last record read + 1 // // there could only be initial dummy records if a line range was specified // and line ranges can only be on files with a record structure // unsigned int recordNumber = 0; for( int i=1; iclose(); wxMessageDialog *md = new wxMessageDialog( this, wxT("end of file reached reading initial dummy records"), wxT("Fatal error: no vectors were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } // // finally ready to read some data // std::string const blank( ", \t" ); if( errorFill_->IsChecked() ) { int const Classes[128] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; int const StateTable[7][3] = { // blnk , othr { 1, 2, 3 }, { 1, 2, 3 }, { 4, 6, 3 }, { 5, 7, 3 }, { 5, 7, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; for( int j=1;; ++j ) { ++recordNumber; std::string sc; sc.clear(); if( std::getline(*inStream,sc).fail() )break; if( sc.empty() )continue; // the record is empty, nothing on the line std::vector reals( maxColumnNumber, 0.0 ); std::vector itype( maxColumnNumber, 0 ); std::vector strings( maxColumnNumber ); int nf = -1; unsigned int newState = 1; unsigned int currentState = 0; bool flag = true; std::size_t scLen = sc.size(); for( std::size_t k=0; k> d ) { itype[nf] = 1; reals[nf] = d; } if( nf == maxColumnNumber-1 ) { flag = false; break; } } } if( flag ) { itype[++nf] = 2; double d; if( std::istringstream( strings[nf].mb_str(wxConvUTF8).release() ) >> d ) { itype[nf] = 1; reals[nf] = d; } } bool stopReading = false; if( nf >= 0 ) { for( std::size_t k=0; kIsChecked() ) { wxString c( wxT("field ") ); c << k+1 << wxT(", record ") << recordNumber << wxT(" set to Error Fill value, file: ") << fileName; ExGlobals::WarningMessage( c ); } } else data[k].push_back( reals[columnNumbers[k]-1] ); if( data[k].size()==nloc[k] && !makeNew_->IsChecked() && !append_->IsChecked() )fill[k] = false; } } if( stopReading )break; } if( lineRange_->IsChecked() ) { stopReading = false; int next = startingLine + increment*j; if( next > lastLine )break; for( int i=last; iIsChecked() ) { formatString = formatTextCtrl_->GetValue(); if( formatString.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("expecting a format"), wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); inStream->close(); return; } } else { for( std::size_t i=1; iIsChecked() )formatString = sc.find(',')==sc.npos ? formatSP : formatCM; double vd[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; int result = sscanf( sc.c_str(), formatString.mb_str(wxConvUTF8), vd, vd+1, vd+2, vd+3, vd+4, vd+5, vd+6, vd+7, vd+8, vd+9, vd+10, vd+11, vd+12, vd+13, vd+14, vd+15, vd+16, vd+17, vd+18, vd+19, vd+20, vd+21, vd+22, vd+23, vd+24, vd+25, vd+26, vd+27, vd+28, vd+29, vd+30, vd+31, vd+32, vd+33, vd+34, vd+35, vd+36, vd+37, vd+38, vd+39, vd+40, vd+41, vd+42, vd+43, vd+44, vd+45, vd+46, vd+47, vd+48, vd+49, vd+50, vd+51, vd+52, vd+53, vd+54, vd+55, vd+56, vd+57, vd+58, vd+59, vd+60, vd+61, vd+62, vd+63, vd+64, vd+65, vd+66, vd+67, vd+68, vd+69, vd+70, vd+71, vd+72, vd+73, vd+74, vd+75, vd+76, vd+77, vd+78, vd+79, vd+80, vd+81, vd+81, vd+83, vd+84, vd+85, vd+86, vd+87, vd+88, vd+89, vd+90, vd+91, vd+92, vd+93, vd+94, vd+95, vd+96, vd+97, vd+98, vd+99 ); if( result == EOF ) { wxString message( wxT("error reading record ") ); message << recordNumber; if( errorStop_->IsChecked() ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, message, wxT("Fatal error: no vectors were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( messages_->IsChecked() )ExGlobals::WarningMessage( message ); } else if( result == 0 ) { wxString message( wxT("error reading record ") ); message << recordNumber; if( errorStop_->IsChecked() ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, message, wxT("Fatal error: no vectors were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( messages_->IsChecked() )ExGlobals::WarningMessage( message ); } else if( result < maxColumnNumber ) { wxString message( wxT("not enough values on record ") ); message << recordNumber; if( errorStop_->IsChecked() ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, message, wxT("Fatal error: no vectors were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } if( messages_->IsChecked() )ExGlobals::WarningMessage( message ); } else // no errors in reading { for( std::size_t k=0; kIsChecked() ) { bool stopReading = false; int next = startingLine + increment*j; if( lastLine>0 && next>lastLine )break; for( int i=last; iIsChecked() )inStream->close(); // // finished reading, one of: end of file, an error, or not extending vector // bool nothingWasRead = true; for( std::size_t j=0; j 0 ) { try { NumericVariable *nv = NumericVariable::PutVariable( names[j], data[j], 0, wxT("from gui") ); nv->SetOrigin( fileName ); } catch ( EVariableError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } nothingWasRead = false; if( messages_->IsChecked() ) { wxString c; c << data[j].size() - nloc[j]; if( append_->IsChecked() ) ExGlobals::WriteOutput( c+wxT(" values have been appended to vector ")+names[j] ); else ExGlobals::WriteOutput( wxString(wxT("vector "))+names[j]+wxT(" has been created with ")+c+wxT(" values") ); } } } if( nothingWasRead )ExGlobals::WarningMessage( wxT("nothing was read") ); } void ReadVectorsForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/AnalysisWindow.h0000644012702201742730000000751511274636606017612 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_ANALYSIS_WINDOW #define EXTREMA_ANALYSIS_WINDOW #include #include #include "wx/wx.h" class extrema; class AnalysisMessagePanel; class AnalysisCommandPanel; class ReadVectorsForm; class ReadScalarsForm; class ReadMatrixForm; class ReadTextForm; class WriteVectorsForm; class WriteScalarsForm; class WriteMatrixForm; class WriteTextForm; class ExecuteDialog; class ShowVariablesForm; class GenerateVectorForm; class FitForm; class StackDialog; // The AnalysisWindow is the main extrema window. It contains the command history // and message text control and the command input text control, as well as various // menus and speed buttons. class AnalysisWindow : public wxFrame { public: AnalysisWindow( extrema * ); void WriteOutput( wxString const & ); void ClearOutput(); void AddCommandString( wxString const & ); std::vector &GetCommandStrings(); void ZeroExecuteDialog(); void ZeroShowVariables(); void ZeroLoadVectors(); void ZeroLoadScalars(); void ZeroLoadMatrix(); void ZeroLoadText(); void ZeroWriteVectors(); void ZeroWriteScalars(); void ZeroWriteMatrix(); void ZeroWriteText(); void ZeroGenerateVector(); void ZeroFit(); void ZeroStackDialog(); FitForm *GetFitForm(); void SetFitForm( FitForm * ); ExecuteDialog *GetExecuteDialog(); void SetExecuteDialog( ExecuteDialog * ); GenerateVectorForm *GetGenerateVectorForm(); void SetGenerateVectorForm( GenerateVectorForm * ); // event handlers: these functions should NOT be virtual void OnQuit( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnAbout( wxCommandEvent & ); void OnHelp( wxCommandEvent & ); void OnExecute( wxCommandEvent & ); void OnShowVariables( wxCommandEvent & ); void OnLoadVectors( wxCommandEvent & ); void OnLoadScalars( wxCommandEvent & ); void OnLoadMatrix( wxCommandEvent & ); void OnLoadText( wxCommandEvent & ); void OnWriteVectors( wxCommandEvent & ); void OnWriteScalars( wxCommandEvent & ); void OnWriteMatrix( wxCommandEvent & ); void OnWriteText( wxCommandEvent & ); void OnGenerateVector( wxCommandEvent & ); void OnFit( wxCommandEvent & ); void OnStackToggle( wxCommandEvent & ); friend std::ostream &operator<<( std::ostream &, AnalysisWindow const * ); private: extrema *extrema_; AnalysisMessagePanel *messagePanel_; AnalysisCommandPanel *commandPanel_; ReadVectorsForm *readVectorsForm_; ReadScalarsForm *readScalarsForm_; ReadMatrixForm *readMatrixForm_; ReadTextForm *readTextForm_; WriteVectorsForm *writeVectorsForm_; WriteScalarsForm *writeScalarsForm_; WriteMatrixForm *writeMatrixForm_; WriteTextForm *writeTextForm_; ExecuteDialog *executeDialog_; ShowVariablesForm *showVariablesForm_; GenerateVectorForm *generateVectorForm_; FitForm *fitForm_; StackDialog *stackDialog_; enum { ID_execute, ID_loadVectors, ID_loadScalars, ID_loadMatrix, ID_loadText, ID_writeVectors, ID_writeScalars, ID_writeMatrix, ID_writeText }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ReadTextForm.cpp0000644012702201742730000003323511274636606017534 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "ReadTextForm.h" #include "ChooseFilePanel.h" #include "AnalysisWindow.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "TextVariable.h" #include "ExGlobals.h" #include "CMD_read.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ReadTextForm, wxFrame ) EVT_BUTTON( wxID_APPLY, ReadTextForm::OnApply ) EVT_BUTTON( wxID_CLOSE, ReadTextForm::OnClose ) EVT_CHECKBOX( ID_lineRange, ReadTextForm::OnLineRange ) EVT_CLOSE( ReadTextForm::CloseEventHandler ) END_EVENT_TABLE() ReadTextForm::ReadTextForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Read text"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, true, wxT("Choose a data file for reading"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); wxPanel *varNamePanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxGridSizer *varNameSizer = new wxGridSizer( 1, 2, 0, 0 ); varNameSizer->Add( new wxStaticText(varNamePanel,wxID_ANY,wxT("Variable name"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT), wxSizerFlags(0).Right().Border(wxTOP,10) ); varNameTextCtrl_ = new wxTextCtrl( varNamePanel, wxID_ANY ); varNameTextCtrl_->SetValue( wxT("") ); varNameSizer->Add( varNameTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); varNamePanel->SetSizer( varNameSizer ); mainSizer->Add( varNamePanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *leftPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *leftSizer = new wxBoxSizer( wxVERTICAL ); closeBefore_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Close file before reading") ); leftSizer->Add( closeBefore_, wxSizerFlags(0).Border(wxALL,2) ); closeBefore_->SetValue( true ); closeAfter_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Close file after reading") ); leftSizer->Add( closeAfter_, wxSizerFlags(0).Border(wxALL,2) ); closeAfter_->SetValue( true ); leftSizer->Add( new wxStaticLine(leftPanel), wxSizerFlags(0).Expand().Border(wxALL,1) ); messages_ = new wxCheckBox( leftPanel, wxID_ANY, wxT("Display messages") ); leftSizer->Add( messages_, wxSizerFlags(0).Border(wxALL,2) ); messages_->SetValue( true ); leftPanel->SetSizer( leftSizer ); midSizer->Add( leftPanel, wxSizerFlags(0).Border(wxALL,1) ); wxPanel *rightPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *rightSizer = new wxBoxSizer( wxVERTICAL ); lineRange_ = new wxCheckBox( rightPanel, ID_lineRange, wxT("Use a line range") ); rightSizer->Add( lineRange_, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *midRightPanel = new wxPanel( rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *midRightSizer = new wxGridSizer( 3, 2, 0, 0 ); firstLineText_ = new wxStaticText( midRightPanel, wxID_ANY, wxT("First line to read"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); midRightSizer->Add( firstLineText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); firstLineTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); firstLineTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( firstLineTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); lastLineText_ = new wxStaticText( midRightPanel, wxID_ANY, wxT("Last line to read"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); midRightSizer->Add( lastLineText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); lastLineTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); lastLineTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( lastLineTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); incrementText_ = new wxStaticText( midRightPanel, wxID_ANY, wxT("Increment"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); midRightSizer->Add( incrementText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); incrementTextCtrl_ = new wxTextCtrl( midRightPanel, wxID_ANY ); incrementTextCtrl_->SetValue( wxT("1") ); midRightSizer->Add( incrementTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); midRightPanel->SetSizer( midRightSizer ); rightSizer->Add( midRightPanel, wxSizerFlags(0).Border(wxALL,1) ); firstLineTextCtrl_->Enable( false ); lastLineTextCtrl_->Enable( false ); incrementTextCtrl_->Enable( false ); firstLineText_->Enable( false ); lastLineText_->Enable( false ); incrementText_->Enable( false ); rightPanel->SetSizer( rightSizer ); midSizer->Add( rightPanel, wxSizerFlags(0).Border(wxALL,10) ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( (wxWindow*)this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("read data from the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/ReadTextForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/ReadTextForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/ReadTextForm/WIDTH"), 550l ); int height = config->Read( wxT("/ReadTextForm/HEIGHT"), 300l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/ReadTextForm") ); Show( true ); } void ReadTextForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ReadTextForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ReadTextForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ReadTextForm/WIDTH"), static_cast(width) ); config->Write( wxT("/ReadTextForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/ReadTextForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroLoadText(); Destroy(); } void ReadTextForm::OnLineRange( wxCommandEvent &WXUNUSED(event) ) { if( lineRange_->IsChecked() ) { firstLineTextCtrl_->Enable( true ); lastLineTextCtrl_->Enable( true ); incrementTextCtrl_->Enable( true ); firstLineText_->Enable( true ); lastLineText_->Enable( true ); incrementText_->Enable( true ); } else { firstLineTextCtrl_->Enable( false ); lastLineTextCtrl_->Enable( false ); incrementTextCtrl_->Enable( false ); firstLineText_->Enable( false ); lastLineText_->Enable( false ); incrementText_->Enable( false ); } } void ReadTextForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_read *readCommand = CMD_read::Instance(); bool newFile = (readCommand->GetFilename() != fileName); readCommand->SetReadInFilename( fileName ); std::ifstream *inStream = readCommand->GetStream(); if( inStream->is_open() && (closeBefore_->IsChecked() || newFile) )inStream->close(); if( !inStream->is_open() ) { inStream->clear( std::ios::goodbit ); inStream->open( fileName.mb_str(wxConvUTF8), std::ios_base::in ); if( !inStream->is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } wxString varName( varNameTextCtrl_->GetValue() ); if( varName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("a text variable name must be entered"), wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); inStream->close(); return; } int startingLine = 1; int lastLine = -1; int increment = 1; wxString stmp; long ltmp; if( lineRange_->IsChecked() ) { stmp = firstLineTextCtrl_->GetValue(); if( !stmp.ToLong(<mp) || ltmp<1L ) { firstLineTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for line range first line"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } startingLine = static_cast(ltmp); stmp = lastLineTextCtrl_->GetValue(); if( !stmp.ToLong(<mp) || static_cast(ltmp)SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for line range last line"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } lastLine = static_cast(ltmp); stmp = incrementTextCtrl_->GetValue(); if( !stmp.ToLong(<mp) || ltmp<1L ) { incrementTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for line range increment"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } increment = static_cast(ltmp); } // // read in the initial dummy records // int last = startingLine+1; // last record read + 1 // // there could only be initial dummy records if a line range was specified // and line ranges can only be on files with a record structure // unsigned int recordNumber = 0; for( int i=1; iclose(); wxMessageDialog *md = new wxMessageDialog( this, wxT("end of file reached reading initial dummy records"), wxT("Fatal error: no vectors were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } // // finally ready to read some data // std::vector data; for( std::size_t j=1;; ++j ) { ++recordNumber; std::string sc; sc.clear(); if( std::getline(*inStream,sc).fail() )break; if( sc.empty() )sc = " "; data.push_back( wxString(sc.c_str(),wxConvUTF8) ); if( !lineRange_->IsChecked() )break; // // vector line range // bool stopReading = false; if( j >= (lastLine-startingLine)/increment+1 )break; // stop reading int next = startingLine + increment*recordNumber; for( int i=last; iIsChecked() )inStream->close(); // // finished reading // TextVariable *tv = TextVariable::PutVariable( varName, data, wxT("from gui") ); tv->SetOrigin( fileName ); if( messages_->IsChecked() ) ExGlobals::WriteOutput( wxString(wxT("text variable "))+varName+wxT(" has been created") ); } void ReadTextForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/StackDialog.h0000644012702201742730000000257611274636606017026 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_STACK_DIALOG #define EXTREMA_STACK_DIALOG #include "wx/wx.h" class AnalysisWindow; class ChooseFilePanel; class StackDialog : public wxFrame { public: StackDialog( AnalysisWindow * ); private: void Toggle(); // event handlers void OnOffToggle( wxCommandEvent & ); void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); AnalysisWindow *analysisWindow_; wxRadioBox *onOffRB_; ChooseFilePanel *chooseFilePanel_; wxCheckBox *appendCkB_; enum { ID_onoff }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/WriteMatrixForm.cpp0000644012702201742730000001577611274636606020305 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "WriteMatrixForm.h" #include "AnalysisWindow.h" #include "ChooseFilePanel.h" #include "EVariableError.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "CMD_write.h" BEGIN_EVENT_TABLE( WriteMatrixForm, wxFrame ) EVT_BUTTON( wxID_APPLY, WriteMatrixForm::OnApply ) EVT_BUTTON( wxID_CLOSE, WriteMatrixForm::OnClose ) EVT_BUTTON( wxID_REFRESH, WriteMatrixForm::OnRefresh ) EVT_CLOSE( WriteMatrixForm::CloseEventHandler ) END_EVENT_TABLE() WriteMatrixForm::WriteMatrixForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Write matrices"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, false, wxT("Choose a data file for writing"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); variableList_ = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_MULTIPLE|wxLB_EXTENDED|wxLB_NEEDED_SB ); FillList(); mainSizer->Add( variableList_, wxSizerFlags(1).Expand().Border(wxALL,5) ); append_ = new wxCheckBox( this, wxID_ANY, wxT("Append data to the file") ); mainSizer->Add( append_, wxSizerFlags(0).Border(wxALL,5) ); append_->SetValue( false ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *refreshButton = new wxButton( bottomPanel, wxID_REFRESH, wxT("Refresh") ); refreshButton->SetToolTip( wxT("update the list of matrices above") ); bottomSizer->Add( refreshButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("write data to the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/WriteMatrixForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/WriteMatrixForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/WriteMatrixForm/WIDTH"), 550l ); int height = config->Read( wxT("/WriteMatrixForm/HEIGHT"), 300l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/WriteMatrixForm") ); Show( true ); } void WriteMatrixForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/WriteMatrixForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/WriteMatrixForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/WriteMatrixForm/WIDTH"), static_cast(width) ); config->Write( wxT("/WriteMatrixForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/WriteMatrixForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroWriteMatrix(); Destroy(); } void WriteMatrixForm::OnRefresh( wxCommandEvent &WXUNUSED(event) ) { FillList(); } void WriteMatrixForm::FillList() { variableList_->Clear(); NVariableTable *nvTable = NVariableTable::GetTable(); int end = nvTable->Entries(); for( int i=0; iGetEntry( i ); if( nv->GetData().GetNumberOfDimensions() == 2 )variableList_->Append( nv->GetName() ); } } void WriteMatrixForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was written"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_write *writeCommand = CMD_write::Instance(); writeCommand->SetFilename( fileName ); std::ofstream *outStream = writeCommand->GetStream(); if( outStream->is_open() )outStream->close(); outStream->clear( std::ios::goodbit ); if( append_->IsChecked() )outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out|std::ios::app ); else outStream->open( fileName.mb_str(wxConvUTF8), std::ios::out ); if( !outStream->is_open() ) { outStream->clear( std::ios::goodbit ); wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } std::vector data; int count = variableList_->GetCount(); for( int i=0; iIsChecked(i) )continue; int ndm; double value; int dimSizes[3]; std::vector().swap( data ); wxString name( variableList_->GetString(i) ); try { NumericVariable::GetVariable( name, ndm, value, data, dimSizes ); } catch( EVariableError const &e ) { outStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxString(wxT("Fatal error: matrix "))+name+wxT(" was not written"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } for( int j=0; jclose(); } void WriteMatrixForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/wxForms/HintForm.h0000644012702201742730000000213011274636606016351 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_HINT_FORM #define EXTREMA_HINT_FORM #include #include "wx/wx.h" class HintForm : public wxFrame { public: HintForm(); ~HintForm(); void HideHint(); void ShowHint( std::vector const & ); private: wxStaticText *textLabel_; // any class wishing to process wxWidgets events must use this macro //DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/Makefile.in0000644012702201742730000005005611440762626016526 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2010 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/wxForms DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwxforms_la_LIBADD = am_libwxforms_la_OBJECTS = AnalysisCommandPanel.lo \ AnalysisMessagePanel.lo AnalysisSpeedButtonPanel.lo \ AnalysisWindow.lo AxisPopup.lo BasicColors.lo \ ChooseFilePanel.lo CommandTextCtrl.lo CurvePopup.lo \ ExecuteDialog.lo FigureForm.lo FitForm.lo FontChooser.lo \ GenerateVectorForm.lo GraphForm.lo GraphicsPage.lo HintForm.lo \ ImportWindow.lo InquireYNDialog.lo InquireDialog.lo \ LegendPopup.lo PeakFindForm.lo ReadVectorsForm.lo \ ReadScalarsForm.lo ReadMatrixForm.lo ReadTextForm.lo \ SetAspectRatioForm.lo ShowVariablesForm.lo StackDialog.lo \ TextForm.lo TextPopup.lo ThreeDPlotForm.lo VarInfoForm.lo \ VisualizationSpeedButtonPanel.lo VisualizationWindow.lo \ WriteVectorsForm.lo WriteScalarsForm.lo WriteMatrixForm.lo \ WriteTextForm.lo libwxforms_la_OBJECTS = $(am_libwxforms_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libwxforms_la_SOURCES) DIST_SOURCES = $(libwxforms_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libwxforms.la libwxforms_la_SOURCES = \ AnalysisCommandPanel.cpp AnalysisCommandPanel.h \ AnalysisMessagePanel.cpp AnalysisMessagePanel.h \ AnalysisSpeedButtonPanel.cpp AnalysisSpeedButtonPanel.h \ AnalysisWindow.cpp AnalysisWindow.h \ AxisPopup.cpp AxisPopup.h \ BasicColors.cpp BasicColors.h \ ChooseFilePanel.cpp ChooseFilePanel.h \ CommandTextCtrl.cpp CommandTextCtrl.h \ CurvePopup.cpp CurvePopup.h \ ExecuteDialog.cpp ExecuteDialog.h \ FigureForm.cpp FigureForm.h \ FitForm.cpp FitForm.h \ FontChooser.cpp FontChooser.h \ GenerateVectorForm.cpp GenerateVectorForm.h \ GraphForm.cpp GraphForm.h \ GraphicsPage.cpp GraphicsPage.h \ HintForm.cpp HintForm.h \ ImportWindow.cpp ImportWindow.h \ InquireYNDialog.cpp InquireYNDialog.h \ InquireDialog.cpp InquireDialog.h \ LegendPopup.cpp LegendPopup.h \ PeakFindForm.cpp PeakFindForm.h \ ReadVectorsForm.cpp ReadVectorsForm.h \ ReadScalarsForm.cpp ReadScalarsForm.h \ ReadMatrixForm.cpp ReadMatrixForm.h \ ReadTextForm.cpp ReadTextForm.h \ SetAspectRatioForm.cpp SetAspectRatioForm.h \ ShowVariablesForm.cpp ShowVariablesForm.h \ StackDialog.cpp StackDialog.h \ TextForm.cpp TextForm.h \ TextPopup.cpp TextPopup.h \ ThreeDPlotForm.cpp ThreeDPlotForm.h \ VarInfoForm.cpp VarInfoForm.h \ VisualizationSpeedButtonPanel.cpp VisualizationSpeedButtonPanel.h \ VisualizationWindow.cpp VisualizationWindow.h \ WriteVectorsForm.cpp WriteVectorsForm.h \ WriteScalarsForm.cpp WriteScalarsForm.h \ WriteMatrixForm.cpp WriteMatrixForm.h \ WriteTextForm.cpp WriteTextForm.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/wxForms/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/wxForms/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libwxforms.la: $(libwxforms_la_OBJECTS) $(libwxforms_la_DEPENDENCIES) $(CXXLINK) $(libwxforms_la_OBJECTS) $(libwxforms_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnalysisCommandPanel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnalysisMessagePanel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnalysisSpeedButtonPanel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnalysisWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AxisPopup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BasicColors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChooseFilePanel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandTextCtrl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CurvePopup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ExecuteDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FigureForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FitForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontChooser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GenerateVectorForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GraphForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GraphicsPage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HintForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImportWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InquireDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InquireYNDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LegendPopup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeakFindForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadMatrixForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadScalarsForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadTextForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadVectorsForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SetAspectRatioForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShowVariablesForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StackDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextPopup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ThreeDPlotForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VarInfoForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VisualizationSpeedButtonPanel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VisualizationWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WriteMatrixForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WriteScalarsForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WriteTextForm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WriteVectorsForm.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/wxForms/TextForm.cpp0000644012702201742730000004221611274636606016737 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "wx/filedlg.h" #include "TextForm.h" #include "VisualizationWindow.h" #include "NumericVariable.h" #include "EVariableError.h" #include "NVariableTable.h" #include "ExGlobals.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_window.h" #include "GRA_intCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorControl.h" #include "GRA_setOfCharacteristics.h" #include "EGraphicsError.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "GRA_drawableText.h" #include "FontChooser.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( TextForm, wxFrame ) EVT_CHECKBOX( ID_interactive, TextForm::OnInteractive ) EVT_RADIOBUTTON( ID_ul, TextForm::OnUL ) EVT_RADIOBUTTON( ID_uc, TextForm::OnUC ) EVT_RADIOBUTTON( ID_ur, TextForm::OnUR ) EVT_RADIOBUTTON( ID_cl, TextForm::OnCL ) EVT_RADIOBUTTON( ID_cc, TextForm::OnCC ) EVT_RADIOBUTTON( ID_cr, TextForm::OnCR ) EVT_RADIOBUTTON( ID_ll, TextForm::OnLL ) EVT_RADIOBUTTON( ID_lc, TextForm::OnLC ) EVT_RADIOBUTTON( ID_lr, TextForm::OnLR ) EVT_BUTTON( ID_font, TextForm::OnFont ) EVT_BUTTON( ID_erase, TextForm::OnErase ) EVT_BUTTON( wxID_APPLY, TextForm::OnDraw ) EVT_BUTTON( wxID_CLOSE, TextForm::OnClose ) EVT_CLOSE( TextForm::CloseEventHandler ) END_EVENT_TABLE() int TextForm::gwToRadio_[] = { 6,7,8, 3,4,5, 0,1,2 }; TextForm::TextForm( VisualizationWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Text Form"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), visualizationWindow_(parent) { CreateForm(); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/DrawTextForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/DrawTextForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/DrawTextForm/WIDTH"), 560l ); int height = config->Read( wxT("/DrawTextForm/HEIGHT"), 305l ); SetSize( ulx, uly, width, height ); Show( true ); FillOutForm(); wxString sTmp; config->Read( wxT("/DrawTextForm/STRING"), &sTmp, wxT("") ); stringTC_->SetValue( sTmp ); sTmp.clear(); config->Read( wxT("/DrawTextForm/XLOC"), &sTmp, wxT("") ); locxTC_->SetValue( sTmp ); sTmp.clear(); config->Read( wxT("/DrawTextForm/YLOC"), &sTmp, wxT("") ); locyTC_->SetValue( sTmp ); bool bTmp = true; config->Read( wxT("/DrawTextForm/INTERACTIVE"), &bTmp, true ); interactiveCkB_->SetValue( bTmp ); SetupInteractive(); int i = config->Read( wxT("/DrawTextForm/ALIGNMENT"), 1l ); alignmentRB_[gwToRadio_[i-1]]->SetValue( true ); Layout(); fromSet_ = false; } void TextForm::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->AddSpacer( 10 ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); topSizer->Add( new wxStaticText(topPanel,wxID_ANY,wxT("Text string to draw: ")), wxSizerFlags(0).Right().Border(wxTOP,5) ); stringTC_ = new wxTextCtrl( topPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(300,25) ); topSizer->Add( stringTC_, wxSizerFlags(1).Left().Border(wxALL,2) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *nextPanel = new wxPanel( this, wxID_ANY ); wxBoxSizer *nextSizer = new wxBoxSizer( wxHORIZONTAL); interactiveCkB_ = new wxCheckBox( nextPanel, ID_interactive, wxT("Interactively position string ") ); nextSizer->Add( interactiveCkB_, wxSizerFlags(0).Left().Border(wxTOP,25) ); wxPanel *locPanel = new wxPanel( nextPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *locSizer = new wxBoxSizer( wxHORIZONTAL ); wxPanel *locxPanel = new wxPanel( locPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *locxSizer = new wxBoxSizer( wxVERTICAL ); locxST_ = new wxStaticText( locxPanel, wxID_ANY, wxT("%x location") ); locxSizer->Add( locxST_, wxSizerFlags(0).Center().Border(wxALL,1) ); locxTC_ = new wxTextCtrl( locxPanel, wxID_ANY ); locxSizer->Add( locxTC_, wxSizerFlags(0).Center().Border(wxALL,1) ); locxPanel->SetSizer( locxSizer ); locSizer->Add( locxPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); wxPanel *locyPanel = new wxPanel( locPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *locySizer = new wxBoxSizer( wxVERTICAL ); locyST_ = new wxStaticText( locyPanel, wxID_ANY, wxT("%y location") ); locySizer->Add( locyST_, wxSizerFlags(0).Center().Border(wxALL,1) ); locyTC_ = new wxTextCtrl( locyPanel, wxID_ANY ); locySizer->Add( locyTC_, wxSizerFlags(0).Center().Border(wxALL,1) ); locyPanel->SetSizer( locySizer ); locSizer->Add( locyPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); locPanel->SetSizer( locSizer ); nextSizer->Add( locPanel, wxSizerFlags(0).Left().Border(wxALL,1) ); nextPanel->SetSizer( nextSizer ); mainSizer->Add( nextPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *alignPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER ); wxGridSizer *alignSizer = new wxGridSizer( 4, 3, 2, 2 ); alignSizer->Add( new wxStaticText(alignPanel,wxID_ANY,wxT("Alignment")), wxSizerFlags(0).Left().Border(wxALL,5) ); alignSizer->Add( new wxStaticText(alignPanel,wxID_ANY,wxT("")), wxSizerFlags(0).Left().Border(wxALL,5) ); alignSizer->Add( new wxStaticText(alignPanel,wxID_ANY,wxT("")), wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[0] = new wxRadioButton( alignPanel, ID_ul, wxT("upper left"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); alignSizer->Add( alignmentRB_[0], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[1] = new wxRadioButton( alignPanel, ID_uc, wxT("upper centre") ); alignSizer->Add( alignmentRB_[1], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[2] = new wxRadioButton( alignPanel, ID_ur, wxT("upper right") ); alignSizer->Add( alignmentRB_[2], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[3] = new wxRadioButton( alignPanel, ID_cl, wxT("centre left") ); alignSizer->Add( alignmentRB_[3], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[4] = new wxRadioButton( alignPanel, ID_cc, wxT("centre centre") ); alignSizer->Add( alignmentRB_[4], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[5] = new wxRadioButton( alignPanel, ID_cr, wxT("centre right") ); alignSizer->Add( alignmentRB_[5], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[6] = new wxRadioButton( alignPanel, ID_ll, wxT("lower left") ); alignSizer->Add( alignmentRB_[6], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[7] = new wxRadioButton( alignPanel, ID_lc, wxT("lower centre") ); alignSizer->Add( alignmentRB_[7], wxSizerFlags(0).Left().Border(wxALL,5) ); alignmentRB_[8] = new wxRadioButton( alignPanel, ID_lr, wxT("lower right") ); alignSizer->Add( alignmentRB_[8], wxSizerFlags(0).Left().Border(wxALL,5) ); alignPanel->SetSizer( alignSizer ); mainSizer->Add( alignPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxButton *fontButton = new wxButton( this, ID_font, wxT("Font") ); fontButton->SetToolTip( wxT("click to change the font") ); mainSizer->Add( fontButton, wxSizerFlags(0).Center().Border(wxALL,10) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *eraseButton = new wxButton( bottomPanel, ID_erase, wxT("Erase") ); eraseButton->SetToolTip( wxT("erase the last drawn string") ); bottomSizer->Add( eraseButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *drawButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Draw") ); drawButton->SetToolTip( wxT("draw the string") ); bottomSizer->Add( drawButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); } void TextForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/DrawTextForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/DrawTextForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/DrawTextForm/WIDTH"), static_cast(width) ); config->Write( wxT("/DrawTextForm/HEIGHT"), static_cast(height) ); // config->Write( wxT("/DrawTextForm/STRING"), stringTC_->GetValue() ); config->Write( wxT("/DrawTextForm/XLOC"), locxTC_->GetValue() ); config->Write( wxT("/DrawTextForm/YLOC"), locyTC_->GetValue() ); config->Write( wxT("/DrawTextForm/INTERACTIVE"), interactiveCkB_->IsChecked() ); for( int i=0; i<9; ++i ) { if( alignmentRB_[i]->GetValue() ) { config->Write( wxT("/DrawTextForm/ALIGNMENT"), static_cast(gwToRadio_[i]+1) ); break; } } } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ visualizationWindow_->ZeroTextForm(); Destroy(); } void TextForm::FillOutForm() { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *textC = gw->GetTextCharacteristics(); // locxTC_->SetValue( wxString()<(textC->Get(wxT("XLOCATION")))->GetAsPercent() ); locyTC_->SetValue( wxString()<(textC->Get(wxT("YLOCATION")))->GetAsPercent() ); // alignmentRB_[gwToRadio_[static_cast(textC->Get(wxT("ALIGNMENT")))->Get()-1]]->SetValue( true ); // interactiveCkB_->SetValue( static_cast(textC->Get(wxT("INTERACTIVE")))->Get() ); } void TextForm::SetupInteractive() { if( interactiveCkB_->IsChecked() ) { locxST_->Enable( false ); locxTC_->Enable( false ); locyST_->Enable( false ); locyTC_->Enable( false ); } else { locxST_->Enable( true ); locxTC_->Enable( true ); locyST_->Enable( true ); locyTC_->Enable( true ); } } void TextForm::OnDraw( wxCommandEvent &event ) { Draw(); } void TextForm::Draw() { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *textC = gw->GetTextCharacteristics(); // int alignment; for( int i=0; i<9; ++i ) { if( alignmentRB_[i]->GetValue() ) { alignment = i; static_cast(textC->Get(wxT("ALIGNMENT")))->Set( gwToRadio_[i]+1 ); break; } } bool interactive = interactiveCkB_->IsChecked(); if( !interactive ) { double xloc, yloc; if( !locxTC_->GetValue().ToDouble(&xloc) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for %x location"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( !locyTC_->GetValue().ToDouble(&yloc) ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered for %y location"), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } static_cast(textC->Get(wxT("XLOCATION")))->SetAsPercent( xloc ); static_cast(textC->Get(wxT("YLOCATION")))->SetAsPercent( yloc ); } if( !fromSet_ || !interactive ) { GRA_drawableText *dt = new GRA_drawableText( stringTC_->GetValue() ); try { dt->Parse(); } catch ( EGraphicsError &e ) { delete dt; wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( interactive )visualizationWindow_->SetInteractiveText( dt ); else { gw->AddDrawableObject( dt ); dt->SetX( static_cast(textC->Get(wxT("XLOCATION")))->GetAsWorld() ); dt->SetY( static_cast(textC->Get(wxT("YLOCATION")))->GetAsWorld() ); wxWindow *wx = ExGlobals::GetwxWindow(); wxClientDC dc( wx ); wx->PrepareDC( dc ); dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); ExGlobals::RefreshGraphics(); } } if( ExGlobals::StackIsOn() ) { wxString line( wxT("FORM TEXT,'") ); int psc = interactive ? 1 : 0; line += stringTC_->GetValue() + wxT("',") + (wxString()<GetValue() + wxT(",") + locyTC_->GetValue() + wxT(",") + (wxString()<SetValue( true ); } void TextForm::OnUC( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[1]->SetValue( true ); } void TextForm::OnUR( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[2]->SetValue( true ); } void TextForm::OnCL( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[3]->SetValue( true ); } void TextForm::OnCC( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[4]->SetValue( true ); } void TextForm::OnCR( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[5]->SetValue( true ); } void TextForm::OnLL( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[6]->SetValue( true ); } void TextForm::OnLC( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[7]->SetValue( true ); } void TextForm::OnLR( wxCommandEvent &WXUNUSED(event) ) { alignmentRB_[8]->SetValue( true ); } void TextForm::OnFont( wxCommandEvent &WXUNUSED(event) ) { GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *textC = gw->GetTextCharacteristics(); // ExGlobals::SetWorkingFontFlag( false ); // FontChooser fc( this ); fc.SetFont( GRA_fontControl::GetFontCode(static_cast(textC->Get(wxT("FONT")))->Get()), GRA_colorControl::GetColorCode(static_cast(textC->Get(wxT("COLOR")))->Get()), static_cast(textC->Get(wxT("HEIGHT")))->GetAsPercent(), static_cast(textC->Get(wxT("ANGLE")))->Get() ); fc.ShowModal(); // if( ExGlobals::GetWorkingFontFlag() ) { static_cast(textC->Get(wxT("FONT")))->Set( ExGlobals::GetWorkingFont() ); static_cast(textC->Get(wxT("COLOR")))->Set( ExGlobals::GetWorkingFontColor() ); static_cast(textC->Get(wxT("HEIGHT")))->SetAsPercent( ExGlobals::GetWorkingFontHeight() ); static_cast(textC->Get(wxT("ANGLE")))->Set( ExGlobals::GetWorkingFontAngle() ); } } void TextForm::OnInteractive( wxCommandEvent &WXUNUSED(event) ) { SetupInteractive(); } void TextForm::OnErase( wxCommandEvent &WXUNUSED(event) ) { Erase(); } void TextForm::Erase() { ExGlobals::GetGraphWindow()->RemoveLastTextString(); ExGlobals::GetwxWindow()->Refresh(); ExGlobals::GetwxWindow()->Update(); if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM TEXT,ERASE") ); } void TextForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM TEXT,CLOSE") ); Close(); } void TextForm::Set( wxString const &text, bool psc, double xloc, double yloc, int alignment, wxString const &action ) { stringTC_->SetValue( text ); interactiveCkB_->SetValue( psc ); locxTC_->SetValue( wxString() << xloc ); locyTC_->SetValue( wxString() << yloc ); alignmentRB_[gwToRadio_[alignment-1]]->SetValue( true ); if( action == wxT("CLOSE") ) { if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM TEXT,CLOSE") ); Close(); } else if( action == wxT("ERASE") ) { Erase(); } else if( action == wxT("DRAW" ) ) { fromSet_ = true; Draw(); fromSet_ = false; } } // end of file extrema-4.4.5/src/wxForms/InquireYNDialog.cpp0000644012702201742730000001154211274636606020170 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/config.h" #include "InquireYNDialog.h" #include "ExGlobals.h" #include "CMD_inquire.h" #include "ECommandError.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( InquireYNDialog, wxDialog ) EVT_BUTTON( wxID_YES, InquireYNDialog::OnYes ) EVT_BUTTON( wxID_NO, InquireYNDialog::OnNo ) EVT_BUTTON( wxID_STOP, InquireYNDialog::OnStopAll ) EVT_CLOSE( InquireYNDialog::CloseEventHandler ) END_EVENT_TABLE() InquireYNDialog::InquireYNDialog() : wxDialog( (wxWindow*)NULL,wxID_ANY,wxT("inquire"),wxDefaultPosition,wxDefaultSize ) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *topPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *topSizer = new wxBoxSizer( wxHORIZONTAL ); messageCtrl_ = new wxStaticText( topPanel, -1, wxT(" ") ); topSizer->Add( messageCtrl_, wxSizerFlags(0).Border(wxALL,10) ); topPanel->SetSizer( topSizer ); mainSizer->Add( topPanel, wxSizerFlags(1).Expand().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( (wxWindow*)this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *yesButton = new wxButton( bottomPanel, wxID_YES, wxT("Yes") ); yesButton->SetToolTip( wxT("click to answer yes to the inquiry") ); bottomSizer->Add( yesButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *noButton = new wxButton( bottomPanel, wxID_NO, wxT("No") ); noButton->SetToolTip( wxT("click to answer no to the inquiry") ); bottomSizer->Add( noButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *stopAllButton = new wxButton( bottomPanel, wxID_STOP, wxT("Stop all scripts") ); stopAllButton->SetToolTip( wxT("click to stop all active scripts") ); bottomSizer->Add( stopAllButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(1).Expand().Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/InquireYNDialog/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/InquireYNDialog/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/InquireYNDialog/WIDTH"), 570l ); int height = config->Read( wxT("/InquireYNDialog/HEIGHT"), 145l ); SetSize( ulx, uly, width, height ); Show( true ); } void InquireYNDialog::SetLabel( wxString const &message ) { messageCtrl_->SetLabel( message ); } void InquireYNDialog::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/InquireYNDialog/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/InquireYNDialog/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/InquireYNDialog/WIDTH"), static_cast(width) ); config->Write( wxT("/InquireYNDialog/HEIGHT"), static_cast(height) ); } Destroy(); } void InquireYNDialog::OnYes( wxCommandEvent &WXUNUSED(event) ) { try { CMD_inquire::Instance()->ProcessYN( wxT("YES") ); } catch ( ECommandError const &e ) { ExGlobals::StopAllScripts(); wxMessageDialog *md = new wxMessageDialog( (wxWindow*)this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); } Close(); } void InquireYNDialog::OnNo( wxCommandEvent &WXUNUSED(event) ) { try { CMD_inquire::Instance()->ProcessYN( wxT("NO") ); } catch ( ECommandError const &e ) { ExGlobals::StopAllScripts(); wxMessageDialog *md = new wxMessageDialog( (wxWindow*)this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); } Close(); } void InquireYNDialog::OnStopAll( wxCommandEvent &WXUNUSED(event) ) { ExGlobals::StopAllScripts(); Close(); } // end of file extrema-4.4.5/src/wxForms/VisualizationSpeedButtonPanel.h0000644012702201742730000000472011327733341022621 0ustar spangspang/* Copyright (C) 2010 Joseph L. Chuma 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. */ #ifndef EXTREMA_VISUALIZATION_SPEEDBUTTON_PANEL #define EXTREMA_VISUALIZATION_SPEEDBUTTON_PANEL #include "wx/wx.h" #include "wx/print.h" // The VisualizationWindow is the main extrema graphics window. It contains the // graphics canvas as well as various menus and speed buttons. class VisualizationWindow; class VisualizationSpeedButtonPanel : public wxPanel { public: VisualizationSpeedButtonPanel( VisualizationWindow * ); void OnClearGraphicsPage( wxCommandEvent & ); void OnDrawGraph( wxCommandEvent & ); void On3DPlot( wxCommandEvent & ); void OnDrawFigure( wxCommandEvent & ); void OnDrawText( wxCommandEvent & ); void OnPeakFind( wxCommandEvent & ); void OnSaveDrawing( wxCommandEvent & ); void OnPrintDrawing( wxCommandEvent & ); void OnNewPage( wxCommandEvent & ); void OnRemovePage( wxCommandEvent & ); void OnSetAspectRatio( wxCommandEvent & ); void OnImportDrawing( wxCommandEvent & ); void OnDrawFigures( wxCommandEvent &WXUNUSED(event) ) { wxMessageDialog *md = new wxMessageDialog( (wxWindow*)this, wxT("Click here to draw figures (coming soon)"), wxT("draw figures"), wxOK|wxICON_INFORMATION ); md->ShowModal(); } private: VisualizationWindow *visualizationWindow_; enum { ID_clearGraphicsPage, ID_drawGraph, ID_drawText, ID_peakFind, ID_drawFigures, ID_saveDrawing, ID_importDrawing, ID_printDrawing, ID_newPage, ID_removePage, ID_aspectRatio, ID_3dplot, ID_drawFigure }; DECLARE_EVENT_TABLE() }; class MyPrintout : public wxPrintout { public: MyPrintout( wxString const &title ) : wxPrintout(title) {} bool OnPrintPage( int ); }; #endif extrema-4.4.5/src/wxForms/ExecuteDialog.cpp0000644012702201742730000001604511274636606017712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/filename.h" #include "ExecuteDialog.h" #include "ChooseFilePanel.h" #include "AnalysisWindow.h" #include "ParseLine.h" #include "CMD_execute.h" #include "ESyntaxError.h" #include "ECommandError.h" #include "ExGlobals.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ExecuteDialog, wxFrame ) EVT_BUTTON( wxID_APPLY, ExecuteDialog::OnApply ) EVT_BUTTON( wxID_CLOSE, ExecuteDialog::OnClose ) EVT_CLOSE( ExecuteDialog::CloseEventHandler ) END_EVENT_TABLE() ExecuteDialog::ExecuteDialog( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("execute a script"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); chooseFilePanel_ = new ChooseFilePanel( this, true, wxT("Choose an extrema script file"), wxT("script file|*.pcm|stack file|*.stk|any file|*.*") ); mainSizer->Add( chooseFilePanel_, wxSizerFlags(1).Expand().Left().Border(wxALL,5) ); wxPanel *midPanel = new wxPanel( this ); //wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(400,100), wxNO_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxHORIZONTAL ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(1).Expand().Center().Border(wxALL,1) ); midSizer->Add( new wxStaticText(midPanel,wxID_ANY,wxT("Parameter(s): ")), wxSizerFlags(0).Right().Border(wxALL,10) ); parameterTextCtrl_ = new wxTextCtrl( midPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(350,20) ); parameterTextCtrl_->SetToolTip( wxT("enter any required parameters") ); midSizer->Add( parameterTextCtrl_, wxSizerFlags(1).Expand().Left().Border(wxALL,10) ); wxPanel *bottomPanel = new wxPanel( this ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(1).Center().Border(wxALL,5) ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("execute the chosen file") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Center().Border(wxRIGHT,5) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Center().Border(wxLEFT,5) ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/ExecuteDialog/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/ExecuteDialog/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/ExecuteDialog/WIDTH"), 570l ); int height = config->Read( wxT("/ExecuteDialog/HEIGHT"), 145l ); SetSize( ulx, uly, width, height ); chooseFilePanel_->GetFilenames( config, wxT("/ExecuteDialog") ); wxString tmp; config->Read( wxT("/ExecuteDialog/PARAMETERS"), &tmp ); if( !tmp.empty() ) { ExGlobals::RemoveQuotes( tmp ); parameterTextCtrl_->SetValue( tmp ); } Show( true ); } void ExecuteDialog::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ExecuteDialog/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ExecuteDialog/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ExecuteDialog/WIDTH"), static_cast(width) ); config->Write( wxT("/ExecuteDialog/HEIGHT"), static_cast(height) ); chooseFilePanel_->SaveFilenames( config, wxT("/ExecuteDialog") ); if( !parameterTextCtrl_->GetValue().empty() ) config->Write( wxT("/ExecuteDialog/PARAMETERS"), parameterTextCtrl_->GetValue() ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroExecuteDialog(); Destroy(); } void ExecuteDialog::OnApply( wxCommandEvent &WXUNUSED(event) ) { Apply(); } void ExecuteDialog::Apply() { wxString fileName( chooseFilePanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Warning"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } wxFileName wxfn( fileName ); ExGlobals::SetCurrentPath( wxfn.GetPath() ); // wxString commandLine( wxT("EXECUTE ") ); commandLine += fileName; if( !parameterTextCtrl_->GetValue().empty() ) commandLine += wxT(' ') + parameterTextCtrl_->GetValue(); ParseLine p( commandLine ); try { p.ParseIt(); } catch( ESyntaxError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } try { CMD_execute::Instance()->Execute( &p ); } catch( ECommandError &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Fatal error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } if( ExGlobals::StackIsOn() ) { wxString line( wxT("FORM EXECUTE,'") ); line += fileName; wxString p( parameterTextCtrl_->GetValue() ); if( p.empty() )line += wxT("',,APPLY"); else line += wxT("','") + p + wxT("',APPLY"); ExGlobals::WriteStack( line ); } // this must be the top level script since it is run interactively // try { ExGlobals::RunScript(); } catch ( std::runtime_error &e ) { ExGlobals::ShowScriptError( e.what() ); ExGlobals::StopAllScripts(); } } void ExecuteDialog::OnClose( wxCommandEvent &WXUNUSED(event) ) { if( ExGlobals::StackIsOn() )ExGlobals::WriteStack( wxT("FORM EXECUTE,CLOSE") ); Close(); } void ExecuteDialog::Set( wxString const &filename, wxString const ¶meters, wxString const &action ) { chooseFilePanel_->SetFile( filename ); parameterTextCtrl_->SetValue( parameters ); if( action == wxT("CLOSE") )Close(); else if( action == wxT("APPLY") )Apply(); } // end of file extrema-4.4.5/src/wxForms/BasicColors.h0000644012702201742730000000250011274636606017027 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_BASICCOLORS #define EXTREMA_BASICCOLORS #include "wx/wx.h" #include "wx/dialog.h" class BasicColors : public wxDialog { public: BasicColors( wxWindow * ); private: // event handlers void CloseEventHandler( wxCloseEvent & ); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; class ColorButton : public wxButton { public: ColorButton( wxPanel *, BasicColors *, int ); private: BasicColors *owner_; int colorCode_; // event handlers void OnClick( wxCommandEvent & ); enum { ID_button }; DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/TextForm.h0000644012702201742730000000422711274636606016404 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_TEXTFORM #define EXTREMA_TEXTFORM #include "wx/wx.h" class VisualizationWindow; class TextForm : public wxFrame { public: TextForm( VisualizationWindow * ); void Erase(); void Set( wxString const &, bool, double, double, int, wxString const & ); private: void CreateForm(); void FillOutForm(); void SetupInteractive(); void Draw(); // event handlers void OnUL( wxCommandEvent & ); void OnUC( wxCommandEvent & ); void OnUR( wxCommandEvent & ); void OnCL( wxCommandEvent & ); void OnCC( wxCommandEvent & ); void OnCR( wxCommandEvent & ); void OnLL( wxCommandEvent & ); void OnLC( wxCommandEvent & ); void OnLR( wxCommandEvent & ); void OnInteractive( wxCommandEvent & ); void OnFont( wxCommandEvent & ); void OnErase( wxCommandEvent & ); void OnDraw( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); VisualizationWindow *visualizationWindow_; wxTextCtrl *stringTC_, *locxTC_, *locyTC_; wxCheckBox *interactiveCkB_; wxStaticText *locxST_, *locyST_; wxRadioButton *alignmentRB_[9]; enum { ID_interactive, ID_ul, ID_uc, ID_ur, ID_cl, ID_cc, ID_cr, ID_ll, ID_lc, ID_lr, ID_font, ID_erase }; enum { SIZE = 9 }; static int gwToRadio_[SIZE]; bool fromSet_; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/FitForm.h0000644012702201742730000000555011274636606016202 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_FITFORM #define EXTREMA_FITFORM #include #include "wx/wx.h" class AnalysisWindow; class NumericVariable; class FitForm : public wxFrame { public: FitForm( AnalysisWindow * ); void Set( wxString const &, wxString const &, double, double, wxString const &, wxString const &, int, wxString const &, std::vector &, std::vector &, double, double, wxString const & ); void ClearGraphics(); private: void CreateForm(); void FillOutForm(); void UpdateVectors( wxComboBox * ); void UpdateExpression(); void FitTypeChange(); void DegreeChange(); void ClearResults(); void TestTheFit(); void DoTheFit(); void SetupParameterFields( int, bool, bool, wxString const & =wxString(wxT("")) ); void CreateParameters(); void PlotFit(); // event handlers void OnDataVectorChange( wxCommandEvent & ); void OnIndepVectorChange( wxCommandEvent & ); void OnErrorVectorChange( wxCommandEvent & ); void OnFitTypeChange( wxCommandEvent & ); void OnDegreeChange( wxCommandEvent & ); void OnTest( wxCommandEvent & ); void OnClear( wxCommandEvent & ); void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); wxString fitExpression_, fitTitle_, dVecName_, iVecName_, eVecName_, pvStr_; std::vector pStrings_; double chisq_, confidenceLevel_, minRange_, maxRange_; unsigned int nFree_; std::vector< std::vector > pStartValues_; NumericVariable *iVec_; AnalysisWindow *analysisWindow_; wxStaticText *dataST_, *indepST_, *errorST_, *typeST_, *degreeST_, *minST_, *maxST_, *exprST_; wxComboBox *dataCB_, *indepCB_, *errorCB_, *typeCB_, *degreeCB_; wxCheckBox *pCkB_[8]; wxTextCtrl *minTC_, *maxTC_, *chiTC_, *confTC_, *degFreeTC_, *exprTC_; wxTextCtrl *pnameTC_[8], *pstartTC_[8], *presultTC_[8]; wxTextCtrl *legxTC_, *legyTC_; wxButton *testButton_, *applyButton_; enum { ID_dvec, ID_ivec, ID_evec, ID_type, ID_degree, ID_test, ID_clear }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/GraphForm.h0000644012702201742730000000362211274636606016517 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_GRAPHFORM #define EXTREMA_GRAPHFORM #include #include "wx/wx.h" class VisualizationWindow; class GraphForm : public wxFrame { public: GraphForm( VisualizationWindow * ); void Set( wxString const &, wxString const &, double, double, wxString const &, int, wxString const & ); void ClearGraphics(); private: void CreateForm(); void FillOutForm(); void UpdateVectors( wxComboBox * ); void Draw(); // event handlers void OnPlotsymbolChange( wxCommandEvent & ); void OnIndepChange( wxCommandEvent & ); void OnDraw( wxCommandEvent & ); void OnClear( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); VisualizationWindow *visualizationWindow_; wxStaticText *dataST_, *indepST_, *errorST_, *symbolST_, *minST_, *maxST_; wxComboBox *dataCB_, *indepCB_, *errorCB_, *symbolCB_; wxCheckBox *connectCkB_; wxTextCtrl *minTC_, *maxTC_; wxButton *drawButton_, *clearButton_; int color_; std::vector symArray_; enum { ID_ivec, ID_symbol, ID_clear }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ReadScalarsForm.h0000644012702201742730000000320211274636606017634 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_READSCALARSFORM #define EXTREMA_READSCALARSFORM #include "wx/wx.h" #include "wx/grid.h" class AnalysisWindow; class ChooseFilePanel; class ReadScalarsForm : public wxFrame { public: ReadScalarsForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnCellChange( wxGridEvent & ); void OnErrorFill( wxCommandEvent & ); void OnFormat( wxCommandEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxGrid *scalarGrid_; wxCheckBox *closeBefore_, *closeAfter_, *errorFill_, *format_, *messages_; wxTextCtrl *errorFillTextCtrl_, *formatTextCtrl_, *lineNumberTextCtrl_; wxStaticText *lineNumberText_; enum { ID_errorFill, ID_format }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/ExSpinCtrlD.h0000644012702201742730000000654611274636606017001 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_SPINCTRLD #define EXTREMA_SPINCTRLD #include "wx/wx.h" #include "wx/sizer.h" #include "wx/spinbutt.h" #include "wx/textctrl.h" template class ExSpinCtrlD : public wxPanel { public: ExSpinCtrlD( wxPanel *parent, wxString const &label, T *popup, void (T::*memFunc)(double) ) : wxPanel(parent), popup_(popup), memFunc_(memFunc) { wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( sizer ); sizer->Add( new wxStaticText(this,wxID_ANY,label), 0,wxALIGN_LEFT|wxALL,2 ); //wxSizerFlags flags(0); //sizer->Add( new wxStaticText(this,wxID_ANY,label), flags.Left().Border(wxALL,2) ); wxPanel *panel2 = new wxPanel( this ); wxBoxSizer *sizer2 = new wxBoxSizer( wxHORIZONTAL ); panel2->SetSizer( sizer2 ); sizer->Add( panel2, 0,wxALIGN_CENTER|wxALL,1 ); //sizer->Add( panel2, flags.Center().Border(wxALL,1) ); textCtrl_ = new wxTextCtrl( panel2, ID_text ); sizer2->Add( textCtrl_, 0,wxALIGN_LEFT|wxALL,1 ); //sizer2->Add( textCtrl_, flags.Left().Border(wxALL,1) ); spinButton_ = new wxSpinButton( panel2, ID_spin ); spinButton_->SetRange( 0, 1000 ); sizer2->Add( spinButton_, 0,wxALIGN_LEFT|wxALL,1 ); //sizer2->Add( spinButton_, flags.Left().Border(wxALL,1) ); Connect( ID_spin, wxID_ANY, wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&ExSpinCtrlD::OnSpinChange ); Connect( ID_text, wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)&ExSpinCtrlD::OnTextChange ); } void SetValue( double val ) { int itmp = static_cast(val*10+0.5); spinButton_->SetValue( itmp ); textCtrl_->SetValue( wxString()<GetValue(); textCtrl_->SetValue( wxString()<*memFunc_)( val ); } void OnTextChange( wxCommandEvent &WXUNUSED(event) ) { wxString text( textCtrl_->GetValue() ); if( text.empty() )return; double val; if( !text.ToDouble(&val) || val<0.0 || val>100.0 ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("invalid value entered"), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } (popup_->*memFunc_)( val ); } wxSpinButton *spinButton_; wxTextCtrl *textCtrl_; T *popup_; void (T::* memFunc_)(double); enum { ID_spin, ID_text }; //DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/CurvePopup.cpp0000644012702201742730000002726211274636606017303 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "wx/radiobox.h" #include "CurvePopup.h" #include "GraphicsPage.h" #include "GRA_window.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "ExGlobals.h" #include "GRA_intCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "BasicColors.h" #include "EGraphicsError.h" #include "GRA_cartesianCurve.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( CurvePopup, wxFrame ) EVT_RADIOBOX( ID_curveType, CurvePopup::OnCurveType ) EVT_CHECKBOX( ID_connect, CurvePopup::OnConnect ) EVT_BUTTON( wxID_CLOSE, CurvePopup::OnClose ) EVT_CLOSE( CurvePopup::CloseEventHandler ) END_EVENT_TABLE() CurvePopup::CurvePopup( GraphicsPage *parent ) : wxFrame(parent,wxID_ANY,wxT("Curve Popup"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), page_(parent) { setup_ = true; CreateForm(); // wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/CurvePopup/UPPERLEFTX"), 950l ); int uly = config->Read( wxT("/CurvePopup/UPPERLEFTY"), 150l ); int width = config->Read( wxT("/CurvePopup/WIDTH"), 270l ); int height = config->Read( wxT("/CurvePopup/HEIGHT"), 420l ); SetSize( ulx, uly, width, height ); Show( true ); // Layout(); } void CurvePopup::CreateForm() { wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( sizer ); wxString choices[3]; choices[0] = wxT("Non-histogram"); choices[1] = wxT("Histogram without tails"); choices[2] = wxT("Histogram with tails"); histogramRB_ = new wxRadioBox( this,ID_curveType,wxT("Curve type"),wxDefaultPosition,wxDefaultSize,3,choices ); histogramRB_->SetToolTip( wxT("set the type of curve") ); sizer->Add( histogramRB_, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *topMidPanel = new wxPanel( this ); wxBoxSizer *topMidSizer = new wxBoxSizer( wxHORIZONTAL ); topMidPanel->SetSizer( topMidSizer ); curveColor_ = new ExColorCtrl( topMidPanel, wxT("Curve color"), this, &CurvePopup::OnCurveColor ); curveColor_->SetToolTip( wxT("change the curve color") ); topMidSizer->Add( curveColor_, wxSizerFlags(0).Left().Border(wxALL,5) ); areafillColor_ = new ExColorCtrl( topMidPanel, wxT("Areafill color"), this, &CurvePopup::OnAreafillColor ); areafillColor_->SetToolTip( wxT("change the areafill color") ); topMidSizer->Add( areafillColor_, wxSizerFlags(0).Left().Border(wxALL,5) ); sizer->Add( topMidPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *topLowerPanel = new wxPanel( this ); wxBoxSizer *topLowerSizer = new wxBoxSizer( wxHORIZONTAL ); topLowerPanel->SetSizer( topLowerSizer ); lineWidthSC_ = new ExSpinCtrlI( topLowerPanel, wxT("Line width"), 1, 10, this, &CurvePopup::OnCurveLineWidth ); lineWidthSC_->SetToolTip( wxT("set the line width for the curve") ); topLowerSizer->Add( lineWidthSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); lineTypeSC_ = new ExSpinCtrlI( topLowerPanel, wxT("Line type"), 1, 10, this, &CurvePopup::OnCurveLineType ); lineTypeSC_->SetToolTip( wxT("set the line type for the curve") ); topLowerSizer->Add( lineTypeSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); sizer->Add( topLowerPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); plotsymbolPanel_ = new wxPanel( this ); wxStaticBoxSizer *plotsymbolSizer = new wxStaticBoxSizer( wxVERTICAL, plotsymbolPanel_, wxT("Plotsymbol") ); plotsymbolPanel_->SetSizer( plotsymbolSizer ); wxPanel *psTopPanel = new wxPanel( plotsymbolPanel_ ); wxBoxSizer *psTopSizer = new wxBoxSizer( wxHORIZONTAL ); psTopPanel->SetSizer( psTopSizer ); plotsymbolColor_ = new ExColorCtrl( psTopPanel, wxT("Color"), this, &CurvePopup::OnPlotsymbolColor ); plotsymbolColor_->SetToolTip( wxT("change the plotsymbol color") ); psTopSizer->Add( plotsymbolColor_, wxSizerFlags(0).Left().Border(wxALL,5) ); plotsymbolCodeSC_ = new ExSpinCtrlI( psTopPanel, wxT("Code"), 0, 18, this, &CurvePopup::OnPlotsymbolCode ); plotsymbolCodeSC_->SetToolTip( wxT("change the plotsymbol code") ); psTopSizer->Add( plotsymbolCodeSC_, wxSizerFlags(0).Left().Border(wxALL,5) ); connectCB_ = new wxCheckBox( psTopPanel, ID_connect, wxT("Connect") ); connectCB_->SetToolTip( wxT("toggle connect plotsymbols") ); psTopSizer->Add( connectCB_, wxSizerFlags(0).Left().Border(wxTOP,15) ); plotsymbolSizer->Add( psTopPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); wxPanel *psBotPanel = new wxPanel( plotsymbolPanel_ ); wxBoxSizer *psBotSizer = new wxBoxSizer( wxHORIZONTAL ); psBotPanel->SetSizer( psBotSizer ); plotsymbolSizeSC_ = new ExSpinCtrlD( psBotPanel, wxT("Size (%)"), this, &CurvePopup::OnPlotsymbolSize ); plotsymbolSizeSC_->SetToolTip( wxT("set the plotsymbol size (as a percentage of the window)") ); psBotSizer->Add( plotsymbolSizeSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); plotsymbolAngleSC_ = new ExSpinCtrlI( psBotPanel, wxT("Angle (degrees)"), 0, 360, this, &CurvePopup::OnPlotsymbolAngle ); plotsymbolAngleSC_->SetToolTip( wxT("set the plotsymbol angle (from 0 to 360 degrees)") ); psBotSizer->Add( plotsymbolAngleSC_, wxSizerFlags(0).Center().Border(wxALL,5) ); plotsymbolSizer->Add( psBotPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); sizer->Add( plotsymbolPanel_, wxSizerFlags(0).Center().Border(wxALL,2) ); closeBTN_ = new wxButton( this, wxID_CLOSE, wxT("Close") ); sizer->Add( closeBTN_, wxSizerFlags(0).Center().Border(wxALL,2) ); } void CurvePopup::Setup( GRA_window *window, GRA_cartesianCurve *curve ) { setup_ = true; window_ = window; curve_ = curve; curve_->SetPopup(); curveChars_ = window_->GetDataCurveCharacteristics(); // this will be a problem if histType is other than 0, 1, or 2 int histType = curve_->GetHistogramType(); if( histType == 3 )histType = 1; if( histType == 4 )histType = 2; histogramRB_->SetSelection( histType ); plotsymbolPanel_->Enable( histType==0 ); curveColor_->SetColor( curve_->GetColor() ); areafillColor_->SetColor( curve_->GetAreaFillColor() ); lineWidthSC_->SetValue( curve_->GetLineWidth() ); lineTypeSC_->SetValue( curve_->GetLineType() ); plotsymbolCodeSC_->SetValue( abs(curve_->GetPlotsymbolCode()) ); connectCB_->SetValue( curve_->GetPlotsymbolCode()>=0 ); plotsymbolColor_->SetColor( curve_->GetPlotsymbolColor() ); double heightW = curve_->GetPlotsymbolSize(); double height, dummy; window_->WorldToPercent( 0.0, heightW, dummy, height ); plotsymbolSizeSC_->SetValue( height ); plotsymbolAngleSC_->SetValue( static_cast(curve_->GetPlotsymbolAngle()) ); setup_ = false; } void CurvePopup::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/CurvePopup/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/CurvePopup/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/CurvePopup/WIDTH"), static_cast(width) ); config->Write( wxT("/CurvePopup/HEIGHT"), static_cast(height) ); } if( curve_ )curve_->Disconnect(); // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ Destroy(); ExGlobals::ZeroCurvePopup(); } void CurvePopup::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void CurvePopup::Disconnect() { curve_ = 0; } void CurvePopup::OnCurveColor( GRA_color *color ) { if( setup_ || !curve_ )return; static_cast(curveChars_->Get(wxT("CURVECOLOR")))->Set( color ); curve_->SetColor( color ); ReDraw(); } void CurvePopup::OnAreafillColor( GRA_color *color ) { if( setup_ || !curve_ )return; if( GRA_colorControl::GetColorCode(color) == 0 )color = 0; static_cast(window_->GetGeneralCharacteristics()-> Get(wxT("AREAFILLCOLOR")))->Set( color ); curve_->SetAreaFillColor( color ); ReDraw(); } void CurvePopup::OnPlotsymbolColor( GRA_color *color ) { if( setup_ || !curve_ )return; static_cast(curveChars_->Get(wxT("PLOTSYMBOLCOLOR")))->Set( color ); curve_->SetPlotsymbolColor( color ); ReDraw(); } void CurvePopup::OnPlotsymbolCode( int code ) { if( setup_ || !curve_ )return; if( !connectCB_->IsChecked() )code *= -1; static_cast(curveChars_->Get(wxT("PLOTSYMBOL")))->Set( code ); curve_->SetPlotsymbolCode( code ); ReDraw(); } void CurvePopup::OnCurveLineWidth( int lw ) { if( setup_ || !curve_ )return; static_cast(curveChars_->Get(wxT("CURVELINEWIDTH")))->Set( lw ); curve_->SetLineWidth( lw ); ReDraw(); } void CurvePopup::OnCurveLineType( int lt ) { if( setup_ || !curve_ )return; static_cast(curveChars_->Get(wxT("CURVELINETYPE")))->Set( lt ); curve_->SetLineType( lt ); ReDraw(); } void CurvePopup::OnPlotsymbolSize( double size ) { if( setup_ || !curve_ )return; static_cast(curveChars_->Get(wxT("PLOTSYMBOLSIZE")))->SetAsPercent( size ); curve_->SetPlotsymbolSize( static_cast(curveChars_->Get(wxT("PLOTSYMBOLSIZE")))->GetAsWorld() ); ReDraw(); } void CurvePopup::OnPlotsymbolAngle( int angle ) { if( setup_ || !curve_ )return; static_cast(curveChars_->Get(wxT("PLOTSYMBOLANGLE")))-> Set( static_cast(angle) ); curve_->SetPlotsymbolAngle( angle ); ReDraw(); } void CurvePopup::OnCurveType( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !curve_ )return; int histType = histogramRB_->GetSelection(); static_cast(curveChars_->Get(wxT("HISTOGRAMTYPE")))->Set( histType ); curve_->SetHistogramType( histType ); plotsymbolPanel_->Enable( histType==0 ); ReDraw(); } void CurvePopup::OnConnect( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !curve_ )return; int code = plotsymbolCodeSC_->GetValue(); if( !connectCB_->IsChecked() )code *= -1; static_cast(curveChars_->Get(wxT("PLOTSYMBOL")))->Set( code ); curve_->SetPlotsymbolCode( code ); ReDraw(); } void CurvePopup::ReDraw() { if( setup_ || !curve_ )return; try { page_->SetGraphWindow( window_ ); page_->ReplotCurrentWindow( true ); } catch ( EGraphicsError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } extrema-4.4.5/src/wxForms/ShowVariablesForm.cpp0000644012702201742730000001571411274636606020567 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "ShowVariablesForm.h" #include "AnalysisWindow.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "TextVariable.h" #include "VarInfoForm.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ShowVariablesForm, wxFrame ) EVT_BUTTON( wxID_REFRESH, ShowVariablesForm::OnRefresh ) EVT_BUTTON( wxID_CLOSE, ShowVariablesForm::OnClose ) EVT_CLOSE( ShowVariablesForm::CloseEventHandler ) EVT_GRID_SELECT_CELL( ShowVariablesForm::OnSelectCell ) END_EVENT_TABLE() ShowVariablesForm::ShowVariablesForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Show variables"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { varInfoForm_ = 0; wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); wxPanel *gridPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(550,350), wxNO_BORDER ); wxBoxSizer *gridSizer = new wxBoxSizer( wxHORIZONTAL ); // // create the variable grid varGrid_ = new wxGrid( gridPanel, wxID_ANY, wxDefaultPosition, wxSize(540,340), wxSUNKEN_BORDER|wxVSCROLL ); varGrid_->CreateGrid( 50, 4 ); varGrid_->SetColSize( 0, 140 ); varGrid_->SetColSize( 1, 100 ); varGrid_->SetColSize( 2, 100 ); varGrid_->SetColSize( 3, 100 ); varGrid_->SetColLabelValue( 0, wxT("Scalars") ); varGrid_->SetColLabelValue( 1, wxT("Vectors") ); varGrid_->SetColLabelValue( 2, wxT("Matrices") ); varGrid_->SetColLabelValue( 3, wxT("Strings") ); wxGridCellAttr *attr = new wxGridCellAttr(); attr->SetReadOnly(true); varGrid_->SetColAttr( 0, attr ); attr = new wxGridCellAttr(); attr->SetReadOnly(true); varGrid_->SetColAttr( 1, attr ); attr = new wxGridCellAttr(); attr->SetReadOnly(true); varGrid_->SetColAttr( 2, attr ); attr = new wxGridCellAttr(); attr->SetReadOnly(true); varGrid_->SetColAttr( 3, attr ); gridSizer->Add( varGrid_, wxSizerFlags(1).Expand().Border(wxALL,1) ); mainSizer->Add( gridPanel, wxSizerFlags(1).Expand().Border(wxALL,2) ); wxPanel *bottomPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *refreshButton = new wxButton( bottomPanel, wxID_REFRESH, wxT("Refresh") ); refreshButton->SetToolTip( wxT("refresh the display of current variables") ); bottomSizer->Add( refreshButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/ShowVariablesForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/ShowVariablesForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/ShowVariablesForm/WIDTH"), 550l ); int height = config->Read( wxT("/ShowVariablesForm/HEIGHT"), 400l ); SetSize( ulx, uly, width, height ); Show( true ); FillGrid(); } void ShowVariablesForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ShowVariablesForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ShowVariablesForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ShowVariablesForm/WIDTH"), static_cast(width) ); config->Write( wxT("/ShowVariablesForm/HEIGHT"), static_cast(height) ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroShowVariables(); Destroy(); } void ShowVariablesForm::OnRefresh( wxCommandEvent &WXUNUSED(event) ) { FillGrid(); } void ShowVariablesForm::FillGrid() { if( varGrid_->GetNumberRows() > 0 ) { varGrid_->ClearGrid(); varGrid_->DeleteRows( 0, varGrid_->GetNumberRows() ); } NVariableTable *nvTable = NVariableTable::GetTable(); std::vector scalarNames, vectorNames, matrixNames, stringNames; int end = nvTable->Entries(); for( int i=0; iGetEntry( i ); wxString name( nv->GetName() ); switch ( nv->GetData().GetNumberOfDimensions() ) { case 0: scalarNames.push_back( name ); break; case 1: vectorNames.push_back( name ); break; case 2: matrixNames.push_back( name ); break; } } TVariableTable *tvTable = TVariableTable::GetTable(); end = tvTable->Entries(); for( int i=0; iGetEntry( i ); stringNames.push_back( tv->GetName() ); } std::size_t nRows = std::max( scalarNames.size(), std::max(vectorNames.size(),std::max(matrixNames.size(),stringNames.size())) ); if( nRows > 0 ) { varGrid_->InsertRows( 0, nRows ); for( std::size_t i=0; iSetCellValue( i, 0, scalarNames[i] ); if( i < vectorNames.size() )varGrid_->SetCellValue( i, 1, vectorNames[i] ); if( i < matrixNames.size() )varGrid_->SetCellValue( i, 2, matrixNames[i] ); if( i < stringNames.size() )varGrid_->SetCellValue( i, 3, stringNames[i] ); } } } void ShowVariablesForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void ShowVariablesForm::ZeroVarInfoForm() { varInfoForm_ = 0; } void ShowVariablesForm::OnSelectCell( wxGridEvent &e ) { int row = e.GetRow(); int column = e.GetCol(); // e.Skip(); // wxString name( varGrid_->GetCellValue(row,column) ); if( !name.empty() ) { if( !varInfoForm_ )varInfoForm_ = new VarInfoForm( this ); varInfoForm_->DisplayInfo( name ); } } // end of file extrema-4.4.5/src/wxForms/ReadMatrixForm.h0000644012702201742730000000314611274636606017517 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_READMATRIXFORM #define EXTREMA_READMATRIXFORM #include "wx/wx.h" #include "wx/grid.h" class AnalysisWindow; class ChooseFilePanel; class ReadMatrixForm : public wxFrame { public: ReadMatrixForm( AnalysisWindow * ); // event handlers void OnApply( wxCommandEvent & ); void OnClose( wxCommandEvent & ); void CloseEventHandler( wxCloseEvent & ); void OnErrorFill( wxCommandEvent & ); void OnFormat( wxCommandEvent & ); private: AnalysisWindow *analysisWindow_; ChooseFilePanel *topPanel_; wxCheckBox *closeBefore_, *closeAfter_, *errorFill_, *format_, *messages_; wxTextCtrl *formatTextCtrl_, *errorFillTextCtrl_, *lineNumberTextCtrl_, *matrixNameTextCtrl_, *rowsTextCtrl_, *columnsTextCtrl_; enum { ID_errorFill, ID_format }; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; #endif extrema-4.4.5/src/wxForms/LegendPopup.cpp0000644012702201742730000003557411274636606017422 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "wx/slider.h" #include "LegendPopup.h" #include "GraphicsPage.h" #include "GRA_window.h" #include "GRA_font.h" #include "GRA_fontControl.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "ExGlobals.h" #include "GRA_setOfCharacteristics.h" #include "GRA_sizeCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "BasicColors.h" #include "EGraphicsError.h" #include "GRA_legend.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( LegendPopup, wxFrame ) EVT_COMBOBOX( ID_font, LegendPopup::OnTitleFont ) EVT_CHECKBOX( ID_drawLegend, LegendPopup::OnDrawLegend ) EVT_CHECKBOX( ID_drawFrame, LegendPopup::OnDrawFrame ) EVT_CHECKBOX( ID_drawTitle, LegendPopup::OnDrawTitle ) EVT_TEXT_ENTER( ID_title, LegendPopup::OnTitleEnter ) EVT_BUTTON( wxID_CLOSE, LegendPopup::OnClose ) EVT_CLOSE( LegendPopup::CloseEventHandler ) END_EVENT_TABLE() LegendPopup::LegendPopup( GraphicsPage *parent ) : wxFrame(parent,wxID_ANY,wxT("Legend Popup"),wxDefaultPosition,wxDefaultSize, wxDEFAULT_FRAME_STYLE), page_(parent) { setup_ = true; CreateForm(); // wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/LegendPopup/UPPERLEFTX"), 950l ); int uly = config->Read( wxT("/LegendPopup/UPPERLEFTY"), 150l ); int width = config->Read( wxT("/LegendPopup/WIDTH"), 290l ); int height = config->Read( wxT("/LegendPopup/HEIGHT"), 570l ); SetSize( ulx, uly, width, height ); Show( true ); // Layout(); } void LegendPopup::CreateForm() { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); SetSizer( mainSizer ); drawLegendCB_ = new wxCheckBox( this, ID_drawLegend, wxT("Draw legend") ); drawLegendCB_->SetToolTip( wxT("toggle the graph legend on/off") ); mainSizer->Add( drawLegendCB_, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *framePanel = new wxPanel( this ); wxStaticBoxSizer *frameSizer = new wxStaticBoxSizer( wxVERTICAL, framePanel, wxT("Legend frame") ); framePanel->SetSizer( frameSizer ); mainSizer->Add( framePanel, wxSizerFlags(0).Center().Border(wxALL,5) ); drawFrameCB_ = new wxCheckBox( framePanel, ID_drawFrame, wxT("Draw legend frame") ); drawFrameCB_->SetToolTip( wxT("toggle the graph legend frame on/off") ); frameSizer->Add( drawFrameCB_, wxSizerFlags(0).Center().Border(wxALL,5) ); frameColor_ = new ExColorCtrl( framePanel, wxT("Color"), this, &LegendPopup::OnFrameColor ); frameColor_->SetToolTip( wxT("change the legend frame color") ); frameSizer->Add( frameColor_, wxSizerFlags(0).Center().Border(wxALL,5) ); wxPanel *frameMidPanel = new wxPanel( framePanel ); wxBoxSizer *frameMidSizer = new wxBoxSizer( wxHORIZONTAL ); frameMidPanel->SetSizer( frameMidSizer ); frameSizer->Add( frameMidPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); frameMidSizer->Add( new wxStaticText(frameMidPanel,wxID_ANY,wxT("Move")), wxSizerFlags(0).Left().Border(wxTOP,25) ); moveH_ = new ExSlider( frameMidPanel, wxT("Horizontal"), this, &LegendPopup::OnMoveH ); moveH_->SetToolTip( wxT("shift the legend left or right") ); frameMidSizer->Add( moveH_, wxSizerFlags(0).Left().Border(wxALL,2) ); moveV_ = new ExSlider( frameMidPanel, wxT("Vertical"), this, &LegendPopup::OnMoveV ); moveV_->SetToolTip( wxT("shift the legend up or down") ); frameMidSizer->Add( moveV_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *frameBotPanel = new wxPanel( framePanel ); wxBoxSizer *frameBotSizer = new wxBoxSizer( wxHORIZONTAL ); frameBotPanel->SetSizer( frameBotSizer ); frameSizer->Add( frameBotPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); frameBotSizer->Add( new wxStaticText(frameBotPanel,wxID_ANY,wxT("Expand")), wxSizerFlags(0).Left().Border(wxTOP,25) ); expandH_ = new ExSlider( frameBotPanel, wxT("Horizontal"), this, &LegendPopup::OnExpandH ); expandH_->SetToolTip( wxT("expand the legend horizontally") ); frameBotSizer->Add( expandH_, wxSizerFlags(0).Left().Border(wxALL,2) ); expandV_ = new ExSlider( frameBotPanel, wxT("Vertical"), this, &LegendPopup::OnExpandV ); expandV_->SetToolTip( wxT("expand the legend vertically") ); frameBotSizer->Add( expandV_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *titlePanel = new wxPanel( this ); wxStaticBoxSizer *titleSizer = new wxStaticBoxSizer( wxVERTICAL, titlePanel, wxT("Legend title") ); titlePanel->SetSizer( titleSizer ); mainSizer->Add( titlePanel, wxSizerFlags(0).Center().Border(wxALL,5) ); drawTitleCB_ = new wxCheckBox( titlePanel, ID_drawTitle, wxT("Draw legend title") ); drawTitleCB_->SetToolTip( wxT("toggle the graph legend title on/off") ); titleSizer->Add( drawTitleCB_, wxSizerFlags(0).Center().Border(wxALL,2) ); titleSizer->Add( new wxStaticText(titlePanel,wxID_ANY,wxT("Title")), wxSizerFlags(0).Left().Border(wxTOP,2) ); titleTC_ = new wxTextCtrl( titlePanel, ID_title, wxT(""), wxDefaultPosition, wxSize(250,25), wxTE_LEFT|wxTE_PROCESS_ENTER ); titleTC_->SetToolTip( wxT("enter the new title (hit Enter key to accept title)") ); titleSizer->Add( titleTC_, wxSizerFlags(0).Left().Border(wxALL,2) ); wxPanel *titleMidPanel = new wxPanel( titlePanel ); wxBoxSizer *titleMidSizer = new wxBoxSizer( wxHORIZONTAL ); titleMidPanel->SetSizer( titleMidSizer ); titleSizer->Add( titleMidPanel, wxSizerFlags(0).Center().Border(wxALL,5) ); titleColor_ = new ExColorCtrl( titleMidPanel, wxT("Color"), this, &LegendPopup::OnTitleColor ); titleColor_->SetToolTip( wxT("change the legend title color") ); titleMidSizer->Add( titleColor_, wxSizerFlags(0).Left().Border(wxALL,5) ); titleHeightSC_ = new ExSpinCtrlD( titleMidPanel, wxT("Height (%)"), this, &LegendPopup::OnTitleHeight ); titleHeightSC_->SetToolTip( wxT("set the legend title height (as a % of the window)") ); titleMidSizer->Add( titleHeightSC_, wxSizerFlags(0).Left().Border(wxALL,5) ); wxPanel *titleBotPanel = new wxPanel( titlePanel ); wxBoxSizer *titleBotSizer = new wxBoxSizer( wxVERTICAL ); titleBotPanel->SetSizer( titleBotSizer ); titleSizer->Add( titleBotPanel, wxSizerFlags(0).Center().Border(wxALL,2) ); titleBotSizer->Add( new wxStaticText(titleBotPanel,wxID_ANY,wxT("Font")), wxSizerFlags(0).Left().Border(wxALL,2) ); int nf = GRA_fontControl::GetCount(); wxString choices[nf]; for( int i=0; iGetFontName(); titleFontCB_ = new wxComboBox( titleBotPanel, ID_font, wxT(""), wxDefaultPosition, wxSize(200,25), nf, choices, wxCB_READONLY ); titleFontCB_->SetToolTip( wxT("choose the title font") ); titleBotSizer->Add( titleFontCB_, wxSizerFlags(0).Left().Border(wxALL,2) ); closeBTN_ = new wxButton( this, wxID_CLOSE, wxT("Close") ); mainSizer->Add( closeBTN_, wxSizerFlags(0).Center().Border(wxALL,2) ); } void LegendPopup::Setup( GRA_window *window, GRA_legend *legend ) { setup_ = true; window_ = window; legend_ = legend; legend_->SetPopup(); legChars_ = window_->GetGraphLegendCharacteristics(); drawLegendCB_->SetValue( static_cast(legChars_->Get(wxT("ON")))->Get() ); frameColor_->SetColor( static_cast(legChars_->Get(wxT("FRAMECOLOR")))->Get() ); drawFrameCB_->SetValue( static_cast(legChars_->Get(wxT("FRAMEON")))->Get() ); double xlo = static_cast(legChars_->Get(wxT("FRAMEXLO")))->GetAsPercent(); double ylo = static_cast(legChars_->Get(wxT("FRAMEYLO")))->GetAsPercent(); double xhi = static_cast(legChars_->Get(wxT("FRAMEXHI")))->GetAsPercent(); double yhi = static_cast(legChars_->Get(wxT("FRAMEYHI")))->GetAsPercent();; moveH_->SetValue( xlo ); moveV_->SetValue( ylo ); expandH_->SetValue( xhi-xlo ); expandV_->SetValue( yhi-ylo ); drawTitleCB_->SetValue( static_cast(legChars_->Get(wxT("TITLEON")))->Get() ); titleTC_->SetValue( static_cast(legChars_->Get(wxT("TITLE")))->Get() ); titleColor_->SetColor( static_cast(legChars_->Get(wxT("TITLECOLOR")))->Get() ); titleHeightSC_->SetValue( static_cast(legChars_->Get(wxT("TITLEHEIGHT")))->GetAsPercent() ); titleFontCB_->SetValue( static_cast(legChars_->Get(wxT("TITLEFONT")))->Get()->GetFontName() ); setup_ = false; } void LegendPopup::OnFrameColor( GRA_color *color ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("FRAMECOLOR")))->Set( color ); legend_->MakeFrame(); if( drawLegendCB_->IsChecked() && drawFrameCB_->IsChecked() )ReDraw(); } void LegendPopup::OnTitleColor( GRA_color *color ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("TITLECOLOR")))->Set( color ); legend_->MakeTitle(); if( drawTitleCB_->IsChecked() && drawLegendCB_->IsChecked() )ReDraw(); } void LegendPopup::OnTitleHeight( double height ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("TITLEHEIGHT")))->SetAsPercent( height ); legend_->MakeTitle(); if( drawTitleCB_->IsChecked() && drawLegendCB_->IsChecked() )ReDraw(); } void LegendPopup::OnMoveH( double x ) { if( setup_ || !legend_ )return; double xlo = static_cast(legChars_->Get(wxT("FRAMEXLO")))->GetAsPercent(); double xhi = static_cast(legChars_->Get(wxT("FRAMEXHI")))->GetAsPercent(); double dx = xhi - xlo; static_cast(legChars_->Get(wxT("FRAMEXLO")))->SetAsPercent( x ); static_cast(legChars_->Get(wxT("FRAMEXHI")))->SetAsPercent( x+dx ); legend_->Initialize(); ReDraw(); } void LegendPopup::OnMoveV( double y ) { if( setup_ || !legend_ )return; double ylo = static_cast(legChars_->Get(wxT("FRAMEYLO")))->GetAsPercent(); double yhi = static_cast(legChars_->Get(wxT("FRAMEYHI")))->GetAsPercent(); double dy = yhi - ylo; static_cast(legChars_->Get(wxT("FRAMEYLO")))->SetAsPercent( y ); static_cast(legChars_->Get(wxT("FRAMEYHI")))->SetAsPercent( y+dy ); legend_->Initialize(); ReDraw(); } void LegendPopup::OnExpandH( double dx ) { if( setup_ || !legend_ )return; double xlo = static_cast(legChars_->Get(wxT("FRAMEXLO")))->GetAsPercent(); static_cast(legChars_->Get(wxT("FRAMEXHI")))->SetAsPercent( xlo+dx ); legend_->Initialize(); ReDraw(); } void LegendPopup::OnExpandV( double dy ) { if( setup_ || !legend_ )return; double ylo = static_cast(legChars_->Get(wxT("FRAMEYLO")))->GetAsPercent(); static_cast(legChars_->Get(wxT("FRAMEYHI")))->SetAsPercent( ylo+dy ); legend_->Initialize(); ReDraw(); } void LegendPopup::OnTitleEnter( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("TITLE")))->Set( titleTC_->GetValue() ); legend_->MakeTitle(); if( drawTitleCB_->IsChecked() && drawLegendCB_->IsChecked() )ReDraw(); } void LegendPopup::OnTitleFont( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("TITLEFONT")))->Set( GRA_fontControl::GetFont(titleFontCB_->GetValue()) ); legend_->MakeTitle(); if( drawTitleCB_->IsChecked() && drawLegendCB_->IsChecked() )ReDraw(); } void LegendPopup::OnDrawLegend( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("ON")))->Set( drawLegendCB_->IsChecked() ); ReDraw(); } void LegendPopup::OnDrawFrame( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("FRAMEON")))->Set( drawFrameCB_->IsChecked() ); ReDraw(); } void LegendPopup::OnDrawTitle( wxCommandEvent &WXUNUSED(event) ) { if( setup_ || !legend_ )return; static_cast(legChars_->Get(wxT("TITLEON")))->Set( drawTitleCB_->IsChecked() ); ReDraw(); } void LegendPopup::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/LegendPopup/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/LegendPopup/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/LegendPopup/WIDTH"), static_cast(width) ); config->Write( wxT("/LegendPopup/HEIGHT"), static_cast(height) ); } if( legend_ )legend_->Disconnect(); // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ Destroy(); ExGlobals::ZeroLegendPopup(); } void LegendPopup::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } void LegendPopup::Disconnect() { legend_ = 0; } void LegendPopup::ReDraw() { if( setup_ || !legend_ )return; try { page_->SetGraphWindow( window_ ); page_->ReplotCurrentWindow( true ); } catch ( EGraphicsError const &e ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(e.what(),wxConvUTF8), wxT("Error"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } // end of file extrema-4.4.5/src/wxForms/ReadScalarsForm.cpp0000644012702201742730000004771611274636606020211 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include #include "wx/config.h" #include "wx/statline.h" #include "wx/stattext.h" #include "ReadScalarsForm.h" #include "AnalysisWindow.h" #include "ChooseFilePanel.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "TextVariable.h" #include "ExGlobals.h" #include "CMD_read.h" // the event tables connect the wxWidgets events with the // event handler functions which process them // BEGIN_EVENT_TABLE( ReadScalarsForm, wxFrame ) EVT_BUTTON( wxID_APPLY, ReadScalarsForm::OnApply ) EVT_BUTTON( wxID_CLOSE, ReadScalarsForm::OnClose ) EVT_GRID_CELL_CHANGE( ReadScalarsForm::OnCellChange ) EVT_CHECKBOX( ID_errorFill, ReadScalarsForm::OnErrorFill ) EVT_CHECKBOX( ID_format, ReadScalarsForm::OnFormat ) EVT_CLOSE( ReadScalarsForm::CloseEventHandler ) END_EVENT_TABLE() ReadScalarsForm::ReadScalarsForm( AnalysisWindow *parent ) : wxFrame(parent,wxID_ANY,wxT("Read scalars"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE), analysisWindow_(parent) { wxBoxSizer *mainSizer = new wxBoxSizer( wxVERTICAL ); mainSizer->InsertSpacer( 0, 10 ); topPanel_ = new ChooseFilePanel( this, true, wxT("Choose a data file for reading"), wxT("any file|*.*") ); mainSizer->Add( topPanel_, wxSizerFlags(0).Border(wxALL,1) ); wxPanel *gridPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *gridSizer = new wxBoxSizer( wxHORIZONTAL ); // create the scalar name/column grid // column 0 is "scalar name", column 1 is "column number" scalarGrid_ = new wxGrid( gridPanel, wxID_ANY, wxDefaultPosition, wxSize(375,250), wxSUNKEN_BORDER|wxVSCROLL ); scalarGrid_->CreateGrid( 100, 2 ); scalarGrid_->SetColFormatNumber( 1 ); scalarGrid_->SetColLabelValue( 0, wxT("scalar name") ); scalarGrid_->SetColLabelValue( 1, wxT("column") ); scalarGrid_->SetColSize( 0, 210 ); scalarGrid_->SetColSize( 1, 60 ); gridSizer->Add( scalarGrid_, wxSizerFlags(0).Border(wxALL,2) ); gridPanel->SetSizer( gridSizer ); mainSizer->Add( gridPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *midPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER ); wxBoxSizer *midSizer = new wxBoxSizer( wxVERTICAL ); closeBefore_ = new wxCheckBox( midPanel, wxID_ANY, wxT("Close file before reading") ); midSizer->Add( closeBefore_, wxSizerFlags(0).Border(wxALL,2) ); closeBefore_->SetValue( true ); closeAfter_ = new wxCheckBox( midPanel, wxID_ANY, wxT("Close file after reading") ); midSizer->Add( closeAfter_, wxSizerFlags(0).Border(wxALL,2) ); closeAfter_->SetValue( true ); midSizer->Add( new wxStaticLine(midPanel), wxSizerFlags(0).Expand().Border(wxALL,1) ); wxPanel *errorFillPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *errorFillSizer = new wxBoxSizer( wxHORIZONTAL ); errorFill_ = new wxCheckBox( errorFillPanel, ID_errorFill, wxT("Error fill") ); errorFillSizer->Add( errorFill_, wxSizerFlags(0).Border(wxALL,2) ); errorFillTextCtrl_ = new wxTextCtrl( errorFillPanel, wxID_ANY ); errorFillTextCtrl_->SetValue( wxT("0.0") ); errorFillSizer->Add( errorFillTextCtrl_, wxSizerFlags(0).Border(wxALL,2) ); errorFillTextCtrl_->Enable( false ); errorFillPanel->SetSizer( errorFillSizer ); midSizer->Add( errorFillPanel, wxSizerFlags(0).Border(wxALL,2) ); midSizer->Add( new wxStaticLine(midPanel), wxSizerFlags(0).Expand().Border(wxALL,2) ); messages_ = new wxCheckBox( midPanel, wxID_ANY, wxT("Display messages") ); midSizer->Add( messages_, wxSizerFlags(0).Border(wxALL,2) ); messages_->SetValue( true ); midSizer->Add( new wxStaticLine(midPanel), wxSizerFlags(0).Expand().Border(wxALL,2) ); wxPanel *lineNumberPanel = new wxPanel( midPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxGridSizer *lineNumberSizer = new wxGridSizer( 1, 2, 0, 0 ); lineNumberText_ = new wxStaticText( lineNumberPanel, wxID_ANY, wxT("Line to read"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); lineNumberSizer->Add( lineNumberText_, wxSizerFlags(0).Right().Border(wxTOP,10) ); lineNumberTextCtrl_ = new wxTextCtrl( lineNumberPanel, wxID_ANY ); lineNumberTextCtrl_->SetValue( wxT("1") ); lineNumberSizer->Add( lineNumberTextCtrl_, wxSizerFlags(0).Left().Border(wxALL,5) ); lineNumberPanel->SetSizer( lineNumberSizer ); midSizer->Add( lineNumberPanel, wxSizerFlags(0).Border(wxALL,1) ); midSizer->Add( new wxStaticLine(midPanel), wxSizerFlags(0).Expand().Border(wxALL,10) ); format_ = new wxCheckBox( midPanel, ID_format, wxT("Use format") ); midSizer->Add( format_, wxSizerFlags(0).Center().Border(wxALL,1) ); formatTextCtrl_ = new wxTextCtrl( midPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(175,25) ); midSizer->Add( formatTextCtrl_, wxSizerFlags(0).Center().Border(wxALL,10) ); formatTextCtrl_->Enable( false ); midPanel->SetSizer( midSizer ); mainSizer->Add( midPanel, wxSizerFlags(0).Center().Border(wxALL,1) ); wxPanel *bottomPanel = new wxPanel( (wxWindow*)this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER ); wxBoxSizer *bottomSizer = new wxBoxSizer( wxHORIZONTAL ); wxButton *applyButton = new wxButton( bottomPanel, wxID_APPLY, wxT("Apply") ); applyButton->SetToolTip( wxT("read data from the file chosen above") ); bottomSizer->Add( applyButton, wxSizerFlags(0).Border(wxALL,10) ); wxButton *closeButton = new wxButton( bottomPanel, wxID_CLOSE, wxT("Close") ); closeButton->SetToolTip( wxT("close this form") ); bottomSizer->Add( closeButton, wxSizerFlags(0).Border(wxALL,10) ); bottomPanel->SetSizer( bottomSizer ); mainSizer->Add( bottomPanel, wxSizerFlags(0).Centre().Border(wxALL,1) ); SetSizer( mainSizer ); wxConfigBase *config = wxConfigBase::Get(); int ulx = config->Read( wxT("/ReadScalarsForm/UPPERLEFTX"), 0l ); int uly = config->Read( wxT("/ReadScalarsForm/UPPERLEFTY"), 640l ); int width = config->Read( wxT("/ReadScalarsForm/WIDTH"), 575l ); int height = config->Read( wxT("/ReadScalarsForm/HEIGHT"), 610l ); SetSize( ulx, uly, width, height ); topPanel_->GetFilenames( config, wxT("/ReadScalarsForm") ); Show( true ); } void ReadScalarsForm::CloseEventHandler( wxCloseEvent &WXUNUSED(event) ) { wxConfigBase *config = wxConfigBase::Get(); if( config ) { int ulx, uly; GetPosition( &ulx, &uly ); config->Write( wxT("/ReadScalarsForm/UPPERLEFTX"), static_cast(ulx) ); config->Write( wxT("/ReadScalarsForm/UPPERLEFTY"), static_cast(uly) ); int width, height; GetSize( &width, &height ); config->Write( wxT("/ReadScalarsForm/WIDTH"), static_cast(width) ); config->Write( wxT("/ReadScalarsForm/HEIGHT"), static_cast(height) ); topPanel_->SaveFilenames( config, wxT("/ReadScalarsForm") ); } // // close all child windows /* wxWindowList children( GetChildren() ); wxWindowListNode *node = children.GetFirst(); while( node ) { wxWindow *window = node->GetData(); window->Close(true); node = node->GetNext(); } */ analysisWindow_->ZeroLoadScalars(); Destroy(); } void ReadScalarsForm::OnCellChange( wxGridEvent &WXUNUSED(event) ) { if( scalarGrid_->GetGridCursorCol() == 0 ) { int row = scalarGrid_->GetGridCursorRow(); wxString s; scalarGrid_->SetCellValue( row, 1, s<<(row+1) ); } } void ReadScalarsForm::OnErrorFill( wxCommandEvent &WXUNUSED(event) ) { errorFillTextCtrl_->Enable( errorFill_->IsChecked() ); } void ReadScalarsForm::OnFormat( wxCommandEvent &WXUNUSED(event) ) { formatTextCtrl_->Enable( format_->IsChecked() ); } void ReadScalarsForm::OnApply( wxCommandEvent &WXUNUSED(event) ) { wxString fileName( topPanel_->GetSelection() ); if( fileName.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("no file has been chosen"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } CMD_read *readCommand = CMD_read::Instance(); bool newFile = (readCommand->GetFilename() != fileName); readCommand->SetReadInFilename( fileName ); std::ifstream *inStream = readCommand->GetStream(); if( inStream->is_open() && (closeBefore_->IsChecked() || newFile) )inStream->close(); if( !inStream->is_open() ) { inStream->clear( std::ios::goodbit ); inStream->open( fileName.mb_str(wxConvUTF8), std::ios_base::in ); if( !inStream->is_open() ) { wxMessageDialog *md = new wxMessageDialog( this, wxString(wxT("Could not open "))+fileName, wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); return; } } wxString formatString; if( format_->IsChecked() ) { formatString = formatTextCtrl_->GetValue(); if( formatString.empty() ) { wxMessageDialog *md = new wxMessageDialog( this, wxT("expecting a format"), wxT("Fatal error: nothing was read"), wxOK|wxICON_ERROR ); md->ShowModal(); inStream->close(); return; } } std::vector names; std::vector columnNumber; int nRows = scalarGrid_->GetNumberRows(); for( int i=0; iGetCellValue(i,0) ); if( name.empty() )break; names.push_back( name ); wxString colm( scalarGrid_->GetCellValue(i,1) ); if( colm.empty() || format_->IsChecked() )columnNumber.push_back(i+1); else { long ltmp; if( !colm.ToLong(<mp) || ltmp<1L ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("column number must be an integer > 0"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } columnNumber.push_back( static_cast(ltmp) ); } } if( names.empty() ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("expecting some output vector names"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } int maxColumnNumber = 0; std::size_t numberOfNames = names.size(); for( std::size_t i=0; iRemoveEntry( names[i] ); NVariableTable::GetTable()->RemoveEntry( names[i] ); } long ltmp; wxString stmp( lineNumberTextCtrl_->GetValue() ); if( !stmp.ToLong(<mp) || ltmp<1L ) { lineNumberTextCtrl_->SetValue( wxT("1") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("line number must be > 0"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } int startingLine = static_cast(ltmp); double errorFillValue = readCommand->GetErrorFill(); if( errorFill_->IsChecked() ) { stmp = errorFillTextCtrl_->GetValue(); if( !stmp.ToDouble(&errorFillValue) ) { errorFillTextCtrl_->SetValue( wxT("0.0") ); inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, stmp+wxT(" is an invalid value for error fill"), wxT("Fatal error: nothing was read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } readCommand->SetErrorFill( errorFillValue ); } // // read in the initial dummy records // unsigned int recordNumber = 0; for( int i=1; iclose(); wxMessageDialog *md = new wxMessageDialog( this, wxT("end of file reached reading initial dummy records"), wxT("Fatal error: no scalars were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } } ++recordNumber; // // finally ready to read some data // std::vector data( maxColumnNumber ); if( format_->IsChecked() ) { std::string sc; sc.clear(); if( std::getline(*inStream,sc).fail() || sc.empty() ) { inStream->close(); wxString c( wxT("record ") ); c << recordNumber; wxMessageDialog *md = new wxMessageDialog( this, c+wxT(" could not be read"), wxT("Fatal error: no scalars were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } double vd[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; int result = sscanf( sc.c_str(), formatString.mb_str(wxConvUTF8), vd, vd+1, vd+2, vd+3, vd+4, vd+5, vd+6, vd+7, vd+8, vd+9, vd+10, vd+11, vd+12, vd+13, vd+14, vd+15, vd+16, vd+17, vd+18, vd+19, vd+20, vd+21, vd+22, vd+23, vd+24, vd+25, vd+26, vd+27, vd+28, vd+29, vd+30, vd+31, vd+32, vd+33, vd+34, vd+35, vd+36, vd+37, vd+38, vd+39, vd+40, vd+41, vd+42, vd+43, vd+44, vd+45, vd+46, vd+47, vd+48, vd+49, vd+50, vd+51, vd+52, vd+53, vd+54, vd+55, vd+56, vd+57, vd+58, vd+59, vd+60, vd+61, vd+62, vd+63, vd+64, vd+65, vd+66, vd+67, vd+68, vd+69, vd+70, vd+71, vd+72, vd+73, vd+74, vd+75, vd+76, vd+77, vd+78, vd+79, vd+80, vd+81, vd+81, vd+83, vd+84, vd+85, vd+86, vd+87, vd+88, vd+89, vd+90, vd+91, vd+92, vd+93, vd+94, vd+95, vd+96, vd+97, vd+98, vd+99 ); if( result==EOF || result==0 ) { wxString message( wxT("error reading record ") ); message << recordNumber; inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, message, wxT("Fatal error: no scalars were read"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } else if( result < maxColumnNumber ) { wxString message( wxT("not enough values on record ") ); message << recordNumber; inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, message, wxT("Fatal error: no scalars were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // // no errors in reading // for( int k=0; kclose(); wxMessageDialog *md = new wxMessageDialog( this, message, wxT("Fatal error: no scalars were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } // // trim leading and trailing blanks // std::string const blank( " \t" ); std::size_t rTemp = sc.find_last_not_of( blank ); if( rTemp != sc.npos ) { std::size_t lTemp = sc.find_first_not_of( blank ); if( lTemp != sc.npos )sc = sc.substr( lTemp, rTemp-lTemp+1 ); } int const Classes[128] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; int const StateTable[7][3] = { // blnk , othr { 1, 2, 3 }, { 1, 2, 3 }, { 4, 6, 3 }, { 5, 7, 3 }, { 5, 7, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; std::vector reals( maxColumnNumber, 0.0 ); std::vector itype( maxColumnNumber, 0 ); std::vector strings( maxColumnNumber ); int nf = -1; unsigned int newState = 1; unsigned int currentState = 0; bool flag = true; std::size_t scLen = sc.length(); for( std::size_t k=0; k 0 ) { for( std::size_t k=0; kIsChecked() ) { inStream->close(); wxMessageDialog *md = new wxMessageDialog( this, wxT("error reading scalars"), wxT("Fatal error: no scalars were modified"), wxOK|wxICON_INFORMATION ); md->ShowModal(); return; } data[k] = errorFillValue; if( messages_->IsChecked() ) { wxChar c[200]; ::wxSnprintf( c, 200, wxT("error in field %d, record %d, file: %s"), k+1, recordNumber, fileName.c_str() ); ExGlobals::WarningMessage( c ); } } else data[k] = reals[columnNumber[k]-1]; } } } if( closeAfter_->IsChecked() )inStream->close(); // // finished reading, one of: end of file, an error, or not extending vector // for( std::size_t j=0; jSetOrigin( fileName ); if( messages_->IsChecked() ) ExGlobals::WriteOutput( wxString(wxT("scalar "))+names[j]+wxT(" has been created") ); } } void ReadScalarsForm::OnClose( wxCommandEvent &WXUNUSED(event) ) { Close(); } // end of file extrema-4.4.5/src/Functions/0000755012702201742730000000000011440766116014754 5ustar spangspangextrema-4.4.5/src/Functions/FCN_atanh.cpp0000644012702201742730000000213011274636611017236 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_atanh.h" #include "EExpressionError.h" FCN_atanh *FCN_atanh::fcn_atanh_ = 0; void FCN_atanh::ScalarEval( int j, std::vector &rStack ) const { if( (rStack[j]<=-1.0) || (rStack[j]>=1.0) ) throw EExpressionError( wxT("ATANH: argument must be in the range (-1,1)") ); rStack[j] = 0.5 * log( (1.0 + rStack[j])/(1.0 - rStack[j]) ); } extrema-4.4.5/src/Functions/FCN_asech.h0000644012702201742730000000217511274636611016704 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ASECH #define FCN_ASECH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_asech : public ScalarFunction { public: static FCN_asech *Instance() { if( !fcn_asech_ )fcn_asech_ = new FCN_asech(); return fcn_asech_; } void ScalarEval( int, std::vector & ) const; private: FCN_asech() : ScalarFunction( wxT("ASECH") ) {} static FCN_asech *fcn_asech_; }; #endif extrema-4.4.5/src/Functions/FCN_clebsg.h0000644012702201742730000000221411274636611017052 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CLEBSG #define FCN_CLEBSG #include "wx/wx.h" #include "ScalarFunction.h" class FCN_clebsg : public ScalarFunction { public: static FCN_clebsg *Instance() { if( !fcn_clebsg_ )fcn_clebsg_ = new FCN_clebsg(); return fcn_clebsg_; } void ScalarEval( int, std::vector & ) const; private: FCN_clebsg() : ScalarFunction( wxT("CLEBSG"), 6, 6 ) {} static FCN_clebsg *fcn_clebsg_; }; #endif extrema-4.4.5/src/Functions/FCN_ifft.h0000644012702201742730000000227611274636611016553 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_IFFT #define FCN_IFFT #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_ifft : public ArrayFunction { public: static FCN_ifft *Instance() { if( !fcn_ifft_ )fcn_ifft_ = new FCN_ifft(); return fcn_ifft_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_ifft() : ArrayFunction( wxT("IFFT"), 1, 2, MIXED2NUM, NUMERIC, CHARACTER ) {} static FCN_ifft *fcn_ifft_; }; #endif extrema-4.4.5/src/Functions/FCN_psi.h0000644012702201742730000000214211274636611016406 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PSI #define FCN_PSI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_psi : public ScalarFunction { public: static FCN_psi *Instance() { if( !fcn_psi_ )fcn_psi_ = new FCN_psi(); return fcn_psi_; } void ScalarEval( int, std::vector & ) const; private: FCN_psi() : ScalarFunction( wxT("PSI") ) {} static FCN_psi *fcn_psi_; }; #endif extrema-4.4.5/src/Functions/FCN_hypgeo.cpp0000644012702201742730000000230111274636611017436 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_hypgeo.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_hypgeo *FCN_hypgeo::fcn_hypgeo_ = 0; void FCN_hypgeo::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Hypergeometric2F1( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_logam.cpp0000644012702201742730000000203011274636611017241 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_logam.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_logam *FCN_logam::fcn_logam_ = 0; void FCN_logam::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::LnGamma( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_bivinterp.h0000644012702201742730000000252111274636611017616 0ustar spangspang/* Copyright (C) 2006 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BIVARIATEINTERPOLATE #define FCN_BIVARIATEINTERPOLATE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_bivariateInterpolate : public ArrayFunction { public: static FCN_bivariateInterpolate *Instance() { if( !fcn_bivariateInterpolate_ )fcn_bivariateInterpolate_ = new FCN_bivariateInterpolate(); return fcn_bivariateInterpolate_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_bivariateInterpolate() : ArrayFunction( wxT("BIVINTERP"), 5, 5 ) {} static FCN_bivariateInterpolate *fcn_bivariateInterpolate_; }; #endif extrema-4.4.5/src/Functions/FCN_tanh.h0000644012702201742730000000216011274636611016545 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_TANH #define FCN_TANH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_tanh : public ScalarFunction { public: static FCN_tanh *Instance() { if( !fcn_tanh_ )fcn_tanh_ = new FCN_tanh(); return fcn_tanh_; } void ScalarEval( int, std::vector & ) const; private: FCN_tanh() : ScalarFunction( wxT("TANH") ) {} static FCN_tanh *fcn_tanh_; }; #endif extrema-4.4.5/src/Functions/FCN_tand.cpp0000644012702201742730000000163411274636611017101 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_tand.h" FCN_tand *FCN_tand::fcn_tand_ = 0; void FCN_tand::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = tan( rStack[j]*M_PI/180. ); } extrema-4.4.5/src/Functions/FCN_hermite.h0000644012702201742730000000223011274636611017246 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_HERMITE #define FCN_HERMITE #include "wx/wx.h" #include "ScalarFunction.h" class FCN_hermite : public ScalarFunction { public: static FCN_hermite *Instance() { if( !fcn_hermite_ )fcn_hermite_ = new FCN_hermite(); return fcn_hermite_; } void ScalarEval( int, std::vector & ) const; private: FCN_hermite() : ScalarFunction( wxT("HERMITE"), 2, 2 ) {} static FCN_hermite *fcn_hermite_; }; #endif extrema-4.4.5/src/Functions/FunctionTable.h0000644012702201742730000000346211274636611017670 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FUNCTIONTABLE #define FCN_FUNCTIONTABLE #include #include "wx/wx.h" class FunctionDefinition; class FunctionTable { // FunctionTable is the table of pointers to FunctionDefinitions // FunctionTable is a "singleton" (only one static object) // In FunctionTable, each FunctionDefinition pointer is stored // with its name as a key to itself, so each FunctionDefinition // object must have a unique name. public: typedef std::map functionMap; typedef functionMap::value_type entryType; protected: FunctionTable(); FunctionTable( FunctionTable const & ); public: static FunctionTable *GetTable(); virtual ~FunctionTable(); void ClearTable(); bool Contains( FunctionDefinition const * ) const; bool Contains( wxString const & ) const; int Entries() const { return functionMap_->size(); } FunctionDefinition *GetFunction( wxString const & ) const; void AddEntry( FunctionDefinition * ); void CreateFunctions(); private: functionMap *functionMap_; static FunctionTable *functionTable_; }; #endif extrema-4.4.5/src/Functions/FCN_int.h0000644012702201742730000000225711274636611016414 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_INT #define FCN_INT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_int : public ScalarFunction { public: static FCN_int *Instance() { if( !fcn_int_ )fcn_int_ = new FCN_int(); return fcn_int_; } void ScalarEval( int j, std::vector &rStack ) const { rStack[j] = static_cast(static_cast(rStack[j])); } private: FCN_int() : ScalarFunction( wxT("INT") ) {} static FCN_int *fcn_int_; }; #endif extrema-4.4.5/src/Functions/FCN_ei.cpp0000644012702201742730000000202711274636611016545 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ei.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_ei *FCN_ei::fcn_ei_ = 0; void FCN_ei::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = -UsefulFunctions::ExponentialIntegral( -rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_gauss.h0000644012702201742730000000217311274636611016741 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAUSS #define FCN_GAUSS #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gauss : public ScalarFunction { public: static FCN_gauss *Instance() { if( !fcn_gauss_ )fcn_gauss_ = new FCN_gauss(); return fcn_gauss_; } void ScalarEval( int, std::vector & ) const; private: FCN_gauss() : ScalarFunction( wxT("GAUSS") ) {} static FCN_gauss *fcn_gauss_; }; #endif extrema-4.4.5/src/Functions/FCN_len.cpp0000644012702201742730000000300011274636611016716 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_len.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_len *FCN_len::fcn_len_ = 0; void FCN_len::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("argument of LEN function must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } } void FCN_len::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::size_t size1; arg1->IsaNVariable() ? size1=arg1->GetNVarPtr()->GetData().GetDimMag(0) : size1=arg1->GetWorkspacePtr()->GetDimMag(0); ws->SetValue( static_cast(size1) ); ws->SetNumberOfDimensions(0); } // end of file extrema-4.4.5/src/Functions/FCN_plmu.h0000644012702201742730000000216411274636611016574 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PLMU #define FCN_PLMU #include "wx/wx.h" #include "ScalarFunction.h" class FCN_plmu : public ScalarFunction { public: static FCN_plmu *Instance() { if( !fcn_plmu_ )fcn_plmu_ = new FCN_plmu(); return fcn_plmu_; } void ScalarEval( int, std::vector & ) const; private: FCN_plmu() : ScalarFunction( wxT("PLMU"), 3, 3 ) {} static FCN_plmu *fcn_plmu_; }; #endif extrema-4.4.5/src/Functions/FCN_dilog.h0000644012702201742730000000217211274636611016714 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DILOG #define FCN_DILOG #include "wx/wx.h" #include "ScalarFunction.h" class FCN_dilog : public ScalarFunction { public: static FCN_dilog *Instance() { if( !fcn_dilog_ )fcn_dilog_ = new FCN_dilog(); return fcn_dilog_; } void ScalarEval( int, std::vector & ) const; private: FCN_dilog() : ScalarFunction( wxT("DILOG") ) {} static FCN_dilog *fcn_dilog_; }; #endif extrema-4.4.5/src/Functions/FCN_vlen.h0000644012702201742730000000223111274636611016556 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_VLEN #define FCN_VLEN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_vlen : public ArrayFunction { public: static FCN_vlen *Instance() { if( !fcn_vlen_ )fcn_vlen_ = new FCN_vlen(); return fcn_vlen_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_vlen() : ArrayFunction( wxT("VLEN") ) {} static FCN_vlen *fcn_vlen_; }; #endif extrema-4.4.5/src/Functions/FCN_string.cpp0000644012702201742730000000143711274636611017462 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_string.h" FCN_string *FCN_string::fcn_string_ = 0; extrema-4.4.5/src/Functions/FCN_acot.cpp0000644012702201742730000000162711274636611017103 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acot.h" FCN_acot *FCN_acot::fcn_acot_ = 0; void FCN_acot::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = atan( 1.0/rStack[j] ); } extrema-4.4.5/src/Functions/FCN_ellick.cpp0000644012702201742730000000205711274636611017416 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ellick.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_ellick *FCN_ellick::fcn_ellick_ = 0; void FCN_ellick::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::CompleteEllipticIntegral1( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_ln.cpp0000644012702201742730000000176411274636611016570 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_ln.h" #include "EExpressionError.h" FCN_ln *FCN_ln::fcn_ln_ = 0; void FCN_ln::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] <= 0.0 )throw EExpressionError( wxT("LN: argument <= 0") ); rStack[j] = log( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_fft.h0000644012702201742730000000226211274636611016375 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FFT #define FCN_FFT #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_fft : public ArrayFunction { public: static FCN_fft *Instance() { if( !fcn_fft_ )fcn_fft_ = new FCN_fft(); return fcn_fft_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_fft() : ArrayFunction( wxT("FFT"), 1, 2, MIXED2NUM, NUMERIC, CHARACTER ) {} static FCN_fft *fcn_fft_; }; #endif extrema-4.4.5/src/Functions/FCN_asin.cpp0000644012702201742730000000204711274636611017104 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_asin.h" #include "EExpressionError.h" FCN_asin *FCN_asin::fcn_asin_ = 0; void FCN_asin::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j]<-1.0 || rStack[j]>1.0 ) throw EExpressionError( wxT("ASIN: argument must be >= -1 and <= 1") ); rStack[j] = asin( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_agauss.h0000644012702201742730000000221411274636611017076 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_AGAUSS #define FCN_AGAUSS #include "wx/wx.h" #include "ScalarFunction.h" class FCN_agauss : public ScalarFunction { public: static FCN_agauss *Instance() { if( !fcn_agauss_ )fcn_agauss_ = new FCN_agauss(); return fcn_agauss_; } void ScalarEval( int, std::vector & ) const; private: FCN_agauss() : ScalarFunction( wxT("AGAUSS"), 2, 2 ) {} static FCN_agauss *fcn_agauss_; }; #endif extrema-4.4.5/src/Functions/FCN_erfc.cpp0000644012702201742730000000203611274636611017067 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_erfc.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_erfc *FCN_erfc::fcn_erfc_ = 0; void FCN_erfc::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ComplementaryError( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_pfactors.cpp0000644012702201742730000000427011274636611017773 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_pfactors.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_pfactors *FCN_pfactors::fcn_pfactors_ = 0; void FCN_pfactors::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( ndmEff != 0 ) throw EExpressionError( wxT("PFACTORS: argument must be a scalar") ); numberOfArguments_ = 1; nLoop = 0; } void FCN_pfactors::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg = codes[0]; double d; if( arg->IsaNVariable() ) d = arg->GetNVarPtr()->GetData().GetScalarValue(); else if( arg->IsaWorkspace() ) { Workspace *w = arg->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("PFACTORS: argument workspace is empty") ); d = w->GetValue(); } else d = arg->GetConstantValue(); int n = abs(static_cast(d)); if( n == 0 ) throw EExpressionError( wxT("PFACTORS: zero has no prime factors") ); int prime = 2; int k = 0; L10: if( n%prime == 0 ) // prime is a factor { if( k == 100 ) throw EExpressionError( wxT("PFACTORS: maximum number of prime factors (100) exceeded") ); ws->SetData( k++, prime ); n /= prime; if( n == 1 ) { ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, k ); return; } goto L10; } prime = UsefulFunctions::NextPrime(prime+1); // now test the next prime goto L10; } // end of file extrema-4.4.5/src/Functions/FCN_lcase.cpp0000644012702201742730000000145211274636611017240 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_lcase.h" FCN_lcase *FCN_lcase::fcn_lcase_ = 0; // end of file extrema-4.4.5/src/Functions/FCN_gaussin.h0000644012702201742730000000222211274636611017263 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAUSSIN #define FCN_GAUSSIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gaussin : public ScalarFunction { public: static FCN_gaussin *Instance() { if( !fcn_gaussin_ )fcn_gaussin_ = new FCN_gaussin(); return fcn_gaussin_; } void ScalarEval( int, std::vector & ) const; private: FCN_gaussin() : ScalarFunction( wxT("GAUSSIN") ) {} static FCN_gaussin *fcn_gaussin_; }; #endif extrema-4.4.5/src/Functions/FCN_time.cpp0000644012702201742730000001665211274636611017117 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/datetime.h" #include "FCN_time.h" #include "EExpressionError.h" FCN_time *FCN_time::fcn_time_ = 0; void FCN_time::TextScalarEval( int j, std::vector &sStack ) const { wxDateTime now = wxDateTime::Now(); if( GetArgumentCounter() == 1 ) { wxString format, order; wxChar seperator; int nh=0, nm=0, ns=0; int ampm=0; // 0 -> not there, 1 -> lower case, 2 -> upper case try { order = ParseInputString( sStack[j], seperator, nh, nm, ns, ampm ); AddToFormat( format, order.at(0), nh, nm, ns, ampm ); } catch (EExpressionError &e) { throw; } if( order.size() > 1 ) { format += seperator; try { AddToFormat( format, order.at(1), nh, nm, ns, ampm ); } catch (EExpressionError &e) { throw; } if( order.size() > 2 ) { format += seperator; try { AddToFormat( format, order.at(2), nh, nm, ns, ampm ); } catch (EExpressionError &e) { throw; } } } if( ampm == 1 )format += wxT(" %P"); else if( ampm == 2 )format += wxT(" %p"); sStack[j] = now.Format( format.c_str() ); } else // no arguments { sStack.push_back( now.Format(wxT("%H:%M:%S")) ); } } wxString FCN_time::ParseInputString( wxString const &input_in, wxChar &seperator, int &nh, int &nm, int &ns, int &m ) const { std::string input( input_in.Upper().mb_str(wxConvUTF8) ); if( input == "T" ) { ampm = 1; nh = 2; nm = 2; seperator = wxT(':'); return wxT("hm"); } else if( input == "TT" ) { ampm = 2; nh = 2; nm = 2; ns = 2; seperator = wxT(':'); return wxT("hms"); } int size = input.size(); if( size>6 ) { if( input.substr(size-6,6)==" AM/PM" ) { ampm = 1; input = input.substr(0,size-6); } } input += '\n'; // // 'H' = 0, 'N' = 1, 'S' = 2, other = 3, linefeed = 4 int const classes[128] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; int const stateTable[10][5] = { // H N S othr end { 1, 2, 3, -1, -2 }, // 0 { 4, -3, -4, 7, 100 }, // 1 { -5, 5, -6, 8, 100 }, // 2 { -7, -8, 6, 9, 100 }, // 3 { 4, -3, -4, 7, 100 }, // 4 { -5, 5, -6, 8, 100 }, // 5 { -7, -8, 6, 9, 100 }, // 6 { -9, 2, 3,-12, -13 }, // 7 { 1,-10, 3,-12, -13 }, // 8 { 1, 2,-11,-12, -13 } // 9 }; int nsep = 0; bool hdone=false, mdone=false, sdone=false; int currentState=0, newState=0; int i = -1; int errNo = 0; wxString order; for( ;; ) { switch (newState) { case 0: { break; } case 1: { if( hdone )currentState = -9; else ++nh; order += wxT("h"); break; } case 2: { if( mdone )currentState = -10; else ++nm; order += wxT("m"); break; } case 3: { if( sdone )currentState = -11; else ++ns; order += wxT("s"); break; } case 4: { ++nh; break; } case 5: { ++nm; break; } case 6: { ++ns; break; } case 7: { if( ++nsep > 2 )currentState = -12; else seperator = input.at(i); hdone = true; break; } case 8: { if( ++nsep > 2 )currentState = -12; else seperator = input.at(i); mdone = true; break; } case 9: { if( ++nsep > 2 )currentState = -12; else seperator = input.at(i); sdone = true; break; } } if( currentState < 0 ) { errNo = abs(currentState); break; } currentState = newState; int iascii = toascii( input.at(++i) ); newState = stateTable[currentState][classes[iascii]]; //std::cout << "iascii=" << iascii << ", currentState=" << currentState // << ", newState=" << newState << "\n"; if( newState == 100 )break; if( newState < 0 ) { errNo = abs(newState); break; } } switch (errNo) { case 1: throw EExpressionError( wxT("TIME: seperator cannot begin a format") ); case 2: throw EExpressionError( wxT("TIME: blank format") ); case 3: throw EExpressionError( wxT("TIME: n immediately following h") ); case 4: throw EExpressionError( wxT("TIME: s immediately following h") ); case 5: throw EExpressionError( wxT("TIME: h immediately following n") ); case 6: throw EExpressionError( wxT("TIME: s immediately following n") ); case 7: throw EExpressionError( wxT("TIME: h immediately following s") ); case 8: throw EExpressionError( wxT("TIME: n immediately following s") ); case 9: throw EExpressionError( wxT("TIME: only one hour specifier section allowed") ); case 10: throw EExpressionError( wxT("TIME: only one minute specifier section allowed") ); case 11: throw EExpressionError( wxT("TIME: only one second specifier section allowed") ); case 12: throw EExpressionError( wxT("TIME: seperator must be a single character") ); case 13: throw EExpressionError( wxT("TIME: seperator cannot end a format") ); } return order; } void FCN_time::AddToFormat( wxString &format, wxChar c, int nh, int nm, int ns, int ampm ) const { if( c == wxT('h') ) { switch (nh) { case 1: format += ampm > 0 ? wxT("%#I") : wxT("%#H"); break; case 2: format += ampm > 0 ? wxT("%I") : wxT("%H"); break; default: throw EExpressionError( wxT("TIME: valid hour indicators are h hh") ); } } else if( c == wxT('m') ) { switch (nm) { case 1: format += wxT("%#M"); break; case 2: format += wxT("%M"); break; default: throw EExpressionError( wxT("TIME: valid minute indicators are m mm") ); } } else if( c == wxT('s') ) { switch (ns) { case 1: format += wxT("%#S"); break; case 2: format += wxT("%S"); break; default: throw EExpressionError( wxT("TIME: valid second indicators are s ss") ); } } } extrema-4.4.5/src/Functions/FCN_sign.h0000644012702201742730000000216611274636611016561 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SIGN #define FCN_SIGN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sign : public ScalarFunction { public: static FCN_sign *Instance() { if( !fcn_sign_ )fcn_sign_ = new FCN_sign(); return fcn_sign_; } void ScalarEval( int, std::vector & ) const; private: FCN_sign() : ScalarFunction( wxT("SIGN"), 2, 2 ) {} static FCN_sign *fcn_sign_; }; #endif extrema-4.4.5/src/Functions/FCN_tcase.h0000644012702201742730000000225311274636611016715 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_TCASE #define FCN_TCASE #include "wx/wx.h" #include "FunctionDefinition.h" class FCN_tcase : public FunctionDefinition { public: static FCN_tcase *Instance() { if( !fcn_tcase_ )fcn_tcase_ = new FCN_tcase(); return fcn_tcase_; } void TextScalarEval( int, std::vector & ) const; private: FCN_tcase() : FunctionDefinition( wxT("TCASE"), 1, 1, CHAR2CHAR, CHARACTER ) {} static FCN_tcase *fcn_tcase_; }; #endif extrema-4.4.5/src/Functions/FCN_ker.cpp0000644012702201742730000000201211274636611016723 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ker.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_ker *FCN_ker::fcn_ker_ = 0; void FCN_ker::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Ker( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_tina.cpp0000644012702201742730000000226111274636611017103 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_tina.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_tina *FCN_tina::fcn_tina_ = 0; void FCN_tina::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::NormalizedTina( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_evaluate.cpp0000644012702201742730000000313211274636611017754 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_evaluate.h" #include "Workspace.h" #include "ExprCodes.h" #include "EExpressionError.h" FCN_evaluate *FCN_evaluate::fcn_evaluate_ = 0; void FCN_evaluate::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { nLoop = 1; numberOfArguments_ = 1; } void FCN_evaluate::ArrayEval( Workspace *w ) { ExprCodes *ec = w->GetCodes().at(0); if( !ec->IsaWorkspace() ) throw EExpressionError( wxT("ArrayEval error in EVALUATE function") ); Workspace *ws = ec->GetWorkspacePtr(); if( ws->IsEmpty() ) throw EExpressionError( wxT("EVALUATE: argument workspace is empty") ); std::size_t ndim = ws->GetNumberOfDimensions(); w->SetNumberOfDimensions( ndim ); if( ndim == 0 ) { w->SetValue( ws->GetValue() ); } else { w->SetData( ws->GetData() ); for( std::size_t i=0; iSetDimMag( i, ws->GetDimMag(i) ); } } // end of file extrema-4.4.5/src/Functions/FCN_abs.h0000644012702201742730000000214411274636611016362 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ABS #define FCN_ABS #include "wx/wx.h" #include "ScalarFunction.h" class FCN_abs : public ScalarFunction { public: static FCN_abs *Instance() { if( !fcn_abs_ )fcn_abs_ = new FCN_abs(); return fcn_abs_; } void ScalarEval( int, std::vector & ) const; private: FCN_abs() : ScalarFunction( wxT("ABS") ) {} static FCN_abs *fcn_abs_; }; #endif extrema-4.4.5/src/Functions/FCN_savgol.h0000644012702201742730000000226611274636611017115 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SAVGOL #define FCN_SAVGOL #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_savgol : public ArrayFunction { public: static FCN_savgol *Instance() { if( !fcn_savgol_ )fcn_savgol_ = new FCN_savgol(); return fcn_savgol_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_savgol() : ArrayFunction( wxT("SAVGOL"), 3, 3 ) {} static FCN_savgol *fcn_savgol_; }; #endif extrema-4.4.5/src/Functions/FCN_asind.h0000644012702201742730000000217411274636611016716 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ASIND #define FCN_ASIND #include "wx/wx.h" #include "ScalarFunction.h" class FCN_asind : public ScalarFunction { public: static FCN_asind *Instance() { if( !fcn_asind_ )fcn_asind_ = new FCN_asind(); return fcn_asind_; } void ScalarEval( int, std::vector & ) const; private: FCN_asind() : ScalarFunction( wxT("ASIND") ) {} static FCN_asind *fcn_asind_; }; #endif extrema-4.4.5/src/Functions/FCN_char.cpp0000644012702201742730000000362111274636611017066 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_char.h" #include "Workspace.h" #include "EExpressionError.h" FCN_char *FCN_char::fcn_char_ = 0; void FCN_char::TextArrayEval( int const j, std::vector &wStack, std::vector &sStack ) const { Workspace *n = wStack[j]; if( n->IsEmpty() )throw EExpressionError( wxT("CHAR: argument workspace is empty") ); wxString str; if( n->GetNumberOfDimensions() == 0 ) { int x = static_cast( n->GetValue() ); if( x < 0 ) throw EExpressionError( wxT("CHAR: argument < 0") ); else if( x > 127 )throw EExpressionError( wxT("CHAR: argument > 127") ); str = wxString( 1, static_cast(x) ); } else if( n->GetNumberOfDimensions() == 1 ) { std::size_t end = n->GetDimMag(0); for( std::size_t i=0; i( n->GetData(i) ); if( x < 0 ) throw EExpressionError( wxT("CHAR: argument < 0") ); else if( x > 127 )throw EExpressionError( wxT("CHAR: argument > 127") ); str += wxString( 1, static_cast(x) ); } } else throw EExpressionError( wxT("CHAR: argument must be scalar or vector") ); sStack[j] = str; } // end of file extrema-4.4.5/src/Functions/FCN_iclose.cpp0000644012702201742730000000501011274636611017421 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_iclose.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_iclose *FCN_iclose::fcn_iclose_ = 0; void FCN_iclose::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("first argument of ICLOSE function must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 0 ) throw EExpressionError( wxT("second argument of ICLOSE function must be a scalar") ); numberOfArguments_ = 2; } } void FCN_iclose::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1; std::size_t size1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("ICLOSE: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); size1 = w1->GetDimMag(0); } double value; if( arg2->IsaNVariable() ) { value = arg2->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg2->IsaWorkspace() ) { value = arg2->GetWorkspacePtr()->GetValue(); } else { value = arg2->GetConstantValue(); } int idx = 0; double temp = fabs(d1[0]-value); for( std::size_t i=0; iSetValue( static_cast(1+idx) ); ws->SetNumberOfDimensions(0); } // end of file extrema-4.4.5/src/Functions/FCN_nes.h0000644012702201742730000000226311274636611016404 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_NES #define FCN_NES #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_nes : public ArrayFunction { public: static FCN_nes *Instance() { if( !fcn_nes_ )fcn_nes_ = new FCN_nes(); return fcn_nes_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_nes() : ArrayFunction( wxT("NES"), 2, 2, MIXED2NUM, CHARACTER, CHARACTER ) {} static FCN_nes *fcn_nes_; }; #endif extrema-4.4.5/src/Functions/FCN_betain.cpp0000644012702201742730000000217011274636611017411 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_betain.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_betain *FCN_betain::fcn_betain_ = 0; void FCN_betain::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::IncompleteBeta( rStack[j], rStack[j+1], rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } // end of file extrema-4.4.5/src/Functions/FCN_fres1.h0000644012702201742730000000217211274636611016636 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FRES1 #define FCN_FRES1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_fres1 : public ScalarFunction { public: static FCN_fres1 *Instance() { if( !fcn_fres1_ )fcn_fres1_ = new FCN_fres1(); return fcn_fres1_; } void ScalarEval( int, std::vector & ) const; private: FCN_fres1() : ScalarFunction( wxT("FRES1") ) {} static FCN_fres1 *fcn_fres1_; }; #endif extrema-4.4.5/src/Functions/FCN_poisson.cpp0000644012702201742730000000212611274636611017642 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_poisson.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_poisson *FCN_poisson::fcn_poisson_ = 0; void FCN_poisson::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Poisson( rStack[j], static_cast(rStack[j+1]) ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_prod.h0000644012702201742730000000223211274636611016557 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PROD #define FCN_PROD #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_prod : public ArrayFunction { public: static FCN_prod *Instance() { if( !fcn_prod_ )fcn_prod_ = new FCN_prod(); return fcn_prod_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_prod() : ArrayFunction( wxT("PROD") ) {} static FCN_prod *fcn_prod_; }; #endif extrema-4.4.5/src/Functions/FCN_imin.cpp0000644012702201742730000000435311274636611017110 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_imin.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_imin *FCN_imin::fcn_imin_ = 0; void FCN_imin::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { numberOfArguments_ = 1; nLoop = 0; } void FCN_imin::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0]; std::vector d1; int ndm1, size1; // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) throw EExpressionError( wxT("IMIN: argument must be a vector") ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("IMIN: argument workspace is empty") ); ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) throw EExpressionError( wxT("IMIN: argument must be a vector") ); d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("IMIN: argument must be a vector") ); // int imin = 0; double xmin = d1[0]; for( int i=0; i d1[i] ) { imin = i; xmin = d1[i]; } } ws->SetValue( static_cast(imin+1) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_splinterp.cpp0000644012702201742730000000712411274636611020173 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_splinterp.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_splinterp *FCN_splinterp::fcn_splinterp_ = 0; void FCN_splinterp::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("SPLINTERP: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; if( ++numberOfArguments_ == 2 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("SPLINTERP: second argument must be a vector") ); } else if( numberOfArguments_ == 3 ) { if( ndmEff != 0 ) throw EExpressionError( wxT("SPLINTERP: third argument must be a scalar") ); } } } void FCN_splinterp::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; std::vector d1, d2; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("SPLINTERP: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("SPLINTERP: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("SPLINTERP: input vectors must have the same lengths") ); if( size1 < 2 ) throw EExpressionError( wxT("SPLINTERP: independent vector length must be > 1") ); // double d3; if( arg3->IsaNVariable() ) { d3 = arg3->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg3->IsaWorkspace() ) { if( arg3->GetWorkspacePtr()->IsEmpty() ) throw EExpressionError( wxT("SPLINTERP: third argument workspace is empty") ); d3 = arg3->GetWorkspacePtr()->GetValue(); } else { d3 = arg3->GetConstantValue(); } int npts = static_cast(d3+0.5); if( npts < 2 )throw EExpressionError( wxT("SPLINTERP: number of output points must be > 1") ); std::vector xx( npts ); std::vector yy( npts ); UsefulFunctions::Splinterp( d1, d2, xx, yy ); for( int i=0; iSetNumberOfDimensions(2); ws->SetDimMag( 0, npts ); ws->SetDimMag( 1, 2 ); ws->SetData( xx ); } // end of file extrema-4.4.5/src/Functions/FCN_beta.cpp0000644012702201742730000000207311274636611017064 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_beta.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_beta *FCN_beta::fcn_beta_ = 0; void FCN_beta::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::CompleteBeta( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_log.h0000644012702201742730000000214311274636611016375 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LOG #define FCN_LOG #include "wx/wx.h" #include "ScalarFunction.h" class FCN_log : public ScalarFunction { public: static FCN_log *Instance() { if( !fcn_log_ )fcn_log_ = new FCN_log(); return fcn_log_; } void ScalarEval( int, std::vector & ) const; private: FCN_log() : ScalarFunction( wxT("LOG") ) {} static FCN_log *fcn_log_; }; #endif extrema-4.4.5/src/Functions/FCN_atand.h0000644012702201742730000000217411274636611016707 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ATAND #define FCN_ATAND #include "wx/wx.h" #include "ScalarFunction.h" class FCN_atand : public ScalarFunction { public: static FCN_atand *Instance() { if( !fcn_atand_ )fcn_atand_ = new FCN_atand(); return fcn_atand_; } void ScalarEval( int, std::vector & ) const; private: FCN_atand() : ScalarFunction( wxT("ATAND") ) {} static FCN_atand *fcn_atand_; }; #endif extrema-4.4.5/src/Functions/FCN_identity.h0000644012702201742730000000231211274636611017443 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_IDENTITY #define FCN_IDENTITY #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_identity : public ArrayFunction { public: static FCN_identity *Instance() { if( !fcn_identity_ )fcn_identity_ = new FCN_identity(); return fcn_identity_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_identity() : ArrayFunction( wxT("IDENTITY") ) {} static FCN_identity *fcn_identity_; }; #endif extrema-4.4.5/src/Functions/FCN_tan.h0000644012702201742730000000214411274636611016377 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_TAN #define FCN_TAN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_tan : public ScalarFunction { public: static FCN_tan *Instance() { if( !fcn_tan_ )fcn_tan_ = new FCN_tan(); return fcn_tan_; } void ScalarEval( int, std::vector & ) const; private: FCN_tan() : ScalarFunction( wxT("TAN") ) {} static FCN_tan *fcn_tan_; }; #endif extrema-4.4.5/src/Functions/FCN_besi0.h0000644012702201742730000000217411274636611016622 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESI0 #define FCN_BESI0 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besi0 : public ScalarFunction { public: static FCN_besi0 *Instance() { if( !fcn_besi0_ )fcn_besi0_ = new FCN_besi0(); return fcn_besi0_; } void ScalarEval( int, std::vector & ) const; private: FCN_besi0() : ScalarFunction( wxT("BESI0") ) {} static FCN_besi0 *fcn_besi0_; }; #endif extrema-4.4.5/src/Functions/FCN_cheby.h0000644012702201742730000000220011274636611016700 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CHEBY #define FCN_CHEBY #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cheby : public ScalarFunction { public: static FCN_cheby *Instance() { if( !fcn_cheby_ )fcn_cheby_ = new FCN_cheby(); return fcn_cheby_; } void ScalarEval( int, std::vector & ) const; private: FCN_cheby() : ScalarFunction( wxT("CHEBY"), 2, 2 ) {} static FCN_cheby *fcn_cheby_; }; #endif extrema-4.4.5/src/Functions/FCN_string.h0000644012702201742730000000227111274636611017124 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STRING #define FCN_STRING #include "wx/wx.h" #include "FunctionDefinition.h" class FCN_string : public FunctionDefinition { public: static FCN_string *Instance() { if( !fcn_string_ )fcn_string_ = new FCN_string(); return fcn_string_; } void TextScalarEval( int, std::vector & ) const {} private: FCN_string() : FunctionDefinition( wxT("STRING"), 1, 1, CHAR2CHAR, CHARACTER ) {} static FCN_string *fcn_string_; }; #endif extrema-4.4.5/src/Functions/FCN_cosint.cpp0000644012702201742730000000204411274636611017446 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_cosint.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_cosint *FCN_cosint::fcn_cosint_ = 0; void FCN_cosint::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::CosineIntegral( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_roll.h0000644012702201742730000000223711274636611016570 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ROLL #define FCN_ROLL #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_roll : public ArrayFunction { public: static FCN_roll *Instance() { if( !fcn_roll_ )fcn_roll_ = new FCN_roll(); return fcn_roll_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_roll() : ArrayFunction( wxT("ROLL"), 2, 2 ) {} static FCN_roll *fcn_roll_; }; #endif extrema-4.4.5/src/Functions/FCN_erf.h0000644012702201742730000000214411274636611016371 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ERF #define FCN_ERF #include "wx/wx.h" #include "ScalarFunction.h" class FCN_erf : public ScalarFunction { public: static FCN_erf *Instance() { if( !fcn_erf_ )fcn_erf_ = new FCN_erf(); return fcn_erf_; } void ScalarEval( int, std::vector & ) const; private: FCN_erf() : ScalarFunction( wxT("ERF") ) {} static FCN_erf *fcn_erf_; }; #endif extrema-4.4.5/src/Functions/FCN_asecd.cpp0000644012702201742730000000202411274636611017224 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_asecd.h" #include "EExpressionError.h" FCN_asecd *FCN_asecd::fcn_asecd_ = 0; void FCN_asecd::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] == 0.0 )throw EExpressionError( wxT("ASECD: argument = 0") ); rStack[j] = acos( 1.0/rStack[j] )*180./M_PI; } extrema-4.4.5/src/Functions/FCN_asinh.cpp0000644012702201742730000000166611274636611017262 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_asinh.h" FCN_asinh *FCN_asinh::fcn_asinh_ = 0; void FCN_asinh::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = log( rStack[j] + sqrt(rStack[j]*rStack[j]+1) ); } extrema-4.4.5/src/Functions/FCN_exist.cpp0000644012702201742730000000316711274636611017312 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_exist.h" #include "Workspace.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "NVariableTable.h" #include "TVariableTable.h" FCN_exist *FCN_exist::fcn_exist_ = 0; void FCN_exist::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { nLoop = 0; numberOfArguments_ = 1; } void FCN_exist::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg = codes[0]; wxString name; if( arg->IsaWorkspace() )name = arg->GetWorkspacePtr()->GetFinalString(); else if( arg->IsaTString() )name = arg->GetTString(); else throw EExpressionError( wxT("argument of EXIST function must be character") ); // name.UpperCase(); if( NVariableTable::GetTable()->Contains(name) ) ws->SetValue( 1.0 ); // true else if( TVariableTable::GetTable()->Contains(name) ) ws->SetValue( 1.0 ); else ws->SetValue( 0.0 ); } // end of file extrema-4.4.5/src/Functions/FCN_logam.h0000644012702201742730000000217211274636611016715 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LOGAM #define FCN_LOGAM #include "wx/wx.h" #include "ScalarFunction.h" class FCN_logam : public ScalarFunction { public: static FCN_logam *Instance() { if( !fcn_logam_ )fcn_logam_ = new FCN_logam(); return fcn_logam_; } void ScalarEval( int, std::vector & ) const; private: FCN_logam() : ScalarFunction( wxT("LOGAM") ) {} static FCN_logam *fcn_logam_; }; #endif extrema-4.4.5/src/Functions/FCN_savgol.cpp0000644012702201742730000000655411274636611017454 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_savgol.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_savgol *FCN_savgol::fcn_savgol_ = 0; void FCN_savgol::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 0 ) throw EExpressionError( wxT("SAVGOL: first argument must be a scalar") ); numberOfArguments_ = 1; nLoop = 0; } else { if( numberOfArguments_ == 1 ) { if( ndmEff != 0 ) throw EExpressionError( wxT("SAVGOL: second argument must be a scalar") ); numberOfArguments_ = 2; } else if( numberOfArguments_ == 2 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("SAVGOL: third argument must be a vector") ); numberOfArguments_ = 3; } } } void FCN_savgol::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); std::size_t filterOrder; if( codes[0]->IsaNVariable() ) { filterOrder = static_cast(codes[0]->GetNVarPtr()->GetData().GetScalarValue()); } else if( codes[0]->IsaWorkspace() ) { filterOrder = static_cast(codes[0]->GetWorkspacePtr()->GetValue()); } else { filterOrder = static_cast(codes[0]->GetConstantValue()); } if( filterOrder!=2 && filterOrder!=4 ) throw EExpressionError( wxT("SAVGOL: first argument must be 2 or 4") ); // std::size_t filterWidth; if( codes[1]->IsaNVariable() ) { filterWidth = static_cast(codes[1]->GetNVarPtr()->GetData().GetScalarValue()); } else if( codes[1]->IsaWorkspace() ) { filterWidth = static_cast(codes[1]->GetWorkspacePtr()->GetValue()); } else { filterWidth = static_cast(codes[1]->GetConstantValue()); } // std::vector yIn; std::size_t size; if( codes[2]->IsaNVariable() ) { NumericData nd( codes[2]->GetNVarPtr()->GetData() ); yIn.assign( nd.GetData().begin(), nd.GetData().end() ); size = nd.GetDimMag(0); } else { Workspace *w = codes[2]->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("SAVGOL: third argument workspace is empty") ); yIn.assign( w->GetData().begin(), w->GetData().end() ); size = w->GetDimMag(0); } if( size < 2 )throw EExpressionError( wxT("SAVGOL: third argument length must be >= 2") ); // std::vector yOut( size, 0.0 ); try { UsefulFunctions::SavitzkyGolay( yIn, yOut, filterWidth, filterOrder ); } catch (EExpressionError &e) { throw; } ws->SetData( yOut ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, size ); } // end of file extrema-4.4.5/src/Functions/FCN_ucase.h0000644012702201742730000000231611274636611016716 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_UCASE #define FCN_UCASE #include "wx/wx.h" #include "FunctionDefinition.h" class FCN_ucase : public FunctionDefinition { public: static FCN_ucase *Instance() { if( !fcn_ucase_ )fcn_ucase_ = new FCN_ucase(); return fcn_ucase_; } void TextScalarEval( int j, std::vector &sStack ) const { sStack[j].UpperCase(); } private: FCN_ucase() : FunctionDefinition( wxT("UCASE"), 1, 1, CHAR2CHAR, CHARACTER ) {} static FCN_ucase *fcn_ucase_; }; #endif extrema-4.4.5/src/Functions/FCN_voigt.h0000644012702201742730000000220011274636611016736 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_VOIGT #define FCN_VOIGT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_voigt : public ScalarFunction { public: static FCN_voigt *Instance() { if( !fcn_voigt_ )fcn_voigt_ = new FCN_voigt(); return fcn_voigt_; } void ScalarEval( int, std::vector & ) const; private: FCN_voigt() : ScalarFunction( wxT("VOIGT"), 4, 4 ) {} static FCN_voigt *fcn_voigt_; }; #endif extrema-4.4.5/src/Functions/FCN_integral.h0000644012702201742730000000243011274636611017420 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_INTEGRAL #define FCN_INTEGRAL #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_integral : public ArrayFunction { public: static FCN_integral *Instance() { if( !fcn_integral_ )fcn_integral_ = new FCN_integral(); return fcn_integral_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_integral() : ArrayFunction( wxT("INTEGRAL"), 2, 3, MIXED2NUM, NUMERIC, NUMERIC, CHARACTER ) {} static FCN_integral *fcn_integral_; }; #endif extrema-4.4.5/src/Functions/FCN_finellic.cpp0000644012702201742730000000213511274636611017735 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_finellic.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_finellic *FCN_finellic::fcn_finellic_ = 0; void FCN_finellic::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::IncompleteEllipticIntegral1( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_agauss.cpp0000644012702201742730000000204311274636611017431 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_agauss.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_agauss *FCN_agauss::fcn_agauss_ = 0; void FCN_agauss::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::GaussInverse( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_csc.h0000644012702201742730000000214411274636611016365 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CSC #define FCN_CSC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_csc : public ScalarFunction { public: static FCN_csc *Instance() { if( !fcn_csc_ )fcn_csc_ = new FCN_csc(); return fcn_csc_; } void ScalarEval( int, std::vector & ) const; private: FCN_csc() : ScalarFunction( wxT("CSC") ) {} static FCN_csc *fcn_csc_; }; #endif extrema-4.4.5/src/Functions/FCN_ker.h0000644012702201742730000000214211274636611016374 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_KER #define FCN_KER #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ker : public ScalarFunction { public: static FCN_ker *Instance() { if( !fcn_ker_ )fcn_ker_ = new FCN_ker(); return fcn_ker_; } void ScalarEval( int, std::vector & ) const; private: FCN_ker() : ScalarFunction( wxT("KER") ) {} static FCN_ker *fcn_ker_; }; #endif extrema-4.4.5/src/Functions/FCN_fold.h0000644012702201742730000000223711274636611016544 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FOLD #define FCN_FOLD #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_fold : public ArrayFunction { public: static FCN_fold *Instance() { if( !fcn_fold_ )fcn_fold_ = new FCN_fold(); return fcn_fold_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_fold() : ArrayFunction( wxT("FOLD"), 2, 2 ) {} static FCN_fold *fcn_fold_; }; #endif extrema-4.4.5/src/Functions/FCN_acosd.h0000644012702201742730000000217211274636611016707 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACOSD #define FCN_ACOSD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acosd : public ScalarFunction { public: static FCN_acosd *Instance() { if( !fcn_acosd_ )fcn_acosd_ = new FCN_acosd(); return fcn_acosd_; } void ScalarEval( int, std::vector & ) const; private: FCN_acosd() : ScalarFunction( wxT("ACOSD") ) {} static FCN_acosd *fcn_acosd_; }; #endif extrema-4.4.5/src/Functions/FCN_time.h0000644012702201742730000000254611274636611016561 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_TIME #define FCN_TIME #include "wx/wx.h" #include "FunctionDefinition.h" class FCN_time : public FunctionDefinition { public: static FCN_time *Instance() { if( !fcn_time_ )fcn_time_ = new FCN_time(); return fcn_time_; } void TextScalarEval( int, std::vector & ) const; private: FCN_time() : FunctionDefinition( wxT("TIME"), 0, 1, CHAR2CHAR, CHARACTER ) {} wxString ParseInputString( wxString const &, wxChar &, int &, int &, int &, int & ) const; void AddToFormat( wxString &, wxChar, int, int, int, int ) const; static FCN_time *fcn_time_; }; #endif extrema-4.4.5/src/Functions/FCN_atan2.cpp0000644012702201742730000000210611274636611017153 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_atan2.h" #include "EExpressionError.h" FCN_atan2 *FCN_atan2::fcn_atan2_ = 0; void FCN_atan2::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j]==0.0 && rStack[j+1]==0.0 ) throw EExpressionError( wxT("ATAN2: both arguments = 0") ); rStack[j] = atan2( rStack[j], rStack[j+1] ); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_walsh.cpp0000644012702201742730000000221411274636611017264 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_walsh.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_walsh *FCN_walsh::fcn_walsh_ = 0; void FCN_walsh::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BinaryOrderedWalsh( static_cast(rStack[j]), rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_expand.h0000644012702201742730000000231611274636611017075 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EXPAND #define FCN_EXPAND #include "wx/wx.h" #include "ScalarFunction.h" class FCN_expand : public ScalarFunction { public: static FCN_expand *Instance() { if( !fcn_expand_ )fcn_expand_ = new FCN_expand(); return fcn_expand_; } void TextScalarEval( int, std::vector & ) const; private: FCN_expand() : ScalarFunction( wxT("EXPAND"), 1, 1, CHAR2CHAR, CHARACTER ) {} static FCN_expand *fcn_expand_; bool FillOut( wxString & ) const; }; #endif extrema-4.4.5/src/Functions/FCN_mean.h0000644012702201742730000000223611274636611016537 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_MEAN #define FCN_MEAN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_mean : public ArrayFunction { public: static FCN_mean *Instance() { if( !fcn_mean_ )fcn_mean_ = new FCN_mean(); return fcn_mean_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_mean() : ArrayFunction( wxT("MEAN"), 1, 2 ) {} static FCN_mean *fcn_mean_; }; #endif extrema-4.4.5/src/Functions/FCN_min.cpp0000644012702201742730000001444611274636611016743 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_min.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_min *FCN_min::fcn_min_ = 0; void FCN_min::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_min::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::vector d1; int ndm1, size1[3]; double val1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 == 0 ) val1 = nd.GetScalarValue(); else d1.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )size1[i] = nd.GetDimMag(i); } else if( arg1->IsaWorkspace() ) { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("MIN: first argument workspace is empty") ); ndm1 = w1->GetNumberOfDimensions(); if( ndm1 == 0 ) val1 = w1->GetValue(); else d1.assign( w1->GetData().begin(), w1->GetData().end() ); for( std::size_t i=0; i<3; ++i )size1[i] = w1->GetDimMag(i); } else // first argument must be a constant { ndm1 = 0; val1 = arg1->GetConstantValue(); } int num1 = 0; if( ndm1 == 1 ) num1 = size1[0]; else if( ndm1==2 ) num1 = size1[0]*size1[1]; if( numberOfArguments_ == 1 ) { if( num1 == 0 ) { ws->SetValue( val1 ); } else { ws->SetValue( d1[0] ); for( int i = 0; i < num1; ++i ) { if( ws->GetValue() > d1[i] )ws->SetValue( d1[i] ); } } ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } else { ExprCodes *arg2 = codes[1]; std::vector d2; int ndm2, size2[3]; double val2; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = nd.GetScalarValue(); else d2.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = nd.GetDimMag(i); } else if( arg2->IsaWorkspace() ) { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("MIN: second argument workspace is empty") ); ndm2 = w2->GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = w2->GetValue(); else d2.assign( w2->GetData().begin(), w2->GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = w2->GetDimMag(i); } else // second argument must be a constant { ndm2 = 0; val2 = arg2->GetConstantValue(); } int num2 = 0; if( ndm2 == 0 ) { if( ndm1 != 0 ) throw EExpressionError( wxT("MIN: all function arguments must be the same type") ); } else if( ndm2 == 1 ) { if( ndm1 != 1 ) throw EExpressionError( wxT("MIN: all function arguments must be the same type") ); num2 = size2[0]; } else if( ndm2 == 2 ) { if( ndm1 != 2 ) throw EExpressionError( wxT("MIN: all function arguments must be the same type") ); num2 = size2[0]*size2[1]; } if( num1 != num2 ) throw EExpressionError( wxT("MIN: all function arguments must be the same size") ); if( num1 == 0 ) { ws->SetValue( std::min(val1,val2) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } else { for( int i=0; iSetData( i, std::min(d1[i],d2[i]) ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, num1 ); } int narg = 2; while( narg < numberOfArguments_ ) { arg2 = codes[narg]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = nd.GetScalarValue(); else d2.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = nd.GetDimMag(i); } else if( arg2->IsaWorkspace() ) { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("MIN: argument workspace is empty") ); ndm2 = w2->GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = w2->GetValue(); else d2.assign( w2->GetData().begin(), w2->GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = w2->GetDimMag(i); } else // first argument must be a constant { ndm2 = 0; val2 = arg2->GetConstantValue(); } if( ndm2==0 ) { if( ndm1 != 0 ) throw EExpressionError( wxT("MIN: all function arguments must be the same type") ); num2 = 0; } else if( ndm2 == 1 ) { if( ndm1 != 1 ) throw EExpressionError( wxT("MIN: all function arguments must be the same type") ); num2 = size2[0]; } else if( ndm2 == 2 ) { if( ndm1 != 2 ) throw EExpressionError( wxT("MIN: all function arguments must be the same type") ); num2 = size2[0]*size2[1]; } if( num1 != num2 ) throw EExpressionError( wxT("MIN: function arguments must be the same size") ); if( num1 == 0 ) ws->SetValue( std::min(ws->GetValue(),val2) ); else for( int i=0; iSetData( i, std::min(ws->GetData(i),d2[i]) ); ++narg; } } } // end of file extrema-4.4.5/src/Functions/FCN_wign3j.h0000644012702201742730000000221411274636611017014 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_WIGN3J #define FCN_WIGN3J #include "wx/wx.h" #include "ScalarFunction.h" class FCN_wign3j : public ScalarFunction { public: static FCN_wign3j *Instance() { if( !fcn_wign3j_ )fcn_wign3j_ = new FCN_wign3j(); return fcn_wign3j_; } void ScalarEval( int, std::vector & ) const; private: FCN_wign3j() : ScalarFunction( wxT("WIGN3J"), 6, 6 ) {} static FCN_wign3j *fcn_wign3j_; }; #endif extrema-4.4.5/src/Functions/FCN_fres2.h0000644012702201742730000000217211274636611016637 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FRES2 #define FCN_FRES2 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_fres2 : public ScalarFunction { public: static FCN_fres2 *Instance() { if( !fcn_fres2_ )fcn_fres2_ = new FCN_fres2(); return fcn_fres2_; } void ScalarEval( int, std::vector & ) const; private: FCN_fres2() : ScalarFunction( wxT("FRES2") ) {} static FCN_fres2 *fcn_fres2_; }; #endif extrema-4.4.5/src/Functions/FCN_racah.h0000644012702201742730000000220011274636611016664 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RACAH #define FCN_RACAH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_racah : public ScalarFunction { public: static FCN_racah *Instance() { if( !fcn_racah_ )fcn_racah_ = new FCN_racah(); return fcn_racah_; } void ScalarEval( int, std::vector & ) const; private: FCN_racah() : ScalarFunction( wxT("RACAH"), 6, 6 ) {} static FCN_racah *fcn_racah_; }; #endif extrema-4.4.5/src/Functions/FCN_sind.cpp0000644012702201742730000000163411274636611017110 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sind.h" FCN_sind *FCN_sind::fcn_sind_ = 0; void FCN_sind::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = sin( rStack[j]*M_PI/180. ); } extrema-4.4.5/src/Functions/FCN_max.cpp0000644012702201742730000001450111274636611016735 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_max.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_max *FCN_max::fcn_max_ = 0; void FCN_max::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_max::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::vector d1; int ndm1, size1[3]; double val1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 == 0 ) val1 = nd.GetScalarValue(); else d1.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )size1[i] = nd.GetDimMag(i); } else if( arg1->IsaWorkspace() ) { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("MAX: argument 1 workspace is empty") ); ndm1 = w1->GetNumberOfDimensions(); if( ndm1 == 0 ) val1 = w1->GetValue(); else d1.assign( w1->GetData().begin(), w1->GetData().end() ); for( std::size_t i=0; i<3; ++i )size1[i] = w1->GetDimMag(i); } else // first argument must be a constant { ndm1 = 0; val1 = arg1->GetConstantValue(); } int num1 = 0; if( ndm1 == 1 ) num1 = size1[0]; else if( ndm1==2 ) num1 = size1[0]*size1[1]; if( numberOfArguments_ == 1 ) { if( num1 == 0 ) { ws->SetValue( val1 ); } else { ws->SetValue( d1[0] ); for( int i=0; iGetValue() < d1[i] )ws->SetValue( d1[i] ); } } ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } else { ExprCodes *arg2 = codes[1]; std::vector d2; int ndm2, size2[3]; double val2; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = nd.GetScalarValue(); else d2.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = nd.GetDimMag(i); } else if( arg2->IsaWorkspace() ) { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("MAX: argument 2 workspace is empty") ); ndm2 = w2->GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = w2->GetValue(); else d2.assign( w2->GetData().begin(), w2->GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = w2->GetDimMag(i); } else // second argument must be a constant { ndm2 = 0; val2 = arg2->GetConstantValue(); } int num2 = 0; if( ndm2 == 0 ) { if( ndm1 != 0 ) throw EExpressionError( wxT("MAX: all function arguments must be the same type") ); } else if( ndm2 == 1 ) { if( ndm1 != 1 ) throw EExpressionError( wxT("MAX: all function arguments must be the same type") ); num2 = size2[0]; } else if( ndm2 == 2 ) { if( ndm1 != 2 ) throw EExpressionError( wxT("MAX: all function arguments must be the same type") ); num2 = size2[0]*size2[1]; } if( num1 != num2 ) throw EExpressionError( wxT("MAX: all function arguments must be the same size") ); if( num1 == 0 ) { ws->SetValue( std::max( val1, val2 ) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } else { for( int i=0; iSetData( i, std::max(d1[i],d2[i]) ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, num1 ); } int narg = 2; while( narg < numberOfArguments_ ) { arg2 = codes[narg]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = nd.GetScalarValue(); else d2.assign( nd.GetData().begin(), nd.GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = nd.GetDimMag(i); } else if( arg2->IsaWorkspace() ) { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("MAX: argument workspace is empty") ); ndm2 = w2->GetNumberOfDimensions(); if( ndm2 == 0 ) val2 = w2->GetValue(); else d2.assign( w2->GetData().begin(), w2->GetData().end() ); for( std::size_t i=0; i<3; ++i )size2[i] = w2->GetDimMag(i); } else // first argument must be a constant { ndm2 = 0; val2 = arg2->GetConstantValue(); } if( ndm2==0 ) { if( ndm1 != 0 ) throw EExpressionError( wxT("MAX: all function arguments must be the same type") ); num2 = 0; } else if( ndm2 == 1 ) { if( ndm1 != 1 ) throw EExpressionError( wxT("MAX: all function arguments must be the same type") ); num2 = size2[0]; } else if( ndm2 == 2 ) { if( ndm1 != 2 ) throw EExpressionError( wxT("MAX: all function arguments must be the same type") ); num2 = size2[0]*size2[1]; } if( num1 != num2 ) throw EExpressionError( wxT("MAX: all function arguments must be the same size") ); if( num1 == 0 ) { ws->SetValue( std::max(ws->GetValue(),val2) ); } else { for( int i=0; iSetData( i, std::max(ws->GetData(i),d2[i]) ); } ++narg; } } } // end of file extrema-4.4.5/src/Functions/FCN_psi.cpp0000644012702201742730000000201211274636611016735 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_psi.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_psi *FCN_psi::fcn_psi_ = 0; void FCN_psi::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Psi( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_cosh.h0000644012702201742730000000216011274636611016547 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COSH #define FCN_COSH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cosh : public ScalarFunction { public: static FCN_cosh *Instance() { if( !fcn_cosh_ )fcn_cosh_ = new FCN_cosh(); return fcn_cosh_; } void ScalarEval( int, std::vector & ) const; private: FCN_cosh() : ScalarFunction( wxT("COSH") ) {} static FCN_cosh *fcn_cosh_; }; #endif extrema-4.4.5/src/Functions/FCN_ucase.cpp0000644012702201742730000000145211274636611017251 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ucase.h" FCN_ucase *FCN_ucase::fcn_ucase_ = 0; // end of file extrema-4.4.5/src/Functions/FCN_legendre.h0000644012702201742730000000224411274636611017403 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LEGENDRE #define FCN_LEGENDRE #include "wx/wx.h" #include "ScalarFunction.h" class FCN_legendre : public ScalarFunction { public: static FCN_legendre *Instance() { if( !fcn_legendre_ )fcn_legendre_ = new FCN_legendre(); return fcn_legendre_; } void ScalarEval( int, std::vector & ) const; private: FCN_legendre() : ScalarFunction( wxT("LEGENDRE"), 2, 2 ) {} static FCN_legendre *fcn_legendre_; }; #endif extrema-4.4.5/src/Functions/FCN_imax.h0000644012702201742730000000223411274636611016553 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_IMAX #define FCN_IMAX #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_imax : public ArrayFunction { public: static FCN_imax *Instance() { if( !fcn_imax_ )fcn_imax_ = new FCN_imax(); return fcn_imax_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_imax() : ArrayFunction( wxT("IMAX"), 1, 1 ) {} static FCN_imax *fcn_imax_; }; #endif extrema-4.4.5/src/Functions/FCN_bei.cpp0000644012702201742730000000201311274636611016702 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_bei.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_bei *FCN_bei::fcn_bei_ = 0; void FCN_bei::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Bei( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_expn.cpp0000644012702201742730000000221311274636611017117 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_expn.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_expn *FCN_expn::fcn_expn_ = 0; void FCN_expn::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ExponentialIntegralN( rStack[j], static_cast(rStack[j+1]) ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_mean.cpp0000644012702201742730000001066311274636611017075 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_mean.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_mean *FCN_mean::fcn_mean_ = 0; void FCN_mean::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_mean::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("MEAN: argument must be a vector") ); else throw EExpressionError( wxT("MEAN: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("MEAN: argument workspace is empty") ); else throw EExpressionError( wxT("MEAN: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("MEAN: argument must be a vector") ); else throw EExpressionError( wxT("MEAN: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("MEAN: argument must be a vector") ); else throw EExpressionError( wxT("MEAN: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("MEAN: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("MEAN: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("MEAN: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("MEAN: argument 2 must be a vector") ); } double wsum=0.0, xsum=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("MEAN: arguments must have the same length") ); for( int i=0; i(size1); } ws->SetValue( xsum/wsum ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_sinh.h0000644012702201742730000000216011274636611016554 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SINH #define FCN_SINH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sinh : public ScalarFunction { public: static FCN_sinh *Instance() { if( !fcn_sinh_ )fcn_sinh_ = new FCN_sinh(); return fcn_sinh_; } void ScalarEval( int, std::vector & ) const; private: FCN_sinh() : ScalarFunction( wxT("SINH") ) {} static FCN_sinh *fcn_sinh_; }; #endif extrema-4.4.5/src/Functions/FCN_gammacin.h0000644012702201742730000000224411274636611017372 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAMMACIN #define FCN_GAMMACIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gammacin : public ScalarFunction { public: static FCN_gammacin *Instance() { if( !fcn_gammacin_ )fcn_gammacin_ = new FCN_gammacin(); return fcn_gammacin_; } void ScalarEval( int, std::vector & ) const; private: FCN_gammacin() : ScalarFunction( wxT("GAMMACIN"), 2, 2 ) {} static FCN_gammacin *fcn_gammacin_; }; #endif extrema-4.4.5/src/Functions/FCN_einellic.cpp0000644012702201742730000000213511274636611017734 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_einellic.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_einellic *FCN_einellic::fcn_einellic_ = 0; void FCN_einellic::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::IncompleteEllipticIntegral2( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_bivsmooth.h0000644012702201742730000000243211274636611017627 0ustar spangspang/* Copyright (C) 2006 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BIVARIATESMOOTH #define FCN_BIVARIATESMOOTH #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_bivariateSmooth : public ArrayFunction { public: static FCN_bivariateSmooth *Instance() { if( !fcn_bivariateSmooth_ )fcn_bivariateSmooth_ = new FCN_bivariateSmooth(); return fcn_bivariateSmooth_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_bivariateSmooth() : ArrayFunction( wxT("BIVSMOOTH"), 5, 5 ) {} static FCN_bivariateSmooth *fcn_bivariateSmooth_; }; #endif extrema-4.4.5/src/Functions/FCN_sinint.h0000644012702201742730000000220611274636611017120 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SININT #define FCN_SININT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sinint : public ScalarFunction { public: static FCN_sinint *Instance() { if( !fcn_sinint_ )fcn_sinint_ = new FCN_sinint(); return fcn_sinint_; } void ScalarEval( int, std::vector & ) const; private: FCN_sinint() : ScalarFunction( wxT("SININT") ) {} static FCN_sinint *fcn_sinint_; }; #endif extrema-4.4.5/src/Functions/FCN_plmu.cpp0000644012702201742730000000236611274636611017133 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_plmu.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_plmu *FCN_plmu::fcn_plmu_ = 0; void FCN_plmu::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::UnnormalizedLegendre( static_cast(rStack[j]), static_cast(rStack[j+1]), rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_plmn.cpp0000644012702201742730000000236011274636611017116 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_plmn.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_plmn *FCN_plmn::fcn_plmn_ = 0; void FCN_plmn::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::NormalizedLegendre( static_cast(rStack[j]), static_cast(rStack[j+1]), rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_deriv.h0000644012702201742730000000232111274636611016723 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DERIV #define FCN_DERIV #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_deriv : public ArrayFunction { public: static FCN_deriv *Instance() { if( !fcn_deriv_ )fcn_deriv_ = new FCN_deriv(); return fcn_deriv_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_deriv() : ArrayFunction( wxT("DERIV"), 2, 3, MIXED2NUM, NUMERIC, NUMERIC, CHARACTER ) {} static FCN_deriv *fcn_deriv_; }; #endif extrema-4.4.5/src/Functions/FCN_len.h0000644012702201742730000000221511274636611016372 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LEN #define FCN_LEN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_len : public ArrayFunction { public: static FCN_len *Instance() { if( !fcn_len_ )fcn_len_ = new FCN_len(); return fcn_len_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_len() : ArrayFunction( wxT("LEN") ) {} static FCN_len *fcn_len_; }; #endif extrema-4.4.5/src/Functions/FCN_volume.h0000644012702201742730000000226611274636611017131 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_VOLUME #define FCN_VOLUME #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_volume : public ArrayFunction { public: static FCN_volume *Instance() { if( !fcn_volume_ )fcn_volume_ = new FCN_volume(); return fcn_volume_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_volume() : ArrayFunction( wxT("VOLUME"), 3, 3 ) {} static FCN_volume *fcn_volume_; }; #endif extrema-4.4.5/src/Functions/FCN_adev.cpp0000644012702201742730000001116511274636611017072 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_adev.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_adev *FCN_adev::fcn_adev_ = 0; void FCN_adev::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_adev::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("ADEV: argument must be a vector") ); else throw EExpressionError( wxT("ADEV: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("ADEV: argument workspace is empty") ); else throw EExpressionError( wxT("ADEV: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("ADEV: argument must be a vector") ); else throw EExpressionError( wxT("ADEV: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("ADEV: argument must be a vector") ); else throw EExpressionError( wxT("ADEV: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("ADEV: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("ADEV: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("ADEV: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("ADEV: argument 2 must be a vector") ); } double wsum=0.0, xsum=0.0, adev=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("ADEV: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; iSetValue( adev/wsum ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_kurt.cpp0000644012702201742730000001166611274636611017146 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_kurt.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_kurt *FCN_kurt::fcn_kurt_ = 0; void FCN_kurt::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_kurt::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("KURT: argument must be a vector") ); else throw EExpressionError( wxT("KURT: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("KURT: argument workspace is empty") ); else throw EExpressionError( wxT("KURT: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("KURT: argument must be a vector") ); else throw EExpressionError( wxT("KURT: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("KURT: argument must be a vector") ); else throw EExpressionError( wxT("KURT: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("KURT: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("KURT: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("KURT: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("KURT: argument 2 must be a vector") ); } double wsum=0.0, xsum=0.0, var=0.0, kurt=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("KURT: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; iSetValue( kurt/wsum/var/var-3.0 ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_acoth.h0000644012702201742730000000217511274636611016717 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACOTH #define FCN_ACOTH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acoth : public ScalarFunction { public: static FCN_acoth *Instance() { if( !fcn_acoth_ )fcn_acoth_ = new FCN_acoth(); return fcn_acoth_; } void ScalarEval( int, std::vector & ) const; private: FCN_acoth() : ScalarFunction( wxT("ACOTH") ) {} static FCN_acoth *fcn_acoth_; }; #endif extrema-4.4.5/src/Functions/FunctionTable.cpp0000644012702201742730000003013211274636611020215 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FunctionTable.h" #include "FunctionDefinition.h" #include "EExpressionError.h" #include "FCN_abs.h" #include "FCN_acosd.h" #include "FCN_acosh.h" #include "FCN_acos.h" #include "FCN_acotd.h" #include "FCN_acoth.h" #include "FCN_acot.h" #include "FCN_acscd.h" #include "FCN_acsch.h" #include "FCN_acsc.h" #include "FCN_adev.h" #include "FCN_aerfc.h" #include "FCN_aerf.h" #include "FCN_agauss.h" #include "FCN_airy.h" #include "FCN_area.h" #include "FCN_asecd.h" #include "FCN_asech.h" #include "FCN_asec.h" #include "FCN_asind.h" #include "FCN_asinh.h" #include "FCN_asin.h" #include "FCN_atan2d.h" #include "FCN_atan2.h" #include "FCN_atand.h" #include "FCN_atanh.h" #include "FCN_atan.h" #include "FCN_bei.h" #include "FCN_ber.h" #include "FCN_besi0.h" #include "FCN_besi1.h" #include "FCN_besj0.h" #include "FCN_besj1.h" #include "FCN_besk0.h" #include "FCN_besk1.h" #include "FCN_besy0.h" #include "FCN_besy1.h" #include "FCN_beta.h" #include "FCN_betain.h" #include "FCN_binom.h" #include "FCN_biry.h" #include "FCN_bivarnor.h" #include "FCN_bivinterp.h" #include "FCN_bivsmooth.h" #include "FCN_canopen.h" #include "FCN_char.h" #include "FCN_cheby.h" #include "FCN_chisq.h" #include "FCN_chisqi.h" #include "FCN_chlogu.h" #include "FCN_clebsg.h" #include "FCN_clen.h" #include "FCN_convolute.h" #include "FCN_cosd.h" #include "FCN_cosh.h" #include "FCN_cos.h" #include "FCN_cosint.h" #include "FCN_cotd.h" #include "FCN_coth.h" #include "FCN_cot.h" #include "FCN_cscd.h" #include "FCN_csch.h" #include "FCN_csc.h" #include "FCN_date.h" #include "FCN_dawson.h" #include "FCN_deconvolute.h" #include "FCN_deriv.h" #include "FCN_det.h" #include "FCN_digamma.h" #include "FCN_dilog.h" #include "FCN_eigen.h" #include "FCN_ei.h" #include "FCN_einellic.h" #include "FCN_ellice.h" #include "FCN_ellick.h" #include "FCN_eqs.h" #include "FCN_erfc.h" #include "FCN_erf.h" #include "FCN_evaluate.h" #include "FCN_exist.h" #include "FCN_expand.h" #include "FCN_exp.h" #include "FCN_expint.h" #include "FCN_expn.h" #include "FCN_factorial.h" #include "FCN_ferdirac.h" #include "FCN_fft.h" #include "FCN_finellic.h" #include "FCN_fisher.h" #include "FCN_fold.h" #include "FCN_frec1.h" #include "FCN_frec2.h" #include "FCN_fres1.h" #include "FCN_fres2.h" #include "FCN_gammacin.h" #include "FCN_gamma.h" #include "FCN_gammain.h" #include "FCN_gammatin.h" #include "FCN_gammln.h" #include "FCN_gammq.h" #include "FCN_gauss.h" #include "FCN_gaussin.h" #include "FCN_gaussj.h" #include "FCN_gmean.h" #include "FCN_heaviside.h" #include "FCN_hermite.h" #include "FCN_hypgeo.h" #include "FCN_ichar.h" #include "FCN_iclose.h" #include "FCN_identity.h" #include "FCN_iequal.h" #include "FCN_ifft.h" #include "FCN_imax.h" #include "FCN_imin.h" #include "FCN_index.h" #include "FCN_integral.h" #include "FCN_interpolate.h" #include "FCN_int.h" #include "FCN_inverse.h" #include "FCN_jacobi.h" #include "FCN_jahnuf.h" #include "FCN_join.h" #include "FCN_kei.h" #include "FCN_ker.h" #include "FCN_kurt.h" #include "FCN_laguerre.h" #include "FCN_lcase.h" #include "FCN_legendre.h" #include "FCN_len.h" #include "FCN_lnagamma.h" #include "FCN_lnbeta.h" #include "FCN_ln.h" #include "FCN_log10.h" #include "FCN_logam.h" #include "FCN_log.h" #include "FCN_max.h" #include "FCN_mean.h" #include "FCN_median.h" #include "FCN_min.h" #include "FCN_mod.h" #include "FCN_nes.h" #include "FCN_nint.h" #include "FCN_normal.h" #include "FCN_null.h" #include "FCN_pdiff.h" #include "FCN_pfactors.h" #include "FCN_plmn.h" #include "FCN_plmu.h" #include "FCN_poica.h" #include "FCN_poisson.h" #include "FCN_prob.h" #include "FCN_prod.h" #include "FCN_psi.h" #include "FCN_racah.h" #include "FCN_radmac.h" #include "FCN_rchar.h" #include "FCN_rms.h" #include "FCN_roll.h" #include "FCN_rprod.h" #include "FCN_rsum.h" #include "FCN_savgol.h" #include "FCN_secd.h" #include "FCN_sech.h" #include "FCN_sec.h" #include "FCN_sign.h" #include "FCN_simpleran.h" #include "FCN_sind.h" #include "FCN_sinh.h" #include "FCN_sin.h" #include "FCN_sinint.h" #include "FCN_skew.h" #include "FCN_smooth.h" #include "FCN_splinterp.h" #include "FCN_splsmooth.h" #include "FCN_sqrt.h" #include "FCN_stdev.h" #include "FCN_step.h" #include "FCN_string.h" #include "FCN_struve0.h" #include "FCN_struve1.h" #include "FCN_student.h" #include "FCN_studenti.h" #include "FCN_sub.h" #include "FCN_sum.h" #include "FCN_sup.h" #include "FCN_tand.h" #include "FCN_tanh.h" #include "FCN_tan.h" #include "FCN_tcase.h" #include "FCN_time.h" #include "FCN_tina.h" #include "FCN_ucase.h" #include "FCN_var.h" #include "FCN_varname.h" #include "FCN_vartype.h" #include "FCN_vlen.h" #include "FCN_voigt.h" #include "FCN_volume.h" #include "FCN_walsh.h" #include "FCN_where.h" #include "FCN_wign3j.h" #include "FCN_wign6j.h" #include "FCN_wign9j.h" #include "FCN_wrap.h" FunctionTable *FunctionTable::functionTable_ = 0; FunctionTable::FunctionTable() { functionMap_ = new functionMap; } FunctionTable::FunctionTable( FunctionTable const &rhs ) { delete functionMap_; functionMap_ = new functionMap(*(rhs.functionMap_)); } FunctionTable::~FunctionTable() { ClearTable(); } FunctionTable *FunctionTable::GetTable() { // returns the pointer to the FunctionTable object // FunctionTable is a "singleton", and can get its // pointer by this function. The first time this // function is called, the FunctionTable object // is instantiated. // if( functionTable_ == 0 )functionTable_ = new FunctionTable(); return functionTable_; } void FunctionTable::ClearTable() { functionMap::const_iterator end = functionMap_->end(); for( functionMap::const_iterator i=functionMap_->begin(); i!=end; ++i )delete (*i).second; delete functionMap_; } bool FunctionTable::Contains( FunctionDefinition const *f ) const { return Contains( f->Name() ); } bool FunctionTable::Contains( wxString const &name ) const { return ( functionMap_->find(name) != functionMap_->end() ); } FunctionDefinition *FunctionTable::GetFunction( wxString const &name ) const { FunctionDefinition *fd = 0; functionMap::iterator const i = functionMap_->find(name); if( i != functionMap_->end() )fd = (*i).second; return fd; } void FunctionTable::AddEntry( FunctionDefinition *f ) { wxString name = f->Name(); if( Contains(name) ) throw EExpressionError( wxString(wxT("The function "))+name+ wxT(" is already in the table") ); functionMap_->insert(entryType(name,f)); } void FunctionTable::CreateFunctions() { FCN_abs::Instance(); FCN_acosd::Instance(); FCN_acosh::Instance(); FCN_acos::Instance(); FCN_acotd::Instance(); FCN_acoth::Instance(); FCN_acot::Instance(); FCN_acscd::Instance(); FCN_acsch::Instance(); FCN_acsc::Instance(); FCN_adev::Instance(); FCN_aerfc::Instance(); FCN_aerf::Instance(); FCN_agauss::Instance(); FCN_airy::Instance(); FCN_area::Instance(); FCN_asecd::Instance(); FCN_asech::Instance(); FCN_asec::Instance(); FCN_asind::Instance(); FCN_asinh::Instance(); FCN_asin::Instance(); FCN_atan2d::Instance(); FCN_atan2::Instance(); FCN_atand::Instance(); FCN_atanh::Instance(); FCN_atan::Instance(); FCN_bei::Instance(); FCN_ber::Instance(); FCN_besi0::Instance(); FCN_besi1::Instance(); FCN_besj0::Instance(); FCN_besj1::Instance(); FCN_besk0::Instance(); FCN_besk1::Instance(); FCN_besy0::Instance(); FCN_besy1::Instance(); FCN_beta::Instance(); FCN_betain::Instance(); FCN_binom::Instance(); FCN_biry::Instance(); FCN_bivarnor::Instance(); FCN_bivariateInterpolate::Instance(); FCN_bivariateSmooth::Instance(); FCN_canopen::Instance(); FCN_char::Instance(); FCN_cheby::Instance(); FCN_chisq::Instance(); FCN_chisqi::Instance(); FCN_chlogu::Instance(); FCN_clebsg::Instance(); FCN_clen::Instance(); FCN_convolute::Instance(); FCN_cosd::Instance(); FCN_cosh::Instance(); FCN_cos::Instance(); FCN_cosint::Instance(); FCN_cotd::Instance(); FCN_coth::Instance(); FCN_cot::Instance(); FCN_cscd::Instance(); FCN_csch::Instance(); FCN_csc::Instance(); FCN_date::Instance(); FCN_dawson::Instance(); FCN_deconvolute::Instance(); FCN_deriv::Instance(); FCN_det::Instance(); FCN_digamma::Instance(); FCN_dilog::Instance(); FCN_eigen::Instance(); FCN_ei::Instance(); FCN_einellic::Instance(); FCN_ellice::Instance(); FCN_ellick::Instance(); FCN_eqs::Instance(); FCN_erfc::Instance(); FCN_erf::Instance(); FCN_evaluate::Instance(); FCN_exist::Instance(); FCN_expand::Instance(); FCN_exp::Instance(); FCN_expint::Instance(); FCN_expn::Instance(); FCN_factorial::Instance(); FCN_ferdirac::Instance(); FCN_fft::Instance(); FCN_finellic::Instance(); FCN_fisher::Instance(); FCN_fold::Instance(); FCN_frec1::Instance(); FCN_frec2::Instance(); FCN_fres1::Instance(); FCN_fres2::Instance(); FCN_gammacin::Instance(); FCN_gamma::Instance(); FCN_gammain::Instance(); FCN_gammatin::Instance(); FCN_gammln::Instance(); FCN_gammq::Instance(); FCN_gauss::Instance(); FCN_gaussin::Instance(); FCN_gaussj::Instance(); FCN_gmean::Instance(); FCN_heaviside::Instance(); FCN_hermite::Instance(); FCN_hypgeo::Instance(); FCN_ichar::Instance(); FCN_iclose::Instance(); FCN_identity::Instance(); FCN_iequal::Instance(); FCN_ifft::Instance(); FCN_imax::Instance(); FCN_imin::Instance(); FCN_index::Instance(); FCN_integral::Instance(); FCN_interpolate::Instance(); FCN_int::Instance(); FCN_inverse::Instance(); FCN_jacobi::Instance(); FCN_jahnuf::Instance(); FCN_join::Instance(); FCN_kei::Instance(); FCN_ker::Instance(); FCN_kurt::Instance(); FCN_laguerre::Instance(); FCN_lcase::Instance(); FCN_legendre::Instance(); FCN_len::Instance(); FCN_lnagamma::Instance(); FCN_lnbeta::Instance(); FCN_ln::Instance(); FCN_log10::Instance(); FCN_logam::Instance(); FCN_log::Instance(); FCN_max::Instance(); FCN_mean::Instance(); FCN_median::Instance(); FCN_min::Instance(); FCN_mod::Instance(); FCN_nes::Instance(); FCN_nint::Instance(); FCN_normal::Instance(); FCN_null::Instance(); FCN_pdiff::Instance(); FCN_pfactors::Instance(); FCN_plmn::Instance(); FCN_plmu::Instance(); FCN_poica::Instance(); FCN_poisson::Instance(); FCN_prob::Instance(); FCN_prod::Instance(); FCN_psi::Instance(); FCN_racah::Instance(); FCN_radmac::Instance(); FCN_rchar::Instance(); FCN_rms::Instance(); FCN_roll::Instance(); FCN_rprod::Instance(); FCN_rsum::Instance(); FCN_savgol::Instance(); FCN_secd::Instance(); FCN_sech::Instance(); FCN_sec::Instance(); FCN_sign::Instance(); FCN_simpleran::Instance(); FCN_sind::Instance(); FCN_sinh::Instance(); FCN_sin::Instance(); FCN_sinint::Instance(); FCN_skew::Instance(); FCN_smooth::Instance(); FCN_splinterp::Instance(); FCN_splsmooth::Instance(); FCN_sqrt::Instance(); FCN_stdev::Instance(); FCN_step::Instance(); FCN_string::Instance(); FCN_struve0::Instance(); FCN_struve1::Instance(); FCN_student::Instance(); FCN_studenti::Instance(); FCN_sub::Instance(); FCN_sum::Instance(); FCN_sup::Instance(); FCN_tand::Instance(); FCN_tanh::Instance(); FCN_tan::Instance(); FCN_tcase::Instance(); FCN_time::Instance(); FCN_tina::Instance(); FCN_ucase::Instance(); FCN_var::Instance(); FCN_varname::Instance(); FCN_vartype::Instance(); FCN_vlen::Instance(); FCN_voigt::Instance(); FCN_volume::Instance(); FCN_walsh::Instance(); FCN_where::Instance(); FCN_wign3j::Instance(); FCN_wign6j::Instance(); FCN_wign9j::Instance(); FCN_wrap::Instance(); } // end of file extrema-4.4.5/src/Functions/FCN_stdev.h0000644012702201742730000000225211274636611016742 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STDEV #define FCN_STDEV #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_stdev : public ArrayFunction { public: static FCN_stdev *Instance() { if( !fcn_stdev_ )fcn_stdev_ = new FCN_stdev(); return fcn_stdev_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_stdev() : ArrayFunction( wxT("STDEV"), 1, 2 ) {} static FCN_stdev *fcn_stdev_; }; #endif extrema-4.4.5/src/Functions/FCN_besy1.cpp0000644012702201742730000000203111274636611017166 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besy1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besy1 *FCN_besy1::fcn_besy1_ = 0; void FCN_besy1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselY1( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_acsch.h0000644012702201742730000000217411274636611016701 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACSCH #define FCN_ACSCH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acsch : public ScalarFunction { public: static FCN_acsch *Instance() { if( !fcn_acsch_ )fcn_acsch_ = new FCN_acsch(); return fcn_acsch_; } void ScalarEval( int, std::vector & ) const; private: FCN_acsch() : ScalarFunction( wxT("ACSCH") ) {} static FCN_acsch *fcn_acsch_; }; #endif extrema-4.4.5/src/Functions/FCN_secd.h0000644012702201742730000000216011274636611016531 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SECD #define FCN_SECD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_secd : public ScalarFunction { public: static FCN_secd *Instance() { if( !fcn_secd_ )fcn_secd_ = new FCN_secd(); return fcn_secd_; } void ScalarEval( int, std::vector & ) const; private: FCN_secd() : ScalarFunction( wxT("SECD") ) {} static FCN_secd *fcn_secd_; }; #endif extrema-4.4.5/src/Functions/FCN_digamma.cpp0000644012702201742730000000203611274636611017547 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_digamma.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_digamma *FCN_digamma::fcn_digamma_ = 0; void FCN_digamma::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Psi( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_index.h0000644012702201742730000000231511274636611016724 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_INDEX #define FCN_INDEX #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_index : public ArrayFunction { public: static FCN_index *Instance() { if( !fcn_index_ )fcn_index_ = new FCN_index(); return fcn_index_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_index() : ArrayFunction( wxT("INDEX"), 2, 2, MIXED2NUM, CHARACTER, CHARACTER ) {} static FCN_index *fcn_index_; }; #endif extrema-4.4.5/src/Functions/FCN_ellick.h0000644012702201742730000000220611274636611017057 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ELLICK #define FCN_ELLICK #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ellick : public ScalarFunction { public: static FCN_ellick *Instance() { if( !fcn_ellick_ )fcn_ellick_ = new FCN_ellick(); return fcn_ellick_; } void ScalarEval( int, std::vector & ) const; private: FCN_ellick() : ScalarFunction( wxT("ELLICK") ) {} static FCN_ellick *fcn_ellick_; }; #endif extrema-4.4.5/src/Functions/FCN_prod.cpp0000644012702201742730000000345711274636611017124 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_prod.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_prod *FCN_prod::fcn_prod_ = 0; void FCN_prod::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( ndmEff != 1 ) throw EExpressionError( wxT("PROD: argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } void FCN_prod::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg = codes[0]; std::vector d; if( arg->IsaNVariable() ) // arg is x { NumericData nd( arg->GetNVarPtr()->GetData() ); d.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("PROD: first argument workspace is empty") ); d.assign( w->GetData().begin(), w->GetData().end() ); } std::size_t size = d.size(); // double prod = 1.0; for( std::size_t i=0; iSetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); ws->SetValue( prod ); } // end of file extrema-4.4.5/src/Functions/FCN_acosh.cpp0000644012702201742730000000170411274636611017246 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acosh.h" FCN_acosh *FCN_acosh::fcn_acosh_ = 0; void FCN_acosh::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = log( rStack[j] + sqrt(rStack[j]*rStack[j]-1) ); } // end of file extrema-4.4.5/src/Functions/FCN_sub.cpp0000644012702201742730000000305511274636611016743 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_sub.h" #include "Workspace.h" #include "ExprCodes.h" #include "TextVariable.h" #include "EExpressionError.h" FCN_sub *FCN_sub::fcn_sub_ = 0; void FCN_sub::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { nLoop = 0; numberOfArguments_ = 1; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_sub::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; if( !arg1->IsaTString() || !arg2->IsaTString() ) throw EExpressionError( wxT("both arguments of SUB function must be character") ); wxString s2( arg2->GetTString() ); if( s2.find(arg1->GetTString(),0) != s2.npos ) ws->SetValue( 1.0 ); // true else ws->SetValue( 0.0 ); // false } // end of file extrema-4.4.5/src/Functions/FCN_tina.h0000644012702201742730000000216411274636611016552 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_TINA #define FCN_TINA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_tina : public ScalarFunction { public: static FCN_tina *Instance() { if( !fcn_tina_ )fcn_tina_ = new FCN_tina(); return fcn_tina_; } void ScalarEval( int, std::vector & ) const; private: FCN_tina() : ScalarFunction( wxT("TINA"), 4, 4 ) {} static FCN_tina *fcn_tina_; }; #endif extrema-4.4.5/src/Functions/FCN_eigen.h0000644012702201742730000000224311274636611016704 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EIGEN #define FCN_EIGEN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_eigen : public ArrayFunction { public: static FCN_eigen *Instance() { if( !fcn_eigen_ )fcn_eigen_ = new FCN_eigen(); return fcn_eigen_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_eigen() : ArrayFunction( wxT("EIGEN") ) {} static FCN_eigen *fcn_eigen_; }; #endif extrema-4.4.5/src/Functions/FCN_where.h0000644012702201742730000000224411274636611016730 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_WHERE #define FCN_WHERE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_where : public ArrayFunction { public: static FCN_where *Instance() { if( !fcn_where_ )fcn_where_ = new FCN_where(); return fcn_where_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_where() : ArrayFunction( wxT("WHERE") ) {} static FCN_where *fcn_where_; }; #endif extrema-4.4.5/src/Functions/FCN_plmn.h0000644012702201742730000000216411274636611016565 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PLMN #define FCN_PLMN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_plmn : public ScalarFunction { public: static FCN_plmn *Instance() { if( !fcn_plmn_ )fcn_plmn_ = new FCN_plmn(); return fcn_plmn_; } void ScalarEval( int, std::vector & ) const; private: FCN_plmn() : ScalarFunction( wxT("PLMN"), 3, 3 ) {} static FCN_plmn *fcn_plmn_; }; #endif extrema-4.4.5/src/Functions/FunctionDefinition.cpp0000644012702201742730000000417411274636611021265 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FunctionDefinition.h" #include "FunctionTable.h" FunctionDefinition::FunctionDefinition( wxString const &name, std::size_t minArg, std::size_t maxArg, Type fcnType, ArgType a1, ArgType a2, ArgType a3, ArgType a4, ArgType a5, ArgType a6, ArgType a7, ArgType a8, ArgType a9, ArgType a10, ArgType a11, ArgType a12, ArgType a13, ArgType a14, ArgType a15, ArgType a16, ArgType a17, ArgType a18, ArgType a19, ArgType a20 ) : name_(name), minimumNumberOfArguments_(minArg), maximumNumberOfArguments_(maxArg), type_(fcnType) { argumentType_[0] = a1; argumentType_[1] = a2; argumentType_[2] = a3; argumentType_[3] = a4; argumentType_[4] = a5; argumentType_[5] = a6; argumentType_[6] = a7; argumentType_[7] = a8; argumentType_[8] = a9; argumentType_[9] = a10; argumentType_[10] = a11; argumentType_[11] = a12; argumentType_[12] = a13; argumentType_[13] = a14; argumentType_[14] = a15; argumentType_[15] = a16; argumentType_[16] = a17; argumentType_[17] = a18; argumentType_[18] = a19; argumentType_[19] = a20; FunctionTable::GetTable()->AddEntry( this ); } // end of file extrema-4.4.5/src/Functions/FCN_gaussj.h0000644012702201742730000000226511274636611017115 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAUSSJ #define FCN_GAUSSJ #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_gaussj : public ArrayFunction { public: static FCN_gaussj *Instance() { if( !fcn_gaussj_ )fcn_gaussj_ = new FCN_gaussj(); return fcn_gaussj_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_gaussj() : ArrayFunction( wxT("GAUSSJ"), 2, 2 ) {} static FCN_gaussj *fcn_gaussj_; }; #endif extrema-4.4.5/src/Functions/FCN_wign9j.cpp0000644012702201742730000000262711274636611017365 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_wign9j.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_wign9j *FCN_wign9j::fcn_wign9j_ = 0; void FCN_wign9j::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Wigner9JSymbol( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3], rStack[j+4], rStack[j+5], rStack[j+6], rStack[j+7], rStack[j+8] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_gammain.cpp0000644012702201742730000000211411274636611017556 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gammain.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gammain *FCN_gammain::fcn_gammain_ = 0; void FCN_gammain::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::IncompleteGamma( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_clebsg.cpp0000644012702201742730000000251611274636611017412 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_clebsg.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_clebsg *FCN_clebsg::fcn_clebsg_ = 0; void FCN_clebsg::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ClebschGordanCoefficient( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3], rStack[j+4], rStack[j+5] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_kei.cpp0000644012702201742730000000201211274636611016712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_kei.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_kei *FCN_kei::fcn_kei_ = 0; void FCN_kei::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Kei( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_gamma.h0000644012702201742730000000217311274636611016701 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAMMA #define FCN_GAMMA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gamma : public ScalarFunction { public: static FCN_gamma *Instance() { if( !fcn_gamma_ )fcn_gamma_ = new FCN_gamma(); return fcn_gamma_; } void ScalarEval( int, std::vector & ) const; private: FCN_gamma() : ScalarFunction( wxT("GAMMA") ) {} static FCN_gamma *fcn_gamma_; }; #endif extrema-4.4.5/src/Functions/FCN_struve1.h0000644012702201742730000000222211274636611017223 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STRUVE1 #define FCN_STRUVE1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_struve1 : public ScalarFunction { public: static FCN_struve1 *Instance() { if( !fcn_struve1_ )fcn_struve1_ = new FCN_struve1(); return fcn_struve1_; } void ScalarEval( int, std::vector & ) const; private: FCN_struve1() : ScalarFunction( wxT("STRUVE1") ) {} static FCN_struve1 *fcn_struve1_; }; #endif extrema-4.4.5/src/Functions/FCN_fisher.h0000644012702201742730000000221411274636611017073 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FISHER #define FCN_FISHER #include "wx/wx.h" #include "ScalarFunction.h" class FCN_fisher : public ScalarFunction { public: static FCN_fisher *Instance() { if( !fcn_fisher_ )fcn_fisher_ = new FCN_fisher(); return fcn_fisher_; } void ScalarEval( int, std::vector & ) const; private: FCN_fisher() : ScalarFunction( wxT("FISHER"), 3, 3 ) {} static FCN_fisher *fcn_fisher_; }; #endif extrema-4.4.5/src/Functions/FCN_frec1.cpp0000644012702201742730000000203111274636611017143 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_frec1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_frec1 *FCN_frec1::fcn_frec1_ = 0; void FCN_frec1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::FresnelC( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_betain.h0000644012702201742730000000221411274636611017055 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BETAIN #define FCN_BETAIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_betain : public ScalarFunction { public: static FCN_betain *Instance() { if( !fcn_betain_ )fcn_betain_ = new FCN_betain(); return fcn_betain_; } void ScalarEval( int, std::vector & ) const; private: FCN_betain() : ScalarFunction( wxT("BETAIN"), 3, 3 ) {} static FCN_betain *fcn_betain_; }; #endif extrema-4.4.5/src/Functions/FCN_bei.h0000644012702201742730000000214411274636611016354 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BEI #define FCN_BEI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_bei : public ScalarFunction { public: static FCN_bei *Instance() { if( !fcn_bei_ )fcn_bei_ = new FCN_bei(); return fcn_bei_; } void ScalarEval( int, std::vector & ) const; private: FCN_bei() : ScalarFunction( wxT("BEI") ) {} static FCN_bei *fcn_bei_; }; #endif extrema-4.4.5/src/Functions/FCN_bivinterp.cpp0000644012702201742730000001256111274636611020156 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_bivinterp.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_bivariateInterpolate *FCN_bivariateInterpolate::fcn_bivariateInterpolate_ = 0; void FCN_bivariateInterpolate::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("BIVINTERP: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; switch ( ++numberOfArguments_ ) { case 2: if( ndmEff != 1 ) throw EExpressionError( wxT("BIVINTERP: second argument must be a vector") ); break; case 3: if( ndmEff != 2 ) throw EExpressionError( wxT("BIVINTERP: third argument must be a matrix") ); break; case 4: if( ndmEff != 1 ) throw EExpressionError( wxT("BIVINTERP: fourth argument must be a vector") ); break; case 5: if( ndmEff != 1 ) throw EExpressionError( wxT("BIVINTERP: fifth argument must be a vector") ); break; } } } void FCN_bivariateInterpolate::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; ExprCodes *arg4 = codes[3]; ExprCodes *arg5 = codes[4]; std::vector d1, d2, d3, d4, d5; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVINTERP: first argument workspace is empty" ) ); d1.assign( w->GetData().begin(), w->GetData().end() ); } int size1 = d1.size(); if( size1 < 2 ) throw EExpressionError( wxT("BIVINTERP: independent vector length < 2") ); // if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVINTERP: second argument workspace is empty") ); d2.assign( w->GetData().begin(), w->GetData().end() ); } int size2 = d2.size(); if( size2 < 2 ) throw EExpressionError( wxT("BIVINTERP: dependent vector length < 2") ); // int size3a[2]; if( arg3->IsaNVariable() ) // arg3 is xout { NumericData nd( arg3->GetNVarPtr()->GetData() ); d3.assign( nd.GetData().begin(), nd.GetData().end() ); size3a[0] = nd.GetDimMag(0); size3a[1] = nd.GetDimMag(1); } else { Workspace *w = arg3->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVINTERP: input matrix argument workspace is empty") ); d3.assign( w->GetData().begin(), w->GetData().end() ); size3a[0] = w->GetDimMag(0); size3a[1] = w->GetDimMag(1); } if( size3a[0] != size2 ) throw EExpressionError( wxT("BIVINTERP: #rows of input matrix must = dependent vector length") ); if( size3a[1] != size1 ) throw EExpressionError( wxT("BIVINTERP: #columns of input matrix must = independent vector length") ); // if( arg4->IsaNVariable() ) { NumericData nd( arg4->GetNVarPtr()->GetData() ); d4.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg4->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVINTERP: fourth argument workspace is empty") ); d4.assign( w->GetData().begin(), w->GetData().end() ); } int size4 = d4.size(); if( size4 < 1 ) throw EExpressionError( wxT("BIVINTERP: output independent vector is empty") ); // if( arg5->IsaNVariable() ) { NumericData nd( arg5->GetNVarPtr()->GetData() ); d5.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg5->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVINTERP: fifth argument workspace is empty") ); d5.assign( w->GetData().begin(), w->GetData().end() ); } int size5 = d5.size(); if( size5 != size4 ) throw EExpressionError( wxT("BIVINTERP: output dependent vector length must = independent vector length") ); // std::vector yy( size4, 0.0 ); try { UsefulFunctions::BivariateInterpolation( d1, d2, d3, d4, d5, yy ); } catch ( std::runtime_error &e ) { throw EExpressionError( wxString(wxT("BIVINTERP: "))+wxString(e.what(),wxConvUTF8) ); } // ws->SetNumberOfDimensions( 1 ); ws->SetDimMag( 0, size4 ); ws->SetData( yy ); } // end of file extrema-4.4.5/src/Functions/FCN_cscd.cpp0000644012702201742730000000203211274636611017060 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_cscd.h" #include "EExpressionError.h" FCN_cscd *FCN_cscd::fcn_cscd_ = 0; void FCN_cscd::ScalarEval( int j, std::vector &rStack ) const { double s = sin( rStack[j]*M_PI/180. ); if( s == 0.0 )throw EExpressionError( wxT("CSCD: sin(argument) = 0") ); rStack[j] = 1.0/s; } extrema-4.4.5/src/Functions/FCN_dilog.cpp0000644012702201742730000000202611274636611017245 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_dilog.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_dilog *FCN_dilog::fcn_dilog_ = 0; void FCN_dilog::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::DiLog( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_besy0.h0000644012702201742730000000217411274636611016642 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESY0 #define FCN_BESY0 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besy0 : public ScalarFunction { public: static FCN_besy0 *Instance() { if( !fcn_besy0_ )fcn_besy0_ = new FCN_besy0(); return fcn_besy0_; } void ScalarEval( int, std::vector & ) const; private: FCN_besy0() : ScalarFunction( wxT("BESY0") ) {} static FCN_besy0 *fcn_besy0_; }; #endif extrema-4.4.5/src/Functions/FCN_asech.cpp0000644012702201742730000000215511274636611017235 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_asech.h" #include "EExpressionError.h" FCN_asech *FCN_asech::fcn_asech_ = 0; void FCN_asech::ScalarEval( int j, std::vector &rStack ) const { if( (-1.0<=rStack[j]) && (rStack[j]<=1.0) ) throw EExpressionError( wxT("ASECH: argument must be in the range [-1,0) (0,+1]") ); rStack[j] = log( (1.0/rStack[j]) + sqrt((1.0/(rStack[j]*rStack[j])-1.0)) ); } extrema-4.4.5/src/Functions/FCN_cot.cpp0000644012702201742730000000201211274636611016727 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_cot.h" #include "EExpressionError.h" FCN_cot *FCN_cot::fcn_cot_ = 0; void FCN_cot::ScalarEval( int j, std::vector &rStack ) const { double t = tan( rStack[j] ); if( t == 0.0 )throw EExpressionError( wxT("COT: tan(argument) = 0") ); rStack[j] = 1.0/t; } extrema-4.4.5/src/Functions/FCN_digamma.h0000644012702201742730000000222311274636611017212 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DIGAMMA #define FCN_DIGAMMA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_digamma : public ScalarFunction { public: static FCN_digamma *Instance() { if( !fcn_digamma_ )fcn_digamma_ = new FCN_digamma(); return fcn_digamma_; } void ScalarEval( int, std::vector & ) const; private: FCN_digamma() : ScalarFunction( wxT("DIGAMMA") ) {} static FCN_digamma *fcn_digamma_; }; #endif extrema-4.4.5/src/Functions/FCN_simpleran.cpp0000644012702201742730000000172111274636611020142 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_simpleran.h" #include "UsefulFunctions.h" FCN_simpleran *FCN_simpleran::fcn_simpleran_ = 0; void FCN_simpleran::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = UsefulFunctions::GetSimpleRandomNumber(); } extrema-4.4.5/src/Functions/FCN_char.h0000644012702201742730000000230411274636611016530 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CHAR #define FCN_CHAR #include "wx/wx.h" #include "FunctionDefinition.h" class Workspace; class FCN_char : public FunctionDefinition { public: static FCN_char *Instance() { if( !fcn_char_ )fcn_char_ = new FCN_char(); return fcn_char_; } void TextArrayEval( int const, std::vector &, std::vector & ) const; private: FCN_char() : FunctionDefinition( wxT("CHAR"), 1, 1, MIXED2CHAR ) {} static FCN_char *fcn_char_; }; #endif extrema-4.4.5/src/Functions/FCN_deconvolute.h0000644012702201742730000000236211274636611020146 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DECONVOLUTE #define FCN_DECONVOLUTE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_deconvolute : public ArrayFunction { public: static FCN_deconvolute *Instance() { if( !fcn_deconvolute_ )fcn_deconvolute_ = new FCN_deconvolute(); return fcn_deconvolute_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_deconvolute() : ArrayFunction( wxT("DECONVOLUTE"), 2, 2 ) {} static FCN_deconvolute *fcn_deconvolute_; }; #endif extrema-4.4.5/src/Functions/FCN_struve1.cpp0000644012702201742730000000204211274636611017556 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_struve1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_struve1 *FCN_struve1::fcn_struve1_ = 0; void FCN_struve1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Struve1( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_asind.cpp0000644012702201742730000000206711274636611017252 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_asind.h" #include "EExpressionError.h" FCN_asind *FCN_asind::fcn_asind_ = 0; void FCN_asind::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j]<-1.0 || rStack[j]>1.0 ) throw EExpressionError( wxT("ASIND: argument must be >= -1 and <= 1") ); rStack[j] = asin( rStack[j] )*180./M_PI; } extrema-4.4.5/src/Functions/FCN_erf.cpp0000644012702201742730000000201411274636611016720 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_erf.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_erf *FCN_erf::fcn_erf_ = 0; void FCN_erf::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Error( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_besj1.cpp0000644012702201742730000000203111274636611017147 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besj1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besj1 *FCN_besj1::fcn_besj1_ = 0; void FCN_besj1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselJ1( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_erfc.h0000644012702201742730000000216011274636611016532 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ERFC #define FCN_ERFC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_erfc : public ScalarFunction { public: static FCN_erfc *Instance() { if( !fcn_erfc_ )fcn_erfc_ = new FCN_erfc(); return fcn_erfc_; } void ScalarEval( int, std::vector & ) const; private: FCN_erfc() : ScalarFunction( wxT("ERFC") ) {} static FCN_erfc *fcn_erfc_; }; #endif extrema-4.4.5/src/Functions/FCN_sech.cpp0000644012702201742730000000201611274636611017070 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sech.h" #include "EExpressionError.h" FCN_sech *FCN_sech::fcn_sech_ = 0; void FCN_sech::ScalarEval( int j, std::vector &rStack ) const { if( cosh(rStack[j]) == 0.0 )throw EExpressionError( wxT("SECH: cosh(argument) = 0") ); rStack[j] = 1./cosh(rStack[j]); } extrema-4.4.5/src/Functions/FCN_mod.h0000644012702201742730000000215211274636611016373 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_MOD #define FCN_MOD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_mod : public ScalarFunction { public: static FCN_mod *Instance() { if( !fcn_mod_ )fcn_mod_ = new FCN_mod(); return fcn_mod_; } void ScalarEval( int, std::vector & ) const; private: FCN_mod() : ScalarFunction( wxT("MOD"), 2, 2 ) {} static FCN_mod *fcn_mod_; }; #endif extrema-4.4.5/src/Functions/FCN_clen.h0000644012702201742730000000226411274636611016541 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CLEN #define FCN_CLEN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_clen : public ArrayFunction { public: static FCN_clen *Instance() { if( !fcn_clen_ )fcn_clen_ = new FCN_clen(); return fcn_clen_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_clen() : ArrayFunction( wxT("CLEN"), 1, 1, MIXED2NUM, CHARACTER ) {} static FCN_clen *fcn_clen_; }; #endif extrema-4.4.5/src/Functions/FCN_skew.cpp0000644012702201742730000001170611274636611017125 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_skew.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_skew *FCN_skew::fcn_skew_ = 0; void FCN_skew::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_skew::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("SKEW: argument must be a vector") ); else throw EExpressionError( wxT("SKEW: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("SKEW: argument workspace is empty") ); else throw EExpressionError( wxT("SKEW: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("SKEW: argument must be a vector") ); else throw EExpressionError( wxT("SKEW: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("SKEW: argument must be a vector") ); else throw EExpressionError( wxT("SKEW: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("SKEW: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("SKEW: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("SKEW: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("SKEW: argument 2 must be a vector") ); } double wsum=0.0, xsum=0.0, var=0.0, skew=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("SKEW: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; iSetValue( skew/wsum/var/sqrt(var) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_sup.cpp0000644012702201742730000000305511274636611016761 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_sup.h" #include "Workspace.h" #include "ExprCodes.h" #include "TextVariable.h" #include "EExpressionError.h" FCN_sup *FCN_sup::fcn_sup_ = 0; void FCN_sup::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { nLoop = 0; numberOfArguments_ = 1; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_sup::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; if( !arg1->IsaTString() || !arg2->IsaTString() ) throw EExpressionError( wxT("both arguments of SUP function must be character") ); wxString s1( arg1->GetTString() ); if( s1.find(arg2->GetTString(),0) != s1.npos ) ws->SetValue( 1.0 ); // true else ws->SetValue( 0.0 ); // false } // end of file extrema-4.4.5/src/Functions/FCN_fold.cpp0000644012702201742730000000571011274636611017076 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_fold.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_fold *FCN_fold::fcn_fold_ = 0; void FCN_fold::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 ) throw EExpressionError( wxT("first argument of FOLD function must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 0 ) throw EExpressionError( wxT("second argument of FOLD function must be a scalar") ); numberOfArguments_ = 2; } } void FCN_fold::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d; std::size_t size; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d.assign( nd.GetData().begin(), nd.GetData().end() ); size = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("FOLD: first argument workspace is empty") ); d.assign( w1->GetData().begin(), w1->GetData().end() ); size = w1->GetDimMag(0); } double rows; if( arg2->IsaNVariable() ) rows = arg2->GetNVarPtr()->GetData().GetScalarValue(); else if( arg2->IsaWorkspace() ) { if( arg2->GetWorkspacePtr()->IsEmpty() ) throw EExpressionError( wxT("FOLD: second argument workspace is empty") ); rows = arg2->GetWorkspacePtr()->GetValue(); } else rows = arg2->GetConstantValue(); if( rows == 0.0 ) throw EExpressionError( wxT("number of rows specified in FOLD function cannot be zero") ); if( rows < 0.0 ) throw EExpressionError( wxT("number of rows specified in FOLD function cannot be < 0") ); std::size_t nrows = static_cast(rows); std::size_t ncols = size/nrows; if( nrows*ncols != size ) throw EExpressionError( wxT("invalid FOLD function row size") ); std::size_t k3 = 0; for( std::size_t k2=0; k2SetData( k1+k2*nrows, d[k3++] ); } ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, nrows ); ws->SetDimMag( 1, ncols ); } // end of file extrema-4.4.5/src/Functions/FCN_chisq.cpp0000644012702201742730000000214711274636611017262 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_chisq.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_chisq *FCN_chisq::fcn_chisq_ = 0; void FCN_chisq::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j+1]); try { rStack[j] = UsefulFunctions::Chisq( rStack[j], n ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } // end of file extrema-4.4.5/src/Functions/FCN_asecd.h0000644012702201742730000000217411274636611016677 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ASECD #define FCN_ASECD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_asecd : public ScalarFunction { public: static FCN_asecd *Instance() { if( !fcn_asecd_ )fcn_asecd_ = new FCN_asecd(); return fcn_asecd_; } void ScalarEval( int, std::vector & ) const; private: FCN_asecd() : ScalarFunction( wxT("ASECD") ) {} static FCN_asecd *fcn_asecd_; }; #endif extrema-4.4.5/src/Functions/FCN_cosh.cpp0000644012702201742730000000162411274636611017106 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_cosh.h" FCN_cosh *FCN_cosh::fcn_cosh_ = 0; void FCN_cosh::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = cosh( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_acos.h0000644012702201742730000000215411274636611016543 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACOS #define FCN_ACOS #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acos : public ScalarFunction { public: static FCN_acos *Instance() { if( !fcn_acos_ )fcn_acos_ = new FCN_acos(); return fcn_acos_; } void ScalarEval( int, std::vector & ) const; private: FCN_acos() : ScalarFunction( wxT("ACOS") ) {} static FCN_acos *fcn_acos_; }; #endif extrema-4.4.5/src/Functions/FCN_chlogu.h0000644012702201742730000000221411274636611017074 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CHLOGU #define FCN_CHLOGU #include "wx/wx.h" #include "ScalarFunction.h" class FCN_chlogu : public ScalarFunction { public: static FCN_chlogu *Instance() { if( !fcn_chlogu_ )fcn_chlogu_ = new FCN_chlogu(); return fcn_chlogu_; } void ScalarEval( int, std::vector & ) const; private: FCN_chlogu() : ScalarFunction( wxT("CHLOGU"), 3, 3 ) {} static FCN_chlogu *fcn_chlogu_; }; #endif extrema-4.4.5/src/Functions/FCN_log10.cpp0000644012702201742730000000200711274636611017070 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_log10.h" #include "EExpressionError.h" FCN_log10 *FCN_log10::fcn_log10_ = 0; void FCN_log10::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] <= 0.0 )throw EExpressionError( wxT("LOG10: argument <= 0") ); rStack[j] = log10( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_aerf.h0000644012702201742730000000216011274636611016530 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_AERF #define FCN_AERF #include "wx/wx.h" #include "ScalarFunction.h" class FCN_aerf : public ScalarFunction { public: static FCN_aerf *Instance() { if( !fcn_aerf_ )fcn_aerf_ = new FCN_aerf(); return fcn_aerf_; } void ScalarEval( int, std::vector & ) const; private: FCN_aerf() : ScalarFunction( wxT("AERF") ) {} static FCN_aerf *fcn_aerf_; }; #endif extrema-4.4.5/src/Functions/FCN_ifft.cpp0000644012702201742730000000722711274636611017107 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_ifft.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_ifft *FCN_ifft::fcn_ifft_ = 0; void FCN_ifft::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 2 ) throw EExpressionError( wxT("IFFT: first argument must be a matrix") ); numberOfArguments_ = 1; nLoop = 2; } } void FCN_ifft::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::vector a; int nrows, ncols; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); a.assign( nd.GetData().begin(), nd.GetData().end() ); nrows = nd.GetDimMag(0); ncols = nd.GetDimMag(1); } else { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("IFFT: first argument workspace is empty") ); a.assign( w->GetData().begin(), w->GetData().end() ); nrows = w->GetDimMag(0); ncols = w->GetDimMag(1); } if( ncols != 2 ) throw EExpressionError( wxT("IFFT: first argument matrix must have exactly 2 columns") ); if( nrows <= 2 ) throw EExpressionError( wxT("IFFT: first argument matrix must have more than 2 rows") ); ExprCodes *arg2 = NULL; if( codes.size() > 2 )arg2 = codes[1]; wxString s; if( !arg2 ) // arg2 is a string determining the type of ifft { s = wxT("AMP&PHASE"); } else { if( arg2->IsaWorkspace() ) s = arg2->GetWorkspacePtr()->GetFinalString(); else if( arg2->IsaTString() ) s = arg2->GetTString(); else throw EExpressionError( wxT("IFFT: second argument must be character") ); s.UpperCase(); if( s != wxT("AMP&PHASE") && s != wxT("COS&SIN") ) throw EExpressionError( wxT("IFFT: second argument must be either AMP&PHASE or COS&SIN") ); } double const deg2rad = M_PI/180.0; int const npt = 2*(nrows-1); std::vector work1(npt,0.0), work2(npt,0.0); if( s == wxT("AMP&PHASE") ) { work1[0] = a[0]*cos(a[nrows]*deg2rad); work2[0] = a[0]*sin(a[nrows]*deg2rad); for( int k=1; kSetData( k, work1[k]/2.0 ); ws->SetDimMag( 0, npt ); ws->SetNumberOfDimensions(1); } // end of file extrema-4.4.5/src/Functions/FCN_inverse.cpp0000644012702201742730000000526711274636611017634 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_inverse.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_inverse *FCN_inverse::fcn_inverse_ = 0; void FCN_inverse::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 2 ) throw EExpressionError( wxT("INVERSE: argument must be a matrix") ); numberOfArguments_ = 1; nLoop = 2; } } void FCN_inverse::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::vector d1; int size1a[2]; int ndm1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( int i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("INVERSE: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( int i=0; iGetDimMag(i); } if( size1a[0] != size1a[1] ) throw EExpressionError( wxT("INVERSE: first argument must be a square matrix") ); int size1 = size1a[0]; // if( size1 < 2 ) throw EExpressionError( wxT("INVERSE: matrix dimension < 2") ); // std::vector indx( size1, 0 ); try { UsefulFunctions::LUDecomposition( d1, indx ); } catch( EExpressionError &e ) { throw; } std::vector d2( size1*size1, 0.0 ); std::vector b( size1, 0.0 ); for( int j=0; jSetData( d2 ); ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, size1 ); ws->SetDimMag( 1, size1 ); } // end of file extrema-4.4.5/src/Functions/FCN_asec.cpp0000644012702201742730000000200411274636611017056 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_asec.h" #include "EExpressionError.h" FCN_asec *FCN_asec::fcn_asec_ = 0; void FCN_asec::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] == 0.0 )throw EExpressionError( wxT("ASEC: argument = 0") ); rStack[j] = acos( 1.0/rStack[j] ); } extrema-4.4.5/src/Functions/FCN_cheby.cpp0000644012702201742730000000216511274636611017245 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_cheby.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_cheby *FCN_cheby::fcn_cheby_ = 0; void FCN_cheby::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j]); double x = rStack[j+1]; try { rStack[j] = UsefulFunctions::ChebyshevPolynomial( n, x ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_cosint.h0000644012702201742730000000221411274636611017112 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COSINT #define FCN_COSINT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cosint : public ScalarFunction { public: static FCN_cosint *Instance() { if( !fcn_cosint_ )fcn_cosint_ = new FCN_cosint(); return fcn_cosint_; } void ScalarEval( int const, std::vector & ) const; private: FCN_cosint() : ScalarFunction( wxT("COSINT") ) {} static FCN_cosint *fcn_cosint_; }; #endif extrema-4.4.5/src/Functions/FCN_sub.h0000644012702201742730000000226411274636611016411 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SUB #define FCN_SUB #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_sub : public ArrayFunction { public: static FCN_sub *Instance() { if( !fcn_sub_ )fcn_sub_ = new FCN_sub(); return fcn_sub_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_sub() : ArrayFunction( wxT("SUB"), 2, 2, MIXED2NUM, CHARACTER, CHARACTER ) {} static FCN_sub *fcn_sub_; }; #endif extrema-4.4.5/src/Functions/FCN_expint.cpp0000644012702201742730000000205111274636611017454 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_expint.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_expint *FCN_expint::fcn_expint_ = 0; void FCN_expint::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ExponentialIntegral( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_poisson.h0000644012702201742730000000222711274636611017311 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_POISSON #define FCN_POISSON #include "wx/wx.h" #include "ScalarFunction.h" class FCN_poisson : public ScalarFunction { public: static FCN_poisson *Instance() { if( !fcn_poisson_ )fcn_poisson_ = new FCN_poisson(); return fcn_poisson_; } void ScalarEval( int, std::vector & ) const; private: FCN_poisson() : ScalarFunction( wxT("POISSON"), 2, 2 ) {} static FCN_poisson *fcn_poisson_; }; #endif extrema-4.4.5/src/Functions/FCN_ln.h0000644012702201742730000000213011274636611016221 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LN #define FCN_LN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ln : public ScalarFunction { public: static FCN_ln *Instance() { if( !fcn_ln_ )fcn_ln_ = new FCN_ln(); return fcn_ln_; } void ScalarEval( int, std::vector & ) const; private: FCN_ln() : ScalarFunction( wxT("LN") ) {} static FCN_ln *fcn_ln_; }; #endif extrema-4.4.5/src/Functions/FCN_acscd.cpp0000644012702201742730000000202211274636611017220 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acscd.h" #include "EExpressionError.h" FCN_acscd *FCN_acscd::fcn_acscd_ = 0; void FCN_acscd::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] == 0.0 )throw EExpressionError(wxT("ACSCD: argument = 0")); rStack[j] = asin( 1.0/rStack[j] )*180./M_PI; } extrema-4.4.5/src/Functions/FCN_student.h0000644012702201742730000000223011274636611017277 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STUDENT #define FCN_STUDENT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_student : public ScalarFunction { public: static FCN_student *Instance() { if( !fcn_student_ )fcn_student_ = new FCN_student(); return fcn_student_; } void ScalarEval( int, std::vector & ) const; private: FCN_student() : ScalarFunction( wxT("STUDENT"), 2, 2 ) {} static FCN_student *fcn_student_; }; #endif extrema-4.4.5/src/Functions/FCN_cot.h0000644012702201742730000000214411274636611016402 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COT #define FCN_COT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cot : public ScalarFunction { public: static FCN_cot *Instance() { if( !fcn_cot_ )fcn_cot_ = new FCN_cot(); return fcn_cot_; } void ScalarEval( int, std::vector & ) const; private: FCN_cot() : ScalarFunction( wxT("COT") ) {} static FCN_cot *fcn_cot_; }; #endif extrema-4.4.5/src/Functions/FCN_lnagamma.h0000644012702201742730000000223711274636611017375 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LNAGAMMA #define FCN_LNAGAMMA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_lnagamma : public ScalarFunction { public: static FCN_lnagamma *Instance() { if( !fcn_lnagamma_ )fcn_lnagamma_ = new FCN_lnagamma(); return fcn_lnagamma_; } void ScalarEval( int, std::vector & ) const; private: FCN_lnagamma() : ScalarFunction( wxT("LNAGAMMA") ) {} static FCN_lnagamma *fcn_lnagamma_; }; #endif extrema-4.4.5/src/Functions/FCN_volume.cpp0000644012702201742730000001121111274636611017452 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_volume.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "GRA_thiessenTriangulation.h" FCN_volume *FCN_volume::fcn_volume_ = 0; void FCN_volume::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("VOLUME: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; ++numberOfArguments_; if( numberOfArguments_ == 2 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("VOLUME: second argument must be a vector") ); } else if( numberOfArguments_ == 3 ) { if( ndmEff!=1 && ndmEff!=2 ) throw EExpressionError( wxT("VOLUME: third argument must be a vector or a matrix") ); } } } void FCN_volume::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; std::vector x, y, z; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); x.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("VOLUME: first argument workspace is empty") ); x.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = x.size(); // if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); y.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("VOLUME: second argument workspace is empty") ); y.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = y.size(); if( size2 != size1 )throw EExpressionError( wxT("VOLUME: vectors have different lengths") ); // bool matrix = false; std::size_t nrows, ncols; if( arg3->IsaNVariable() ) // arg3 is z { NumericData nd( arg3->GetNVarPtr()->GetData() ); z.assign( nd.GetData().begin(), nd.GetData().end() ); if( nd.GetNumberOfDimensions() == 2 ) { matrix = true; nrows = nd.GetDimMag(0); ncols = nd.GetDimMag(1); } } else { Workspace *w3 = arg3->GetWorkspacePtr(); if( w3->IsEmpty() ) throw EExpressionError( wxT("VOLUME: third argument workspace is empty") ); z.assign( w3->GetData().begin(), w3->GetData().end() ); if( w3->GetNumberOfDimensions() == 2 ) { matrix = true; nrows = w3->GetDimMag(0); ncols = w3->GetDimMag(1); } } std::size_t size3 = z.size(); // double volume = 0.0; // if( matrix ) { if( nrows != size2 )throw EExpressionError( wxT("VOLUME: length of dependent vector not equal to number of rows of the matrix") ); if( ncols != size1 )throw EExpressionError( wxT("VOLUME: length of independent vector not equal to number of columns of the matrix") ); for( std::size_t j=1; j<=nrows-1; ++j ) { for( std::size_t i=1; i<=ncols-1; ++i ) { double dx = x[j] - x[j-1]; double dy = y[i] - y[i-1]; double area = 0.5*dx*dy; double hite = z[i-1+(j-1)*ncols] + z[i+(j-1)*ncols] + z[i-1+j*ncols]; volume += area*hite/3.0; hite = z[i-1+j*ncols] + z[i+j*ncols] + z[i+(j-1)*ncols]; volume += area*hite/3.0; } } } else { if( size3 != size1 )throw EExpressionError( wxT("VOLUME: vectors have different lengths") ); if( size1 < 4 )throw EExpressionError( wxT("VOLUME: vector length < 4") ); try { GRA_thiessenTriangulation tt( x, y, z ); tt.CreateMesh(); volume = tt.Volume(); } catch (EExpressionError &e) { throw; } } ws->SetValue( volume ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_acsc.h0000644012702201742730000000215611274636611016531 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACSC #define FCN_ACSC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acsc : public ScalarFunction { public: static FCN_acsc *Instance() { if( !fcn_acsc_ )fcn_acsc_ = new FCN_acsc(); return fcn_acsc_; } void ScalarEval( int, std::vector & ) const; private: FCN_acsc() : ScalarFunction( wxT("ACSC") ) {} static FCN_acsc *fcn_acsc_; }; #endif extrema-4.4.5/src/Functions/FCN_asec.h0000644012702201742730000000216011274636611016526 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ASEC #define FCN_ASEC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_asec : public ScalarFunction { public: static FCN_asec *Instance() { if( !fcn_asec_ )fcn_asec_ = new FCN_asec(); return fcn_asec_; } void ScalarEval( int, std::vector & ) const; private: FCN_asec() : ScalarFunction( wxT("ASEC") ) {} static FCN_asec *fcn_asec_; }; #endif extrema-4.4.5/src/Functions/FCN_sin.h0000644012702201742730000000214411274636611016406 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SIN #define FCN_SIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sin : public ScalarFunction { public: static FCN_sin *Instance() { if( !fcn_sin_ )fcn_sin_ = new FCN_sin(); return fcn_sin_; } void ScalarEval( int, std::vector & ) const; private: FCN_sin() : ScalarFunction( wxT("SIN") ) {} static FCN_sin *fcn_sin_; }; #endif extrema-4.4.5/src/Functions/FCN_sec.cpp0000644012702201742730000000201211274636611016714 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sec.h" #include "EExpressionError.h" FCN_sec *FCN_sec::fcn_sec_ = 0; void FCN_sec::ScalarEval( int j, std::vector &rStack ) const { double c = cos(rStack[j]); if( c <= 0.0 )throw EExpressionError( wxT("SEC: cos(argument) = 0") ); rStack[j] = 1.0/c; } extrema-4.4.5/src/Functions/FCN_beta.h0000644012702201742730000000216411274636611016532 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BETA #define FCN_BETA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_beta : public ScalarFunction { public: static FCN_beta *Instance() { if( !fcn_beta_ )fcn_beta_ = new FCN_beta(); return fcn_beta_; } void ScalarEval( int, std::vector & ) const; private: FCN_beta() : ScalarFunction( wxT("BETA"), 2, 2 ) {} static FCN_beta *fcn_beta_; }; #endif extrema-4.4.5/src/Functions/FCN_rchar.cpp0000644012702201742730000000267011274636611017253 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_rchar.h" #include "Workspace.h" #include "EExpressionError.h" FCN_rchar *FCN_rchar::fcn_rchar_ = 0; void FCN_rchar::TextArrayEval( int const j, std::vector &wStack, std::vector &sStack ) const { double x; Workspace *ws = wStack[j]; if( ws->GetNumberOfDimensions() != 0 ) throw EExpressionError( wxT("first argument to RCHAR must be scalar") ); x = ws->GetValue(); if( GetArgumentCounter() == 1 )sStack[j] << x; else { wxString format( sStack[j+1] ); wxChar c[300]; if( ::wxSnprintf( c, 300, format, x ) < 0 ) throw EExpressionError( wxT("error converting to character using format") ); sStack[j] = c; } } // end of file extrema-4.4.5/src/Functions/FCN_deriv.cpp0000644012702201742730000001061111274636611017257 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "FCN_deriv.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_deriv *FCN_deriv::fcn_deriv_ = 0; void FCN_deriv::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("DERIV: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; ++numberOfArguments_; if( numberOfArguments_ == 2 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("DERIV: second argument must be a vector") ); } } } void FCN_deriv::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = NULL; if( codes.size() > 3 )arg3 = codes[2]; std::vector d1, d2; wxString s3; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("DERIV: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("DERIV: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("DERIV: vectors have different lengths") ); if( size1 < 2 ) throw EExpressionError( wxT("DERIV: independent vector length < 2") ); // if( arg3 == NULL ) // arg3 is a string determining the type of integration { s3 = wxT("INTERP"); } else { if( arg3->IsaWorkspace() ) s3 = arg3->GetWorkspacePtr()->GetFinalString(); else if( arg3->IsaTString() ) s3 = arg3->GetTString(); else throw EExpressionError( wxT("DERIV: third argument must be character") ); s3.UpperCase(); } for( std::size_t i=1; i::epsilon() ) throw EExpressionError( wxT("DERIV: independent vector must be strictly monotonically increasing") ); } std::vector yderiv( size1, 0.0 ); if( s3 == wxT("INTERP") ) { std::size_t deriv = 1; UsefulFunctions::SplineDerivative( d1, d2, d1, yderiv, deriv ); } else if( s3 == wxT("SMOOTH") ) { std::vector yy( size1, 0.0 ); std::vector weights( size1, 1.0 ); UsefulFunctions::SplineSmooth( d1, d2, d1, yy, yderiv, weights ); } else if( s3 == wxT("FC") ) { UsefulFunctions::FritchCarlsonInterpolate( d1, d2, d1, yderiv, 1 ); } else if( s3 == wxT("LAGRANGE3") ) { UsefulFunctions::LagrangeDerivative( d1, d2, d1, yderiv, 3, 1 ); } else if( s3 == wxT("LAGRANGE5") ) { UsefulFunctions::LagrangeDerivative( d1, d2, d1, yderiv, 5, 1 ); } else if( s3 == wxT("LAGRANGE7") ) { UsefulFunctions::LagrangeDerivative( d1, d2, d1, yderiv, 7, 1 ); } else if( s3 == wxT("LAGRANGE9") ) { UsefulFunctions::LagrangeDerivative( d1, d2, d1, yderiv, 9, 1 ); } else throw EExpressionError( wxT("DERIV: invalid third parameter") ); // ws->SetDimMag( 0, yderiv.size() ); ws->SetNumberOfDimensions(1); ws->SetData( yderiv ); } // end of file extrema-4.4.5/src/Functions/FCN_atan.cpp0000644012702201742730000000162311274636611017074 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_atan.h" FCN_atan *FCN_atan::fcn_atan_ = 0; void FCN_atan::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = atan( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_varname.h0000644012702201742730000000236411274636611017252 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_VARNAME #define FCN_VARNAME #include "wx/wx.h" #include "FunctionDefinition.h" class Workspace; class FCN_varname : public FunctionDefinition { public: static FCN_varname *Instance() { if( !fcn_varname_ )fcn_varname_ = new FCN_varname(); return fcn_varname_; } void TextArrayEval( int, std::vector &, std::vector & ) const {} private: FCN_varname() : FunctionDefinition( wxT("VARNAME"), 1, 2, MIXED2CHAR, CHARACTER ) {} static FCN_varname *fcn_varname_; }; #endif extrema-4.4.5/src/Functions/FCN_var.h0000644012702201742730000000222211274636611016402 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_VAR #define FCN_VAR #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_var : public ArrayFunction { public: static FCN_var *Instance() { if( !fcn_var_ )fcn_var_ = new FCN_var(); return fcn_var_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_var() : ArrayFunction( wxT("VAR"), 1, 2 ) {} static FCN_var *fcn_var_; }; #endif extrema-4.4.5/src/Functions/FCN_rms.cpp0000644012702201742730000001101011274636611016741 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_rms.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_rms *FCN_rms::fcn_rms_ = 0; void FCN_rms::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_rms::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("RMS: argument must be a vector") ); else throw EExpressionError( wxT("RMS: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("RMS: argument workspace is empty") ); else throw EExpressionError( wxT("RMS: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("RMS: argument must be a vector") ); else throw EExpressionError( wxT("RMS: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("RMS: argument must be a vector") ); else throw EExpressionError( wxT("RMS: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("RMS: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("RMS: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("RMS: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("RMS: argument 2 must be a vector") ); } double wsum=0.0, rms=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("RMS: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; iSetValue( sqrt(rms/wsum) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_join.cpp0000644012702201742730000002056511274636611017116 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_join.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_join *FCN_join::fcn_join_ = 0; void FCN_join::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("JOIN: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; ++numberOfArguments_; if( numberOfArguments_==2 && ndmEff!=1 ) throw EExpressionError( wxT("JOIN: second argument must be a vector") ); } } void FCN_join::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1, d2; int order1=0, order2=0; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); if( nd.IsAscending() )order1 = -1; else if( nd.IsDescending() )order1 = 1; } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() )throw EExpressionError( wxT("JOIN: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); if( w1->IsAscending() )order1 = -1; else if( w1->IsDescending() )order1 = 1; } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); if( nd.IsAscending() )order2 = -1; else if( nd.IsDescending() )order2 = 1; } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("JOIN: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); if( w2->IsAscending() )order2 = -1; else if( w2->IsDescending() )order2 = 1; } std::size_t size2 = d2.size(); // std::size_t npt = std::max( size1, size2 ); std::vector work1(npt,0), work2(npt,0); // std::size_t ioff = 0; if( order1 == 0 ) // first not ordered { // if one is not ordered, cannot see how to allow duplicate entries if( order2 == -1 ) // second ascending { for( std::size_t k1=1; k1<=size1; ++k1 ) { double xk1 = d1[k1-1]; for( std::size_t k2=1; k2<=size2; ++k2 ) { double xk2 = d2[k2-1]; if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; break; } else if( xk1 < xk2 ) { break; } } } } else if( order2 == 1 ) // second descending { for( std::size_t k1=1; k1<=size1; ++k1 ) { double xk1 = d1[k1-1]; for( std::size_t k2=1; k2<=size2; ++k2 ) { double xk2 = d2[k2-1]; if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; break; } else if( xk1 > xk2 ) { break; } } } } else // second not ordered { for( std::size_t k1=1; k1<=size1; ++k1 ) { for( std::size_t k2=1; k2<=size2; ++k2 ) { if( d1[k1-1] == d2[k2-1] ) { ws->SetData( ioff++, d1[k1-1] ); work1[ioff-1] = k1; work2[ioff-1] = k2; break; } } } } } else if( order1 == -1 ) // first ascending order { if( order2 == -1 ) // second ascending { std::size_t k2 = 0; std::size_t k1 = 0; double xk1, xk2; L10: if( ++k2 > size2 )goto L12; xk2 = d2[k2-1]; L11: if( ++k1 > size1 )goto L12; xk1 = d1[k1-1]; if( xk1 < xk2 ) { goto L11; } else if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; if( k1 == size1 ) { --k1; } else { if( xk1 != d1[k1] )--k1; } goto L10; } else { --k1; goto L10; } L12: // result ascending ; } else if( order2 == 1 ) // second descending { std::size_t k2 = size2+1; std::size_t k1 = 0; double xk1, xk2; L13: if( --k2 < 1 )goto L15; xk2 = d2[k2-1]; L14: if( ++k1 > size1 )goto L15; xk1 = d1[k1-1]; if( xk1 < xk2 ) { goto L14; } else if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; if( k1 == size1 ) { --k1; } else { if( xk1 != d1[k1] )--k1; } goto L13; } else { --k1; goto L13; } L15: // result ascending ; } else // second not ordered { for( std::size_t k2=1; k2<=size2; ++k2 ) { double xk2 = d2[k2-1]; for( std::size_t k1=1; k1<=size1; ++k1 ) { double xk1 = d1[k1-1]; if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; break; } else if( xk1 > xk2 ) { break; } } } } } else if( order1 == 1 ) // first descending { if( order2 == -1 ) // second ascending { std::size_t k2 = 0; std::size_t k1 = size1 + 1; double xk1, xk2; L18: if( ++k2 > size2 )goto L20; xk2 = d2[k2-1]; L19: if( --k1 < 1 )goto L20; xk1 = d1[k1-1]; if( xk1 < xk2 ) { goto L19; } else if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; if( k1 == 1 ) { ++k1; } else { if( xk1 != d1[k1-2] )++k1; } goto L18; } else { ++k1; goto L18; } L20: ; } else if( order2 == 1 ) // second descending { std::size_t k2 = 0; std::size_t k1 = 0; double xk1, xk2; L21: if( ++k2 > size2 )goto L23; xk2 = d2[k2-1]; L22: if( ++k1 > size1 )goto L23; xk1 = d1[k1-1]; if( xk1 > xk2 ) { goto L22; } else if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; if( k1 == size1 ) { --k1; } else { if( xk1 != d1[k1] )--k1; } goto L21; } else { --k1; goto L21; } L23: ; } else // second not ordered { for( std::size_t k2=1; k2<=size2; ++k2 ) { double xk2 = d2[k2-1]; for( std::size_t k1=1; k1<=size1; ++k1 ) { double xk1 = d1[k1-1]; if( xk1 == xk2 ) { ws->SetData( ioff++, xk1 ); work1[ioff-1] = k1; work2[ioff-1] = k2; break; } else if( xk1 < xk2 ) { break; } } } } } for( std::size_t k1=1; k1<=ioff; ++k1 ) { ws->SetData( ioff+k1-1, static_cast(work1[k1-1]) ); ws->SetData( 2*ioff+k1-1, static_cast(work2[k1-1]) ); } ws->SetDimMag( 0, ioff ); ws->SetDimMag( 1, 3 ); ws->SetNumberOfDimensions(2); } // end of file extrema-4.4.5/src/Functions/FCN_join.h0000644012702201742730000000225211274636611016554 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_JOIN #define FCN_JOIN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_join : public ArrayFunction { public: static FCN_join *Instance() { if( !fcn_join_ )fcn_join_ = new FCN_join(); return fcn_join_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_join() : ArrayFunction( wxT("JOIN"), 2, 2, MIXED2NUM ) {} static FCN_join *fcn_join_; }; #endif extrema-4.4.5/src/Functions/FCN_bivarnor.h0000644012702201742730000000224411274636611017440 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BIVARNOR #define FCN_BIVARNOR #include "wx/wx.h" #include "ScalarFunction.h" class FCN_bivarnor : public ScalarFunction { public: static FCN_bivarnor *Instance() { if( !fcn_bivarnor_ )fcn_bivarnor_ = new FCN_bivarnor(); return fcn_bivarnor_; } void ScalarEval( int, std::vector & ) const; private: FCN_bivarnor() : ScalarFunction( wxT("BIVARNOR"), 3, 3 ) {} static FCN_bivarnor *fcn_bivarnor_; }; #endif extrema-4.4.5/src/Functions/FCN_gammatin.h0000644012702201742730000000224411274636611017413 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAMMATIN #define FCN_GAMMATIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gammatin : public ScalarFunction { public: static FCN_gammatin *Instance() { if( !fcn_gammatin_ )fcn_gammatin_ = new FCN_gammatin(); return fcn_gammatin_; } void ScalarEval( int, std::vector & ) const; private: FCN_gammatin() : ScalarFunction( wxT("GAMMATIN"), 2, 2 ) {} static FCN_gammatin *fcn_gammatin_; }; #endif extrema-4.4.5/src/Functions/FCN_pdiff.h0000644012702201742730000000220111274636611016677 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PDIFF #define FCN_PDIFF #include "wx/wx.h" #include "ScalarFunction.h" class FCN_pdiff : public ScalarFunction { public: static FCN_pdiff *Instance() { if( !fcn_pdiff_ )fcn_pdiff_ = new FCN_pdiff(); return fcn_pdiff_; } void ScalarEval( int, std::vector & ) const; private: FCN_pdiff() : ScalarFunction( wxT("PDIFF"), 2, 2 ) {} static FCN_pdiff *fcn_pdiff_; }; #endif extrema-4.4.5/src/Functions/FCN_sin.cpp0000644012702201742730000000161511274636611016743 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sin.h" FCN_sin *FCN_sin::fcn_sin_ = 0; void FCN_sin::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = sin( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_nint.h0000644012702201742730000000216011274636611016563 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_NINT #define FCN_NINT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_nint : public ScalarFunction { public: static FCN_nint *Instance() { if( !fcn_nint_ )fcn_nint_ = new FCN_nint(); return fcn_nint_; } void ScalarEval( int, std::vector & ) const; private: FCN_nint() : ScalarFunction( wxT("NINT") ) {} static FCN_nint *fcn_nint_; }; #endif extrema-4.4.5/src/Functions/FCN_biry.cpp0000644012702201742730000000202111274636611017107 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_biry.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_biry *FCN_biry::fcn_biry_ = 0; void FCN_biry::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Airy2( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_ei.h0000644012702201742730000000212611274636611016212 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EI #define FCN_EI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ei : public ScalarFunction { public: static FCN_ei *Instance() { if( !fcn_ei_ )fcn_ei_ = new FCN_ei(); return fcn_ei_; } void ScalarEval( int, std::vector & ) const; private: FCN_ei() : ScalarFunction( wxT("EI") ) {} static FCN_ei *fcn_ei_; }; #endif extrema-4.4.5/src/Functions/FCN_aerfc.cpp0000644012702201742730000000205311274636611017227 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_aerfc.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_aerfc *FCN_aerfc::fcn_aerfc_ = 0; void FCN_aerfc::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ComplementaryErrorInverse( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_clen.cpp0000644012702201742730000000254411274636611017075 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_clen.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_clen *FCN_clen::fcn_clen_ = 0; void FCN_clen::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } } void FCN_clen::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; if( !arg1->IsaTString() ) throw EExpressionError( wxT("argument of CLEN function must be character") ); ws->SetValue( arg1->GetTString().size() ); ws->SetNumberOfDimensions(0); } // end of file extrema-4.4.5/src/Functions/FCN_dawson.cpp0000644012702201742730000000204411274636611017442 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_dawson.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_dawson *FCN_dawson::fcn_dawson_ = 0; void FCN_dawson::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::DawsonIntegral( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_besk1.h0000644012702201742730000000217311274636611016624 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESK1 #define FCN_BESK1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besk1 : public ScalarFunction { public: static FCN_besk1 *Instance() { if( !fcn_besk1_ )fcn_besk1_ = new FCN_besk1(); return fcn_besk1_; } void ScalarEval( int, std::vector & ) const; private: FCN_besk1() : ScalarFunction( wxT("BESK1") ) {} static FCN_besk1 *fcn_besk1_; }; #endif extrema-4.4.5/src/Functions/FCN_ber.cpp0000644012702201742730000000201211274636611016712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ber.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_ber *FCN_ber::fcn_ber_ = 0; void FCN_ber::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Ber( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_gmean.cpp0000644012702201742730000001134511274636611017242 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_gmean.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_gmean *FCN_gmean::fcn_gmean_ = 0; void FCN_gmean::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_gmean::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("GMEAN: argument must be a vector") ); else throw EExpressionError( wxT("GMEAN: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("GMEAN: argument workspace is empty") ); else throw EExpressionError( wxT("GMEAN: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("GMEAN: argument must be a vector") ); else throw EExpressionError( wxT("GMEAN: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("GMEAN: argument must be a vector") ); else throw EExpressionError( wxT("GMEAN: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("GMEAN: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("GMEAN: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("GMEAN: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("GMEAN: argument 2 must be a vector") ); } double wsum=0.0, gmean=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("GMEAN: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; iSetValue( exp(gmean/wsum) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_bivarnor.cpp0000644012702201742730000000237311274636611017776 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_bivarnor.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_bivarnor *FCN_bivarnor::fcn_bivarnor_ = 0; void FCN_bivarnor::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BivariateNormalDistribution( rStack[j], rStack[j+1], rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_asin.h0000644012702201742730000000216011274636611016545 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ASIN #define FCN_ASIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_asin : public ScalarFunction { public: static FCN_asin *Instance() { if( !fcn_asin_ )fcn_asin_ = new FCN_asin(); return fcn_asin_; } void ScalarEval( int, std::vector & ) const; private: FCN_asin() : ScalarFunction( wxT("ASIN") ) {} static FCN_asin *fcn_asin_; }; #endif extrema-4.4.5/src/Functions/FCN_acotd.h0000644012702201742730000000217411274636611016712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACOTD #define FCN_ACOTD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acotd : public ScalarFunction { public: static FCN_acotd *Instance() { if( !fcn_acotd_ )fcn_acotd_ = new FCN_acotd(); return fcn_acotd_; } void ScalarEval( int, std::vector & ) const; private: FCN_acotd() : ScalarFunction( wxT("ACOTD") ) {} static FCN_acotd *fcn_acotd_; }; #endif extrema-4.4.5/src/Functions/FCN_deconvolute.cpp0000644012702201742730000001035411274636611020501 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_deconvolute.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_deconvolute *FCN_deconvolute::fcn_deconvolute_ = 0; void FCN_deconvolute::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 ) throw EExpressionError( wxT("DECONVOLUTE: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 1 ) throw EExpressionError( wxT("DECONVOLUTE: second argument must be a vector") ); numberOfArguments_ = 2; } } void FCN_deconvolute::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector x, b; std::size_t sizeX, sizeB; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); x.assign( nd.GetData().begin(), nd.GetData().end() ); sizeX = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("DECONVOLUTE: first argument workspace is empty") ); x.assign( w->GetData().begin(), w->GetData().end() ); sizeX = w->GetDimMag(0); } if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); b.assign( nd.GetData().begin(), nd.GetData().end() ); sizeB = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("DECONVOLUTE: first argument workspace is empty") ); b.assign( w->GetData().begin(), w->GetData().end() ); sizeB = w->GetDimMag(0); } // std::size_t nonZeroB = 0; double sumB = 0.0; for( std::size_t i=0; i= 0.00001 ) // The blurring function has not been normalised, so { // we now normalise it to unity for( std::size_t k=0; k work1( sizeX, 0.0 ); std::vector work2( sizeX, 0.0 ); // // Call the discrete fast fourier transform // try { UsefulFunctions::ComplexFourierTransform( x, work1, sizeX, sizeX, false ); UsefulFunctions::ComplexFourierTransform( b, work2, sizeX, sizeX, false ); } catch (EExpressionError &e) { throw; } for( std::size_t k=0; kSetData( x ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, sizeX ); } // end of file extrema-4.4.5/src/Functions/FCN_sum.cpp0000644012702201742730000000344511274636611016761 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_sum.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_sum *FCN_sum::fcn_sum_ = 0; void FCN_sum::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( ndmEff != 1 ) throw EExpressionError( wxT("SUM: argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } void FCN_sum::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg = codes[0]; std::vector d; if( arg->IsaNVariable() ) // arg is x { NumericData nd( arg->GetNVarPtr()->GetData() ); d.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("SUM: first argument workspace is empty") ); d.assign( w->GetData().begin(), w->GetData().end() ); } std::size_t size = d.size(); // double sum = 0.0; for( std::size_t i=0; iSetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); ws->SetValue( sum ); } // end of file extrema-4.4.5/src/Functions/FCN_pdiff.cpp0000644012702201742730000000165711274636611017250 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_pdiff.h" FCN_pdiff *FCN_pdiff::fcn_pdiff_ = 0; void FCN_pdiff::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = rStack[j]-std::min(rStack[j],rStack[j+1]); } // end of file extrema-4.4.5/src/Functions/FCN_identity.cpp0000644012702201742730000000404611274636611020004 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_identity.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_identity *FCN_identity::fcn_identity_ = 0; void FCN_identity::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 0 ) throw EExpressionError( wxT("IDENTITY: argument must be a scalar") ); numberOfArguments_ = 1; nLoop = 2; } } void FCN_identity::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; double value; if( arg1->IsaNVariable() ) value = arg1->GetNVarPtr()->GetData().GetScalarValue(); else if( arg1->IsaWorkspace() ) { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() )throw EExpressionError( wxT("IDENTITY: argument workspace is empty") ); value = w1->GetValue(); } else value = arg1->GetConstantValue(); // int n = static_cast(value); if( n < 2 )throw EExpressionError( wxT("IDENTITY: specified matrix dimension < 2") ); // std::vector d( n*n, 0.0 ); for( int j=0; jSetData( d ); ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, n ); ws->SetDimMag( 1, n ); } // end of file extrema-4.4.5/src/Functions/FCN_fft.cpp0000644012702201742730000000703411274636611016732 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_fft.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_fft *FCN_fft::fcn_fft_ = 0; void FCN_fft::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("FFT: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } } void FCN_fft::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = 0; if( codes.size() > 2 )arg2 = codes[1]; std::vector a; wxString s; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); a.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("FFT: first argument workspace is empty") ); a.assign( w->GetData().begin(), w->GetData().end() ); } if( !arg2 ) // arg2 is a string determining the type of fft { s = wxT("AMP&PHASE"); } else { if( arg2->IsaWorkspace() ) s = arg2->GetWorkspacePtr()->GetFinalString(); else if( arg2->IsaTString() ) s = arg2->GetTString(); else throw EExpressionError( wxT("FFT: second argument must be character") ); s.UpperCase(); if( s != wxT("AMP&PHASE") && s != wxT("COS&SIN") ) throw EExpressionError( wxT("FFT: second argument must be either AMP&PHASE or COS&SIN") ); } int nr = a.size(); int nr2 = nr/2; double deg2rad = M_PI/180.; std::vector b( nr, 0.0 ); try { UsefulFunctions::ComplexFourierTransform( a, b, nr, nr, false ); } catch (EExpressionError &e) { throw; } // // Construct the AMP&PHASE or the H and G coefficients of SIN&COS // ws->SetData( 0, 2.0*a[0]/nr ); ws->SetData( nr2+1, 0.0 ); double hamp, gamp; for( int k=2; k<=nr2; ++k ) { hamp = 2.0*a[k-1]/nr; gamp = 2.0*b[k-1]/nr; if( s == wxT("COS&SIN") ) { ws->SetData(k-1,hamp); ws->SetData(nr2+k,gamp); } else if( s == wxT("AMP&PHASE") ) { double amp = sqrt(hamp*hamp+gamp*gamp); double phase = 0.0; if( amp != 0.0 ) { phase = atan2(gamp,hamp)/deg2rad; if( phase < 0.0 )phase += 360.; } ws->SetData( k-1, amp ); ws->SetData( nr2+k, phase ); } } hamp = a[nr2]/nr; if( s == wxT("COS&SIN") ) { ws->SetData( nr2, hamp ); ws->SetData( nr+1, 0.0 ); } else if( s == wxT("AMP&PHASE") ) { double amp = fabs(hamp); double phase = 0.0; if( hamp < 0.0 )phase = 180.; ws->SetData( nr2, amp ); ws->SetData( nr+1, phase ); } ws->SetDimMag( 0, nr2+1 ); ws->SetDimMag( 1, 2 ); ws->SetNumberOfDimensions(2); } // end of file extrema-4.4.5/src/Functions/FCN_kei.h0000644012702201742730000000214211274636611016363 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_KEI #define FCN_KEI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_kei : public ScalarFunction { public: static FCN_kei *Instance() { if( !fcn_kei_ )fcn_kei_ = new FCN_kei(); return fcn_kei_; } void ScalarEval( int, std::vector & ) const; private: FCN_kei() : ScalarFunction( wxT("KEI") ) {} static FCN_kei *fcn_kei_; }; #endif extrema-4.4.5/src/Functions/FCN_gaussin.cpp0000644012702201742730000000204711274636611017623 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gaussin.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gaussin *FCN_gaussin::fcn_gaussin_ = 0; void FCN_gaussin::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::GaussInverse( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_convolute.h0000644012702201742730000000232411274636611017633 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CONVOLUTE #define FCN_CONVOLUTE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_convolute : public ArrayFunction { public: static FCN_convolute *Instance() { if( !fcn_convolute_ )fcn_convolute_ = new FCN_convolute(); return fcn_convolute_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_convolute() : ArrayFunction( wxT("CONVOLUTE"), 2, 2 ) {} static FCN_convolute *fcn_convolute_; }; #endif extrema-4.4.5/src/Functions/FCN_cos.h0000644012702201742730000000214511274636611016402 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COS #define FCN_COS #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cos : public ScalarFunction { public: static FCN_cos *Instance() { if( !fcn_cos_ )fcn_cos_ = new FCN_cos(); return fcn_cos_; } void ScalarEval( int, std::vector & ) const; private: FCN_cos() : ScalarFunction( wxT("COS") ) {} static FCN_cos *fcn_cos_; }; #endif extrema-4.4.5/src/Functions/FCN_heaviside.h0000644012702201742730000000225411274636611017560 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_HEAVISIDE #define FCN_HEAVISIDE #include "wx/wx.h" #include "ScalarFunction.h" class FCN_heaviside : public ScalarFunction { public: static FCN_heaviside *Instance() { if( !fcn_heaviside_ )fcn_heaviside_ = new FCN_heaviside(); return fcn_heaviside_; } void ScalarEval( int, std::vector & ) const; private: FCN_heaviside() : ScalarFunction( wxT("HEAVISIDE") ) {} static FCN_heaviside *fcn_heaviside_; }; #endif extrema-4.4.5/src/Functions/FCN_normal.h0000644012702201742730000000221411274636611017103 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_NORMAL #define FCN_NORMAL #include "wx/wx.h" #include "ScalarFunction.h" class FCN_normal : public ScalarFunction { public: static FCN_normal *Instance() { if( !fcn_normal_ )fcn_normal_ = new FCN_normal(); return fcn_normal_; } void ScalarEval( int, std::vector & ) const; private: FCN_normal() : ScalarFunction( wxT("NORMAL"), 3, 3 ) {} static FCN_normal *fcn_normal_; }; #endif extrema-4.4.5/src/Functions/FCN_tcase.cpp0000644012702201742730000000224111274636611017245 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_tcase.h" FCN_tcase *FCN_tcase::fcn_tcase_ = 0; void FCN_tcase::TextScalarEval( int j, std::vector &sStack ) const { std::size_t n = sStack[j].size(); for( std::size_t i=0; i(sStack[j][i]); if( j>64 && j<91 ) { sStack[j][i] = static_cast(j+32); } else if( j>96 && j<123 ) { sStack[j][i] = static_cast(j-32); } } } // end of file extrema-4.4.5/src/Functions/FCN_besj1.h0000644012702201742730000000217311274636611016623 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESJ1 #define FCN_BESJ1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besj1 : public ScalarFunction { public: static FCN_besj1 *Instance() { if( !fcn_besj1_ )fcn_besj1_ = new FCN_besj1(); return fcn_besj1_; } void ScalarEval( int, std::vector & ) const; private: FCN_besj1() : ScalarFunction( wxT("BESJ1") ) {} static FCN_besj1 *fcn_besj1_; }; #endif extrema-4.4.5/src/Functions/FCN_jahnuf.cpp0000644012702201742730000000245511274636611017430 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_jahnuf.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_jahnuf *FCN_jahnuf::fcn_jahnuf_ = 0; void FCN_jahnuf::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::JahnUFunction( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3], rStack[j+4], rStack[j+5] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_acsch.cpp0000644012702201742730000000213011274636611017224 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acsch.h" #include "EExpressionError.h" FCN_acsch *FCN_acsch::fcn_acsch_ = 0; void FCN_acsch::ScalarEval( int j, std::vector &rStack ) const { if( (-1.0<=rStack[j]) && (rStack[j]<=1.0) ) throw EExpressionError( wxT("ACSCH: argument must not be 0") ); rStack[j] = log( (1.0/rStack[j]) + sqrt((1.0/(rStack[j]*rStack[j])+1.0)) ); } extrema-4.4.5/src/Functions/FCN_median.h0000644012702201742730000000226611274636611017057 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_MEDIAN #define FCN_MEDIAN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_median : public ArrayFunction { public: static FCN_median *Instance() { if( !fcn_median_ )fcn_median_ = new FCN_median(); return fcn_median_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_median() : ArrayFunction( wxT("MEDIAN"), 1, 1 ) {} static FCN_median *fcn_median_; }; #endif extrema-4.4.5/src/Functions/FCN_binom.cpp0000644012702201742730000000220511274636611017252 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_binom.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_binom *FCN_binom::fcn_binom_ = 0; void FCN_binom::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j]); int m = static_cast(rStack[j+1]); try { rStack[j] = UsefulFunctions::BinomialCoefficient( n, m ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_log10.h0000644012702201742730000000217311274636611016541 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LOG10 #define FCN_LOG10 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_log10 : public ScalarFunction { public: static FCN_log10 *Instance() { if( !fcn_log10_ )fcn_log10_ = new FCN_log10(); return fcn_log10_; } void ScalarEval( int, std::vector & ) const; private: FCN_log10() : ScalarFunction( wxT("LOG10") ) {} static FCN_log10 *fcn_log10_; }; #endif extrema-4.4.5/src/Functions/FCN_coth.cpp0000644012702201742730000000201611274636611017103 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_coth.h" #include "EExpressionError.h" FCN_coth *FCN_coth::fcn_coth_ = 0; void FCN_coth::ScalarEval( int j, std::vector &rStack ) const { if( tanh(rStack[j]) == 0.0 )throw EExpressionError( wxT("COTH: tanh(argument) = 0") ); rStack[j] = 1./tanh(rStack[j]); } extrema-4.4.5/src/Functions/FCN_eqs.cpp0000644012702201742730000000300711274636611016737 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_eqs.h" #include "Workspace.h" #include "ExprCodes.h" #include "TextVariable.h" #include "EExpressionError.h" FCN_eqs *FCN_eqs::fcn_eqs_ = 0; void FCN_eqs::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { nLoop = 0; numberOfArguments_ = 1; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_eqs::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; if( !arg1->IsaTString() || !arg2->IsaTString() ) throw EExpressionError( wxT("both arguments of EQS function must be character") ); if( arg1->GetTString() == arg2->GetTString() ) ws->SetValue( 1.0 ); // true else ws->SetValue( 0.0 ); // false } // end of file extrema-4.4.5/src/Functions/ScalarFunction.h0000644012702201742730000000243211274636611020042 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SCALARFUNCTION #define FCN_SCALARFUNCTION #include "FunctionDefinition.h" class Workspace; class ScalarFunction : public FunctionDefinition { // A virtual class for scalar functions, i.e., // functions that take a single numeric argument // and return a single numeric result public: virtual ~ScalarFunction() {} virtual void CalcArgument( bool, int, int *, Workspace * ); protected: ScalarFunction( wxString const &, std::size_t =1, std::size_t =1, Type =NUM2NUMSCALAR, ArgType =NUMERIC, ArgType =NUMERIC ); }; #endif extrema-4.4.5/src/Functions/FCN_tan.cpp0000644012702201742730000000161511274636611016734 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_tan.h" FCN_tan *FCN_tan::fcn_tan_ = 0; void FCN_tan::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = tan( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_sum.h0000644012702201742730000000221511274636611016420 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SUM #define FCN_SUM #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_sum : public ArrayFunction { public: static FCN_sum *Instance() { if( !fcn_sum_ )fcn_sum_ = new FCN_sum(); return fcn_sum_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_sum() : ArrayFunction( wxT("SUM") ) {} static FCN_sum *fcn_sum_; }; #endif extrema-4.4.5/src/Functions/FCN_student.cpp0000644012702201742730000000224011274636611017633 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_student.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_student *FCN_student::fcn_student_ = 0; void FCN_student::ScalarEval( int const j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::StudentTDistribution( rStack[j], static_cast(rStack[j+1]) ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_atan2d.h0000644012702201742730000000221611274636611016766 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ATAN2D #define FCN_ATAN2D #include "wx/wx.h" #include "ScalarFunction.h" class FCN_atan2d : public ScalarFunction { public: static FCN_atan2d *Instance() { if( !fcn_atan2d_ )fcn_atan2d_ = new FCN_atan2d(); return fcn_atan2d_; } void ScalarEval( int, std::vector & ) const; private: FCN_atan2d() : ScalarFunction( wxT("ATAN2D"), 2, 2 ) {} static FCN_atan2d *fcn_atan2d_; }; #endif extrema-4.4.5/src/Functions/FCN_studenti.h0000644012702201742730000000224411274636611017455 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STUDENTI #define FCN_STUDENTI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_studenti : public ScalarFunction { public: static FCN_studenti *Instance() { if( !fcn_studenti_ )fcn_studenti_ = new FCN_studenti(); return fcn_studenti_; } void ScalarEval( int, std::vector & ) const; private: FCN_studenti() : ScalarFunction( wxT("STUDENTI"), 2, 2 ) {} static FCN_studenti *fcn_studenti_; }; #endif extrema-4.4.5/src/Functions/FCN_interpolate.cpp0000644012702201742730000001227111274636611020500 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "FCN_interpolate.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_interpolate *FCN_interpolate::fcn_interpolate_ = 0; void FCN_interpolate::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("INTERPOLATE: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; if( ++numberOfArguments_ == 2 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("INTERPOLATE: second argument must be a vector") ); } else if( numberOfArguments_ == 3 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("INTERPOLATE: third argument must be a vector") ); } } } void FCN_interpolate::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; ExprCodes *arg4 = 0; if( codes.size() > 4 )arg4 = codes[3]; std::vector d1, d2, d3; wxString s4; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() )throw EExpressionError( wxT("INTERPOLATE: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("INTERPOLATE: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("INTERPOLATE: vectors have different lengths") ); if( size1 < 2 ) throw EExpressionError( wxT("INTERPOLATE: independent vector length < 2") ); // if( arg3->IsaNVariable() ) // arg3 is xout { NumericData nd( arg3->GetNVarPtr()->GetData() ); d3.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w3 = arg3->GetWorkspacePtr(); if( w3->IsEmpty() ) throw EExpressionError( wxT("INTERPOLATE: third argument workspace is empty") ); d3.assign( w3->GetData().begin(), w3->GetData().end() ); } std::size_t size3 = d3.size(); // if( !arg4 ) // arg4 is a string determining the type of interpolation { s4 = wxT("SPLINE"); } else { if( arg4->IsaWorkspace() ) s4 = arg4->GetWorkspacePtr()->GetFinalString(); else if( arg4->IsaTString() ) s4 = arg4->GetTString(); else throw EExpressionError( wxT("INTERPOLATE: fourth argument must be character") ); s4.UpperCase(); } for( std::size_t i=1; i::epsilon() ) throw EExpressionError( wxT("INTERPOLATE: independent vector must be strictly monotonically increasing") ); } if( s4 == wxT("LINEAR") ) { for( std::size_t i=1; i::epsilon() ) throw EExpressionError( wxT("INTERPOLATE: output independent vector must be strictly monotonically increasing") ); } } else { if( s4 == wxT("FC") && size1<3 ) throw EExpressionError( wxT("INTERPOLATE: independent vector length < 3") ); for( std::size_t i=1; i yy( size3, 0.0 ); if( s4 == wxT("SPLINE") ) { UsefulFunctions::SplineInterpolate( d1, d2, d3, yy ); } else if( s4 == wxT("FC") ) { UsefulFunctions::FritchCarlsonInterpolate( d1, d2, d3, yy, 0 ); } else if( s4 == wxT("LINEAR") ) { UsefulFunctions::LinearInterpolate( d1, d2, d3, yy ); } else if( s4 == wxT("LAGRANGE") ) { UsefulFunctions::LagrangeInterpolate( d1, d2, d3, yy ); } else throw EExpressionError( wxT("INTERPOLATE: invalid fourth parameter") ); // ws->SetDimMag( 0, yy.size() ); ws->SetNumberOfDimensions(1); ws->SetData( yy ); } // end of file extrema-4.4.5/src/Functions/FCN_acsc.cpp0000644012702201742730000000200211274636611017052 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acsc.h" #include "EExpressionError.h" FCN_acsc *FCN_acsc::fcn_acsc_ = 0; void FCN_acsc::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] == 0.0 )throw EExpressionError(wxT("ACSC: argument = 0")); rStack[j] = asin( 1.0/rStack[j] ); } extrema-4.4.5/src/Functions/FCN_struve0.cpp0000644012702201742730000000204211274636611017555 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_struve0.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_struve0 *FCN_struve0::fcn_struve0_ = 0; void FCN_struve0::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Struve0( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_poica.cpp0000644012702201742730000000237011274636611017244 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_poica.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_poica *FCN_poica::fcn_poica_ = 0; void FCN_poica::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::PoissonCharlierPolynomial( rStack[j], static_cast(rStack[j+1]), rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_var.cpp0000644012702201742730000001116111274636611016737 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_var.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_var *FCN_var::fcn_var_ = 0; void FCN_var::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_var::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("VAR: argument must be a vector") ); else throw EExpressionError( wxT("VAR: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("VAR: argument workspace is empty") ); else throw EExpressionError( wxT("VAR: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("VAR: argument must be a vector") ); else throw EExpressionError( wxT("VAR: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("VAR: argument must be a vector") ); else throw EExpressionError( wxT("VAR: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("VAR: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("VAR: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("VAR: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("VAR: argument 2 must be a vector") ); } double wsum=0.0, xsum=0.0, var=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("VAR: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; iSetValue( var*size1/(size1-1.0)/wsum ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_gamma.cpp0000644012702201742730000000203611274636611017232 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gamma.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gamma *FCN_gamma::fcn_gamma_ = 0; void FCN_gamma::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::CompleteGamma( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_gammain.h0000644012702201742730000000223011274636611017222 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAMMAIN #define FCN_GAMMAIN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gammain : public ScalarFunction { public: static FCN_gammain *Instance() { if( !fcn_gammain_ )fcn_gammain_ = new FCN_gammain(); return fcn_gammain_; } void ScalarEval( int, std::vector & ) const; private: FCN_gammain() : ScalarFunction( wxT("GAMMAIN"), 2, 2 ) {} static FCN_gammain *fcn_gammain_; }; #endif extrema-4.4.5/src/Functions/FCN_einellic.h0000644012702201742730000000224411274636611017402 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EINELLIC #define FCN_EINELLIC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_einellic : public ScalarFunction { public: static FCN_einellic *Instance() { if( !fcn_einellic_ )fcn_einellic_ = new FCN_einellic(); return fcn_einellic_; } void ScalarEval( int, std::vector & ) const; private: FCN_einellic() : ScalarFunction( wxT("EINELLIC"), 2, 2 ) {} static FCN_einellic *fcn_einellic_; }; #endif extrema-4.4.5/src/Functions/FCN_lcase.h0000644012702201742730000000231611274636611016705 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LCASE #define FCN_LCASE #include "wx/wx.h" #include "FunctionDefinition.h" class FCN_lcase : public FunctionDefinition { public: static FCN_lcase *Instance() { if( !fcn_lcase_ )fcn_lcase_ = new FCN_lcase(); return fcn_lcase_; } void TextScalarEval( int j, std::vector &sStack ) const { sStack[j].LowerCase(); } private: FCN_lcase() : FunctionDefinition( wxT("LCASE"), 1, 1, CHAR2CHAR, CHARACTER ) {} static FCN_lcase *fcn_lcase_; }; #endif extrema-4.4.5/src/Functions/FCN_prob.h0000644012702201742730000000216411274636611016561 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PROB #define FCN_PROB #include "wx/wx.h" #include "ScalarFunction.h" class FCN_prob : public ScalarFunction { public: static FCN_prob *Instance() { if( !fcn_prob_ )fcn_prob_ = new FCN_prob(); return fcn_prob_; } void ScalarEval( int, std::vector & ) const; private: FCN_prob() : ScalarFunction( wxT("PROB"), 2, 2 ) {} static FCN_prob *fcn_prob_; }; #endif extrema-4.4.5/src/Functions/ArrayFunction.h0000644012702201742730000000452211274636611017715 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ARRAYFUNCTION #define FCN_ARRAYFUNCTION #include "wx/wx.h" #include "FunctionDefinition.h" class Workspace; class ArrayFunction : public FunctionDefinition { // A virtual class for array functions public: virtual ~ArrayFunction() {} virtual void ProcessArgument( bool, int, int & ) {} virtual void ArrayEval( Workspace * ) {} protected: ArrayFunction( wxString const &name, std::size_t minArg=1, std::size_t maxArg=1, Type fcnType=NUM2NUMVECTOR, ArgType argType1=NUMERIC, ArgType argType2=NUMERIC, ArgType argType3=NUMERIC, ArgType argType4=NUMERIC, ArgType argType5=NUMERIC, ArgType argType6=NUMERIC, ArgType argType7=NUMERIC, ArgType argType8=NUMERIC, ArgType argType9=NUMERIC, ArgType argType10=NUMERIC, ArgType argType11=NUMERIC, ArgType argType12=NUMERIC, ArgType argType13=NUMERIC, ArgType argType14=NUMERIC, ArgType argType15=NUMERIC, ArgType argType16=NUMERIC, ArgType argType17=NUMERIC, ArgType argType18=NUMERIC, ArgType argType19=NUMERIC, ArgType argType20=NUMERIC ) : FunctionDefinition( name, minArg, maxArg, fcnType, argType1, argType2, argType3, argType4, argType5, argType6, argType7, argType8, argType9, argType10, argType11, argType12, argType13, argType14, argType15, argType16, argType17, argType18, argType19, argType20 ) {} int numberOfArguments_; }; #endif extrema-4.4.5/src/Functions/FCN_step.cpp0000644012702201742730000001200611274636611017121 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_step.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_step *FCN_step::fcn_step_ = 0; void FCN_step::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 && ndmEff!=2 ) throw EExpressionError( wxT("first argument of STEP function must be a vector or matrix") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 0 ) throw EExpressionError( wxT("second argument of STEP function must be a scalar") ); numberOfArguments_ = 2; } } void FCN_step::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1; std::size_t size1[2]; std::size_t ndm1; double step; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( std::size_t i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("STEP: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( std::size_t i=0; iGetDimMag(i); } if( arg2->IsaNVariable() ) { step = arg2->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg2->IsaWorkspace() ) { step = arg2->GetWorkspacePtr()->GetValue(); } else { step = arg2->GetConstantValue(); } if( step == 0.0 ) { if( ndm1 == 1 ) { for( std::size_t i=0; iSetData( i, d1[i] ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, size1[0] ); } else if( ndm1 == 2 ) { for( std::size_t i=0; iSetData( i, d1[i] ); ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, size1[0] ); ws->SetDimMag( 1, size1[1] ); } } else { int istep = static_cast( fabs(step) ); double frac = fabs(step) - static_cast(istep); double cfrac = 1.0 - frac; int tmp = static_cast(size1[0])-istep-1; std::size_t nshift = 0; if( tmp > 0 )nshift = static_cast(tmp); if( ndm1 == 1 ) // vector { for( std::size_t i=1; i<=nshift; ++i ) { std::size_t j0, j1, j2; if( step < 0.0 ) { j0 = i; j1 = i + istep; j2 = j1 + 1; } else { j0 = size1[0] - i + 1; j1 = j0 - istep; j2 = j1 - 1; } ws->SetData( j0-1, cfrac*d1[j1-1]+frac*d1[j2-1] ); } std::size_t nleft = size1[0] - nshift; for( std::size_t i=1; i<=nleft; ++i ) { std::size_t j0, j1; if( step < 0.0 ) { j0 = nshift + i; j1 = size1[0]; } else { j0 = nleft - i + 1; j1 = 1; } ws->SetData( j0-1, d1[j1-1] ); } } else // matrix { for( std::size_t j=1; j<=size1[1]; ++j ) { for( std::size_t i=1; i<=nshift; ++i ) { std::size_t j0, j1, j2; if( step < 0.0 ) { j0 = i; j1 = i + istep; j2 = j1 + 1; } else { j0 = size1[0] - i + 1; j1 = j0 - istep; j2 = j1 - 1; } ws->SetData( j0-1+(j-1)*size1[0], cfrac*d1[j1-1+(j-1)*size1[0]]+frac*d1[j2-1+(j-1)*size1[0]] ); } } std::size_t nleft = size1[0] - nshift; for( std::size_t j=1; j<=size1[1]; ++j ) { for( std::size_t i=1; i<=nleft; ++i ) { std::size_t j0, j1; if( step < 0.0 ) { j0 = nshift + i; j1 = size1[0]; } else { j0 = nleft - i + 1; j1 = 1; } ws->SetData( j0-1+(j-1)*size1[0], d1[j1-1+(j-1)*size1[0]] ); } } } } ws->SetNumberOfDimensions(ndm1); ws->SetDimMag( 0, size1[0] ); if( ndm1 > 1 )ws->SetDimMag( 1, size1[1] ); } // end of file extrema-4.4.5/src/Functions/FCN_area.cpp0000644012702201742730000000535311274636611017065 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_area.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_area *FCN_area::fcn_area_ = 0; void FCN_area::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 )throw EExpressionError(wxT("AREA: first argument must be a vector")); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; ++numberOfArguments_; if( numberOfArguments_==2 && ndmEff!=1 ) throw EExpressionError(wxT("AREA: second argument must be a vector")); } } void FCN_area::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1, d2; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("AREA: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("AREA: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("AREA: vectors have different lengths") ); if( size1 < 2 )throw EExpressionError( wxT("AREA: vector length < 2") ); // double temp = d1[size1-1]*d2[0]-d1[0]*d2[size1-1]; for( std::size_t k1=1; k1SetValue( 0.5*fabs(temp) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_bivsmooth.cpp0000644012702201742730000001302711274636611020164 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_bivsmooth.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_bivariateSmooth *FCN_bivariateSmooth::fcn_bivariateSmooth_ = 0; void FCN_bivariateSmooth::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("BIVSMOOTH: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 2; } else { nLoop = ndmEff; switch ( ++numberOfArguments_ ) { case 2: if( ndmEff != 1 ) throw EExpressionError( wxT("BIVSMOOTH: second argument must be a vector") ); break; case 3: if( ndmEff != 2 ) throw EExpressionError( wxT("BIVSMOOTH: third argument must be a matrix") ); break; case 4: if( ndmEff != 0 ) throw EExpressionError( wxT("BIVSMOOTH: fourth argument must be a scalar") ); break; case 5: if( ndmEff != 0 ) throw EExpressionError( wxT("BIVSMOOTH: fifth argument must be a scalar") ); break; } } } void FCN_bivariateSmooth::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; ExprCodes *arg4 = codes[3]; ExprCodes *arg5 = codes[4]; std::vector d1, d2, d3; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVSMOOTH: first argument workspace is empty") ); d1.assign( w->GetData().begin(), w->GetData().end() ); } int size1 = d1.size(); if( size1 < 2 ) throw EExpressionError( wxT(" wxT(BIVSMOOTH: independent vector length < 2") ); // if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVSMOOTH: second argument workspace is empty") ); d2.assign( w->GetData().begin(), w->GetData().end() ); } int size2 = d2.size(); if( size2 < 2 ) throw EExpressionError( wxT("BIVSMOOTH: dependent vector length < 2") ); // int size3a[2]; if( arg3->IsaNVariable() ) { NumericData nd( arg3->GetNVarPtr()->GetData() ); d3.assign( nd.GetData().begin(), nd.GetData().end() ); size3a[0] = nd.GetDimMag(0); size3a[1] = nd.GetDimMag(1); } else { Workspace *w = arg3->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVSMOOTH: input matrix argument workspace is empty") ); d3.assign( w->GetData().begin(), w->GetData().end() ); size3a[0] = w->GetDimMag(0); size3a[1] = w->GetDimMag(1); } if( size3a[0] != size2 ) throw EExpressionError( wxT("BIVSMOOTH: #rows of input matrix must = dependent vector length") ); if( size3a[1] != size1 ) throw EExpressionError( wxT("BIVSMOOTH: #columns of input matrix must = independent vector length") ); // double value4, value5; if( arg4->IsaNVariable() ) { value4 = arg4->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg4->IsaWorkspace() ) { Workspace *w = arg4->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVSMOOTH: fourth argument workspace is empty") ); value4 = w->GetValue(); } else value4 = arg4->GetConstantValue(); // if( arg5->IsaNVariable() ) { value5 = arg5->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg5->IsaWorkspace() ) { Workspace *w = arg5->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("BIVSMOOTH: fifth argument workspace is empty") ); value5 = w->GetValue(); } else value5 = arg5->GetConstantValue(); // int mx = static_cast(value4+0.5); int my = static_cast(value5+0.5); int uLen = mx*(size1-1)+1; int vLen = my*(size2-1)+1; // std::vector u( uLen, 0.0 ); std::vector v( vLen, 0.0 ); std::vector w( uLen*vLen, 0.0 ); try { UsefulFunctions::BivariateSmoothing( d1, d2, d3, mx, my, u, v, w ); } catch ( std::runtime_error &e ) { throw EExpressionError( wxString(wxT("BIVSMOOTH: "))+wxString(e.what(),wxConvUTF8) ); } std::vector ww( (uLen+1)*(vLen+1), 0.0 ); for( int i=0; iSetNumberOfDimensions( 2 ); ws->SetDimMag( 0, vLen+1 ); ws->SetDimMag( 1, uLen+1 ); ws->SetData( ww ); } // end of file extrema-4.4.5/src/Functions/FunctionDefinition.h0000644012702201742730000000701511274636611020727 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FUNCTIONDEFINITION #define FCN_FUNCTIONDEFINITION #include #include "wx/wx.h" class Workspace; class FunctionDefinition { protected: enum Type { NULLF, NUM2NUMSCALAR, NUM2NUMVECTOR, MIXED2NUM, MIXED2CHAR, CHAR2CHAR }; enum ArgType { NUMERIC, CHARACTER }; FunctionDefinition( wxString const &, std::size_t =1, std::size_t =1, Type =NUM2NUMSCALAR, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC, ArgType =NUMERIC ); public: virtual ~FunctionDefinition() {} bool operator==( FunctionDefinition const &rhs ) const { return (name_ == rhs.name_); } bool operator!=( FunctionDefinition const &rhs ) const { return (name_ != rhs.name_); } wxString Name() const { return name_; } void SetArgumentCounter( int i ) { argumentCounter_ = i; } int GetArgumentCounter() const { return argumentCounter_; } std::size_t GetMinNumberOfArguments() const { return minimumNumberOfArguments_; } std::size_t GetMaxNumberOfArguments() const { return maximumNumberOfArguments_; } bool IsNull() const { return (type_==NULLF); } bool IsNum2NumScalar() const { return (type_==NUM2NUMSCALAR); } bool IsNum2NumVector() const { return (type_==NUM2NUMVECTOR); } bool IsMixed2Num() const { return (type_==MIXED2NUM); } bool IsMixed2Char() const { return (type_==MIXED2CHAR); } bool IsChar2Char() const { return (type_==CHAR2CHAR); } bool ArgTypeIsNumeric( int i ) const { return (argumentType_[i]==NUMERIC); } bool ArgTypeIsCharacter( int i ) const { return (argumentType_[i]==CHARACTER); } virtual void ScalarEval( int, std::vector & ) const {} virtual void TextScalarEval( int, std::vector & ) const {} virtual void TextArrayEval( int, std::vector &, std::vector & ) const {} virtual void ProcessArgument( bool, int, int & ) {} virtual void CalcArgument( bool, int, int *, Workspace * ) {} virtual void ArrayEval( Workspace * ) {} private: // // cannot call default constructor, the copy constructor, or operator= // FunctionDefinition() {} FunctionDefinition( FunctionDefinition const & ) {} FunctionDefinition const &operator=( FunctionDefinition const & ) { return *this; } wxString name_; int argumentCounter_; std::size_t minimumNumberOfArguments_; std::size_t maximumNumberOfArguments_; Type type_; ArgType argumentType_[20]; }; #endif extrema-4.4.5/src/Functions/FCN_acotd.cpp0000644012702201742730000000164611274636611017250 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acotd.h" FCN_acotd *FCN_acotd::fcn_acotd_ = 0; void FCN_acotd::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = atan( 1.0/rStack[j] )*180./M_PI; } extrema-4.4.5/src/Functions/FCN_nint.cpp0000644012702201742730000000202011274636611017111 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_nint.h" FCN_nint *FCN_nint::fcn_nint_ = 0; void FCN_nint::ScalarEval( int j, std::vector &rStack ) const { rStack[j]>=0.0 ? rStack[j] = static_cast(static_cast(rStack[j]+0.49999)) : rStack[j] = static_cast(static_cast(rStack[j]-0.49999)); } extrema-4.4.5/src/Functions/FCN_rprod.h0000644012702201742730000000224511274636611016745 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RPROD #define FCN_RPROD #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_rprod : public ArrayFunction { public: static FCN_rprod *Instance() { if( !fcn_rprod_ )fcn_rprod_ = new FCN_rprod(); return fcn_rprod_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_rprod() : ArrayFunction( wxT("RPROD") ) {} static FCN_rprod *fcn_rprod_; }; #endif extrema-4.4.5/src/Functions/FCN_kurt.h0000644012702201742730000000223611274636611016604 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_KURT #define FCN_KURT #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_kurt : public ArrayFunction { public: static FCN_kurt *Instance() { if( !fcn_kurt_ )fcn_kurt_ = new FCN_kurt(); return fcn_kurt_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_kurt() : ArrayFunction( wxT("KURT"), 1, 2 ) {} static FCN_kurt *fcn_kurt_; }; #endif extrema-4.4.5/src/Functions/FCN_asinh.h0000644012702201742730000000217511274636611016723 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ASINH #define FCN_ASINH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_asinh : public ScalarFunction { public: static FCN_asinh *Instance() { if( !fcn_asinh_ )fcn_asinh_ = new FCN_asinh(); return fcn_asinh_; } void ScalarEval( int, std::vector & ) const; private: FCN_asinh() : ScalarFunction( wxT("ASINH") ) {} static FCN_asinh *fcn_asinh_; }; #endif extrema-4.4.5/src/Functions/FCN_struve0.h0000644012702201742730000000222411274636611017224 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STRUVE0 #define FCN_STRUVE0 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_struve0 : public ScalarFunction { public: static FCN_struve0 *Instance() { if( !fcn_struve0_ )fcn_struve0_ = new FCN_struve0(); return fcn_struve0_; } void ScalarEval( int, std::vector & ) const; private: FCN_struve0() : ScalarFunction( wxT("STRUVE0") ) {} static FCN_struve0 *fcn_struve0_; }; #endif extrema-4.4.5/src/Functions/FCN_acosh.h0000644012702201742730000000217511274636611016716 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACOSH #define FCN_ACOSH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acosh : public ScalarFunction { public: static FCN_acosh *Instance() { if( !fcn_acosh_ )fcn_acosh_ = new FCN_acosh(); return fcn_acosh_; } void ScalarEval( int, std::vector & ) const; private: FCN_acosh() : ScalarFunction( wxT("ACOSH") ) {} static FCN_acosh *fcn_acosh_; }; #endif extrema-4.4.5/src/Functions/FCN_stdev.cpp0000644012702201742730000001134711274636611017302 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_stdev.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_stdev *FCN_stdev::fcn_stdev_ = 0; void FCN_stdev::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 0; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_stdev::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0], *arg2=0; std::vector d1, d2; int ndm1, ndm2, size1, size2; // // if there are 2 arguements, the first is the weights vector and // the second is the data vector // if there is 1 argument, the weights are all 1.0 and the // argument is the data vector // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("STDEV: argument must be a vector") ); else throw EExpressionError( wxT("STDEV: argument 1 must be a vector") ); } d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("STDEV: argument workspace is empty") ); else throw EExpressionError( wxT("STDEV: argument 1 workspace is empty") ); } ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("STDEV: argument must be a vector") ); else throw EExpressionError( wxT("STDEV: argument 1 must be a vector") ); } d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // first argument must be a constant { if( numberOfArguments_ == 1 ) throw EExpressionError( wxT("STDEV: argument must be a vector") ); else throw EExpressionError( wxT("STDEV: argument 1 must be a vector") ); } // if( numberOfArguments_ == 2 ) { arg2 = codes[1]; if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); ndm2 = nd.GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("STDEV: argument 2 must be a vector") ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); size2 = d2.size(); } else if( arg2->IsaWorkspace() ) { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("STDEV: argument 2 workspace is empty") ); ndm2 = w->GetNumberOfDimensions(); if( ndm2 != 1 ) throw EExpressionError( wxT("STDEV: argument 2 must be a vector") ); d2.assign( w->GetData().begin(), w->GetData().end() ); size2 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("STDEV: argument 2 must be a vector") ); } double wsum=0.0, xsum=0.0, var=0.0, stdev=0.0; if( numberOfArguments_ == 2 ) { // the first argument is the weights vector // the second argument is the data vector // if( size1 != size2 ) throw EExpressionError( wxT("STDEV: arguments must have the same length") ); for( int i=0; i(size1); for( int i=0; i= 0.0 )stdev = sqrt(var); ws->SetValue( stdev ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_sign.cpp0000644012702201742730000000174111274636611017112 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sign.h" FCN_sign *FCN_sign::fcn_sign_ = 0; void FCN_sign::ScalarEval( int j, std::vector &rStack ) const { double d = 1.0; if( rStack[j+1] < 0.0 )d = -1; rStack[j] = fabs(rStack[j])*d; rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_integral.cpp0000644012702201742730000000727211274636611017764 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_integral.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_integral *FCN_integral::fcn_integral_ = 0; void FCN_integral::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("INTEGRAL: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; ++numberOfArguments_; if( numberOfArguments_==2 && ndmEff!=1 ) throw EExpressionError( wxT("INTEGRAL: second argument must be a vector") ); } } void FCN_integral::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = NULL; if( codes.size() > 3 )arg3 = codes[2]; std::vector d1, d2; wxString s3; if( arg1->IsaNVariable() ) // arg1 is x { NumericData &nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("INTEGRAL: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData &nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() )throw EExpressionError( wxT("INTEGRAL: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("INTEGRAL: vectors have different lengths") ); if( size1 < 2 ) throw EExpressionError( wxT("INTEGRAL: independent vector length < 2") ); // if( !arg3 ) // arg3 is a string determining the type of integration { s3 = wxT("SMOOTH"); } else { if( arg3->IsaWorkspace() ) s3 = arg3->GetWorkspacePtr()->GetFinalString(); else if( arg3->IsaTString() ) s3 = arg3->GetTString(); else throw EExpressionError( wxT("INTEGRAL: third argument must be character") ); s3.UpperCase(); } std::vector yy( size1, 0.0 ); if( s3 == wxT("SMOOTH") ) { for( std::size_t i=1; iSetDimMag( 0, yy.size() ); ws->SetNumberOfDimensions(1); ws->SetData( yy ); } // end of file extrema-4.4.5/src/Functions/FCN_acscd.h0000644012702201742730000000217411274636611016675 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACSCD #define FCN_ACSCD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acscd : public ScalarFunction { public: static FCN_acscd *Instance() { if( !fcn_acscd_ )fcn_acscd_ = new FCN_acscd(); return fcn_acscd_; } void ScalarEval( int, std::vector & ) const; private: FCN_acscd() : ScalarFunction( wxT("ACSCD") ) {} static FCN_acscd *fcn_acscd_; }; #endif extrema-4.4.5/src/Functions/FCN_jahnuf.h0000644012702201742730000000221411274636611017066 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_JAHNUF #define FCN_JAHNUF #include "wx/wx.h" #include "ScalarFunction.h" class FCN_jahnuf : public ScalarFunction { public: static FCN_jahnuf *Instance() { if( !fcn_jahnuf_ )fcn_jahnuf_ = new FCN_jahnuf(); return fcn_jahnuf_; } void ScalarEval( int, std::vector & ) const; private: FCN_jahnuf() : ScalarFunction( wxT("JAHNUF"), 6, 6 ) {} static FCN_jahnuf *fcn_jahnuf_; }; #endif extrema-4.4.5/src/Functions/FCN_convolute.cpp0000644012702201742730000001065511274636611020174 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_convolute.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_convolute *FCN_convolute::fcn_convolute_; void FCN_convolute::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 ) throw EExpressionError( wxT("CONVOLUTE: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 1 ) throw EExpressionError( wxT("CONVOLUTE: second argument must be a vector") ); numberOfArguments_ = 2; } } void FCN_convolute::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector x, b; std::size_t sizeX, sizeB; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); x.assign( nd.GetData().begin(), nd.GetData().end() ); sizeX = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("CONVOLUTE: first argument workspace is empty") ); x.assign( w->GetData().begin(), w->GetData().end() ); sizeX = w->GetDimMag(0); } if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); b.assign( nd.GetData().begin(), nd.GetData().end() ); sizeB = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w = arg2->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("CONVOLUTE: first argument workspace is empty") ); b.assign( w->GetData().begin(), w->GetData().end() ); sizeB = w->GetDimMag(0); } // bool even = false; if( sizeB/2*2 == sizeB ) { even = true; if( sizeX != sizeB ) throw EExpressionError( wxT("CONVOLUTE: vector argument lengths must be equal") ); } double sumB = 0.0; for( std::size_t i=0; i= 0.00001 ) // The blurring function has not been normalised, so { // we now normalise it to unity for( std::size_t k=0; k work1( sizeX, 0.0 ); std::vector work2( sizeX, 0.0 ); // // Call the discrete fast fourier transform // try { UsefulFunctions::ComplexFourierTransform( x, work1, sizeX, sizeX, false ); UsefulFunctions::ComplexFourierTransform( b, work2, sizeX, sizeX, false ); } catch (EExpressionError &e) { throw; } for( std::size_t k=0; kSetData( k, x[k]/sizeX ); } else // The blurring function array is assumed to contain an odd number of points, { // with the centre point taken to be the central point of the convolution for( std::size_t k=1; k<=sizeX; ++k ) { double sumX = 0.0; for( std::size_t j=1; j<=sizeB; ++j ) { std::size_t i = k-sizeB+sizeB/2+j; if( i>=1 && i<=sizeX )sumX += x[i-1]*b[sizeB-j]; } ws->SetData( k-1, sumX ); } } ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, sizeX ); } // end of file extrema-4.4.5/src/Functions/FCN_rprod.cpp0000644012702201742730000000356011274636611017301 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_rprod.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_rprod *FCN_rprod::fcn_rprod_ = 0; void FCN_rprod::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( ndmEff != 1 ) throw EExpressionError( wxT("RPROD: argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } void FCN_rprod::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg = codes[0]; std::vector d; if( arg->IsaNVariable() ) // arg is x { NumericData nd( arg->GetNVarPtr()->GetData() ); d.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("RPROD: first argument workspace is empty") ); d.assign( w->GetData().begin(), w->GetData().end() ); } std::size_t size = d.size(); // std::vector rprod( size, 0.0 ); rprod[0] = d[0]; for( std::size_t i=1; iSetNumberOfDimensions(1); ws->SetDimMag( 0, size ); ws->SetData( rprod ); } // end of file extrema-4.4.5/src/Functions/FCN_null.h0000644012702201742730000000217011274636611016566 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_NULL #define FCN_NULL #include "wx/wx.h" #include "ScalarFunction.h" class FCN_null : public ScalarFunction { public: static FCN_null *Instance() { if( !fcn_null_ )fcn_null_ = new FCN_null(); return fcn_null_; } void ScalarEval( int, std::vector & ) const {} private: FCN_null() : ScalarFunction( wxT("NULLFUNC") ) {} static FCN_null *fcn_null_; }; #endif extrema-4.4.5/src/Functions/FCN_frec2.cpp0000644012702201742730000000204411274636611017150 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_frec2.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_frec2 *FCN_frec2::fcn_frec2_ = 0; void FCN_frec2::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::FresnelCAssociated( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_min.h0000644012702201742730000000222411274636611016377 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_MIN #define FCN_MIN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_min : public ArrayFunction { public: static FCN_min *Instance() { if( !fcn_min_ )fcn_min_ = new FCN_min(); return fcn_min_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_min() : ArrayFunction( wxT("MIN"), 1, 20 ) {} static FCN_min *fcn_min_; }; #endif extrema-4.4.5/src/Functions/FCN_smooth.cpp0000644012702201742730000001146611274636611017470 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_smooth.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_smooth *FCN_smooth::fcn_smooth_ = 0; void FCN_smooth::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("SMOOTH: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; switch (++numberOfArguments_) { case 2: if( ndmEff != 1 ) throw EExpressionError( wxT("SMOOTH: second argument must be a vector") ); break; case 3: if( ndmEff != 1 ) throw EExpressionError( wxT("SMOOTH: third argument must be a vector") ); break; case 4: if( ndmEff != 1 ) throw EExpressionError( wxT("SMOOTH: fourth argument must be a vector") ); break; } } } void FCN_smooth::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; std::vector d1, d2, d3; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("SMOOTH: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("SMOOTH: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("SMOOTH: vectors have different lengths") ); if( size1 < 2 ) throw EExpressionError( wxT("SMOOTH: independent vector length < 2") ); // if( arg3->IsaNVariable() ) // arg3 is xout { NumericData nd( arg3->GetNVarPtr()->GetData() ); d3.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w3 = arg3->GetWorkspacePtr(); if( w3->IsEmpty() ) throw EExpressionError( wxT("SMOOTH: third argument workspace is empty") ); d3.assign( w3->GetData().begin(), w3->GetData().end() ); } std::size_t size3 = d3.size(); // for( std::size_t i=1; id1[size1-1] ) throw EExpressionError( wxT("SMOOTH: output independent vector has values outside range of input independent vector") ); // std::vector d4; if( numberOfArguments_ == 4 ) // arg4 is the weights { ExprCodes *arg4 = codes[3]; if( arg4->IsaNVariable() ) { NumericData nd( arg4->GetNVarPtr()->GetData() ); d4.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w4 = arg4->GetWorkspacePtr(); if( w4->IsEmpty() ) throw EExpressionError( wxT("SMOOTH: fourth argument workspace is empty") ); d4.assign( w4->GetData().begin(), w4->GetData().end() ); } if( d4.size() != size1 ) throw EExpressionError( wxT("SMOOTH: vectors have different lengths") ); } else { d4.insert( d4.begin(), size1, 1.0 ); } std::vector yy( size3, 0.0 ); std::vector yderiv( size3, 0.0 ); try { UsefulFunctions::SplineSmooth( d1, d2, d3, yy, yderiv, d4 ); } catch (EExpressionError &e) { throw; } ws->SetDimMag( 0, yy.size() ); ws->SetNumberOfDimensions(1); ws->SetData( yy ); } // end of file extrema-4.4.5/src/Functions/FCN_sech.h0000644012702201742730000000216011274636611016535 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SECH #define FCN_SECH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sech : public ScalarFunction { public: static FCN_sech *Instance() { if( !fcn_sech_ )fcn_sech_ = new FCN_sech(); return fcn_sech_; } void ScalarEval( int, std::vector & ) const; private: FCN_sech() : ScalarFunction( wxT("SECH") ) {} static FCN_sech *fcn_sech_; }; #endif extrema-4.4.5/src/Functions/FCN_abs.cpp0000644012702201742730000000162211274636611016715 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_abs.h" FCN_abs *FCN_abs::fcn_abs_ = 0; void FCN_abs::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = fabs( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_legendre.cpp0000644012702201742730000000216311274636611017736 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_legendre.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_legendre *FCN_legendre::fcn_legendre_ = 0; void FCN_legendre::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j]); try { rStack[j] = UsefulFunctions::LegendrePolynomial( n, rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_sec.h0000644012702201742730000000214411274636611016367 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SEC #define FCN_SEC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sec : public ScalarFunction { public: static FCN_sec *Instance() { if( !fcn_sec_ )fcn_sec_ = new FCN_sec(); return fcn_sec_; } void ScalarEval( int, std::vector & ) const; private: FCN_sec() : ScalarFunction( wxT("SEC") ) {} static FCN_sec *fcn_sec_; }; #endif extrema-4.4.5/src/Functions/FCN_chisq.h0000644012702201742730000000220111274636611016716 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CHISQ #define FCN_CHISQ #include "wx/wx.h" #include "ScalarFunction.h" class FCN_chisq : public ScalarFunction { public: static FCN_chisq *Instance() { if( !fcn_chisq_ )fcn_chisq_ = new FCN_chisq(); return fcn_chisq_; } void ScalarEval( int, std::vector & ) const; private: FCN_chisq() : ScalarFunction( wxT("CHISQ"), 2, 2 ) {} static FCN_chisq *fcn_chisq_; }; #endif extrema-4.4.5/src/Functions/FCN_exp.h0000644012702201742730000000214411274636611016411 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EXP #define FCN_EXP #include "wx/wx.h" #include "ScalarFunction.h" class FCN_exp : public ScalarFunction { public: static FCN_exp *Instance() { if( !fcn_exp_ )fcn_exp_ = new FCN_exp(); return fcn_exp_; } void ScalarEval( int, std::vector & ) const; private: FCN_exp() : ScalarFunction( wxT("EXP") ) {} static FCN_exp *fcn_exp_; }; #endif extrema-4.4.5/src/Functions/FCN_ferdirac.h0000644012702201742730000000224411274636611017375 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FERDIRAC #define FCN_FERDIRAC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ferdirac : public ScalarFunction { public: static FCN_ferdirac *Instance() { if( !fcn_ferdirac_ )fcn_ferdirac_ = new FCN_ferdirac(); return fcn_ferdirac_; } void ScalarEval( int, std::vector & ) const; private: FCN_ferdirac() : ScalarFunction( wxT("FERDIRAC"), 2, 2 ) {} static FCN_ferdirac *fcn_ferdirac_; }; #endif extrema-4.4.5/src/Functions/Makefile.am0000644012702201742730000001575711274636611017030 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libfunctions.la libfunctions_la_SOURCES = \ FCN_abs.cpp FCN_abs.h \ FCN_acos.cpp FCN_acos.h \ FCN_acosd.cpp FCN_acosd.h \ FCN_acosh.cpp FCN_acosh.h \ FCN_acot.cpp FCN_acot.h \ FCN_acotd.cpp FCN_acotd.h \ FCN_acoth.cpp FCN_acoth.h \ FCN_acsc.cpp FCN_acsc.h \ FCN_acscd.cpp FCN_acscd.h \ FCN_acsch.cpp FCN_acsch.h \ FCN_adev.cpp FCN_adev.h \ FCN_aerfc.cpp FCN_aerfc.h \ FCN_aerf.cpp FCN_aerf.h \ FCN_agauss.cpp FCN_agauss.h \ FCN_airy.cpp FCN_airy.h \ FCN_area.cpp FCN_area.h \ FCN_asec.cpp FCN_asec.h \ FCN_asecd.cpp FCN_asecd.h \ FCN_asech.cpp FCN_asech.h \ FCN_asin.cpp FCN_asin.h \ FCN_asind.cpp FCN_asind.h \ FCN_asinh.cpp FCN_asinh.h \ FCN_atan2.cpp FCN_atan2.h \ FCN_atan2d.cpp FCN_atan2d.h \ FCN_atan.cpp FCN_atan.h \ FCN_atand.cpp FCN_atand.h \ FCN_atanh.cpp FCN_atanh.h \ FCN_bei.cpp FCN_bei.h \ FCN_ber.cpp FCN_ber.h \ FCN_besi0.cpp FCN_besi0.h \ FCN_besi1.cpp FCN_besi1.h \ FCN_besj0.cpp FCN_besj0.h \ FCN_besj1.cpp FCN_besj1.h \ FCN_besk0.cpp FCN_besk0.h \ FCN_besk1.cpp FCN_besk1.h \ FCN_besy0.cpp FCN_besy0.h \ FCN_besy1.cpp FCN_besy1.h \ FCN_beta.cpp FCN_beta.h \ FCN_betain.cpp FCN_betain.h \ FCN_binom.cpp FCN_binom.h \ FCN_biry.cpp FCN_biry.h \ FCN_bivarnor.cpp FCN_bivarnor.h \ FCN_bivinterp.cpp FCN_bivinterp.h \ FCN_bivsmooth.cpp FCN_bivsmooth.h \ FCN_canopen.cpp FCN_canopen.h \ FCN_char.cpp FCN_char.h \ FCN_cheby.cpp FCN_cheby.h \ FCN_chisq.cpp FCN_chisq.h \ FCN_chisqi.cpp FCN_chisqi.h \ FCN_chlogu.cpp FCN_chlogu.h \ FCN_clebsg.cpp FCN_clebsg.h \ FCN_clen.cpp FCN_clen.h \ FCN_convolute.cpp FCN_convolute.h \ FCN_cos.cpp FCN_cos.h \ FCN_cosd.cpp FCN_cosd.h \ FCN_cosh.cpp FCN_cosh.h \ FCN_cosint.cpp FCN_cosint.h \ FCN_cot.cpp FCN_cot.h \ FCN_cotd.cpp FCN_cotd.h \ FCN_coth.cpp FCN_coth.h \ FCN_csc.cpp FCN_csc.h \ FCN_cscd.cpp FCN_cscd.h \ FCN_csch.cpp FCN_csch.h \ FCN_date.cpp FCN_date.h \ FCN_dawson.cpp FCN_dawson.h \ FCN_deconvolute.cpp FCN_deconvolute.h \ FCN_deriv.cpp FCN_deriv.h \ FCN_det.cpp FCN_det.h \ FCN_digamma.cpp FCN_digamma.h \ FCN_dilog.cpp FCN_dilog.h \ FCN_ei.cpp FCN_ei.h \ FCN_eigen.cpp FCN_eigen.h \ FCN_einellic.cpp FCN_einellic.h \ FCN_ellice.cpp FCN_ellice.h \ FCN_ellick.cpp FCN_ellick.h \ FCN_eqs.cpp FCN_eqs.h \ FCN_erfc.cpp FCN_erfc.h \ FCN_erf.cpp FCN_erf.h \ FCN_evaluate.cpp FCN_evaluate.h \ FCN_exist.cpp FCN_exist.h \ FCN_expand.cpp FCN_expand.h \ FCN_exp.cpp FCN_exp.h \ FCN_expint.cpp FCN_expint.h \ FCN_expn.cpp FCN_expn.h \ FCN_factorial.cpp FCN_factorial.h \ FCN_ferdirac.cpp FCN_ferdirac.h \ FCN_fft.cpp FCN_fft.h \ FCN_finellic.cpp FCN_finellic.h \ FCN_fisher.cpp FCN_fisher.h \ FCN_fold.cpp FCN_fold.h \ FCN_frec1.cpp FCN_frec1.h \ FCN_frec2.cpp FCN_frec2.h \ FCN_fres1.cpp FCN_fres1.h \ FCN_fres2.cpp FCN_fres2.h \ FCN_gammacin.cpp FCN_gammacin.h \ FCN_gamma.cpp FCN_gamma.h \ FCN_gammain.cpp FCN_gammain.h \ FCN_gammatin.cpp FCN_gammatin.h \ FCN_gammln.cpp FCN_gammln.h \ FCN_gammq.cpp FCN_gammq.h \ FCN_gauss.cpp FCN_gauss.h \ FCN_gaussin.cpp FCN_gaussin.h \ FCN_gaussj.cpp FCN_gaussj.h \ FCN_gmean.cpp FCN_gmean.h \ FCN_heaviside.cpp FCN_heaviside.h \ FCN_hermite.cpp FCN_hermite.h \ FCN_hypgeo.cpp FCN_hypgeo.h \ FCN_ichar.cpp FCN_ichar.h \ FCN_iclose.cpp FCN_iclose.h \ FCN_identity.cpp FCN_identity.h \ FCN_iequal.cpp FCN_iequal.h \ FCN_ifft.cpp FCN_ifft.h \ FCN_imax.cpp FCN_imax.h \ FCN_imin.cpp FCN_imin.h \ FCN_index.cpp FCN_index.h \ FCN_int.cpp FCN_int.h \ FCN_integral.cpp FCN_integral.h \ FCN_interpolate.cpp FCN_interpolate.h \ FCN_inverse.cpp FCN_inverse.h \ FCN_jacobi.cpp FCN_jacobi.h \ FCN_jahnuf.cpp FCN_jahnuf.h \ FCN_join.cpp FCN_join.h \ FCN_kei.cpp FCN_kei.h \ FCN_ker.cpp FCN_ker.h \ FCN_kurt.cpp FCN_kurt.h \ FCN_laguerre.cpp FCN_laguerre.h \ FCN_lcase.cpp FCN_lcase.h \ FCN_legendre.cpp FCN_legendre.h \ FCN_len.cpp FCN_len.h \ FCN_lnagamma.cpp FCN_lnagamma.h \ FCN_lnbeta.cpp FCN_lnbeta.h \ FCN_ln.cpp FCN_ln.h \ FCN_log10.cpp FCN_log10.h \ FCN_logam.cpp FCN_logam.h \ FCN_log.cpp FCN_log.h \ FCN_max.cpp FCN_max.h \ FCN_mean.cpp FCN_mean.h \ FCN_median.cpp FCN_median.h \ FCN_min.cpp FCN_min.h \ FCN_mod.cpp FCN_mod.h \ FCN_nes.cpp FCN_nes.h \ FCN_nint.cpp FCN_nint.h \ FCN_normal.cpp FCN_normal.h \ FCN_null.cpp FCN_null.h \ FCN_pdiff.cpp FCN_pdiff.h \ FCN_pfactors.cpp FCN_pfactors.h \ FCN_plmn.cpp FCN_plmn.h \ FCN_plmu.cpp FCN_plmu.h \ FCN_poica.cpp FCN_poica.h \ FCN_poisson.cpp FCN_poisson.h \ FCN_prob.cpp FCN_prob.h \ FCN_prod.cpp FCN_prod.h \ FCN_psi.cpp FCN_psi.h \ FCN_racah.cpp FCN_racah.h \ FCN_radmac.cpp FCN_radmac.h \ FCN_rchar.cpp FCN_rchar.h \ FCN_rms.cpp FCN_rms.h \ FCN_roll.cpp FCN_roll.h \ FCN_rprod.cpp FCN_rprod.h \ FCN_rsum.cpp FCN_rsum.h \ FCN_savgol.cpp FCN_savgol.h \ FCN_sec.cpp FCN_sec.h \ FCN_secd.cpp FCN_secd.h \ FCN_sech.cpp FCN_sech.h \ FCN_sign.cpp FCN_sign.h \ FCN_simpleran.cpp FCN_simpleran.h \ FCN_sin.cpp FCN_sin.h \ FCN_sind.cpp FCN_sind.h \ FCN_sinh.cpp FCN_sinh.h \ FCN_skew.cpp FCN_skew.h \ FCN_sinint.cpp FCN_sinint.h \ FCN_smooth.cpp FCN_smooth.h \ FCN_splinterp.cpp FCN_splinterp.h \ FCN_splsmooth.cpp FCN_splsmooth.h \ FCN_sqrt.cpp FCN_sqrt.h \ FCN_stdev.cpp FCN_stdev.h \ FCN_step.cpp FCN_step.h \ FCN_string.cpp FCN_string.h \ FCN_struve0.cpp FCN_struve0.h \ FCN_struve1.cpp FCN_struve1.h \ FCN_student.cpp FCN_student.h \ FCN_studenti.cpp FCN_studenti.h \ FCN_sub.cpp FCN_sub.h \ FCN_sum.cpp FCN_sum.h \ FCN_sup.cpp FCN_sup.h \ FCN_tan.cpp FCN_tan.h \ FCN_tand.cpp FCN_tand.h \ FCN_tanh.cpp FCN_tanh.h \ FCN_tcase.cpp FCN_tcase.h \ FCN_time.cpp FCN_time.h \ FCN_tina.cpp FCN_tina.h \ FCN_ucase.cpp FCN_ucase.h \ FCN_var.cpp FCN_var.h \ FCN_varname.cpp FCN_varname.h \ FCN_vartype.cpp FCN_vartype.h \ FCN_vlen.cpp FCN_vlen.h \ FCN_voigt.cpp FCN_voigt.h \ FCN_volume.cpp FCN_volume.h \ FCN_walsh.cpp FCN_walsh.h \ FCN_where.cpp FCN_where.h \ FCN_wign3j.cpp FCN_wign3j.h \ FCN_wign6j.cpp FCN_wign6j.h \ FCN_wign9j.cpp FCN_wign9j.h \ FCN_wrap.cpp FCN_wrap.h \ FunctionDefinition.cpp FunctionDefinition.h \ FunctionTable.cpp FunctionTable.h \ ScalarFunction.cpp ScalarFunction.h \ ArrayFunction.h extrema-4.4.5/src/Functions/FCN_expint.h0000644012702201742730000000220611274636611017123 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EXPINT #define FCN_EXPINT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_expint : public ScalarFunction { public: static FCN_expint *Instance() { if( !fcn_expint_ )fcn_expint_ = new FCN_expint(); return fcn_expint_; } void ScalarEval( int, std::vector & ) const; private: FCN_expint() : ScalarFunction( wxT("EXPINT") ) {} static FCN_expint *fcn_expint_; }; #endif extrema-4.4.5/src/Functions/FCN_fres2.cpp0000644012702201742730000000204311274636611017167 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_fres2.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_fres2 *FCN_fres2::fcn_fres2_ = 0; void FCN_fres2::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::FresnelSAssociated( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_airy.cpp0000644012702201742730000000204111274636611017110 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_airy.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_airy *FCN_airy::fcn_airy_ = 0; void FCN_airy::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Airy( rStack[j] ); } catch (EExpressionError &e) { throw; } } // end of file extrema-4.4.5/src/Functions/FCN_splinterp.h0000644012702201742730000000234011274636611017633 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SPLINTERP #define FCN_SPLINTERP #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_splinterp : public ArrayFunction { public: static FCN_splinterp *Instance() { if( !fcn_splinterp_ )fcn_splinterp_ = new FCN_splinterp(); return fcn_splinterp_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_splinterp() : ArrayFunction( wxT("SPLINTERP"), 3, 3 ) {} static FCN_splinterp *fcn_splinterp_; }; #endif extrema-4.4.5/src/Functions/FCN_besy1.h0000644012702201742730000000217311274636611016642 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESY1 #define FCN_BESY1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besy1 : public ScalarFunction { public: static FCN_besy1 *Instance() { if( !fcn_besy1_ )fcn_besy1_ = new FCN_besy1(); return fcn_besy1_; } void ScalarEval( int, std::vector & ) const; private: FCN_besy1() : ScalarFunction( wxT("BESY1") ) {} static FCN_besy1 *fcn_besy1_; }; #endif extrema-4.4.5/src/Functions/FCN_binom.h0000644012702201742730000000220211274636611016714 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BINOM #define FCN_BINOM #include "wx/wx.h" #include "ScalarFunction.h" class FCN_binom : public ScalarFunction { public: static FCN_binom *Instance() { if( !fcn_binom_ )fcn_binom_ = new FCN_binom(); return fcn_binom_; } void ScalarEval( int, std::vector & ) const; private: FCN_binom() : ScalarFunction( wxT("BINOM"), 2, 2 ) {} static FCN_binom *fcn_binom_; }; #endif extrema-4.4.5/src/Functions/FCN_pfactors.h0000644012702201742730000000231011274636611017431 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_PFACTORS #define FCN_PFACTORS #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_pfactors : public ArrayFunction { public: static FCN_pfactors *Instance() { if( !fcn_pfactors_ )fcn_pfactors_ = new FCN_pfactors(); return fcn_pfactors_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_pfactors() : ArrayFunction( wxT("PFACTORS") ) {} static FCN_pfactors *fcn_pfactors_; }; #endif extrema-4.4.5/src/Functions/FCN_atand.cpp0000644012702201742730000000164211274636611017241 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_atand.h" FCN_atand *FCN_atand::fcn_atand_ = 0; void FCN_atand::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = atan( rStack[j] )*180./M_PI; } extrema-4.4.5/src/Functions/FCN_csc.cpp0000644012702201742730000000201211274636611016712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_csc.h" #include "EExpressionError.h" FCN_csc *FCN_csc::fcn_csc_ = 0; void FCN_csc::ScalarEval( int j, std::vector &rStack ) const { double s = sin( rStack[j] ); if( s == 0.0 )throw EExpressionError( wxT("CSC: sin(argument) = 0") ); rStack[j] = 1.0/s; } extrema-4.4.5/src/Functions/FCN_wrap.cpp0000644012702201742730000000671011274636611017124 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_wrap.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_wrap *FCN_wrap::fcn_wrap_ = 0; void FCN_wrap::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 && ndmEff!=2 ) throw EExpressionError( wxT("first argument of WRAP function must be a vector or matrix") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 0 ) throw EExpressionError( wxT("second argument of WRAP function must be a scalar") ); numberOfArguments_ = 2; } } void FCN_wrap::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1; std::size_t size1[2]; int ndm1; double step; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( unsigned short int i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("WRAP: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( unsigned short int i=0; iGetDimMag(i); } if( arg2->IsaNVariable() ) { step = arg2->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg2->IsaWorkspace() ) { step = arg2->GetWorkspacePtr()->GetValue(); } else { step = arg2->GetConstantValue(); } if( step == 0.0 ) { if( ndm1 == 1 ) { for( std::size_t i=0; iSetData( i, d1[i] ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, size1[0] ); } else if( ndm1 == 2 ) { for( std::size_t i=0; iSetData( i, d1[i] ); ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, size1[0] ); ws->SetDimMag( 1, size1[1] ); } } else { int istep = static_cast( fabs(step) ); int num; ndm1 == 1 ? num = size1[0] : num = size1[0]*size1[1]; if( istep > num )istep = num; if( step < 0.0 ) { for( int i=0; iSetData( i, d1[i+istep] ); for( int i=num-istep; iSetData( i, 0.0 ); } else { for( int i=num-1; i>=istep; --i )ws->SetData( i, d1[i-istep] ); for( int i=0; iSetData( i, 0.0 ); } ws->SetNumberOfDimensions(ndm1); ws->SetDimMag( 0, size1[0] ); if( ndm1 > 1 )ws->SetDimMag( 1, size1[1] ); } } // end of file extrema-4.4.5/src/Functions/ScalarFunction.cpp0000644012702201742730000000333611274636611020401 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "ScalarFunction.h" #include "Workspace.h" #include "EExpressionError.h" ScalarFunction::ScalarFunction( wxString const &name, std::size_t minArg, std::size_t maxArg, Type fcnType, ArgType argType1, ArgType argType2 ) : FunctionDefinition( name, minArg, maxArg, fcnType, argType1, argType2 ) {} void ScalarFunction::CalcArgument( bool firstArgument, int ndmEff, int *nptEff, Workspace *ws ) { if( firstArgument ) { for( std::size_t j=0; jGetNumberOfLoops(); ++j ) ws->SetDimMag( static_cast(j), nptEff[j] ); } else { for( std::size_t j=0; jGetNumberOfLoops(); ++j ) { if( static_cast(ws->GetDimMag(static_cast(j))) != nptEff[j] ) { wxString buff( wxT("Error in CalcArgument: size mismatch for dimension ") ); throw EExpressionError( buff << j ); } } } } // end-of-file extrema-4.4.5/src/Functions/FCN_ichar.cpp0000644012702201742730000000312711274636611017240 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ichar.h" #include "Workspace.h" #include "EExpressionError.h" #include "ExprCodes.h" FCN_ichar *FCN_ichar::fcn_ichar_ = 0; void FCN_ichar::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { nLoop = 1; numberOfArguments_ = 1; } void FCN_ichar::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg = codes[0]; wxString s; if( arg->IsaWorkspace() ) { s = arg->GetWorkspacePtr()->GetFinalString(); } else if( arg->IsaTString() ) { s = arg->GetTString(); } else { throw EExpressionError( wxT("CHAR: argument must be character") ); } std::size_t len = s.size(); for( std::size_t i=0; i(c); ws->SetData( i, static_cast(j) ); } ws->SetNumberOfDimensions( 1 ); ws->SetDimMag( 0, len ); } // end of file extrema-4.4.5/src/Functions/FCN_vartype.h0000644012702201742730000000242111274636611017305 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_VARTYPE #define FCN_VARTYPE #include "wx/wx.h" #include "FunctionDefinition.h" class Workspace; class FCN_vartype : public FunctionDefinition { public: static FCN_vartype *Instance() { if( !fcn_vartype_ )fcn_vartype_ = new FCN_vartype(); return fcn_vartype_; } void TextArrayEval( int const, std::vector &, std::vector & ) const {} private: FCN_vartype() : FunctionDefinition( wxT("VARTYPE"), 1, 2, MIXED2CHAR, CHARACTER ) {} static FCN_vartype *fcn_vartype_; }; #endif extrema-4.4.5/src/Functions/FCN_sinh.cpp0000644012702201742730000000162411274636611017113 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sinh.h" FCN_sinh *FCN_sinh::fcn_sinh_ = 0; void FCN_sinh::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = sinh( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_chlogu.cpp0000644012702201742730000000240611274636611017432 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_chlogu.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_chlogu *FCN_chlogu::fcn_chlogu_ = 0; void FCN_chlogu::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::LogarithmicConfluentHypergeometric( rStack[j], rStack[j+1], rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_gammatin.cpp0000644012702201742730000000212411274636611017743 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gammatin.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gammatin *FCN_gammatin::fcn_gammatin_ = 0; void FCN_gammatin::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::TricomiSIncomplete( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_factorial.cpp0000644012702201742730000000212111274636611020107 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_factorial.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_factorial *FCN_factorial::fcn_factorial_ = 0; void FCN_factorial::ScalarEval( int j, std::vector &rStack ) const { try { int n = static_cast( rStack[j] ); rStack[j] = UsefulFunctions::Factorial( n ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_gammln.h0000644012702201742730000000220611274636611017067 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAMMLN #define FCN_GAMMLN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gammln : public ScalarFunction { public: static FCN_gammln *Instance() { if( !fcn_gammln_ )fcn_gammln_ = new FCN_gammln(); return fcn_gammln_; } void ScalarEval( int, std::vector & ) const; private: FCN_gammln() : ScalarFunction( wxT("GAMMLN") ) {} static FCN_gammln *fcn_gammln_; }; #endif extrema-4.4.5/src/Functions/FCN_atan2.h0000644012702201742730000000220211274636611016615 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ATAN2 #define FCN_ATAN2 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_atan2 : public ScalarFunction { public: static FCN_atan2 *Instance() { if( !fcn_atan2_ )fcn_atan2_ = new FCN_atan2(); return fcn_atan2_; } void ScalarEval( int, std::vector & ) const; private: FCN_atan2() : ScalarFunction( wxT("ATAN2"), 2, 2 ) {} static FCN_atan2 *fcn_atan2_; }; #endif extrema-4.4.5/src/Functions/FCN_evaluate.h0000644012702201742730000000231111274636611017417 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EVAL #define FCN_EVAL #include "wx/wx.h" #include "ArrayFunction.h" class FCN_evaluate : public ArrayFunction { public: static FCN_evaluate *Instance() { if( !fcn_evaluate_ )fcn_evaluate_ = new FCN_evaluate(); return fcn_evaluate_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_evaluate() : ArrayFunction( wxT("EVALUATE"), 1, 1, MIXED2NUM, CHARACTER ) {} static FCN_evaluate *fcn_evaluate_; }; #endif extrema-4.4.5/src/Functions/FCN_smooth.h0000644012702201742730000000226711274636611017134 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SMOOTH #define FCN_SMOOTH #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_smooth : public ArrayFunction { public: static FCN_smooth *Instance() { if( !fcn_smooth_ )fcn_smooth_ = new FCN_smooth(); return fcn_smooth_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_smooth() : ArrayFunction( wxT("SMOOTH"), 3, 4 ) {} static FCN_smooth *fcn_smooth_; }; #endif extrema-4.4.5/src/Functions/FCN_wign6j.h0000644012702201742730000000221411274636611017017 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_WIGN6J #define FCN_WIGN6J #include "wx/wx.h" #include "ScalarFunction.h" class FCN_wign6j : public ScalarFunction { public: static FCN_wign6j *Instance() { if( !fcn_wign6j_ )fcn_wign6j_ = new FCN_wign6j(); return fcn_wign6j_; } void ScalarEval( int, std::vector & ) const; private: FCN_wign6j() : ScalarFunction( wxT("WIGN6J"), 6, 6 ) {} static FCN_wign6j *fcn_wign6j_; }; #endif extrema-4.4.5/src/Functions/FCN_rchar.h0000644012702201742730000000236711274636611016723 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RCHAR #define FCN_RCHAR #include #include "wx/wx.h" #include "FunctionDefinition.h" class Workspace; class FCN_rchar : public FunctionDefinition { public: static FCN_rchar *Instance() { if( !fcn_rchar_ )fcn_rchar_ = new FCN_rchar(); return fcn_rchar_; } void TextArrayEval( int, std::vector &, std::vector & ) const; private: FCN_rchar() : FunctionDefinition( wxT("RCHAR"), 1, 2, MIXED2CHAR, NUMERIC, CHARACTER ) {} static FCN_rchar *fcn_rchar_; }; #endif extrema-4.4.5/src/Functions/FCN_besk1.cpp0000644012702201742730000000203111274636611017150 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besk1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besk1 *FCN_besk1::fcn_besk1_ = 0; void FCN_besk1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselK1( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_ellice.h0000644012702201742730000000220611274636611017051 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ELLICE #define FCN_ELLICE #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ellice : public ScalarFunction { public: static FCN_ellice *Instance() { if( !fcn_ellice_ )fcn_ellice_ = new FCN_ellice(); return fcn_ellice_; } void ScalarEval( int, std::vector & ) const; private: FCN_ellice() : ScalarFunction( wxT("ELLICE") ) {} static FCN_ellice *fcn_ellice_; }; #endif extrema-4.4.5/src/Functions/FCN_secd.cpp0000644012702201742730000000203011274636611017060 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_secd.h" #include "EExpressionError.h" FCN_secd *FCN_secd::fcn_secd_ = 0; void FCN_secd::ScalarEval( int j, std::vector &rStack ) const { double c = cos(rStack[j]*M_PI/180.); if( c <= 0.0 )throw EExpressionError( wxT("SECD: cos(argument) = 0") ); rStack[j] = 1.0/c; } extrema-4.4.5/src/Functions/FCN_laguerre.cpp0000644012702201742730000000216311274636611017757 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_laguerre.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_laguerre *FCN_laguerre::fcn_laguerre_ = 0; void FCN_laguerre::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j]); try { rStack[j] = UsefulFunctions::LaguerrePolynomial( n, rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_normal.cpp0000644012702201742730000000214011274636611017434 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_normal.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_normal *FCN_normal::fcn_normal_ = 0; void FCN_normal::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Normal( rStack[j], rStack[j+1], rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_gaussj.cpp0000644012702201742730000001140211274636611017441 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gaussj.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_gaussj *FCN_gaussj::fcn_gaussj_ = 0; void FCN_gaussj::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 2 ) throw EExpressionError( wxT("GAUSSJ: first argument must be a matrix") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; ++numberOfArguments_; if( numberOfArguments_ == 2 ) { if( ndmEff != 1 ) throw EExpressionError( wxT("GAUSSJ: second argument must be a vector") ); } } } void FCN_gaussj::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1, d2; int size1a[2]; int ndm1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( int i=0; iGetWorkspacePtr(); if( w1->IsEmpty() )throw EExpressionError( wxT("GAUSSJ: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( int i=0; iGetDimMag(i); } if( size1a[0] != size1a[1] ) throw EExpressionError( wxT("GAUSSJ: first argument must be a square matrix") ); int size1 = size1a[0]; // if( arg2->IsaNVariable() ) { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() )throw EExpressionError( wxT("GAUSSJ: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } int size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("GAUSSJ: row dimension of matrix first argument must be same as the length of the vector argument") ); if( size1 < 2 ) throw EExpressionError( wxT("GAUSSJ: vector length < 2") ); // try { std::vector indx( size1, 0 ); UsefulFunctions::LUDecomposition( d1, indx ); UsefulFunctions::LUSubstitution( d1, indx, d2 ); } catch( EExpressionError &e ) { throw; } /* std::vector indxr( size1, 0.0 ); std::vector indxc( size1, 0.0 ); std::vector piv( size1, 0 ); int row, col; for( int k1=1; k1<=size1; ++k1 ) { double big = 0.0; for( int k2=1; k2<=size1; ++k2 ) { if( piv[k2-1] != 1 ) { for( int k3=1; k3<=size1; ++k3 ) { if( piv[k3-1] == 0 ) { if( fabs(d1[k2-1+(k3-1)*size1]) >= big ) { big = fabs(d1[k2-1+(k3-1)*size1]); row = k2; col = k3; } } else if( piv[k3-1] > 1 ) { throw EExpressionError("GAUSSJ: matrix argument is singular"); } } } } ++piv[col-1]; if( row != col ) { double dum; for( int k2=1; k2<=size1; ++k2 ) { dum = d1[row-1+(k2-1)*size1]; d1[row-1+(k2-1)*size1] = d1[col-1+(k2-1)*size1]; d1[col-1+(k2-1)*size1] = dum; } dum = d2[row-1]; d2[row-1] = d2[col-1]; d2[col-1] = dum; } indxr[k1-1] = row; indxc[k1-1] = col; if( d1[col-1+(col-1)*size1] == 0.0 ) throw EExpressionError("GAUSSJ: matrix argument is singular"); double pivinv = 1.0/d1[col-1+(col-1)*size1]; d1[col-1+(col-1)*size1] = 1.0; for( int k2=1; k2<=size1; ++k2 ) d1[col-1+(k2-1)*size1] = d1[col-1+(k2-1)*size1]*pivinv; d2[col-1] *= pivinv; for( int k2=1; k2<=size1; ++k2 ) { if( k2 != col ) { double dum = d1[k2-1+(col-1)*size1]; d1[k2-1+(col-1)*size1] = 0.0; for( int k3=1; k3<=size1; ++k3 ) d1[k2-1+(k3-1)*size1] -= d1[col-1+(k3-1)*size1]*dum; d2[k2-1] -= d2[col-1]*dum; } } } */ ws->SetData( d2 ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, size1 ); } // end of file extrema-4.4.5/src/Functions/FCN_lnbeta.cpp0000644012702201742730000000212611274636611017415 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_lnbeta.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_lnbeta *FCN_lnbeta::fcn_lnbeta_ = 0; void FCN_lnbeta::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::LnCompleteBeta( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } // end of file extrema-4.4.5/src/Functions/FCN_lnagamma.cpp0000644012702201742730000000207211274636611017725 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_lnagamma.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_lnagamma *FCN_lnagamma::fcn_lnagamma_ = 0; void FCN_lnagamma::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::LnAbsGamma( rStack[j] ); } catch (EExpressionError &e) { throw; } } // end of file extrema-4.4.5/src/Functions/FCN_eqs.h0000644012702201742730000000226311274636611016407 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EQS #define FCN_EQS #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_eqs : public ArrayFunction { public: static FCN_eqs *Instance() { if( !fcn_eqs_ )fcn_eqs_ = new FCN_eqs(); return fcn_eqs_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_eqs() : ArrayFunction( wxT("EQS"), 2, 2, MIXED2NUM, CHARACTER, CHARACTER ) {} static FCN_eqs *fcn_eqs_; }; #endif extrema-4.4.5/src/Functions/FCN_ichar.h0000644012702201742730000000225711274636611016710 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ICHAR #define FCN_ICHAR #include "wx/wx.h" #include "ArrayFunction.h" class FCN_ichar : public ArrayFunction { public: static FCN_ichar *Instance() { if( !fcn_ichar_ )fcn_ichar_ = new FCN_ichar(); return fcn_ichar_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_ichar() : ArrayFunction( wxT("ICHAR"), 1, 1, MIXED2NUM, CHARACTER ) {} static FCN_ichar *fcn_ichar_; }; #endif extrema-4.4.5/src/Functions/FCN_sinint.cpp0000644012702201742730000000204211274636611017451 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_sinint.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_sinint *FCN_sinint::fcn_sinint_ = 0; void FCN_sinint::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::SineIntegral( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_radmac.h0000644012702201742730000000223711274636611017047 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RADMAC #define FCN_RADMAC #include #include "wx/wx.h" #include "ScalarFunction.h" class FCN_radmac : public ScalarFunction { public: static FCN_radmac *Instance() { if( !fcn_radmac_ )fcn_radmac_ = new FCN_radmac(); return fcn_radmac_; } void ScalarEval( int, std::vector & ) const; private: FCN_radmac() : ScalarFunction( wxT("RADMAC"), 2, 2 ) {} static FCN_radmac *fcn_radmac_; }; #endif extrema-4.4.5/src/Functions/FCN_expn.h0000644012702201742730000000216411274636611016571 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EXPN #define FCN_EXPN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_expn : public ScalarFunction { public: static FCN_expn *Instance() { if( !fcn_expn_ )fcn_expn_ = new FCN_expn(); return fcn_expn_; } void ScalarEval( int, std::vector & ) const; private: FCN_expn() : ScalarFunction( wxT("EXPN"), 2, 2 ) {} static FCN_expn *fcn_expn_; }; #endif extrema-4.4.5/src/Functions/FCN_coth.h0000644012702201742730000000216011274636611016550 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COTH #define FCN_COTH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_coth : public ScalarFunction { public: static FCN_coth *Instance() { if( !fcn_coth_ )fcn_coth_ = new FCN_coth(); return fcn_coth_; } void ScalarEval( int, std::vector & ) const; private: FCN_coth() : ScalarFunction( wxT("COTH") ) {} static FCN_coth *fcn_coth_; }; #endif extrema-4.4.5/src/Functions/FCN_vlen.cpp0000644012702201742730000000400111274636611017106 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_vlen.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_vlen *FCN_vlen::fcn_vlen_ = 0; void FCN_vlen::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 && ndmEff!=2 ) throw EExpressionError( wxT("argument of VLEN function must be a vector or a matrix") ); numberOfArguments_ = 1; nLoop = ndmEff; } } void FCN_vlen::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; std::size_t size1, size2; int ndm; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm = nd.GetNumberOfDimensions(); size1 = nd.GetDimMag(0); if( ndm == 2 )size2 = nd.GetDimMag(1); } else // argument 1 must be a workspace { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("VLEN: first argument workspace is empty") ); ndm = w1->GetNumberOfDimensions(); size1 = w1->GetDimMag(0); if( ndm == 2 )size2 = w1->GetDimMag(1); } ws->SetData( 0, static_cast(size1) ); if( ndm == 2 )ws->SetData( 1, static_cast(size2) ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, ndm ); } // end of file extrema-4.4.5/src/Functions/FCN_jacobi.cpp0000644012702201742730000000246711274636611017407 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_jacobi.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_jacobi *FCN_jacobi::fcn_jacobi_ = 0; void FCN_jacobi::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::JacobiPolynomial( rStack[j], rStack[j+1], static_cast(rStack[j+2]), rStack[j+3] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_besi1.cpp0000644012702201742730000000203111274636611017146 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besi1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besi1 *FCN_besi1::fcn_besi1_ = 0; void FCN_besi1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselI1( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_cscd.h0000644012702201742730000000216011274636611016527 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CSCD #define FCN_CSCD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cscd : public ScalarFunction { public: static FCN_cscd *Instance() { if( !fcn_cscd_ )fcn_cscd_ = new FCN_cscd(); return fcn_cscd_; } void ScalarEval( int, std::vector & ) const; private: FCN_cscd() : ScalarFunction( wxT("CSCD") ) {} static FCN_cscd *fcn_cscd_; }; #endif extrema-4.4.5/src/Functions/FCN_index.cpp0000644012702201742730000000320211274636611017253 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_index.h" #include "Workspace.h" #include "EExpressionError.h" #include "ExprCodes.h" FCN_index *FCN_index::fcn_index_ = 0; void FCN_index::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { numberOfArguments_ = 1; nLoop = 1; } else ++numberOfArguments_; } void FCN_index::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; if( !arg1->IsaTString() ) throw EExpressionError( wxT("INDEX: first argument must be character") ); if( !arg2->IsaTString() ) throw EExpressionError( wxT("INDEX: second argument must be character") ); wxString s1( arg1->GetTString() ); wxString s2( arg2->GetTString() ); std::size_t idx = s1.find( s2, 0 ); idx==s1.npos ? idx=0 : ++idx; ws->SetNumberOfDimensions(0); ws->SetValue( static_cast(idx) ); } // end of file extrema-4.4.5/src/Functions/FCN_csch.h0000644012702201742730000000216011274636611016533 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CSCH #define FCN_CSCH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_csch : public ScalarFunction { public: static FCN_csch *Instance() { if( !fcn_csch_ )fcn_csch_ = new FCN_csch(); return fcn_csch_; } void ScalarEval( int, std::vector & ) const; private: FCN_csch() : ScalarFunction( wxT("CSCH") ) {} static FCN_csch *fcn_csch_; }; #endif extrema-4.4.5/src/Functions/FCN_studenti.cpp0000644012702201742730000000225511274636611020012 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_studenti.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_studenti *FCN_studenti::fcn_studenti_ = 0; void FCN_studenti::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::StudentTDistributionInverse( rStack[j], static_cast(rStack[j+1]) ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_imin.h0000644012702201742730000000223411274636611016551 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_IMIN #define FCN_IMIN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_imin : public ArrayFunction { public: static FCN_imin *Instance() { if( !fcn_imin_ )fcn_imin_ = new FCN_imin(); return fcn_imin_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_imin() : ArrayFunction( wxT("IMIN"), 1, 1 ) {} static FCN_imin *fcn_imin_; }; #endif extrema-4.4.5/src/Functions/FCN_frec1.h0000644012702201742730000000217211274636611016616 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FREC1 #define FCN_FREC1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_frec1 : public ScalarFunction { public: static FCN_frec1 *Instance() { if( !fcn_frec1_ )fcn_frec1_ = new FCN_frec1(); return fcn_frec1_; } void ScalarEval( int, std::vector & ) const; private: FCN_frec1() : ScalarFunction( wxT("FREC1") ) {} static FCN_frec1 *fcn_frec1_; }; #endif extrema-4.4.5/src/Functions/FCN_racah.cpp0000644012702201742730000000246111274636611017230 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_racah.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_racah *FCN_racah::fcn_racah_ = 0; void FCN_racah::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::RacahCoefficient( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3], rStack[j+4], rStack[j+5] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_wign9j.h0000644012702201742730000000221411274636611017022 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_WIGN9J #define FCN_WIGN9J #include "wx/wx.h" #include "ScalarFunction.h" class FCN_wign9j : public ScalarFunction { public: static FCN_wign9j *Instance() { if( !fcn_wign9j_ )fcn_wign9j_ = new FCN_wign9j(); return fcn_wign9j_; } void ScalarEval( int, std::vector & ) const; private: FCN_wign9j() : ScalarFunction( wxT("WIGN9J"), 9, 9 ) {} static FCN_wign9j *fcn_wign9j_; }; #endif extrema-4.4.5/src/Functions/FCN_acoth.cpp0000644012702201742730000000214611274636611017250 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acoth.h" #include "EExpressionError.h" FCN_acoth *FCN_acoth::fcn_acoth_ = 0; void FCN_acoth::ScalarEval( int j, std::vector &rStack ) const { if( (-1.0<=rStack[j]) && (rStack[j]<=1.0) ) throw EExpressionError( wxT("ACOTH: argument must be in the range (-inf,-1) or (+1,+inf)") ); rStack[j] = 0.5 * log( (1.0 + rStack[j])/(rStack[j] - 1.0) ); } extrema-4.4.5/src/Functions/FCN_lnbeta.h0000644012702201742730000000221511274636611017061 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LNBETA #define FCN_LNBETA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_lnbeta : public ScalarFunction { public: static FCN_lnbeta *Instance() { if( !fcn_lnbeta_ )fcn_lnbeta_ = new FCN_lnbeta(); return fcn_lnbeta_; } void ScalarEval( int, std::vector & ) const; private: FCN_lnbeta() : ScalarFunction( wxT("LNBETA"), 2, 2 ) {} static FCN_lnbeta *fcn_lnbeta_; }; #endif extrema-4.4.5/src/Functions/FCN_gauss.cpp0000644012702201742730000000202611274636611017271 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gauss.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gauss *FCN_gauss::fcn_gauss_ = 0; void FCN_gauss::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Gauss( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_dawson.h0000644012702201742730000000220611274636611017107 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DAWSON #define FCN_DAWSON #include "wx/wx.h" #include "ScalarFunction.h" class FCN_dawson : public ScalarFunction { public: static FCN_dawson *Instance() { if( !fcn_dawson_ )fcn_dawson_ = new FCN_dawson(); return fcn_dawson_; } void ScalarEval( int, std::vector & ) const; private: FCN_dawson() : ScalarFunction( wxT("DAWSON") ) {} static FCN_dawson *fcn_dawson_; }; #endif extrema-4.4.5/src/Functions/FCN_acos.cpp0000644012702201742730000000162311274636611017076 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acos.h" FCN_acos *FCN_acos::fcn_acos_ = 0; void FCN_acos::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = acos( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_besj0.h0000644012702201742730000000217511274636611016624 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESJ0 #define FCN_BESJ0 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besj0 : public ScalarFunction { public: static FCN_besj0 *Instance() { if( !fcn_besj0_ )fcn_besj0_ = new FCN_besj0(); return fcn_besj0_; } void ScalarEval( int, std::vector & ) const; private: FCN_besj0() : ScalarFunction( wxT("BESJ0") ) {} static FCN_besj0 *fcn_besj0_; }; #endif extrema-4.4.5/src/Functions/FCN_eigen.cpp0000644012702201742730000000512111274636611017235 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_eigen.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_eigen *FCN_eigen::fcn_eigen_ = 0; void FCN_eigen::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 2 ) throw EExpressionError( wxT("argument of EIGEN function must be a matrix") ); numberOfArguments_ = 1; nLoop = 0; } } void FCN_eigen::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::vector d; std::size_t rowSize, colSize; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d.assign( nd.GetData().begin(), nd.GetData().end() ); rowSize = nd.GetDimMag(0); colSize = nd.GetDimMag(1); } else // argument 1 must be a workspace { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("EIGEN: argument workspace is empty") ); d.assign( w1->GetData().begin(), w1->GetData().end() ); rowSize = w1->GetDimMag(0); colSize = w1->GetDimMag(1); } if( rowSize != colSize ) throw EExpressionError( wxT("EIGEN: argument must be a square matrix") ); std::size_t n = rowSize; for( std::size_t j=1; j<=n; ++j ) { for( std::size_t i=1; i<=n; ++i ) { if( d[i-1+(j-1)*n] != d[j-1+(i-1)*n] ) throw EExpressionError( wxT("EIGEN: argument must be a symmetric matrix") ); } } std::vector temp(n*(n+1),0.0); for( std::size_t i=1; i<=n; ++i ) { for( std::size_t j=1; j<=i; ++j )temp[i-1+(j-1)*n] = d[i-1+(j-1)*n]; } try { UsefulFunctions::Eigen( temp ); } catch (EExpressionError &e) { throw; } ws->SetData( temp ); ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, n ); ws->SetDimMag( 1, n+1 ); } // end of file extrema-4.4.5/src/Functions/FCN_prob.cpp0000644012702201742730000000212211274636611017106 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_prob.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_prob *FCN_prob::fcn_prob_ = 0; void FCN_prob::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j+1]); try { rStack[j] = UsefulFunctions::Chisq( rStack[j], n ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/Makefile.in0000644012702201742730000011563411440762625017034 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Functions DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libfunctions_la_LIBADD = am_libfunctions_la_OBJECTS = FCN_abs.lo FCN_acos.lo FCN_acosd.lo \ FCN_acosh.lo FCN_acot.lo FCN_acotd.lo FCN_acoth.lo FCN_acsc.lo \ FCN_acscd.lo FCN_acsch.lo FCN_adev.lo FCN_aerfc.lo FCN_aerf.lo \ FCN_agauss.lo FCN_airy.lo FCN_area.lo FCN_asec.lo FCN_asecd.lo \ FCN_asech.lo FCN_asin.lo FCN_asind.lo FCN_asinh.lo \ FCN_atan2.lo FCN_atan2d.lo FCN_atan.lo FCN_atand.lo \ FCN_atanh.lo FCN_bei.lo FCN_ber.lo FCN_besi0.lo FCN_besi1.lo \ FCN_besj0.lo FCN_besj1.lo FCN_besk0.lo FCN_besk1.lo \ FCN_besy0.lo FCN_besy1.lo FCN_beta.lo FCN_betain.lo \ FCN_binom.lo FCN_biry.lo FCN_bivarnor.lo FCN_bivinterp.lo \ FCN_bivsmooth.lo FCN_canopen.lo FCN_char.lo FCN_cheby.lo \ FCN_chisq.lo FCN_chisqi.lo FCN_chlogu.lo FCN_clebsg.lo \ FCN_clen.lo FCN_convolute.lo FCN_cos.lo FCN_cosd.lo \ FCN_cosh.lo FCN_cosint.lo FCN_cot.lo FCN_cotd.lo FCN_coth.lo \ FCN_csc.lo FCN_cscd.lo FCN_csch.lo FCN_date.lo FCN_dawson.lo \ FCN_deconvolute.lo FCN_deriv.lo FCN_det.lo FCN_digamma.lo \ FCN_dilog.lo FCN_ei.lo FCN_eigen.lo FCN_einellic.lo \ FCN_ellice.lo FCN_ellick.lo FCN_eqs.lo FCN_erfc.lo FCN_erf.lo \ FCN_evaluate.lo FCN_exist.lo FCN_expand.lo FCN_exp.lo \ FCN_expint.lo FCN_expn.lo FCN_factorial.lo FCN_ferdirac.lo \ FCN_fft.lo FCN_finellic.lo FCN_fisher.lo FCN_fold.lo \ FCN_frec1.lo FCN_frec2.lo FCN_fres1.lo FCN_fres2.lo \ FCN_gammacin.lo FCN_gamma.lo FCN_gammain.lo FCN_gammatin.lo \ FCN_gammln.lo FCN_gammq.lo FCN_gauss.lo FCN_gaussin.lo \ FCN_gaussj.lo FCN_gmean.lo FCN_heaviside.lo FCN_hermite.lo \ FCN_hypgeo.lo FCN_ichar.lo FCN_iclose.lo FCN_identity.lo \ FCN_iequal.lo FCN_ifft.lo FCN_imax.lo FCN_imin.lo FCN_index.lo \ FCN_int.lo FCN_integral.lo FCN_interpolate.lo FCN_inverse.lo \ FCN_jacobi.lo FCN_jahnuf.lo FCN_join.lo FCN_kei.lo FCN_ker.lo \ FCN_kurt.lo FCN_laguerre.lo FCN_lcase.lo FCN_legendre.lo \ FCN_len.lo FCN_lnagamma.lo FCN_lnbeta.lo FCN_ln.lo \ FCN_log10.lo FCN_logam.lo FCN_log.lo FCN_max.lo FCN_mean.lo \ FCN_median.lo FCN_min.lo FCN_mod.lo FCN_nes.lo FCN_nint.lo \ FCN_normal.lo FCN_null.lo FCN_pdiff.lo FCN_pfactors.lo \ FCN_plmn.lo FCN_plmu.lo FCN_poica.lo FCN_poisson.lo \ FCN_prob.lo FCN_prod.lo FCN_psi.lo FCN_racah.lo FCN_radmac.lo \ FCN_rchar.lo FCN_rms.lo FCN_roll.lo FCN_rprod.lo FCN_rsum.lo \ FCN_savgol.lo FCN_sec.lo FCN_secd.lo FCN_sech.lo FCN_sign.lo \ FCN_simpleran.lo FCN_sin.lo FCN_sind.lo FCN_sinh.lo \ FCN_skew.lo FCN_sinint.lo FCN_smooth.lo FCN_splinterp.lo \ FCN_splsmooth.lo FCN_sqrt.lo FCN_stdev.lo FCN_step.lo \ FCN_string.lo FCN_struve0.lo FCN_struve1.lo FCN_student.lo \ FCN_studenti.lo FCN_sub.lo FCN_sum.lo FCN_sup.lo FCN_tan.lo \ FCN_tand.lo FCN_tanh.lo FCN_tcase.lo FCN_time.lo FCN_tina.lo \ FCN_ucase.lo FCN_var.lo FCN_varname.lo FCN_vartype.lo \ FCN_vlen.lo FCN_voigt.lo FCN_volume.lo FCN_walsh.lo \ FCN_where.lo FCN_wign3j.lo FCN_wign6j.lo FCN_wign9j.lo \ FCN_wrap.lo FunctionDefinition.lo FunctionTable.lo \ ScalarFunction.lo libfunctions_la_OBJECTS = $(am_libfunctions_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libfunctions_la_SOURCES) DIST_SOURCES = $(libfunctions_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libfunctions.la libfunctions_la_SOURCES = \ FCN_abs.cpp FCN_abs.h \ FCN_acos.cpp FCN_acos.h \ FCN_acosd.cpp FCN_acosd.h \ FCN_acosh.cpp FCN_acosh.h \ FCN_acot.cpp FCN_acot.h \ FCN_acotd.cpp FCN_acotd.h \ FCN_acoth.cpp FCN_acoth.h \ FCN_acsc.cpp FCN_acsc.h \ FCN_acscd.cpp FCN_acscd.h \ FCN_acsch.cpp FCN_acsch.h \ FCN_adev.cpp FCN_adev.h \ FCN_aerfc.cpp FCN_aerfc.h \ FCN_aerf.cpp FCN_aerf.h \ FCN_agauss.cpp FCN_agauss.h \ FCN_airy.cpp FCN_airy.h \ FCN_area.cpp FCN_area.h \ FCN_asec.cpp FCN_asec.h \ FCN_asecd.cpp FCN_asecd.h \ FCN_asech.cpp FCN_asech.h \ FCN_asin.cpp FCN_asin.h \ FCN_asind.cpp FCN_asind.h \ FCN_asinh.cpp FCN_asinh.h \ FCN_atan2.cpp FCN_atan2.h \ FCN_atan2d.cpp FCN_atan2d.h \ FCN_atan.cpp FCN_atan.h \ FCN_atand.cpp FCN_atand.h \ FCN_atanh.cpp FCN_atanh.h \ FCN_bei.cpp FCN_bei.h \ FCN_ber.cpp FCN_ber.h \ FCN_besi0.cpp FCN_besi0.h \ FCN_besi1.cpp FCN_besi1.h \ FCN_besj0.cpp FCN_besj0.h \ FCN_besj1.cpp FCN_besj1.h \ FCN_besk0.cpp FCN_besk0.h \ FCN_besk1.cpp FCN_besk1.h \ FCN_besy0.cpp FCN_besy0.h \ FCN_besy1.cpp FCN_besy1.h \ FCN_beta.cpp FCN_beta.h \ FCN_betain.cpp FCN_betain.h \ FCN_binom.cpp FCN_binom.h \ FCN_biry.cpp FCN_biry.h \ FCN_bivarnor.cpp FCN_bivarnor.h \ FCN_bivinterp.cpp FCN_bivinterp.h \ FCN_bivsmooth.cpp FCN_bivsmooth.h \ FCN_canopen.cpp FCN_canopen.h \ FCN_char.cpp FCN_char.h \ FCN_cheby.cpp FCN_cheby.h \ FCN_chisq.cpp FCN_chisq.h \ FCN_chisqi.cpp FCN_chisqi.h \ FCN_chlogu.cpp FCN_chlogu.h \ FCN_clebsg.cpp FCN_clebsg.h \ FCN_clen.cpp FCN_clen.h \ FCN_convolute.cpp FCN_convolute.h \ FCN_cos.cpp FCN_cos.h \ FCN_cosd.cpp FCN_cosd.h \ FCN_cosh.cpp FCN_cosh.h \ FCN_cosint.cpp FCN_cosint.h \ FCN_cot.cpp FCN_cot.h \ FCN_cotd.cpp FCN_cotd.h \ FCN_coth.cpp FCN_coth.h \ FCN_csc.cpp FCN_csc.h \ FCN_cscd.cpp FCN_cscd.h \ FCN_csch.cpp FCN_csch.h \ FCN_date.cpp FCN_date.h \ FCN_dawson.cpp FCN_dawson.h \ FCN_deconvolute.cpp FCN_deconvolute.h \ FCN_deriv.cpp FCN_deriv.h \ FCN_det.cpp FCN_det.h \ FCN_digamma.cpp FCN_digamma.h \ FCN_dilog.cpp FCN_dilog.h \ FCN_ei.cpp FCN_ei.h \ FCN_eigen.cpp FCN_eigen.h \ FCN_einellic.cpp FCN_einellic.h \ FCN_ellice.cpp FCN_ellice.h \ FCN_ellick.cpp FCN_ellick.h \ FCN_eqs.cpp FCN_eqs.h \ FCN_erfc.cpp FCN_erfc.h \ FCN_erf.cpp FCN_erf.h \ FCN_evaluate.cpp FCN_evaluate.h \ FCN_exist.cpp FCN_exist.h \ FCN_expand.cpp FCN_expand.h \ FCN_exp.cpp FCN_exp.h \ FCN_expint.cpp FCN_expint.h \ FCN_expn.cpp FCN_expn.h \ FCN_factorial.cpp FCN_factorial.h \ FCN_ferdirac.cpp FCN_ferdirac.h \ FCN_fft.cpp FCN_fft.h \ FCN_finellic.cpp FCN_finellic.h \ FCN_fisher.cpp FCN_fisher.h \ FCN_fold.cpp FCN_fold.h \ FCN_frec1.cpp FCN_frec1.h \ FCN_frec2.cpp FCN_frec2.h \ FCN_fres1.cpp FCN_fres1.h \ FCN_fres2.cpp FCN_fres2.h \ FCN_gammacin.cpp FCN_gammacin.h \ FCN_gamma.cpp FCN_gamma.h \ FCN_gammain.cpp FCN_gammain.h \ FCN_gammatin.cpp FCN_gammatin.h \ FCN_gammln.cpp FCN_gammln.h \ FCN_gammq.cpp FCN_gammq.h \ FCN_gauss.cpp FCN_gauss.h \ FCN_gaussin.cpp FCN_gaussin.h \ FCN_gaussj.cpp FCN_gaussj.h \ FCN_gmean.cpp FCN_gmean.h \ FCN_heaviside.cpp FCN_heaviside.h \ FCN_hermite.cpp FCN_hermite.h \ FCN_hypgeo.cpp FCN_hypgeo.h \ FCN_ichar.cpp FCN_ichar.h \ FCN_iclose.cpp FCN_iclose.h \ FCN_identity.cpp FCN_identity.h \ FCN_iequal.cpp FCN_iequal.h \ FCN_ifft.cpp FCN_ifft.h \ FCN_imax.cpp FCN_imax.h \ FCN_imin.cpp FCN_imin.h \ FCN_index.cpp FCN_index.h \ FCN_int.cpp FCN_int.h \ FCN_integral.cpp FCN_integral.h \ FCN_interpolate.cpp FCN_interpolate.h \ FCN_inverse.cpp FCN_inverse.h \ FCN_jacobi.cpp FCN_jacobi.h \ FCN_jahnuf.cpp FCN_jahnuf.h \ FCN_join.cpp FCN_join.h \ FCN_kei.cpp FCN_kei.h \ FCN_ker.cpp FCN_ker.h \ FCN_kurt.cpp FCN_kurt.h \ FCN_laguerre.cpp FCN_laguerre.h \ FCN_lcase.cpp FCN_lcase.h \ FCN_legendre.cpp FCN_legendre.h \ FCN_len.cpp FCN_len.h \ FCN_lnagamma.cpp FCN_lnagamma.h \ FCN_lnbeta.cpp FCN_lnbeta.h \ FCN_ln.cpp FCN_ln.h \ FCN_log10.cpp FCN_log10.h \ FCN_logam.cpp FCN_logam.h \ FCN_log.cpp FCN_log.h \ FCN_max.cpp FCN_max.h \ FCN_mean.cpp FCN_mean.h \ FCN_median.cpp FCN_median.h \ FCN_min.cpp FCN_min.h \ FCN_mod.cpp FCN_mod.h \ FCN_nes.cpp FCN_nes.h \ FCN_nint.cpp FCN_nint.h \ FCN_normal.cpp FCN_normal.h \ FCN_null.cpp FCN_null.h \ FCN_pdiff.cpp FCN_pdiff.h \ FCN_pfactors.cpp FCN_pfactors.h \ FCN_plmn.cpp FCN_plmn.h \ FCN_plmu.cpp FCN_plmu.h \ FCN_poica.cpp FCN_poica.h \ FCN_poisson.cpp FCN_poisson.h \ FCN_prob.cpp FCN_prob.h \ FCN_prod.cpp FCN_prod.h \ FCN_psi.cpp FCN_psi.h \ FCN_racah.cpp FCN_racah.h \ FCN_radmac.cpp FCN_radmac.h \ FCN_rchar.cpp FCN_rchar.h \ FCN_rms.cpp FCN_rms.h \ FCN_roll.cpp FCN_roll.h \ FCN_rprod.cpp FCN_rprod.h \ FCN_rsum.cpp FCN_rsum.h \ FCN_savgol.cpp FCN_savgol.h \ FCN_sec.cpp FCN_sec.h \ FCN_secd.cpp FCN_secd.h \ FCN_sech.cpp FCN_sech.h \ FCN_sign.cpp FCN_sign.h \ FCN_simpleran.cpp FCN_simpleran.h \ FCN_sin.cpp FCN_sin.h \ FCN_sind.cpp FCN_sind.h \ FCN_sinh.cpp FCN_sinh.h \ FCN_skew.cpp FCN_skew.h \ FCN_sinint.cpp FCN_sinint.h \ FCN_smooth.cpp FCN_smooth.h \ FCN_splinterp.cpp FCN_splinterp.h \ FCN_splsmooth.cpp FCN_splsmooth.h \ FCN_sqrt.cpp FCN_sqrt.h \ FCN_stdev.cpp FCN_stdev.h \ FCN_step.cpp FCN_step.h \ FCN_string.cpp FCN_string.h \ FCN_struve0.cpp FCN_struve0.h \ FCN_struve1.cpp FCN_struve1.h \ FCN_student.cpp FCN_student.h \ FCN_studenti.cpp FCN_studenti.h \ FCN_sub.cpp FCN_sub.h \ FCN_sum.cpp FCN_sum.h \ FCN_sup.cpp FCN_sup.h \ FCN_tan.cpp FCN_tan.h \ FCN_tand.cpp FCN_tand.h \ FCN_tanh.cpp FCN_tanh.h \ FCN_tcase.cpp FCN_tcase.h \ FCN_time.cpp FCN_time.h \ FCN_tina.cpp FCN_tina.h \ FCN_ucase.cpp FCN_ucase.h \ FCN_var.cpp FCN_var.h \ FCN_varname.cpp FCN_varname.h \ FCN_vartype.cpp FCN_vartype.h \ FCN_vlen.cpp FCN_vlen.h \ FCN_voigt.cpp FCN_voigt.h \ FCN_volume.cpp FCN_volume.h \ FCN_walsh.cpp FCN_walsh.h \ FCN_where.cpp FCN_where.h \ FCN_wign3j.cpp FCN_wign3j.h \ FCN_wign6j.cpp FCN_wign6j.h \ FCN_wign9j.cpp FCN_wign9j.h \ FCN_wrap.cpp FCN_wrap.h \ FunctionDefinition.cpp FunctionDefinition.h \ FunctionTable.cpp FunctionTable.h \ ScalarFunction.cpp ScalarFunction.h \ ArrayFunction.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Functions/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Functions/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libfunctions.la: $(libfunctions_la_OBJECTS) $(libfunctions_la_DEPENDENCIES) $(CXXLINK) $(libfunctions_la_OBJECTS) $(libfunctions_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_abs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acosd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acosh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acotd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acoth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acsc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acscd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_acsch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_adev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_aerf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_aerfc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_agauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_airy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_area.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_asec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_asecd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_asech.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_asin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_asind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_asinh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_atan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_atan2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_atan2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_atand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_atanh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_bei.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ber.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besi0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besi1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besj0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besj1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besk0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besk1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besy0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_besy1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_betain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_binom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_biry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_bivarnor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_bivinterp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_bivsmooth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_canopen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_char.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cheby.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_chisq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_chisqi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_chlogu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_clebsg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_clen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_convolute.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cosd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cosh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cosint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cotd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_coth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_csc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_cscd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_csch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_date.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_dawson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_deconvolute.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_det.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_digamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_dilog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ei.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_eigen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_einellic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ellice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ellick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_eqs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_erf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_erfc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_evaluate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_exist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_exp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_expand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_expint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_expn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_factorial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ferdirac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_fft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_finellic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_fisher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_fold.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_frec1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_frec2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_fres1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_fres2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gammacin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gammain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gammatin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gammln.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gammq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gaussin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gaussj.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_gmean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_heaviside.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_hermite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_hypgeo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ichar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_iclose.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_identity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_iequal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ifft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_imax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_imin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_index.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_integral.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_interpolate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_inverse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_jacobi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_jahnuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_join.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_kei.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ker.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_kurt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_laguerre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_lcase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_legendre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_len.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ln.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_lnagamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_lnbeta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_log10.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_logam.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_max.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_mean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_median.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_min.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_mod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_nes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_nint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_normal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_null.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_pdiff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_pfactors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_plmn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_plmu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_poica.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_poisson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_prob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_prod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_psi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_racah.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_radmac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_rchar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_rms.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_roll.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_rprod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_rsum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_savgol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_secd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sech.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sign.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_simpleran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sinh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sinint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_skew.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_smooth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_splinterp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_splsmooth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sqrt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_stdev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_step.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_string.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_struve0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_struve1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_student.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_studenti.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_sup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_tan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_tand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_tanh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_tcase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_time.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_tina.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_ucase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_var.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_varname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_vartype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_vlen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_voigt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_volume.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_walsh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_where.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_wign3j.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_wign6j.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_wign9j.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FCN_wrap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FunctionDefinition.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FunctionTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ScalarFunction.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Functions/FCN_ferdirac.cpp0000644012702201742730000000211411274636611017724 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ferdirac.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_ferdirac *FCN_ferdirac::fcn_ferdirac_ = 0; void FCN_ferdirac::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::FermiDirac( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_voigt.cpp0000644012702201742730000000226211274636611017301 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_voigt.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_voigt *FCN_voigt::fcn_voigt_ = 0; void FCN_voigt::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::VoigtProfile( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_jacobi.h0000644012702201742730000000221411274636611017042 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_JACOBI #define FCN_JACOBI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_jacobi : public ScalarFunction { public: static FCN_jacobi *Instance() { if( !fcn_jacobi_ )fcn_jacobi_ = new FCN_jacobi(); return fcn_jacobi_; } void ScalarEval( int, std::vector & ) const; private: FCN_jacobi() : ScalarFunction( wxT("JACOBI"), 4, 4 ) {} static FCN_jacobi *fcn_jacobi_; }; #endif extrema-4.4.5/src/Functions/FCN_laguerre.h0000644012702201742730000000224411274636611017424 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_LAGUERRE #define FCN_LAGUERRE #include "wx/wx.h" #include "ScalarFunction.h" class FCN_laguerre : public ScalarFunction { public: static FCN_laguerre *Instance() { if( !fcn_laguerre_ )fcn_laguerre_ = new FCN_laguerre(); return fcn_laguerre_; } void ScalarEval( int, std::vector & ) const; private: FCN_laguerre() : ScalarFunction( wxT("LAGUERRE"), 2, 2 ) {} static FCN_laguerre *fcn_laguerre_; }; #endif extrema-4.4.5/src/Functions/FCN_cosd.cpp0000644012702201742730000000163411274636611017103 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_cosd.h" FCN_cosd *FCN_cosd::fcn_cosd_ = 0; void FCN_cosd::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = cos( rStack[j]*M_PI/180. ); } extrema-4.4.5/src/Functions/FCN_splsmooth.cpp0000644012702201742730000001074611274636611020207 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_splsmooth.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_splsmooth *FCN_splsmooth::fcn_splsmooth_ = 0; void FCN_splsmooth::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("SPLSMOOTH: first argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } else { nLoop = ndmEff; switch (++numberOfArguments_) { case 2: if( ndmEff != 1 ) throw EExpressionError( wxT("SPLSMOOTH: second argument must be a vector") ); break; case 3: if( ndmEff != 0 ) throw EExpressionError( wxT("SPLSMOOTH: third argument must be a scalar") ); break; case 4: if( ndmEff != 1 ) throw EExpressionError( wxT("SPLSMOOTH: fourth argument must be a vector") ); break; } } } void FCN_splsmooth::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; ExprCodes *arg3 = codes[2]; std::vector d1, d2; if( arg1->IsaNVariable() ) // arg1 is x { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("SPLSMOOTH: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); } std::size_t size1 = d1.size(); if( arg2->IsaNVariable() ) // arg2 is y { NumericData nd( arg2->GetNVarPtr()->GetData() ); d2.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w2 = arg2->GetWorkspacePtr(); if( w2->IsEmpty() ) throw EExpressionError( wxT("SPLSMOOTH: second argument workspace is empty") ); d2.assign( w2->GetData().begin(), w2->GetData().end() ); } std::size_t size2 = d2.size(); // if( size2 != size1 ) throw EExpressionError( wxT("SPLSMOOTH: vectors have different lengths") ); if( size1 < 2 ) throw EExpressionError( wxT("SPLSMOOTH: independent vector length < 2") ); // double d3; if( arg3->IsaNVariable() ) { d3 = arg3->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg3->IsaWorkspace() ) { if( arg3->GetWorkspacePtr()->IsEmpty() ) throw EExpressionError( wxT("SPLSMOOTH: third argument workspace is empty") ); d3 = arg3->GetWorkspacePtr()->GetValue(); } else { d3 = arg3->GetConstantValue(); } int npts = static_cast(d3+0.5); if( npts < 2 )throw EExpressionError( wxT("SPLSMOOTH: number of output points must be > 1") ); // std::vector d4; if( numberOfArguments_ == 4 ) // arg4 is the weights { ExprCodes *arg4 = codes[3]; if( arg4->IsaNVariable() ) { NumericData nd( arg4->GetNVarPtr()->GetData() ); d4.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w4 = arg4->GetWorkspacePtr(); if( w4->IsEmpty() ) throw EExpressionError( wxT("SPLSMOOTH: fourth argument workspace is empty") ); d4.assign( w4->GetData().begin(), w4->GetData().end() ); } if( d4.size() != size1 ) throw EExpressionError( wxT("SPLSMOOTH: vectors have different lengths") ); } else { d4.insert( d4.begin(), size1, 1.0 ); } std::vector xx( npts, 0.0 ); std::vector yy( npts, 0.0 ); try { UsefulFunctions::Splsmooth( d1, d2, d4, xx, yy ); } catch (EExpressionError &e) { throw; } for( int i=0; iSetNumberOfDimensions(2); ws->SetDimMag( 0, npts ); ws->SetDimMag( 1, 2 ); ws->SetData( xx ); } // end of file extrema-4.4.5/src/Functions/FCN_mod.cpp0000644012702201742730000000166211274636611016733 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_mod.h" FCN_mod *FCN_mod::fcn_mod_ = 0; void FCN_mod::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = fmod( rStack[j], rStack[j+1] ); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_sqrt.h0000644012702201742730000000216011274636611016604 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SQRT #define FCN_SQRT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sqrt : public ScalarFunction { public: static FCN_sqrt *Instance() { if( !fcn_sqrt_ )fcn_sqrt_ = new FCN_sqrt(); return fcn_sqrt_; } void ScalarEval( int, std::vector & ) const; private: FCN_sqrt() : ScalarFunction( wxT("SQRT") ) {} static FCN_sqrt *fcn_sqrt_; }; #endif extrema-4.4.5/src/Functions/FCN_sind.h0000644012702201742730000000216011274636611016550 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SIND #define FCN_SIND #include "wx/wx.h" #include "ScalarFunction.h" class FCN_sind : public ScalarFunction { public: static FCN_sind *Instance() { if( !fcn_sind_ )fcn_sind_ = new FCN_sind(); return fcn_sind_; } void ScalarEval( int, std::vector & ) const; private: FCN_sind() : ScalarFunction( wxT("SIND") ) {} static FCN_sind *fcn_sind_; }; #endif extrema-4.4.5/src/Functions/FCN_atanh.h0000644012702201742730000000217411274636611016713 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ATANH #define FCN_ATANH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_atanh : public ScalarFunction { public: static FCN_atanh *Instance() { if( !fcn_atanh_ )fcn_atanh_ = new FCN_atanh(); return fcn_atanh_; } void ScalarEval( int, std::vector & ) const; private: FCN_atanh() : ScalarFunction( wxT("ATANH") ) {} static FCN_atanh *fcn_atanh_; }; #endif extrema-4.4.5/src/Functions/FCN_cosd.h0000644012702201742730000000216011274636611016543 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COSD #define FCN_COSD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cosd : public ScalarFunction { public: static FCN_cosd *Instance() { if( !fcn_cosd_ )fcn_cosd_ = new FCN_cosd(); return fcn_cosd_; } void ScalarEval( int, std::vector & ) const; private: FCN_cosd() : ScalarFunction( wxT("COSD") ) {} static FCN_cosd *fcn_cosd_; }; #endif extrema-4.4.5/src/Functions/FCN_fres1.cpp0000644012702201742730000000203111274636611017163 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_fres1.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_fres1 *FCN_fres1::fcn_fres1_ = 0; void FCN_fres1::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::FresnelS( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_airy.h0000644012702201742730000000215711274636611016565 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_AIRY #define FCN_AIRY #include "wx/wx.h" #include "ScalarFunction.h" class FCN_airy : public ScalarFunction { public: static FCN_airy *Instance() { if( !fcn_airy_ )fcn_airy_ = new FCN_airy(); return fcn_airy_; } void ScalarEval( int, std::vector & ) const; private: FCN_airy() : ScalarFunction( wxT("AIRY") ) {} static FCN_airy *fcn_airy_; }; #endif extrema-4.4.5/src/Functions/FCN_acot.h0000644012702201742730000000215611274636611016546 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ACOT #define FCN_ACOT #include "wx/wx.h" #include "ScalarFunction.h" class FCN_acot : public ScalarFunction { public: static FCN_acot *Instance() { if( !fcn_acot_ )fcn_acot_ = new FCN_acot(); return fcn_acot_; } void ScalarEval( int, std::vector & ) const; private: FCN_acot() : ScalarFunction( wxT("ACOT") ) {} static FCN_acot *fcn_acot_; }; #endif extrema-4.4.5/src/Functions/FCN_poica.h0000644012702201742730000000220011274636611016701 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_POICA #define FCN_POICA #include "wx/wx.h" #include "ScalarFunction.h" class FCN_poica : public ScalarFunction { public: static FCN_poica *Instance() { if( !fcn_poica_ )fcn_poica_ = new FCN_poica(); return fcn_poica_; } void ScalarEval( int, std::vector & ) const; private: FCN_poica() : ScalarFunction( wxT("POICA"), 3, 3 ) {} static FCN_poica *fcn_poica_; }; #endif extrema-4.4.5/src/Functions/FCN_aerf.cpp0000644012702201742730000000203111274636611017060 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_aerf.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_aerf *FCN_aerf::fcn_aerf_ = 0; void FCN_aerf::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ErrorInverse( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_int.cpp0000644012702201742730000000144411274636611016744 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_int.h" FCN_int *FCN_int::fcn_int_ = 0; // end of file extrema-4.4.5/src/Functions/FCN_gmean.h0000644012702201742730000000225211274636611016704 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GMEAN #define FCN_GMEAN #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_gmean : public ArrayFunction { public: static FCN_gmean *Instance() { if( !fcn_gmean_ )fcn_gmean_ = new FCN_gmean(); return fcn_gmean_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_gmean() : ArrayFunction( wxT("GMEAN"), 1, 2 ) {} static FCN_gmean *fcn_gmean_; }; #endif extrema-4.4.5/src/Functions/FCN_canopen.h0000644012702201742730000000230611274636611017240 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CANOPEN #define FCN_CANOPEN #include "wx/wx.h" #include "ArrayFunction.h" class FCN_canopen : public ArrayFunction { public: static FCN_canopen *Instance() { if( !fcn_canopen_ )fcn_canopen_ = new FCN_canopen(); return fcn_canopen_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_canopen() : ArrayFunction( wxT("CANOPEN"), 1, 1, MIXED2NUM, CHARACTER ) {} static FCN_canopen *fcn_canopen_; }; #endif extrema-4.4.5/src/Functions/FCN_expand.cpp0000644012702201742730000000532611274636611017434 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_expand.h" #include "Workspace.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "TextVariable.h" #include "NumericData.h" #include "NumericVariable.h" #include "OperatorDefinition.h" FCN_expand *FCN_expand::fcn_expand_ = 0; void FCN_expand::TextScalarEval( int j, std::vector &sStack ) const { wxString str( sStack[j] ); try { while ( FillOut(str) ); } catch( EExpressionError &e ) { throw; } sStack[j] = str; } bool FCN_expand::FillOut( wxString &str ) const { Workspace *ws = new Workspace(str); try { ws->ParseAndCheck( true ); } catch( EExpressionError &e ) { delete ws; throw; } wxString s; bool foundTV = false; std::deque &codes = ws->GetCodes(); std::deque::iterator end = codes.end(); for( std::deque::iterator i=codes.begin(); i!=end; ++i ) { if( (*i)->IsaTVariable() ) { NumericData *ia = 0; NumericData *ic = 0; s += wxT("(")+(*i)->GetTVarPtr()->GetString(ia,ic)+wxT(")"); foundTV = true; } else if( (*i)->IsaFunction() ) { s += (*i)->GetFcnPtr()->Name(); } else if( (*i)->IsaNVariable() ) { s += (*i)->GetNVarPtr()->GetName(); } else if( (*i)->IsaTString() ) { s += (*i)->GetTString(); } else if( (*i)->IsaConstant() ) { s += (*i)->GetConstantString(); } else if( (*i)->IsaOperator() ) { s += (*i)->GetOpPtr()->Name(); } else if( (*i)->IsaOpeningBracket() ) { s += '('; } else if( (*i)->IsaClosingBracket() ) { s += ')'; } else if( (*i)->IsaComma() ) { s += ','; } else if( (*i)->IsaSemicolon() ) { s += ';'; } else if( (*i)->IsaHash() ) { s += '#'; } else if( (*i)->IsaAsterisk() ) { s += '*'; } else if( (*i)->IsaImmediateValue() ) { s += (*i)->GetImmediateValue(); } } str = s; delete ws; return foundTV; } extrema-4.4.5/src/Functions/FCN_atan2d.cpp0000644012702201742730000000212611274636611017321 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_atan2d.h" #include "EExpressionError.h" FCN_atan2d *FCN_atan2d::fcn_atan2d_ = 0; void FCN_atan2d::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j]==0.0 && rStack[j+1]==0.0 ) throw EExpressionError( wxT("ATAN2D: both arguments = 0") ); rStack[j] = atan2( rStack[j], rStack[j+1] )*180./M_PI; rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_imax.cpp0000644012702201742730000000435311274636611017112 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_imax.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_imax *FCN_imax::fcn_imax_ = 0; void FCN_imax::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { numberOfArguments_ = 1; nLoop = 0; } void FCN_imax::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1=codes[0]; std::vector d1; int ndm1, size1; // if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); ndm1 = nd.GetNumberOfDimensions(); if( ndm1 != 1 ) throw EExpressionError( wxT("IMAX: argument must be a vector") ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = d1.size(); } else if( arg1->IsaWorkspace() ) { Workspace *w = arg1->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("IMAX: argument workspace is empty") ); ndm1 = w->GetNumberOfDimensions(); if( ndm1 != 1 ) throw EExpressionError( wxT("IMAX: argument must be a vector") ); d1.assign( w->GetData().begin(), w->GetData().end() ); size1 = d1.size(); } else // argument must be a constant throw EExpressionError( wxT("IMAX: argument must be a vector") ); // int imax = 0; double xmax = d1[0]; for( int i=0; iSetValue( static_cast(imax+1) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_where.cpp0000644012702201742730000000402411274636611017261 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_where.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_where *FCN_where::fcn_where_ = 0; void FCN_where::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("argument of WHERE function must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } } void FCN_where::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; std::vector d1; std::size_t size1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = nd.GetDimMag(0); } else // argument 1 must be a workspace { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("WHERE: argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); size1 = w1->GetDimMag(0); } std::size_t counter = 0; for( std::size_t i=0; iSetData( counter++, static_cast(i+1) ); } if( counter > 0 )ws->SetAscending(); ws->SetDimMag( 0, counter ); ws->SetNumberOfDimensions(1); } // end of file extrema-4.4.5/src/Functions/FCN_acosd.cpp0000644012702201742730000000164211274636611017243 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_acosd.h" FCN_acosd *FCN_acosd::fcn_acosd_ = 0; void FCN_acosd::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = acos( rStack[j] )*180./M_PI; } extrema-4.4.5/src/Functions/FCN_gammq.cpp0000644012702201742730000000210311274636611017245 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gammq.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gammq *FCN_gammq::fcn_gammq_ = 0; void FCN_gammq::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::IncompleteGamma2( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_skew.h0000644012702201742730000000223611274636611016570 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SKEW #define FCN_SKEW #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_skew : public ArrayFunction { public: static FCN_skew *Instance() { if( !fcn_skew_ )fcn_skew_ = new FCN_skew(); return fcn_skew_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_skew() : ArrayFunction( wxT("SKEW"), 1, 2 ) {} static FCN_skew *fcn_skew_; }; #endif extrema-4.4.5/src/Functions/FCN_cotd.cpp0000644012702201742730000000203211274636611017075 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_cotd.h" #include "EExpressionError.h" FCN_cotd *FCN_cotd::fcn_cotd_ = 0; void FCN_cotd::ScalarEval( int j, std::vector &rStack ) const { double t = tan( rStack[j]*M_PI/180. ); if( t == 0.0 )throw EExpressionError( wxT("COTD: tan(argument) = 0") ); rStack[j] = 1.0/t; } extrema-4.4.5/src/Functions/FCN_median.cpp0000644012702201742730000000417211274636611017410 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_median.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_median *FCN_median::fcn_median_ = 0; void FCN_median::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { numberOfArguments_ = 1; nLoop = 0; } void FCN_median::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg=codes[0]; std::vector d; int ndm, size; // if( arg->IsaNVariable() ) { NumericData nd( arg->GetNVarPtr()->GetData() ); ndm = nd.GetNumberOfDimensions(); if( ndm != 1 ) throw EExpressionError( wxT("MEDIAN: argument must be a vector") ); d.assign( nd.GetData().begin(), nd.GetData().end() ); size = d.size(); } else if( arg->IsaWorkspace() ) { Workspace *w = arg->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("MEDIAN: argument workspace is empty") ); ndm = w->GetNumberOfDimensions(); if( ndm != 1 ) throw EExpressionError( wxT("MEDIAN: argument must be a vector") ); d.assign( w->GetData().begin(), w->GetData().end() ); size = d.size(); } else // first argument must be a constant throw EExpressionError( wxT("MEDIAN: argument must be a vector") ); // ws->SetValue( UsefulFunctions::Median(d) ); ws->SetNumberOfDimensions(0); ws->SetDimMag( 0, 0 ); } // end of file extrema-4.4.5/src/Functions/FCN_area.h0000644012702201742730000000223111274636611016522 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_AREA #define FCN_AREA #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_area : public ArrayFunction { public: static FCN_area *Instance() { if( !fcn_area_ )fcn_area_ = new FCN_area(); return fcn_area_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_area() : ArrayFunction( wxT("AREA"), 2, 2 ) {} static FCN_area *fcn_area_; }; #endif extrema-4.4.5/src/Functions/FCN_csch.cpp0000644012702201742730000000201611274636611017066 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_csch.h" #include "EExpressionError.h" FCN_csch *FCN_csch::fcn_csch_ = 0; void FCN_csch::ScalarEval( int j, std::vector &rStack ) const { if( sinh(rStack[j]) == 0.0 )throw EExpressionError( wxT("CSCH: sinh(argument) = 0") ); rStack[j] = 1./sinh(rStack[j]); } extrema-4.4.5/src/Functions/FCN_hypgeo.h0000644012702201742730000000221411274636611017106 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_HYPGEO #define FCN_HYPGEO #include "wx/wx.h" #include "ScalarFunction.h" class FCN_hypgeo : public ScalarFunction { public: static FCN_hypgeo *Instance() { if( !fcn_hypgeo_ )fcn_hypgeo_ = new FCN_hypgeo(); return fcn_hypgeo_; } void ScalarEval( int, std::vector & ) const; private: FCN_hypgeo() : ScalarFunction( wxT("HYPGEO"), 4, 4 ) {} static FCN_hypgeo *fcn_hypgeo_; }; #endif extrema-4.4.5/src/Functions/FCN_gammln.cpp0000644012702201742730000000203511274636611017422 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gammln.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gammln *FCN_gammln::fcn_gammln_ = 0; void FCN_gammln::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::LnGamma( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_exist.h0000644012702201742730000000225711274636611016756 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_EXIST #define FCN_EXIST #include "wx/wx.h" #include "ArrayFunction.h" class FCN_exist : public ArrayFunction { public: static FCN_exist *Instance() { if( !fcn_exist_ )fcn_exist_ = new FCN_exist(); return fcn_exist_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_exist() : ArrayFunction( wxT("EXIST"), 1, 1, MIXED2NUM, CHARACTER ) {} static FCN_exist *fcn_exist_; }; #endif extrema-4.4.5/src/Functions/FCN_wrap.h0000644012702201742730000000223611274636611016570 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_WRAP #define FCN_WRAP #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_wrap : public ArrayFunction { public: static FCN_wrap *Instance() { if( !fcn_wrap_ )fcn_wrap_ = new FCN_wrap(); return fcn_wrap_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_wrap() : ArrayFunction( wxT("WRAP"), 2, 2 ) {} static FCN_wrap *fcn_wrap_; }; #endif extrema-4.4.5/src/Functions/FCN_heaviside.cpp0000644012702201742730000000177711274636611020124 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_heaviside.h" FCN_heaviside *FCN_heaviside::fcn_heaviside_ = 0; void FCN_heaviside::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] < 0.0 )rStack[j] = 0.0; else if( rStack[j] == 0.0 )rStack[j] = 0.5; else rStack[j] = 1.0; } extrema-4.4.5/src/Functions/FCN_iclose.h0000644012702201742730000000226711274636611017101 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ICLOSE #define FCN_ICLOSE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_iclose : public ArrayFunction { public: static FCN_iclose *Instance() { if( !fcn_iclose_ )fcn_iclose_ = new FCN_iclose(); return fcn_iclose_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_iclose() : ArrayFunction( wxT("ICLOSE"), 2, 2 ) {} static FCN_iclose *fcn_iclose_; }; #endif extrema-4.4.5/src/Functions/FCN_sup.h0000644012702201742730000000226311274636611016426 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SUP #define FCN_SUP #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_sup : public ArrayFunction { public: static FCN_sup *Instance() { if( !fcn_sup_ )fcn_sup_ = new FCN_sup(); return fcn_sup_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_sup() : ArrayFunction( wxT("SUP"), 2, 2, MIXED2NUM, CHARACTER, CHARACTER ) {} static FCN_sup *fcn_sup_; }; #endif extrema-4.4.5/src/Functions/FCN_iequal.h0000644012702201742730000000226711274636611017103 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_IEQUAL #define FCN_IEQUAL #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_iequal : public ArrayFunction { public: static FCN_iequal *Instance() { if( !fcn_iequal_ )fcn_iequal_ = new FCN_iequal(); return fcn_iequal_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_iequal() : ArrayFunction( wxT("IEQUAL"), 2, 2 ) {} static FCN_iequal *fcn_iequal_; }; #endif extrema-4.4.5/src/Functions/FCN_besi1.h0000644012702201742730000000217311274636611016622 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESI1 #define FCN_BESI1 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besi1 : public ScalarFunction { public: static FCN_besi1 *Instance() { if( !fcn_besi1_ )fcn_besi1_ = new FCN_besi1(); return fcn_besi1_; } void ScalarEval( int, std::vector & ) const; private: FCN_besi1() : ScalarFunction( wxT("BESI1") ) {} static FCN_besi1 *fcn_besi1_; }; #endif extrema-4.4.5/src/Functions/FCN_biry.h0000644012702201742730000000215611274636611016565 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BIRY #define FCN_BIRY #include "wx/wx.h" #include "ScalarFunction.h" class FCN_biry : public ScalarFunction { public: static FCN_biry *Instance() { if( !fcn_biry_ )fcn_biry_ = new FCN_biry(); return fcn_biry_; } void ScalarEval( int, std::vector & ) const; private: FCN_biry() : ScalarFunction( wxT("BIRY") ) {} static FCN_biry *fcn_biry_; }; #endif extrema-4.4.5/src/Functions/FCN_nes.cpp0000644012702201742730000000300611274636611016733 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_nes.h" #include "Workspace.h" #include "ExprCodes.h" #include "TextVariable.h" #include "EExpressionError.h" FCN_nes *FCN_nes::fcn_nes_ = 0; void FCN_nes::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { nLoop = 0; numberOfArguments_ = 1; } else { ++numberOfArguments_; nLoop = ndmEff; } } void FCN_nes::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; if( !arg1->IsaTString() || !arg2->IsaTString() ) throw EExpressionError( wxT("both arguments of NES function must be character") ); if( arg1->GetTString() != arg2->GetTString() ) ws->SetValue( 1.0 ); // true else ws->SetValue( 0.0 ); // false } // end of file extrema-4.4.5/src/Functions/FCN_besk0.h0000644012702201742730000000217311274636611016623 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BESK0 #define FCN_BESK0 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_besk0 : public ScalarFunction { public: static FCN_besk0 *Instance() { if( !fcn_besk0_ )fcn_besk0_ = new FCN_besk0(); return fcn_besk0_; } void ScalarEval( int, std::vector & ) const; private: FCN_besk0() : ScalarFunction( wxT("BESK0") ) {} static FCN_besk0 *fcn_besk0_; }; #endif extrema-4.4.5/src/Functions/FCN_det.cpp0000644012702201742730000000465311274636611016733 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_det.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_det *FCN_det::fcn_det_ = 0; void FCN_det::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 2 ) throw EExpressionError( wxT("DET: argument must be a matrix") ); numberOfArguments_ = 1; nLoop = 2; } } void FCN_det::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; std::vector d1; int size1a[2]; int ndm1; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( int i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("DET: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( int i=0; iGetDimMag(i); } if( size1a[0] != size1a[1] ) throw EExpressionError( wxT("DET: first argument must be a square matrix") ); int size1 = size1a[0]; // if( size1 < 2 ) throw EExpressionError( wxT("DET: matrix dimension < 2") ); // std::vector indx( size1, 0 ); int id; try { id = UsefulFunctions::LUDecomposition( d1, indx ); } catch( EExpressionError &e ) { throw; } double d = static_cast(id); for( int i=0; iSetValue( d ); ws->SetNumberOfDimensions(0); } // end of file extrema-4.4.5/src/Functions/FCN_aerfc.h0000644012702201742730000000217211274636611016676 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_AERFC #define FCN_AERFC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_aerfc : public ScalarFunction { public: static FCN_aerfc *Instance() { if( !fcn_aerfc_ )fcn_aerfc_ = new FCN_aerfc(); return fcn_aerfc_; } void ScalarEval( int, std::vector & ) const; private: FCN_aerfc() : ScalarFunction( wxT("AERFC") ) {} static FCN_aerfc *fcn_aerfc_; }; #endif extrema-4.4.5/src/Functions/FCN_besk0.cpp0000644012702201742730000000203111274636611017147 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besk0.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besk0 *FCN_besk0::fcn_besk0_ = 0; void FCN_besk0::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselK0( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_besy0.cpp0000644012702201742730000000203111274636611017165 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besy0.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besy0 *FCN_besy0::fcn_besy0_ = 0; void FCN_besy0::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselY0( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_step.h0000644012702201742730000000223611274636611016572 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_STEP #define FCN_STEP #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_step : public ArrayFunction { public: static FCN_step *Instance() { if( !fcn_step_ )fcn_step_ = new FCN_step(); return fcn_step_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_step() : ArrayFunction( wxT("STEP"), 2, 2 ) {} static FCN_step *fcn_step_; }; #endif extrema-4.4.5/src/Functions/FCN_splsmooth.h0000644012702201742730000000233311274636611017645 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_SPLSMOOTH #define FCN_SPLSMOOTH #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_splsmooth : public ArrayFunction { public: static FCN_splsmooth *Instance() { if( !fcn_splsmooth_ )fcn_splsmooth_ = new FCN_splsmooth(); return fcn_splsmooth_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_splsmooth() : ArrayFunction( wxT("SPLSMOOTH"), 3, 4 ) {} static FCN_splsmooth *fcn_splsmooth_; }; #endif extrema-4.4.5/src/Functions/FCN_finellic.h0000644012702201742730000000224411274636611017403 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FINELLIC #define FCN_FINELLIC #include "wx/wx.h" #include "ScalarFunction.h" class FCN_finellic : public ScalarFunction { public: static FCN_finellic *Instance() { if( !fcn_finellic_ )fcn_finellic_ = new FCN_finellic(); return fcn_finellic_; } void ScalarEval( int, std::vector & ) const; private: FCN_finellic() : ScalarFunction( wxT("FINELLIC"), 2, 2 ) {} static FCN_finellic *fcn_finellic_; }; #endif extrema-4.4.5/src/Functions/FCN_gammacin.cpp0000644012702201742730000000213611274636611017725 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_gammacin.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_gammacin *FCN_gammacin::fcn_gammacin_ = 0; void FCN_gammacin::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ComplementaryIncompleteGamma( rStack[j], rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_walsh.h0000644012702201742730000000220011274636611016724 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_WALSH #define FCN_WALSH #include "wx/wx.h" #include "ScalarFunction.h" class FCN_walsh : public ScalarFunction { public: static FCN_walsh *Instance() { if( !fcn_walsh_ )fcn_walsh_ = new FCN_walsh(); return fcn_walsh_; } void ScalarEval( int, std::vector & ) const; private: FCN_walsh() : ScalarFunction( wxT("WALSH"), 2, 2 ) {} static FCN_walsh *fcn_walsh_; }; #endif extrema-4.4.5/src/Functions/FCN_inverse.h0000644012702201742730000000227611274636611017276 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_INVERSE #define FCN_INVERSE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_inverse : public ArrayFunction { public: static FCN_inverse *Instance() { if( !fcn_inverse_ )fcn_inverse_ = new FCN_inverse(); return fcn_inverse_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_inverse() : ArrayFunction( wxT("INVERSE") ) {} static FCN_inverse *fcn_inverse_; }; #endif extrema-4.4.5/src/Functions/FCN_simpleran.h0000644012702201742730000000223211274636611017605 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RAN #define FCN_RAN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_simpleran : public ScalarFunction { public: static FCN_simpleran *Instance() { if( !fcn_simpleran_ )fcn_simpleran_ = new FCN_simpleran(); return fcn_simpleran_; } void ScalarEval( int, std::vector & ) const; private: FCN_simpleran() : ScalarFunction( wxT("RAN") ) {} static FCN_simpleran *fcn_simpleran_; }; #endif extrema-4.4.5/src/Functions/FCN_null.cpp0000644012702201742730000000142711274636611017125 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_null.h" FCN_null *FCN_null::fcn_null_ = 0; extrema-4.4.5/src/Functions/FCN_gammq.h0000644012702201742730000000220011274636611016710 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_GAMMQ #define FCN_GAMMQ #include "wx/wx.h" #include "ScalarFunction.h" class FCN_gammq : public ScalarFunction { public: static FCN_gammq *Instance() { if( !fcn_gammq_ )fcn_gammq_ = new FCN_gammq(); return fcn_gammq_; } void ScalarEval( int, std::vector & ) const; private: FCN_gammq() : ScalarFunction( wxT("GAMMQ"), 2, 2 ) {} static FCN_gammq *fcn_gammq_; }; #endif extrema-4.4.5/src/Functions/FCN_wign3j.cpp0000644012702201742730000000246011274636611017352 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_wign3j.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_wign3j *FCN_wign3j::fcn_wign3j_ = 0; void FCN_wign3j::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Wigner3JSymbol( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3], rStack[j+4], rStack[j+5] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_fisher.cpp0000644012702201742730000000225211274636611017430 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_fisher.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_fisher *FCN_fisher::fcn_fisher_ = 0; void FCN_fisher::ScalarEval( int j, std::vector &rStack ) const { int m = static_cast(rStack[j]); int n = static_cast(rStack[j+1]); try { rStack[j] = UsefulFunctions::FisherDistribution( m, n, rStack[j+2] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_chisqi.cpp0000644012702201742730000000212611274636611017430 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_chisqi.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_chisqi *FCN_chisqi::fcn_chisqi_ = 0; void FCN_chisqi::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::ChisqInverse( rStack[j], static_cast(rStack[j+1]) ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_iequal.cpp0000644012702201742730000000510511274636611017430 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "FCN_iequal.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_iequal *FCN_iequal::fcn_iequal_ = 0; void FCN_iequal::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff != 1 ) throw EExpressionError( wxT("first argument of IEQUAL function must be a vector") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 0 ) throw EExpressionError( wxT("second argument of IEQUAL function must be a scalar") ); numberOfArguments_ = 2; } } void FCN_iequal::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1; std::size_t size1; int startIndex; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); size1 = nd.GetDimMag(0); startIndex = 1; } else // argument 1 must be a workspace { Workspace *w1 = arg1->GetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("IEQUAL: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); size1 = w1->GetDimMag(0); startIndex = 1; } double value; if( arg2->IsaNVariable() ) { value = arg2->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg2->IsaWorkspace() ) { value = arg2->GetWorkspacePtr()->GetValue(); } else { value = arg2->GetConstantValue(); } ws->SetValue( 0.0 ); for( std::size_t i=0; i::epsilon() ) { ws->SetValue( static_cast(startIndex+i) ); break; } } ws->SetNumberOfDimensions(0); } // end of file extrema-4.4.5/src/Functions/FCN_rsum.cpp0000644012702201742730000000354411274636611017143 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_rsum.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_rsum *FCN_rsum::fcn_rsum_ = 0; void FCN_rsum::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( ndmEff != 1 ) throw EExpressionError( wxT("RSUM: argument must be a vector") ); numberOfArguments_ = 1; nLoop = 1; } void FCN_rsum::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg = codes[0]; std::vector d; if( arg->IsaNVariable() ) // arg is x { NumericData nd( arg->GetNVarPtr()->GetData() ); d.assign( nd.GetData().begin(), nd.GetData().end() ); } else { Workspace *w = arg->GetWorkspacePtr(); if( w->IsEmpty() ) throw EExpressionError( wxT("RSUM: first argument workspace is empty") ); d.assign( w->GetData().begin(), w->GetData().end() ); } std::size_t size = d.size(); // std::vector rsum( size, 0.0 ); rsum[0] = d[0]; for( std::size_t i=1; iSetNumberOfDimensions(1); ws->SetDimMag( 0, size ); ws->SetData( rsum ); } // end of file extrema-4.4.5/src/Functions/FCN_date.h0000644012702201742730000000247311274636611016537 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DATE #define FCN_DATE #include "wx/wx.h" #include "FunctionDefinition.h" class FCN_date : public FunctionDefinition { public: static FCN_date *Instance() { if( !fcn_date_ )fcn_date_ = new FCN_date(); return fcn_date_; } void TextScalarEval( int, std::vector & ) const; private: FCN_date() : FunctionDefinition( wxT("DATE"), 0, 1, CHAR2CHAR, CHARACTER ) {} wxString ParseInputString( wxString const &, wxChar &, int &, int &, int & ) const; void AddToFormat( wxString &, wxChar, int, int, int ) const; static FCN_date *fcn_date_; }; #endif extrema-4.4.5/src/Functions/FCN_radmac.cpp0000644012702201742730000000212411274636611017375 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_radmac.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_radmac *FCN_radmac::fcn_radmac_ = 0; void FCN_radmac::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Rademacher( static_cast(rStack[j]), rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_varname.cpp0000644012702201742730000000146311274636611017604 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_varname.h" FCN_varname *FCN_varname::fcn_varname_ = 0; // end of file extrema-4.4.5/src/Functions/FCN_wign6j.cpp0000644012702201742730000000246011274636611017355 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_wign6j.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_wign6j *FCN_wign6j::fcn_wign6j_ = 0; void FCN_wign6j::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::Wigner6JSymbol( rStack[j], rStack[j+1], rStack[j+2], rStack[j+3], rStack[j+4], rStack[j+5] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_atan.h0000644012702201742730000000216011274636611016536 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ATAN #define FCN_ATAN #include "wx/wx.h" #include "ScalarFunction.h" class FCN_atan : public ScalarFunction { public: static FCN_atan *Instance() { if( !fcn_atan_ )fcn_atan_ = new FCN_atan(); return fcn_atan_; } void ScalarEval( int, std::vector & ) const; private: FCN_atan() : ScalarFunction( wxT("ATAN") ) {} static FCN_atan *fcn_atan_; }; #endif extrema-4.4.5/src/Functions/FCN_max.h0000644012702201742730000000222311274636611016400 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_MAX #define FCN_MAX #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_max : public ArrayFunction { public: static FCN_max *Instance() { if( !fcn_max_ )fcn_max_ = new FCN_max(); return fcn_max_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_max() : ArrayFunction( wxT("MAX"), 1, 20 ) {} static FCN_max *fcn_max_; }; #endif extrema-4.4.5/src/Functions/FCN_ellice.cpp0000644012702201742730000000205711274636611017410 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_ellice.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_ellice *FCN_ellice::fcn_ellice_ = 0; void FCN_ellice::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::CompleteEllipticIntegral2( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_frec2.h0000644012702201742730000000217211274636611016617 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FREC2 #define FCN_FREC2 #include "wx/wx.h" #include "ScalarFunction.h" class FCN_frec2 : public ScalarFunction { public: static FCN_frec2 *Instance() { if( !fcn_frec2_ )fcn_frec2_ = new FCN_frec2(); return fcn_frec2_; } void ScalarEval( int, std::vector & ) const; private: FCN_frec2() : ScalarFunction( wxT("FREC2") ) {} static FCN_frec2 *fcn_frec2_; }; #endif extrema-4.4.5/src/Functions/FCN_exp.cpp0000644012702201742730000000207411274636611016746 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "FCN_exp.h" #include "EExpressionError.h" FCN_exp *FCN_exp::fcn_exp_ = 0; void FCN_exp::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] > log(std::numeric_limits::max()) ) throw EExpressionError( wxT("max value for exp exceeded") ); rStack[j] = exp( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_det.h0000644012702201742730000000221311274636611016366 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_DET #define FCN_DET #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_det : public ArrayFunction { public: static FCN_det *Instance() { if( !fcn_det_ )fcn_det_ = new FCN_det(); return fcn_det_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_det() : ArrayFunction( wxT("DET") ) {} static FCN_det *fcn_det_; }; #endif extrema-4.4.5/src/Functions/FCN_rms.h0000644012702201742730000000222211274636611016413 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RMS #define FCN_RMS #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_rms : public ArrayFunction { public: static FCN_rms *Instance() { if( !fcn_rms_ )fcn_rms_ = new FCN_rms(); return fcn_rms_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_rms() : ArrayFunction( wxT("RMS"), 1, 2 ) {} static FCN_rms *fcn_rms_; }; #endif extrema-4.4.5/src/Functions/FCN_roll.cpp0000644012702201742730000001056011274636611017121 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_roll.h" #include "Workspace.h" #include "ExprCodes.h" #include "NumericVariable.h" #include "EExpressionError.h" FCN_roll *FCN_roll::fcn_roll_ = 0; void FCN_roll::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { if( firstArgument ) { if( ndmEff!=1 && ndmEff!=2 ) throw EExpressionError( wxT("first argument of ROLL function must be a vector or matrix") ); numberOfArguments_ = 1; nLoop = 0; } else { if( ndmEff != 0 ) throw EExpressionError( wxT("second argument of ROLL function must be a scalar") ); numberOfArguments_ = 2; } } void FCN_roll::ArrayEval( Workspace *ws ) { std::deque &codes = ws->GetCodes(); ExprCodes *arg1 = codes[0]; ExprCodes *arg2 = codes[1]; std::vector d1; std::size_t size1[2]; int ndm1; double step; if( arg1->IsaNVariable() ) { NumericData nd( arg1->GetNVarPtr()->GetData() ); d1.assign( nd.GetData().begin(), nd.GetData().end() ); ndm1 = nd.GetNumberOfDimensions(); for( unsigned short int i=0; iGetWorkspacePtr(); if( w1->IsEmpty() ) throw EExpressionError( wxT("ROLL: first argument workspace is empty") ); d1.assign( w1->GetData().begin(), w1->GetData().end() ); ndm1 = w1->GetNumberOfDimensions(); for( unsigned short int i=0; iGetDimMag(i); } if( arg2->IsaNVariable() ) { step = arg2->GetNVarPtr()->GetData().GetScalarValue(); } else if( arg2->IsaWorkspace() ) { step = arg2->GetWorkspacePtr()->GetValue(); } else { step = arg2->GetConstantValue(); } if( step == 0.0 ) { if( ndm1 == 1 ) { for( std::size_t i=0; iSetData( i, d1[i] ); ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, size1[0] ); } else if( ndm1 == 2 ) { for( std::size_t i=0; iSetData( i, d1[i] ); ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, size1[0] ); ws->SetDimMag( 1, size1[1] ); } } else { int j1, j2; int istep = static_cast( fabs(step) ); double frac = fabs(step)-istep; double cfrac = 1.0 - frac; if( ndm1 == 1 ) { for( int i=0; i(size1[0]); ++i ) { if( step < 0.0 ) { j1 = (i+istep)%static_cast(size1[0]); j2 = (i+istep+1)%static_cast(size1[0]); } else { j1 = (i-istep)%static_cast(size1[0]); j2 = (i-istep-1)%static_cast(size1[0]); } if( j1 < 0 )j1 += size1[0]; if( j2 < 0 )j2 += size1[0]; ws->SetData( i, cfrac*d1[j1] + frac*d1[j2] ); ++j1; ++j2; } ws->SetNumberOfDimensions(1); ws->SetDimMag( 0, size1[0] ); } else if( ndm1 == 2 ) { for( int j=0; j(size1[1]); ++j ) { for( int i=0; i(size1[0]); ++i ) { if( step < 0.0 ) { j1 = (i+istep)%static_cast(size1[0]); j2 = (i+istep+1)%static_cast(size1[0]); } else { j1 = (i-istep)%static_cast(size1[0]); j2 = (i-istep-1)%static_cast(size1[0]); } if( j1 < 0 )j1 += size1[0]; if( j2 < 0 )j2 += size1[0]; ws->SetData( i+j*size1[0], cfrac*d1[j1+j*size1[0]]+frac*d1[j2+j*size1[0]] ); ++j1; ++j2; } } ws->SetNumberOfDimensions(2); ws->SetDimMag( 0, size1[0] ); ws->SetDimMag( 1, size1[1] ); } } } // end of file extrema-4.4.5/src/Functions/FCN_hermite.cpp0000644012702201742730000000215511274636611017607 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_hermite.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_hermite *FCN_hermite::fcn_hermite_ = 0; void FCN_hermite::ScalarEval( int j, std::vector &rStack ) const { int n = static_cast(rStack[j]); try { rStack[j] = UsefulFunctions::HermitePolynomial( n, rStack[j+1] ); } catch (EExpressionError &e) { throw; } rStack.pop_back(); } extrema-4.4.5/src/Functions/FCN_ber.h0000644012702201742730000000214411274636611016365 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_BER #define FCN_BER #include "wx/wx.h" #include "ScalarFunction.h" class FCN_ber : public ScalarFunction { public: static FCN_ber *Instance() { if( !fcn_ber_ )fcn_ber_ = new FCN_ber(); return fcn_ber_; } void ScalarEval( int, std::vector & ) const; private: FCN_ber() : ScalarFunction( wxT("BER") ) {} static FCN_ber *fcn_ber_; }; #endif extrema-4.4.5/src/Functions/FCN_besj0.cpp0000644012702201742730000000203111274636611017146 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besj0.h" #include "UsefulFunctions.h" #include "EExpressionError.h" FCN_besj0 *FCN_besj0::fcn_besj0_ = 0; void FCN_besj0::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselJ0( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Functions/FCN_interpolate.h0000644012702201742730000000251111274636611020141 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_INTERPOLATE #define FCN_INTERPOLATE #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_interpolate : public ArrayFunction { public: static FCN_interpolate *Instance() { if( !fcn_interpolate_ )fcn_interpolate_ = new FCN_interpolate(); return fcn_interpolate_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_interpolate() : ArrayFunction( wxT("INTERPOLATE"), 3, 4, MIXED2NUM, NUMERIC, NUMERIC, NUMERIC, CHARACTER ) {} static FCN_interpolate *fcn_interpolate_; }; #endif extrema-4.4.5/src/Functions/FCN_canopen.cpp0000644012702201742730000000277311274636611017603 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/filefn.h" #include "FCN_canopen.h" #include "Workspace.h" #include "EExpressionError.h" #include "ExprCodes.h" #include "NVariableTable.h" #include "TVariableTable.h" FCN_canopen *FCN_canopen::fcn_canopen_ = 0; void FCN_canopen::ProcessArgument( bool firstArgument, int ndmEff, int &nLoop ) { nLoop = 0; numberOfArguments_ = 1; } void FCN_canopen::ArrayEval( Workspace *ws ) { std::deque &codes( ws->GetCodes() ); ExprCodes *arg1 = codes[0]; wxString name; if( arg1->IsaWorkspace() )name = arg1->GetWorkspacePtr()->GetFinalString(); else if( arg1->IsaTString() )name = arg1->GetTString(); else throw EExpressionError( wxT("argument of CANOPEN function must be character") ); // ws->SetValue( wxFileExists(name) ? 1.0 : 0.0 ); } // end of file extrema-4.4.5/src/Functions/FCN_rsum.h0000644012702201742730000000223111274636611016600 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_RSUM #define FCN_RSUM #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_rsum : public ArrayFunction { public: static FCN_rsum *Instance() { if( !fcn_rsum_ )fcn_rsum_ = new FCN_rsum(); return fcn_rsum_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_rsum() : ArrayFunction( wxT("RSUM") ) {} static FCN_rsum *fcn_rsum_; }; #endif extrema-4.4.5/src/Functions/FCN_tanh.cpp0000644012702201742730000000162411274636611017104 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_tanh.h" FCN_tanh *FCN_tanh::fcn_tanh_ = 0; void FCN_tanh::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = tanh( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_sqrt.cpp0000644012702201742730000000177611274636611017153 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_sqrt.h" #include "EExpressionError.h" FCN_sqrt *FCN_sqrt::fcn_sqrt_ = 0; void FCN_sqrt::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] < 0.0 )throw EExpressionError( wxT("SQRT: argument < 0") ); rStack[j] = sqrt( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_adev.h0000644012702201742730000000223611274636611016536 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_ADEV #define FCN_ADEV #include "wx/wx.h" #include "ArrayFunction.h" class Workspace; class FCN_adev : public ArrayFunction { public: static FCN_adev *Instance() { if( !fcn_adev_ )fcn_adev_ = new FCN_adev(); return fcn_adev_; } void ProcessArgument( bool, int, int & ); void ArrayEval( Workspace * ); private: FCN_adev() : ArrayFunction( wxT("ADEV"), 1, 2 ) {} static FCN_adev *fcn_adev_; }; #endif extrema-4.4.5/src/Functions/FCN_date.cpp0000644012702201742730000001706311274636611017073 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/datetime.h" #include "FCN_date.h" #include "EExpressionError.h" FCN_date *FCN_date::fcn_date_ = 0; void FCN_date::TextScalarEval( int j, std::vector &sStack ) const { wxDateTime now = wxDateTime::Now(); if( GetArgumentCounter() == 1 ) { //std::cout << "sStack[" << j << "]=|" << sStack[j].mb_str(wxConvUTF8) << "|\n"; wxString format, order; wxChar seperator; int nd=0, nm=0, ny=0; try { order = ParseInputString( sStack[j], seperator, nd, nm, ny ); //std::cout << "order=|" << order.mb_str(wxConvUTF8) << "|\n"; AddToFormat( format, order.at(0), nd, nm, ny ); } catch (EExpressionError &e) { throw; } if( order.size() > 1 ) { format += seperator; try { AddToFormat( format, order.at(1), nd, nm, ny ); } catch (EExpressionError &e) { throw; } if( order.size() > 2 ) { format += seperator; try { AddToFormat( format, order.at(2), nd, nm, ny ); } catch (EExpressionError &e) { throw; } } } //std::cout << "format=|" << format.mb_str(wxConvUTF8) << "|\n"; sStack[j] = now.Format( format.c_str() ); } else // no arguments { sStack.push_back( now.Format(wxT("%d/%m/%Y")) ); } } wxString FCN_date::ParseInputString( wxString const &input_in, wxChar &seperator, int &nd, int &nm, int &ny ) const { std::string input( input_in.Upper().mb_str(wxConvUTF8) ); input += '\n'; // // 'D' = 0, 'M' = 1, 'Y' = 2, other = 3, linefeed = 4 int const classes[128] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; int const stateTable[10][5] = { // D M Y othr end { 1, 2, 3, -1, -2 }, // 0 { 4, -3, -4, 7, 100 }, // 1 { -5, 5, -6, 8, 100 }, // 2 { -7, -8, 6, 9, 100 }, // 3 { 4, -3, -4, 7, 100 }, // 4 { -5, 5, -6, 8, 100 }, // 5 { -7, -8, 6, 9, 100 }, // 6 { -9, 2, 3,-12, -13 }, // 7 { 1,-10, 3,-12, -13 }, // 8 { 1, 2,-11,-12, -13 } // 9 }; int nsep = 0; bool ddone=false, mdone=false, ydone=false; int currentState=0, newState=0; int i = -1; int errNo = 0; wxString order; for( ;; ) { //std::cout << "newState=" << newState << "\n"; switch (newState) { case 0: { break; } case 1: { if( ddone )currentState = -9; else ++nd; order += wxT("d"); break; } case 2: { if( mdone )currentState = -10; else ++nm; order += wxT("m"); break; } case 3: { if( ydone )currentState = -11; else ++ny; order += wxT("y"); break; } case 4: { ++nd; break; } case 5: { ++nm; break; } case 6: { ++ny; break; } case 7: { if( ++nsep > 2 )currentState = -12; else seperator = input.at(i); //std::cout << "7: seperator=|" << seperator << "|, " << toascii(seperator) << "\n"; ddone = true; break; } case 8: { if( ++nsep > 2 )currentState = -12; else seperator = input.at(i); //std::cout << "8: seperator=|" << seperator << "|, " << toascii(seperator) << "\n"; mdone = true; break; } case 9: { if( ++nsep > 2 )currentState = -12; else seperator = input.at(i); //std::cout << "9: seperator=|" << seperator << "|, " << toascii(seperator) << "\n"; ydone = true; break; } } if( currentState < 0 ) { errNo = abs(currentState); break; } currentState = newState; int iascii = toascii( input.at(++i) ); newState = stateTable[currentState][classes[iascii]]; //std::cout << "iascii=" << iascii << ", currentState=" << currentState // << ", newState=" << newState << "\n"; if( newState == 100 )break; if( newState < 0 ) { errNo = abs(newState); break; } } switch (errNo) { case 1: throw EExpressionError( wxT("DATE: seperator cannot begin a format") ); case 2: throw EExpressionError( wxT("DATE: blank format") ); case 3: throw EExpressionError( wxT("DATE: m immediately following d") ); case 4: throw EExpressionError( wxT("DATE: y immediately following d") ); case 5: throw EExpressionError( wxT("DATE: d immediately following m") ); case 6: throw EExpressionError( wxT("DATE: y immediately following m") ); case 7: throw EExpressionError( wxT("DATE: d immediately following y") ); case 8: throw EExpressionError( wxT("DATE: m immediately following y") ); case 9: throw EExpressionError( wxT("DATE: only one day specifier section allowed") ); case 10: throw EExpressionError( wxT("DATE: only one month specifier section allowed") ); case 11: throw EExpressionError( wxT("DATE: only one year specifier section allowed") ); case 12: throw EExpressionError( wxT("DATE: seperator must be a single character") ); case 13: throw EExpressionError( wxT("DATE: seperator cannot end a format") ); } return order; } void FCN_date::AddToFormat( wxString &format, wxChar c, int nd, int nm, int ny ) const { if( c == wxT('d') ) { switch (nd) { case 1: format += wxT("%#d"); break; case 2: format += wxT("%d"); break; case 3: format += wxT("%a"); break; case 4: format += wxT("%A"); break; default: throw EExpressionError( wxT("DATE: valid day indicators are d dd ddd dddd") ); } } else if( c == wxT('m') ) { switch (nm) { case 1: format += wxT("%#m"); break; case 2: format += wxT("%m"); break; case 3: format += wxT("%b"); break; case 4: format += wxT("%B"); break; default: throw EExpressionError( wxT("DATE: valid month indicators are m mm mmm mmmm") ); } } else if( c == wxT('y') ) { switch (ny) { case 2: format += wxT("%y"); break; case 4: format += wxT("%Y"); break; default: throw EExpressionError( wxT("DATE: valid year indicators are yy yyyy") ); } } } extrema-4.4.5/src/Functions/FCN_tand.h0000644012702201742730000000216011274636611016541 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_TAND #define FCN_TAND #include "wx/wx.h" #include "ScalarFunction.h" class FCN_tand : public ScalarFunction { public: static FCN_tand *Instance() { if( !fcn_tand_ )fcn_tand_ = new FCN_tand(); return fcn_tand_; } void ScalarEval( int, std::vector & ) const; private: FCN_tand() : ScalarFunction( wxT("TAND") ) {} static FCN_tand *fcn_tand_; }; #endif extrema-4.4.5/src/Functions/FCN_log.cpp0000644012702201742730000000200011274636611016720 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_log.h" #include "EExpressionError.h" FCN_log *FCN_log::fcn_log_ = 0; void FCN_log::ScalarEval( int j, std::vector &rStack ) const { if( rStack[j] <= 0.0 )throw EExpressionError( wxT("LOG: argument <= 0") ); rStack[j] = log( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_cotd.h0000644012702201742730000000216011274636611016544 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_COTD #define FCN_COTD #include "wx/wx.h" #include "ScalarFunction.h" class FCN_cotd : public ScalarFunction { public: static FCN_cotd *Instance() { if( !fcn_cotd_ )fcn_cotd_ = new FCN_cotd(); return fcn_cotd_; } void ScalarEval( int, std::vector & ) const; private: FCN_cotd() : ScalarFunction( wxT("COTD") ) {} static FCN_cotd *fcn_cotd_; }; #endif extrema-4.4.5/src/Functions/FCN_vartype.cpp0000644012702201742730000000146311274636611017645 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_vartype.h" FCN_vartype *FCN_vartype::fcn_vartype_ = 0; // end of file extrema-4.4.5/src/Functions/FCN_cos.cpp0000644012702201742730000000161511274636611016736 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "FCN_cos.h" FCN_cos *FCN_cos::fcn_cos_ = 0; void FCN_cos::ScalarEval( int j, std::vector &rStack ) const { rStack[j] = cos( rStack[j] ); } extrema-4.4.5/src/Functions/FCN_factorial.h0000644012702201742730000000225211274636611017561 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_FACTORIAL #define FCN_FACTORIAL #include "wx/wx.h" #include "ScalarFunction.h" class FCN_factorial : public ScalarFunction { public: static FCN_factorial *Instance() { if( !fcn_factorial_ )fcn_factorial_ = new FCN_factorial(); return fcn_factorial_; } void ScalarEval( int, std::vector & ) const; private: FCN_factorial() : ScalarFunction( wxT("FACTORIAL") ) {} static FCN_factorial *fcn_factorial_; }; #endif extrema-4.4.5/src/Functions/FCN_chisqi.h0000644012702201742730000000221411274636611017073 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef FCN_CHISQI #define FCN_CHISQI #include "wx/wx.h" #include "ScalarFunction.h" class FCN_chisqi : public ScalarFunction { public: static FCN_chisqi *Instance() { if( !fcn_chisqi_ )fcn_chisqi_ = new FCN_chisqi(); return fcn_chisqi_; } void ScalarEval( int, std::vector & ) const; private: FCN_chisqi() : ScalarFunction( wxT("CHISQI"), 2, 2 ) {} static FCN_chisqi *fcn_chisqi_; }; #endif extrema-4.4.5/src/Functions/FCN_besi0.cpp0000644012702201742730000000203111274636611017145 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "FCN_besi0.h" #include "EExpressionError.h" #include "UsefulFunctions.h" FCN_besi0 *FCN_besi0::fcn_besi0_ = 0; void FCN_besi0::ScalarEval( int j, std::vector &rStack ) const { try { rStack[j] = UsefulFunctions::BesselI0( rStack[j] ); } catch (EExpressionError &e) { throw; } } extrema-4.4.5/src/Makefile.in0000644012702201742730000006617711440762625015073 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2007 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = extrema$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" LTLIBRARIES = $(lib_LTLIBRARIES) libextrema_la_DEPENDENCIES = Commands/libcommands.la \ Expression/libexpression.la Functions/libfunctions.la \ Graphics/libgraphics.la Operators/liboperators.la \ Parsing/libparsing.la Utilities/libutilities.la \ Variables/libvariables.la wxForms/libwxforms.la am_libextrema_la_OBJECTS = libextrema_la_OBJECTS = $(am_libextrema_la_OBJECTS) PROGRAMS = $(bin_PROGRAMS) am_extrema_OBJECTS = extrema.$(OBJEXT) extrema_OBJECTS = $(am_extrema_OBJECTS) am__DEPENDENCIES_1 = extrema_DEPENDENCIES = libextrema.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libextrema_la_SOURCES) \ $(nodist_EXTRA_libextrema_la_SOURCES) $(extrema_SOURCES) DIST_SOURCES = $(libextrema_la_SOURCES) $(extrema_SOURCES) RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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 = Commands Expression Functions Graphics Operators Parsing Utilities Variables wxForms . # EX_CXXFLAGS, WX_CXXFLAGS, MUD_CXXFLAGS, and MINUIT_CXXFLAGS are defined in acinclude.m4 AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) AM_LDFLAGS = $(EX_LDFLAGS) $(WX_LIBS) $(GTK_LIBS) lib_LTLIBRARIES = libextrema.la libextrema_la_SOURCES = nodist_EXTRA_libextrema_la_SOURCES = dummy.cxx libextrema_la_LIBADD = Commands/libcommands.la \ Expression/libexpression.la \ Functions/libfunctions.la \ Graphics/libgraphics.la \ Operators/liboperators.la \ Parsing/libparsing.la \ Utilities/libutilities.la \ Variables/libvariables.la \ wxForms/libwxforms.la extrema_SOURCES = extrema.cpp extrema.h extrema_LDADD = libextrema.la $(WX_LIBS) $(GTK_LIBS) $(MUD_LIB) $(MINUIT_LIB) all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .cxx .lo .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) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libextrema.la: $(libextrema_la_OBJECTS) $(libextrema_la_DEPENDENCIES) $(CXXLINK) -rpath $(libdir) $(libextrema_la_OBJECTS) $(libextrema_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list extrema$(EXEEXT): $(extrema_OBJECTS) $(extrema_DEPENDENCIES) @rm -f extrema$(EXEEXT) $(CXXLINK) $(extrema_OBJECTS) $(extrema_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extrema.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< .cxx.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # 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. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) install-binPROGRAMS: install-libLTLIBRARIES installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libLTLIBRARIES clean-libtool ctags \ ctags-recursive distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES 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-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-libLTLIBRARIES install-data-local: -cp -Rf ../Images $(pkgdatadir)/Images -cp -Rf ../Help $(pkgdatadir)/Help # 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: extrema-4.4.5/src/Commands/0000755012702201742730000000000011440766113014542 5ustar spangspangextrema-4.4.5/src/Commands/CMD_filter.cpp0000644012702201742730000003063711274636606017237 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_filter.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "EVariableError.h" #include "NumericVariable.h" #include "ExGlobals.h" CMD_filter *CMD_filter::cmd_filter_ = 0; CMD_filter::CMD_filter() : Command( wxT("FILTER") ) { AddQualifier( wxT("MEDIAN"), false ); AddQualifier( wxT("MEAN"), false ); AddQualifier( wxT("RECURSIVE"), false ); } void CMD_filter::Execute( ParseLine const *p ) { // FILTER\MEAN yin yout npt // // FILTER\MEDIAN yin,yout npt // This command filters the data array YIN through a window // "npt" points in width. The default filter is a running median // filter; others may be specified using the appropriate modifier // (e.g. \MEAN ). // // FILTER\-RECURSIVE yin yout cv // This syntax allows for the specification of a general // -RECURSIVE filter of arbitrary length by means of the list of // filter coefficients cv={c1,c2,...cm}. The i'th output point of // yout is the sum of the ck*yin(i-m/2+k-1) where k=1 to m. Thus, // for odd m we apply the c's symmetrically about yin(i) // // FILTER\RECURSIVE yin yout cv dv // This syntax allows for the specification of a general RECURSIVE // filter of arbitrary length by means of the list of filter // coefficients cv=[c1;c2;...;cm] and a list of secondary filter // coefficients dv=[d1;d2;...;dn] which operate on the previously // made output yout(i-k) where k=1 to n. Thus, given just d1 and // d2, we apply d1 to yout(i-1) and d2 to yout(i-2) in generating // yout(i). // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens()<2 || !p->IsString(1) ) throw ECommandError( command+wxT("expecting data vector") ); std::vector x; try { NumericVariable::GetVector( p->GetString(1), wxT("data vector"), x ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); std::size_t numx = x.size(); // if( p->GetNumberOfTokens()<3 || !p->IsString(2) ) throw ECommandError( command+wxT("expecting output results vector") ); wxString resultsName( p->GetString(2) ); AddToStackLine( resultsName ); // std::vector yout( numx, 0.0 ); if( qualifiers[wxT("MEAN")] || qualifiers[wxT("MEDIAN")] ) { // perform a running filter operation of width nfiltc points // if( p->GetNumberOfTokens() < 4 ) throw ECommandError( command+wxT("expecting filter width") ); double width; try { NumericVariable::GetScalar( p->GetString(3), wxT("filter width"), width ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::size_t nfiltc = static_cast(fabs(width)+0.5); if( nfiltc < 2 ) throw ECommandError( command+wxT("filter cannot be applied to less than 2 points") ); else if( nfiltc > numx ) throw ECommandError( command+wxT("filter length > input data vector length") ); AddToStackLine( p->GetString(3) ); // // check the modifier setting for special filters, and either fill the // coefficient array cofc if this is a linear filter, or perform the // necessary sorting operations if this a median filter // if( qualifiers[wxT("MEAN")] ) { if( width > 0.0 ) { for( std::size_t j=1; j<=numx; ++j ) { int jlo = j-nfiltc/2; int jup = j+(nfiltc-1)/2; if( jlo < 1 ) { jlo = 1; jup = jlo + nfiltc - 1; } else if( jup > static_cast(numx) ) { jup = numx; jlo = jup - nfiltc + 1; } double yfilt = 0.0; for( int jj=jlo; jj<=jup; ++jj )yfilt += x[jj-1]/nfiltc; yout[j-1] = yfilt; } } else // perform 'fast' running mean { double sum = 0.0; // // initialization summing // for( std::size_t i=1; i<=nfiltc; ++i ) { std::size_t ii = i-nfiltc/2; ii = std::max(ii,static_cast(1)); // set data below 1st point to it ii = std::min(ii,numx); // set data above last point to it sum += x[ii-1]; } yout[0] = sum/nfiltc; // // continue summing, adding/dropping a single point // for( std::size_t j=2; j<=numx; ++j ) { std::size_t ii = j+(nfiltc-1)/2; ii = std::min(ii,numx); sum += x[ii-1]; ii = j-nfiltc/2-1; ii = std::max(static_cast(1),ii); // // subtract oldest point from sum // sum -= x[ii-1]; yout[j-1] = sum/nfiltc; } } } else // median filter { std::vector temp( nfiltc, 0.0 ); if( nfiltc/2*2 != nfiltc ) // odd number of points { std::size_t const k = nfiltc/2 + 1; for( std::size_t j=1; j<=numx; ++j ) { int jlo = j-nfiltc/2; int jup = j+(nfiltc-1)/2; if( jlo < 1 ) { jlo = 1; jup = jlo + nfiltc - 1; } else if( jup > static_cast(numx) ) { jup = numx; jlo = jup - nfiltc + 1; } for( std::size_t i=1; i<=nfiltc; ++i )temp[i-1] = x[jlo+i-2]; yout[j-1] = Median( temp, k ); } } else // even number of points { // take the average of filter applied twice, once when data point is below // 'centre' and once when data point is above 'centre' // std::size_t k1 = nfiltc/2 + 1; std::size_t k2 = nfiltc/2; for( std::size_t j=1; j<=numx; ++j ) { int jlo = j-nfiltc/2; int jup = j+(nfiltc-1)/2; if( jlo < 1 ) { jlo = 1; jup = jlo + nfiltc - 1; } else if( jup > static_cast(numx) ) { jup = numx; jlo = jup - nfiltc + 1; } // // e.g. 4 point filter -->v v v v // . . . x x x x x x x x x x x x x . . . // point being acted upon ^ // k1=3 for( std::size_t i=1; i<=nfiltc; ++i )temp[i-1] = x[jlo+i-2]; double answer1 = Median( temp, k1 ); jlo = j-(nfiltc-1)/2; jup = j+nfiltc/2; if( jlo < 1 ) { jlo = 1; jup = jlo + nfiltc - 1; } else if( jup > static_cast(numx) ) { jup = numx; jlo = jup - nfiltc + 1; } // // eg. 4 point filter --> v v v v // . . . x x x x x x x x x x x x x . . . // point being acted upon ^ // k2=2 for( std::size_t i=1; i<=nfiltc; ++i )temp[i-1] = x[jlo+i-2]; double answer2 = Median( temp, k2 ); yout[j-1] = (answer1+answer2)/2.0; } } } } else // not mean or median { if( p->GetNumberOfTokens()<4 || !p->IsString(3) ) throw ECommandError( command+wxT("expecting data coefficients vector") ); std::vector cv; try { NumericVariable::GetVector( p->GetString(3), wxT("data coefficients vector"), cv ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::size_t nfiltc = cv.size(); if( nfiltc > numx ) throw ECommandError( command+wxT("coefficients vector length > input data vector length") ); AddToStackLine( p->GetString(3) ); // std::size_t nfiltd; std::vector cv2; if( qualifiers[wxT("RECURSIVE")] ) { if( p->GetNumberOfTokens()<5 || !p->IsString(4) ) throw ECommandError( command+wxT("expecting output coefficients vector") ); try { NumericVariable::GetVector( p->GetString(4), wxT("output coefficients vector"), cv2 ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } nfiltd = cv2.size(); AddToStackLine( p->GetString(3) ); } // // this section performs the necessary linear filtering // operations. this includes most of the standard filters, // such as the mean, for which the output is a linear // combination of the input values. it does not, however, // include the median filter // if( !qualifiers[wxT("RECURSIVE")] ) { for( std::size_t j=1; j<=numx; ++j ) { int jlo = j - nfiltc/2; int jup = j + (nfiltc-1)/2; if( jlo < 1 ) { jlo = 1; jup = jlo + nfiltc - 1; } else if( jup > static_cast(numx) ) { jup = numx; jlo = jup - nfiltc + 1; } double yfilt = 0.0; std::size_t ifilt = 1; for( int jj=jlo; jj<=jup; ++jj ) { yfilt += cv[ifilt-1]*x[jj-1]; ++ifilt; } yout[j-1] = yfilt; } } else // secondary set of coefficients was entered { for( std::size_t j=1; j<=numx; ++j ) { yout[j-1] = 0.0; int jlo = j-nfiltd; int jup = j-1; double yfiltd = 0.0; int ifilt = 1; for( int jj=jup; jj>=jlo; --jj ) // we assume yout[i-1]=0 for i<1 { if( jj > 0 )yfiltd += cv2[ifilt-1]*yout[jj-1]; ++ifilt; } jlo = j-nfiltc/2; jup = j+(nfiltc-1)/2; if( jlo < 1 ) { jlo = 1; jup = jlo + nfiltc - 1; } else if( jup > static_cast(numx) ) { jup = numx; jlo = jup - nfiltc + 1; } double yfiltc = 0.0; ifilt = 1; for( int jj=jlo; jj<=jup; ++jj ) { yfiltc += cv[ifilt-1]*x[jj-1]; ++ifilt; } yout[j-1] = yfiltc + yfiltd; } } } NumericVariable::PutVariable( resultsName, yout, 0, p->GetInputLine() ); } double CMD_filter::Median( std::vector &v, std::size_t k ) { // This routine finds the Kth ordered element of ARRAY size N. // Great for finding the median or any percentile value. // // The median of a vector is defined as the value which has the same // number of elements of lesser and greater value, or if the vector // has an even number of elements, then the average of the two elements // adjacent to the midpoint. // // To find the median of a vector of 100 elements you would // have to call this routine twice with values for K of 50 and 51 // and then average the two numbers. // // The method was taken from Niklaus Wirth's // "ALGORITHMS + DATA STRUCTURES = PROGRAMS" // // The method is quite efficient. It works by partitioning the // array at the kth element and SWAPPING all elements // of smaller index and greater value with all elements of higher index // of lesser value. // // WARNING - The ARRAY passed is PARTIALLY SORTED by this routine. // std::size_t n = v.size(); if( k > n )k = n; if( k < 1 )k = 1; std::size_t left = 1; std::size_t right = n; while( left < right ) { double sentinal = v[k-1]; std::size_t i = left; std::size_t j = right; L150: while( v[i-1] < sentinal )++i; while( sentinal < v[j-1] )--j; if( i <= j ) { double temp = v[i-1]; v[i-1] = v[j-1]; v[j-1] = temp; ++i; --j; } if( i <= j )goto L150; if( j < k )left = i; if( k < i )right = j; } return v[k-1]; } // end of file extrema-4.4.5/src/Commands/CMD_define.h0000644012702201742730000000207211274636606016641 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_DEFINE #define CMD_DEFINE #include "Command.h" class ParseLine; class CMD_define : public Command { public: static CMD_define *Instance() { if( !cmd_define_ )cmd_define_ = new CMD_define(); return cmd_define_; } void Execute( ParseLine const * ); private: CMD_define(); static CMD_define *cmd_define_; }; #endif extrema-4.4.5/src/Commands/CMD_clear.cpp0000644012702201742730000000503311274636606017030 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_clear.h" #include "ParseLine.h" #include "ECommandError.h" #include "EVariableError.h" #include "ExGlobals.h" #include "NumericVariable.h" #include "GRA_window.h" CMD_clear *CMD_clear::cmd_clear_ = 0; CMD_clear::CMD_clear() : Command( wxT("CLEAR") ) { AddQualifier( wxT("REPLOT"), true ); AddQualifier( wxT("HISTORY"), false ); } void CMD_clear::Execute( ParseLine const *p ) { // Clear the graphics window. // If \REPLOT is used, clear the replot buffers as well. // // CLEAR clear all GRA_window's // CLEAR n clear GRA_window n // CLEAR\-REPLOT clear all GRA_window's but leave replot buffers alone // CLEAR\-REPLOT n clear GRA_window n but leave replot buffers alone // CLEAR\HISTORY just clear the history buffer // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( qualifiers[wxT("HISTORY")] ) { ExGlobals::ClearHistory(); return; } if( p->GetNumberOfTokens() == 1 ) // no parameters entered { ExGlobals::ClearGraphicsMonitor(); if( qualifiers[wxT("REPLOT")] )ExGlobals::ClearWindows(); return; } // a window number was entered // double d; try { NumericVariable::GetScalar( p->GetString(1), wxT("window number"), d ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int n = static_cast( d ); if( n < 0 )throw ECommandError( Name()+wxT(": window number < 0") ); if( n > static_cast(ExGlobals::GetNumberOfWindows()) ) throw ECommandError( command+wxT("window number > largest defined window number") ); ExGlobals::ClearGraphicsWindow( qualifiers[wxT("REPLOT")], n ); AddToStackLine( p->GetString(1) ); } // end of file extrema-4.4.5/src/Commands/CMD_fit.h0000644012702201742730000000222111274636606016165 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_FITCOMMAND #define CMD_FITCOMMAND #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_fit : public Command { public: static CMD_fit *Instance() { if( !cmd_fit_ )cmd_fit_ = new CMD_fit(); return cmd_fit_; } void Execute( ParseLine const * ); private: CMD_fit(); static CMD_fit *cmd_fit_; wxString rhs_; std::vector lhsSave_; std::vector rhsSave_; }; #endif extrema-4.4.5/src/Commands/CMD_text.h0000644012702201742730000000205011274636606016367 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_TEXT #define CMD_TEXT #include "Command.h" class ParseLine; class CMD_text : public Command { public: static CMD_text *Instance() { if( !cmd_text_ )cmd_text_ = new CMD_text(); return cmd_text_; } void Execute( ParseLine const * ); private: CMD_text(); static CMD_text *cmd_text_; }; #endif extrema-4.4.5/src/Commands/CMD_sort.cpp0000644012702201742730000000703411274636606016734 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_sort.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "UsefulFunctions.h" #include "EVariableError.h" #include "NumericVariable.h" CMD_sort *CMD_sort::cmd_sort_ = 0; CMD_sort::CMD_sort() : Command( wxT("SORT") ) { AddQualifier( wxT("UP"), true ); AddQualifier( wxT("DOWN"), false ); } void CMD_sort::Execute( ParseLine const *p ) { // // Sort a vector into ascending or descending order. // Also rearrange other vectors along with the sorted one if their // names are included in the command parameter list. // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); qualifiers[wxT("UP")] = !qualifiers[wxT("DOWN")]; if( p->GetNumberOfTokens() < 2 )throw ECommandError( command+wxT("expecting a vector to sort") ); std::vector x; try { NumericVariable::GetVector( p->GetString(1), wxT("vector to sort"), x ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } wxString sortName( p->GetString(1) ); AddToStackLine( sortName ); std::size_t xSize = x.size(); // int nTokens = p->GetNumberOfTokens(); std::vector< std::vector > otherVecs; std::vector names; if( nTokens > 2 )otherVecs.resize( nTokens-2 ); for( int i=2; iIsString(i) ) throw ECommandError( command+wxT("expecting associated vector to re-arrange") ); try { NumericVariable::GetVector( p->GetString(i), wxT("vector to re-arrange"), otherVecs[i-2] ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(i) ); names.push_back( p->GetString(i) ); } std::vector dKey(xSize); for( std::size_t i=0; i(i); UsefulFunctions::QuickSort( x, dKey, qualifiers[wxT("UP")] ); std::vector key(xSize); for( std::size_t i=0; i(dKey[i]); // int order = qualifiers[wxT("UP")] ? 1 : 2; NumericVariable::PutVariable( sortName, x, order, p->GetInputLine() ); // if( !names.empty() ) { std::size_t nOthers = names.size(); // // Create a temporary vector. // Sort the optional arrays using the KEYS vector which contains presorted indices. // std::vector temp(xSize); for( std::size_t j=0; jGetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } } // end of file extrema-4.4.5/src/Commands/CMD_generate.cpp0000644012702201742730000001452711274636606017544 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_generate.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "EVariableError.h" #include "NumericVariable.h" #include "ExGlobals.h" #include "UsefulFunctions.h" CMD_generate *CMD_generate::cmd_generate_ = 0; CMD_generate::CMD_generate() : Command( wxT("GENERATE") ) { AddQualifier( wxT("RANDOM"), false ); } void CMD_generate::Execute( ParseLine const *p ) { // Generate a new vector, given the name, the minimum, either the increment or // the maximum, and the number of elements. // Or // Generate a set of random numbers given the name, the minimum, the maximum, // and the number of values to generate. // // GENERATE X MIN INC,,NPTS // GENERATE X MIN ,,MAX NPTS // GENERATE X MIN INC MAX // GENERATE\RANDOM X MIN MAX NPTS // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( wxT("GENERATE: ") ); // if( p->GetNumberOfTokens()<2 || !p->IsString(1) ) throw ECommandError( command+wxT("missing output vector name") ); wxString name( p->GetString(1) ); AddToStackLine( name ); // double vMin, vMax, vInc; int vNum; std::vector x; if( qualifiers[wxT("RANDOM")] ) { if( p->GetNumberOfTokens() < 5 ) throw ECommandError( command+wxT("expecting minimum, maximum and number of values") ); double d; try { NumericVariable::GetScalar( p->GetString(2), wxT("minimum value"), vMin ); AddToStackLine( p->GetString(2) ); // NumericVariable::GetScalar( p->GetString(3), wxT("maximum value"), vMax ); AddToStackLine( p->GetString(3) ); // NumericVariable::GetScalar( p->GetString(4), wxT("number of values"), d ); AddToStackLine( p->GetString(4) ); vNum = static_cast(d); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( vNum <= 0 )throw ECommandError( command+wxT("number of values must be positive") ); double delv = vMax - vMin; x.reserve( vNum ); for( int i=0; iGetNumberOfTokens() < 5 ) throw ECommandError( command+wxT("expecting min,inc,,npts or min,,max,npts or min,inc,max") ); try { NumericVariable::GetScalar( p->GetString(2), wxT("minimum value"), vMin ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); // bool incrementGiven = false; bool maximumGiven = false; bool nptsGiven = false; // if( p->IsNull(3) ) { AddToStackLine(); } else { incrementGiven = true; try { NumericVariable::GetScalar( p->GetString(3), wxT("increment"), vInc ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( vInc == 0.0 )throw ECommandError( command+wxT("increment = 0") ); AddToStackLine( p->GetString(3) ); } if( p->IsNull(4) ) { AddToStackLine(); } else { maximumGiven = true; try { NumericVariable::GetScalar( p->GetString(4), wxT("maximum value"), vMax ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(4) ); } if( p->GetNumberOfTokens() > 5 ) { nptsGiven = true; double d; try { NumericVariable::GetScalar( p->GetString(5), wxT("number of values"), d ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } vNum = static_cast(d); if( vNum == 0 )throw ECommandError( command+wxT("number of values = 0") ); if( vNum < 0 )throw ECommandError( command+wxT("number of values < 0") ); AddToStackLine( p->GetString(5) ); } if( incrementGiven ) { if( maximumGiven ) { vNum = static_cast((vMax-vMin)/vInc) + 1; if( vNum <= 0 )throw ECommandError( command+wxT("number of values must be positive") ); x.reserve( vNum ); for( int i=0; i fabs(vMax*0.000001) ) { wxString s( wxT("GENERATE: calculated maximum = ") ); s << x[vNum-1] << wxT(", given maximum = ") << vMax; ExGlobals::WarningMessage( s ); } if( nptsGiven )ExGlobals::WarningMessage(wxT("GENERATE: number of points will be ignored")); } else if( nptsGiven ) { x.reserve( vNum ); for( int i=0; i 1 ? vInc = (vMax-vMin)/(vNum-1) : vInc = 0.0; x.reserve( vNum ); for( int i=0; i0.0 ? 1 : 2; try { NumericVariable::PutVariable( name, x, order, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } // end of file extrema-4.4.5/src/Commands/CMD_execute.h0000644012702201742730000000231111274636606017045 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_EXECUTE #define CMD_EXECUTE #include #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_execute : public Command { public: static CMD_execute *Instance() { if( !cmd_execute_ )cmd_execute_ = new CMD_execute(); return cmd_execute_; } void Execute( ParseLine const * ); private: CMD_execute(); static CMD_execute *cmd_execute_; std::ifstream inStream_; bool ReadLine( wxString & ); void TryPaths( wxString & ); }; #endif extrema-4.4.5/src/Commands/CMD_goto.h0000644012702201742730000000204611274636606016360 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_GOTO #define CMD_GOTO #include "Command.h" class ParseLine; class CMD_goto : public Command { public: static CMD_goto *Instance() { if( !cmd_goto_ )cmd_goto_ = new CMD_goto(); return cmd_goto_; } void Execute( ParseLine const * ); private: CMD_goto(); static CMD_goto *cmd_goto_; }; #endif extrema-4.4.5/src/Commands/CMD_statistics.h0000644012702201742730000000227311274636606017604 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_STATISTICS #define CMD_STATISTICS #include "Command.h" class ParseLine; class CMD_statistics : public Command { public: static CMD_statistics *Instance() { if( !cmd_statistics_ )cmd_statistics_ = new CMD_statistics(); return cmd_statistics_; } void Execute( ParseLine const * ); private: CMD_statistics(); static CMD_statistics *cmd_statistics_; void Pearson( std::vector &, std::vector &, double &, double & ); }; #endif extrema-4.4.5/src/Commands/CMD_form.cpp0000644012702201742730000006522711274636606016720 0ustar spangspang/* Copyright (C) 2006 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_form.h" #include "ParseLine.h" #include "ECommandError.h" #include "EVariableError.h" #include "ExGlobals.h" #include "NumericVariable.h" #include "NVariableTable.h" #include "AnalysisWindow.h" #include "VisualizationWindow.h" #include "FitForm.h" #include "GraphForm.h" #include "ExecuteDialog.h" #include "TextForm.h" #include "GenerateVectorForm.h" CMD_form *CMD_form::cmd_form_ = 0; CMD_form::CMD_form() : Command( wxT("FORM") ) { AddQualifier( wxT("NOVICE"), true ); } void CMD_form::Execute( ParseLine const *p ) { // open one of the gui forms // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens()<2 || !p->IsString(1) ) throw ECommandError( command+wxT("expecting a form name") ); wxString form( p->GetString(1) ); form.UpperCase(); ExGlobals::RemoveQuotes( form ); AddToStackLine( form ); int icnt = 2; if( form == wxT("FIT") ) { // FORM FIT,CLOSE // FORM FIT,'CLEAR GRAPHICS' // FORM FIT,dataVec, indepVec, idmin, idmax, errorVec, fitType, nparam, expression, // fixedVec, startVec, xloc, yloc, action // where action can be one of: CLOSE, CLEAR GRAPHICS, TEST THE FIT, or DO THE FIT // command += wxT("FIT "); if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting data vector name or CLOSE or CLEAR GRAPHICS") ); wxString dataName( p->GetString(icnt) ); dataName.UpperCase(); ExGlobals::RemoveQuotes( dataName ); AnalysisWindow *analysisWindow = ExGlobals::GetAnalysisWindow(); FitForm *fitForm = analysisWindow->GetFitForm(); if( dataName == wxT("CLOSE") ) { if( fitForm ) { fitForm->Close(); analysisWindow->ZeroFit(); } return; } else if( dataName == wxT("CLEAR GRAPHICS") ) { if( fitForm )fitForm->Raise(); else { fitForm = new FitForm( analysisWindow ); fitForm->Show(); analysisWindow->SetFitForm( fitForm ); } fitForm->ClearGraphics(); return; } NumericVariable *dataVec = NVariableTable::GetTable()->GetVariable(dataName); if( !dataVec ) throw ECommandError( command+wxT("data vector ")+dataName+wxT(" does not exist") ); AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting independent vector name") ); wxString indepName( p->GetString(icnt) ); NumericVariable *indepVec = NVariableTable::GetTable()->GetVariable(indepName); if( !indepVec ) throw ECommandError( command+wxT("independent vector ")+indepName+wxT(" does not exist") ); AddToStackLine( p->GetString(icnt) ); double idmin, idmax; indepVec->GetData().GetMinMax( idmin, idmax ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting indep. vector range minimum") ); if( p->IsNull(icnt) ) { AddToStackLine( idmin ); } else { try { NumericVariable::GetScalar( p->GetString(icnt), wxT("indep. vector range minimum"), idmin ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); } ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting indep. vector range maximum") ); if( p->IsNull(icnt) ) { AddToStackLine( idmax ); } else { try { NumericVariable::GetScalar( p->GetString(icnt), wxT("indep. vector range maximum"), idmax ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); } ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting error vector name or null") ); wxString errorName; NumericVariable *errorVec = 0; if( p->IsString(icnt) ) { errorName = p->GetString(icnt); errorVec = NVariableTable::GetTable()->GetVariable(errorName); if( !errorVec ) throw ECommandError( command+wxT("error vector")+errorName+wxT(" does not exist") ); AddToStackLine( p->GetString(icnt) ); } else AddToStackLine(); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting type of fit") ); wxString typeName( p->GetString(icnt) ); typeName.UpperCase(); ExGlobals::RemoveQuotes( typeName ); if( typeName!=wxT("LEGENDRE POLYNOMIALS") && typeName!=wxT("POLYNOMIAL") && typeName!=wxT("GAUSSIAN") && typeName!=wxT("LEAST SQUARES LINE") && typeName!=wxT("CONSTANT") && typeName!=wxT("CUSTOM") ) throw ECommandError( command+wxT("invalid type of fit") ); AddToStackLine( p->GetString(icnt) ); // int nParams = 0; ++icnt; if( typeName == wxT("CUSTOM") ) { if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt)) ) throw ECommandError( command+wxT("expecting number of fit parameters") ); double fitp; try { NumericVariable::GetScalar( p->GetString(icnt), wxT("number of fit parameters"), fitp ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } nParams = static_cast(fitp); if( nParams > 8 || nParams < 1 ) throw ECommandError( command+wxT("number of fit parameters must be > 0 and <= 8") ); AddToStackLine( p->GetString(icnt) ); typeName = wxT("Custom"); } else if( typeName == wxT("LEGENDRE POLYNOMIALS") ) { if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt)) ) throw ECommandError( command+wxT("expecting degree of polynomial") ); double deg; try { NumericVariable::GetScalar( p->GetString(icnt), wxT("degree of polynomial"), deg ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } nParams = static_cast(deg)+1; if( nParams > 8 || nParams < 1 ) throw ECommandError( command+wxT("degree of polynomial must be > 0 and <= 7") ); AddToStackLine( p->GetString(icnt) ); typeName = wxT("Legendre polynomials"); } else if( typeName == wxT("POLYNOMIAL") ) { if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt)) ) throw ECommandError( command+wxT("expecting degree of polynomial") ); double deg; try { NumericVariable::GetScalar( p->GetString(icnt), wxT("degree of polynomial"), deg ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } nParams = static_cast(deg)+1; if( nParams > 8 || nParams < 1 ) throw ECommandError( command+wxT("degree of polynomial must be > 0 and <= 7") ); AddToStackLine( p->GetString(icnt) ); typeName = wxT("Polynomial"); } else if( typeName == wxT("GAUSSIAN") ) { nParams = 3; AddToStackLine(); typeName = wxT("Gaussian"); } else if( typeName == wxT("LEAST SQUARES LINE") ) { nParams = 2; AddToStackLine(); typeName = wxT("Least squares line"); } else if( typeName == wxT("CONSTANT") ) { nParams = 1; AddToStackLine(); typeName = wxT("Constant"); } ++icnt; wxString expression; if( typeName == wxT("Custom") ) { if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting fit expression") ); expression = p->GetString(icnt); ExGlobals::RemoveQuotes( expression ); AddToStackLine( p->GetString(icnt) ); } else AddToStackLine(); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting fixed vector") ); std::vector fixed; try { NumericVariable::GetVector( p->GetString(icnt), wxT("fixed vector"), fixed ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( static_cast(fixed.size()) != nParams ) throw ECommandError( command+wxT("fixed vector length must equal number of parameters") ); AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting starting values vector") ); std::vector start; try { NumericVariable::GetVector( p->GetString(icnt), wxT("fixed vector"), start ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( static_cast(start.size()) != nParams ) throw ECommandError( command+wxT("starting values vector length must equal number of parameters") ); AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt)) ) throw ECommandError( command+wxT("expecting %x legend location")); double xloc; try { NumericVariable::GetScalar( p->GetString(icnt), wxT("%x legend location"), xloc ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt)) ) throw ECommandError( command+wxT("expecting %y legend location") ); double yloc; try { NumericVariable::GetScalar( p->GetString(icnt), wxT("%y legend location"), yloc ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()>icnt && !p->IsString(icnt) && !p->IsNull(icnt) ) throw ECommandError( command+wxT("expecting fit actionwxT(") ); wxString action; if( p->GetNumberOfTokens()<=icnt || p->IsNull(icnt) )AddToStackLine(); else { action = p->GetString(icnt).Upper(); ExGlobals::RemoveQuotes( action ); if( action!=wxT("TEST THE FIT") && action!=wxT("CLEAR GRAPHICS") && action!=wxT("DO THE FIT") && action!=wxT("CLOSE") ) throw ECommandError( command+wxT("invalid type of action") ); AddToStackLine( p->GetString(icnt) ); } if( fitForm )fitForm->Raise(); else { fitForm = new FitForm( analysisWindow ); fitForm->Show(); analysisWindow->SetFitForm( fitForm ); } fitForm->Set( dataName, indepName, idmin, idmax, errorName, typeName, nParams, expression, fixed, start, xloc, yloc, action ); } else if( form == wxT("GRAPH") ) { // FORM GRAPH,CLOSE // FROM GRAPH,CLEAR // FORM GRAPH, depVecName, indepVecName, idmin, idmax, errorVecName, plotsymbol, DRAW // command += wxT("GRAPH "); if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting dependent vector name or CLOSE or CLEAR") ); wxString depName( p->GetString(icnt) ); depName.UpperCase(); VisualizationWindow *visualizationWindow = ExGlobals::GetVisualizationWindow(); GraphForm *graphForm = visualizationWindow->GetGraphForm(); if( depName == wxT("CLOSE") ) { if( graphForm ) { graphForm->Close(); visualizationWindow->ZeroGraphForm(); } return; } else if( depName == wxT("CLEAR") ) { if( graphForm )graphForm->Raise(); else { graphForm = new GraphForm( visualizationWindow ); graphForm->Show(); visualizationWindow->SetGraphForm( graphForm ); } graphForm->ClearGraphics(); return; } NumericVariable *depVec = NVariableTable::GetTable()->GetVariable(depName); if( !depVec ) throw ECommandError( command+wxT("dependent vector ")+depName+wxT(" does not exist") ); AddToStackLine( p->GetString(icnt) ); // ++icnt; double idmin, idmax; wxString indepName; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting independent vector name") ); if( p->IsString(icnt) ) { indepName = p->GetString(icnt); NumericVariable *indepVec = NVariableTable::GetTable()->GetVariable(indepName); if( !indepVec ) throw ECommandError( command+wxT("independent vector ")+indepName+wxT(" does not exist") ); AddToStackLine( p->GetString(icnt) ); indepVec->GetData().GetMinMax( idmin, idmax ); } else AddToStackLine(); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting indep. vector range minimum") ); if( p->IsNull(icnt) ) { if( indepName.empty() )AddToStackLine(); else AddToStackLine( idmin ); } else { try { NumericVariable::GetScalar( p->GetString(icnt), wxT("indep. vector range minimum"), idmin ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); } ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting indep. vector range maximum") ); if( p->IsNull(icnt) ) { if( indepName.empty() )AddToStackLine(); else AddToStackLine( idmax ); } else { try { NumericVariable::GetScalar( p->GetString(icnt), wxT("indep. vector range maximum"), idmax ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); } ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting error vector name or null") ); wxString errorName; if( p->IsString(icnt) ) { errorName = p->GetString(icnt); NumericVariable *errorVec = NVariableTable::GetTable()->GetVariable(errorName); if( !errorVec ) throw ECommandError( command+wxT("error vector")+errorName+wxT(" does not exist") ); AddToStackLine( p->GetString(icnt) ); } else AddToStackLine(); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNumeric(icnt)) ) throw ECommandError( command+wxT("expecting plotsymbol code") ); int ps; try { double tmp; NumericVariable::GetScalar( p->GetString(icnt), wxT("plotsymbol code"), tmp ); ps = static_cast(tmp); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()>icnt && !p->IsString(icnt) && !p->IsNull(icnt) ) throw ECommandError( command+wxT("expecting graph action") ); wxString action; if( p->GetNumberOfTokens()<=icnt || p->IsNull(icnt) )AddToStackLine(); else { action = p->GetString(icnt).Upper(); ExGlobals::RemoveQuotes( action ); if( action!=wxT("DRAW") && action!=wxT("CLEAR") && action!=wxT("CLOSE") ) throw ECommandError( command+wxT("invalid type of action") ); AddToStackLine( p->GetString(icnt) ); } if( graphForm )graphForm->Raise(); else { graphForm = new GraphForm( visualizationWindow ); graphForm->Show(); visualizationWindow->SetGraphForm( graphForm ); } graphForm->Set( depName, indepName, idmin, idmax, errorName, ps, action ); } else if( form == wxT("EXECUTE") ) { // FORM EXECUTE,CLOSE // FORM EXECUTE, filename, parameters, APPLY // command += wxT("EXECUTE "); if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting filename or CLOSE") ); wxString fileName( p->GetString(icnt) ); ExGlobals::RemoveQuotes( fileName ); AnalysisWindow *analysisWindow = ExGlobals::GetAnalysisWindow(); ExecuteDialog *executeDialog = analysisWindow->GetExecuteDialog(); if( fileName.Upper() == wxT("CLOSE") ) { AddToStackLine( wxT("CLOSE") ); if( executeDialog ) { executeDialog->Close(); analysisWindow->ZeroExecuteDialog(); } return; } AddToStackLine( p->GetString(icnt) ); // ++icnt; wxString parameters; if( p->GetNumberOfTokens()<=icnt || (!p->IsString(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting parameters") ); if( p->IsString(icnt) ) { parameters = p->GetString(icnt); AddToStackLine( p->GetString(icnt) ); } else AddToStackLine(); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting execute action") ); wxString action( p->GetString(icnt).Upper() ); ExGlobals::RemoveQuotes( action ); if( action!=wxT("APPLY") && action!=wxT("CLOSE") ) throw ECommandError( command+wxT("invalid type of action") ); AddToStackLine( p->GetString(icnt) ); if( executeDialog )executeDialog->Raise(); else { executeDialog = new ExecuteDialog( analysisWindow ); executeDialog->Show(); analysisWindow->SetExecuteDialog( executeDialog ); } executeDialog->Set( fileName, parameters, action ); } else if( form == wxT("TEXT") ) { // FORM TEXT,CLOSE // FORM TEXT,ERASE // FORM TEXT,'text',psc,xloc,yloc,alignment,action // where action can be one of: "CLOSE", "ERASE", "DRAW" // command += wxT("TEXT "); if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting text string or CLOSE or ERASE") ); wxString text( p->GetString(icnt) ); ExGlobals::RemoveQuotes( text ); VisualizationWindow *visualizationWindow = ExGlobals::GetVisualizationWindow(); TextForm *textForm = visualizationWindow->GetTextForm(); if( text.Upper() == wxT("CLOSE") ) { AddToStackLine( wxT("CLOSE") ); if( textForm ) { textForm->Close(); visualizationWindow->ZeroTextForm(); } return; } else if( text.Upper() == wxT("ERASE") ) { AddToStackLine( wxT("ERASE") ); if( textForm )textForm->Raise(); else { textForm = new TextForm( visualizationWindow ); textForm->Show(); visualizationWindow->SetTextForm( textForm ); } textForm->Erase(); return; } AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting interactive flag") ); int psc = static_cast( p->GetNumeric(icnt) ); AddToStackLine( psc ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting x location") ); double xloc = p->IsNumeric(icnt) ? p->GetNumeric(icnt) : 50.0; AddToStackLine( xloc ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting y location") ); double yloc = p->IsNumeric(icnt) ? p->GetNumeric(icnt) : 50.0; AddToStackLine( yloc ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting alignment code") ); int alignment = static_cast( p->GetNumeric(icnt) ); AddToStackLine( alignment ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting text action") ); wxString action( p->GetString(icnt).Upper() ); ExGlobals::RemoveQuotes( action ); if( action!=wxT("CLOSE") && action!=wxT("ERASE") && action!=wxT("DRAW") ) throw ECommandError( command+wxT("text action must be one of CLOSE or ERASE or DRAW") ); AddToStackLine( action ); if( textForm )textForm->Raise(); else { textForm = new TextForm( visualizationWindow ); textForm->Show(); visualizationWindow->SetTextForm( textForm ); } textForm->Set( text, psc, xloc, yloc, alignment, action ); } else if( form == wxT("GENERATE") ) { // FORM GENERATE,CLOSE // FORM GENERATE,DEFAULTS // FORM GENERATE,name,choice,min,inc,max,number,action // where action can be one of: "CLOSE", "DEFAULTS", "APPLY" // command += wxT("GENERATE "); if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting vector name or CLOSE or DEFAULTS") ); wxString name( p->GetString(icnt) ); AnalysisWindow *analysisWindow = ExGlobals::GetAnalysisWindow(); GenerateVectorForm *generateVectorForm = analysisWindow->GetGenerateVectorForm(); if( name.Upper() == wxT("CLOSE") ) { AddToStackLine( wxT("CLOSE") ); if( generateVectorForm ) { generateVectorForm->Close(); analysisWindow->ZeroGenerateVector(); } return; } else if( name.Upper() == wxT("DEFAULTS") ) { AddToStackLine( wxT("DEFAULTS") ); if( generateVectorForm )generateVectorForm->Raise(); else { generateVectorForm = new GenerateVectorForm( analysisWindow ); generateVectorForm->Show(); analysisWindow->SetGenerateVectorForm( generateVectorForm ); } generateVectorForm->Defaults(); return; } AddToStackLine( p->GetString(icnt) ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting choice code") ); int choice = static_cast( p->GetNumeric(icnt) ); AddToStackLine( choice ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting min value") ); double min = p->GetNumeric(icnt); AddToStackLine( min ); // double inc = 0.0; double max = 0.0; int number = 0; switch ( choice ) { case 0: // min,,max,number (random) case 3: // min,,max,number { ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting increment value") ); if( p->IsNumeric(icnt) )inc = p->GetNumeric(icnt); AddToStackLine( inc ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting max value") ); max = p->IsNumeric(icnt); AddToStackLine( max ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting number of elements") ); number = static_cast( p->GetNumeric(icnt) ); AddToStackLine( number ); // break; } case 1: // min,inc,max, { ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting increment value") ); inc = p->GetNumeric(icnt); AddToStackLine( inc ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting max value") ); max = p->IsNumeric(icnt); AddToStackLine( max ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting number of elements") ); if( p->IsNumeric(icnt) )number = static_cast( p->GetNumeric(icnt) ); AddToStackLine( number ); // break; } case 2: // min,inc,,number { ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting increment value") ); inc = p->GetNumeric(icnt); AddToStackLine( inc ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || (!p->IsNumeric(icnt) && !p->IsNull(icnt)) ) throw ECommandError( command+wxT("expecting max value") ); if( p->IsNumeric(icnt) )max = p->IsNumeric(icnt); AddToStackLine( max ); // ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsNumeric(icnt) ) throw ECommandError( command+wxT("expecting number of elements") ); number = static_cast( p->GetNumeric(icnt) ); AddToStackLine( number ); // break; } default: throw ECommandError( command+wxT("invalid choice code: expecting 0, 1, 2, or 3") ); } ++icnt; if( p->GetNumberOfTokens()<=icnt || !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting text action") ); wxString action( p->GetString(icnt).Upper() ); ExGlobals::RemoveQuotes( action ); if( action!=wxT("CLOSE") && action!=wxT("DEFAULTS") && action!=wxT("APPLY") ) throw ECommandError( command+wxT("text action must be one of CLOSE or DEFAULTS or APPLY") ); AddToStackLine( action ); if( generateVectorForm )generateVectorForm->Raise(); else { generateVectorForm = new GenerateVectorForm( analysisWindow ); generateVectorForm->Show(); analysisWindow->SetGenerateVectorForm( generateVectorForm ); } generateVectorForm->Set( name, choice, min, inc, max, number, action ); } else throw ECommandError( command+wxT("unknown FORM type") ); } // end of file extrema-4.4.5/src/Commands/CMD_write.h0000644012702201742730000000246711274636606016551 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_WRITE #define CMD_WRITE #include #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_write : public Command { public: static CMD_write *Instance() { if( !cmd_write_ )cmd_write_ = new CMD_write(); return cmd_write_; } void Execute( ParseLine const * ); void SetFilename( wxString const &s ) { filename_ = s; } wxString &GetFilename() { return filename_; } std::ofstream *GetStream() { return &ofStream_; } private: CMD_write(); static CMD_write *cmd_write_; std::ofstream ofStream_; wxString filename_; }; #endif extrema-4.4.5/src/Commands/CMD_hardcopy.h0000644012702201742730000000212211274636606017214 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_HARDCOPY #define CMD_HARDCOPY #include "Command.h" class ParseLine; class CMD_hardcopy : public Command { public: static CMD_hardcopy *Instance() { if( !cmd_hardcopy_ )cmd_hardcopy_ = new CMD_hardcopy(); return cmd_hardcopy_; } void Execute( ParseLine const * ); private: CMD_hardcopy(); static CMD_hardcopy *cmd_hardcopy_; }; #endif extrema-4.4.5/src/Commands/CMD_filter.h0000644012702201742730000000217611274636606016701 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_FILTERCOMMAND #define CMD_FILTERCOMMAND #include "Command.h" class ParseLine; class CMD_filter : public Command { public: static CMD_filter *Instance() { if( !cmd_filter_ )cmd_filter_ = new CMD_filter(); return cmd_filter_; } void Execute( ParseLine const *p ); private: CMD_filter(); static CMD_filter *cmd_filter_; double Median( std::vector &, size_t ); }; #endif extrema-4.4.5/src/Commands/CMD_statistics.cpp0000644012702201742730000004510511274636606020140 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_statistics.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "EVariableError.h" #include "NumericVariable.h" #include "EExpressionError.h" CMD_statistics *CMD_statistics::cmd_statistics_ = 0; CMD_statistics::CMD_statistics() : Command( wxT("STATISTICS") ) { AddQualifier( wxT("MESSAGES"), true ); AddQualifier( wxT("MOMENTS"), false ); AddQualifier( wxT("PEARSON"), false ); AddQualifier( wxT("WEIGHTS"), false ); } void CMD_statistics::Execute( ParseLine const *p ) { // This routine finds the max, min, indices of the max & min, // mean, geometric mean, median, variance, standard deviation, // root mean square, kurtosis, and skewness of a vector, or, // it finds a moment. // // STATISTICS X ( display all statistics ) // STATISTICS X S1\MAX S2\IMAX S3\MIN S4\IMIN - // S5\MEAN S6\GMEAN S7\RMS S8\VARIANCE S9\SDEV - // S10\ADEV, S11\KURTOSIS S12\SKEWNESS S13\SUM // STAT\WEIGHT W X ( display all statistics ) // STAT\WEIGHT W X S1\MAX S2\IMAX S3\MIN S4\IMIN - // S5\MEAN S6\GMEAN S7\RMS S8\VARIANCE S9\SDEV - // S10\ADEV, S11\KURTOSIS S12\SKEWNESS S13\SUM // STAT\MOMENT W X MOMENT_NUMBER SOUT // STAT\PEARSON X Y { R PROB } // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); bool output = qualifiers[wxT("MESSAGES")] || ExGlobals::NotInaScript() || ExGlobals::GetEcho(); if( !qualifiers[wxT("MESSAGES")] )output = false; if( qualifiers[wxT("PEARSON")] ) { // STATISTICS\PEARSON X Y { R PROB } // if( p->GetNumberOfTokens() < 3 ) throw ECommandError( command+wxT("expecting independent vector") ); std::vector x, y; try { NumericVariable::GetVector( p->GetString(1), wxT("independent vector"), x ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); std::size_t numX = x.size(); // try { NumericVariable::GetVector( p->GetString(2), wxT("dependent vector"), y ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); std::size_t numY = y.size(); // if( numX != numY ) throw ECommandError( command+wxT("input vectors have different lengths") ); // double r, prob; try { Pearson( x, y, r, prob ); } catch( ECommandError &e ) { throw; } if( output ) { wxString c( wxT("Correlation Coeffidient = ") ); ExGlobals::WriteOutput( c << r ); c = wxT("Significance Level = "); ExGlobals::WriteOutput( c << prob ); } if( p->GetNumberOfTokens() == 5 ) { if( !p->IsString(3) ) throw ECommandError( command+wxT("expecting output correlation coefficient variable") ); if( !p->IsString(4) ) throw ECommandError( command+wxT("expecting output significance level variable") ); AddToStackLine( p->GetString(3) ); AddToStackLine( p->GetString(4) ); try { NumericVariable::PutVariable( p->GetString(3), r, p->GetInputLine() ); NumericVariable::PutVariable( p->GetString(4), prob, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } return; } if( qualifiers[wxT("MOMENTS")] ) { // calculate moments // syntax: stat\moments w x moment_number sout // x = input independent vector // w = input weight vector // if( p->GetNumberOfTokens()<2 || !p->IsString(1) ) throw ECommandError( command+wxT("expecting weight vector") ); std::vector w; try { NumericVariable::GetVector( p->GetString(1), wxT("weight vector"), w ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); std::size_t numW = w.size(); if( numW < 2 ) throw ECommandError( command+wxT("weight vector length < 2") ); // if( p->GetNumberOfTokens()<3 || !p->IsString(2) ) throw ECommandError( command+wxT("expecting data vector") ); std::vector x; try { NumericVariable::GetVector( p->GetString(2), wxT("data vector"), x ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); std::size_t numX = x.size(); if( numX != numW ) throw ECommandError( command+wxT("input vectors have different lengths") ); // if( p->GetNumberOfTokens() < 4 ) throw ECommandError( command+wxT("expecting moment number") ); double tmp; try { NumericVariable::GetScalar( p->GetString(3), wxT("data vector"), tmp ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(3) ); int n = static_cast(tmp); if( n < 0 )throw ECommandError( command+wxT("moment number < 0") ); if( n == 0 )throw ECommandError( command+wxT("moment number = 0") ); wxString momentName; if( p->GetNumberOfTokens() == 5 ) { if( !p->IsString(4) ) throw ECommandError( command+wxT("expecting output moment variable") ); momentName = p->GetString(4); AddToStackLine( momentName ); } double wsum = 0.0; for( std::size_t i=0; iGetInputLine() ); if( output ) { wxString c; switch (n) { case 1: c = wxT("first moment = "); break; case 2: c = wxT("second moment = "); break; case 3: c = wxT("third moment = "); break; default: c << n << wxT("_th moment = "); } ExGlobals::WriteOutput( c << xmom ); } return; } // calculate statistics with weights, w assumes w>=0 // x = input independent vector // // statistics x ( display all statistics ) // statistics x s1\max s2\imax s3\min s4\imin - // s5\mean s6\gmean s7\rms s8\variance s9\sdev - // s10\kurtosis s11\skewness // statistics\weight w x ( display all statistics ) // statistics\weight w x s1\max s2\imax s3\min s4\imin - // s5\mean s6\gmean s7\rms s8\variance s9\sdev - // s10\kurtosis s11\skewness // int counter = 1; std::size_t numW = 0; std::vector w; if( qualifiers[wxT("WEIGHTS")] ) { if( p->GetNumberOfTokens()<2 || !p->IsString(1) ) throw ECommandError( command+wxT("expecting weight vector") ); try { NumericVariable::GetVector( p->GetString(1), wxT("weight vector"), w ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); numW = w.size(); if( numW < 2 )throw ECommandError( command+wxT("weight vector length < 2") ); ++counter; } if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting data vector") ); std::vector x; int ndim; double value; int dimSizes[3]; try { NumericVariable::GetVariable( p->GetString(counter), ndim, value, x, dimSizes ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter) ); std::size_t numX = x.size(); if( numX < 2 )throw ECommandError( command+wxT("data variable length < 2") ); if( qualifiers[wxT("WEIGHTS")] ) { if( ndim == 2 )throw ECommandError( command+wxT("cannot apply weights to matrix data") ); if( numW != numX )throw ECommandError( command+wxT("input variables have different lengths") ); } std::vector validNames; validNames.push_back( wxString(wxT("MAX")) ); validNames.push_back( wxString(wxT("IMAX")) ); validNames.push_back( wxString(wxT("JMAX")) ); validNames.push_back( wxString(wxT("MIN")) ); validNames.push_back( wxString(wxT("IMIN")) ); validNames.push_back( wxString(wxT("JMIN")) ); validNames.push_back( wxString(wxT("MEAN")) ); validNames.push_back( wxString(wxT("GMEAN")) ); validNames.push_back( wxString(wxT("RMS")) ); validNames.push_back( wxString(wxT("VARIANCE")) ); validNames.push_back( wxString(wxT("SDEV")) ); validNames.push_back( wxString(wxT("ADEV")) ); validNames.push_back( wxString(wxT("KURTOSIS")) ); validNames.push_back( wxString(wxT("SKEWNESS")) ); validNames.push_back( wxString(wxT("MEDIAN")) ); validNames.push_back( wxString(wxT("SUM")) ); std::size_t nValid = validNames.size(); std::vector valid( nValid, false ); int nfld = p->GetNumberOfTokens(); std::vector validIdx( nfld, -1 ); for( int i=counter+1; iIsString(i) ) { wxString c(wxT("parameter ")); throw ECommandError( command+(c << i+1 << wxT(" is invalid")) ); } int nqual = p->GetToken(i)->GetNumberOfQualifiers(); if( nqual < 1 ) { wxString c(wxT("parameter ")); throw ECommandError( command+(c << i+1 << wxT(" has no identifying qualifier")) ); } if( nqual > 1 ) { wxString c(wxT("parameter ")); throw ECommandError( command+(c << i+1 << wxT(" has more than one qualifier")) ); } wxString qualifier( *p->GetToken(i)->GetQualifier(0) ); for( std::size_t j=0; jGetString(i) ); s += wxString(1,wxT('\\')) + qualifier; AddToStackLine( s ); } double xmeang = 0.0; double xsum = 0.0; double sum = 0.0; double rms = 0.0; bool flag = true; // test for x[i] >= 0.0 bool flag2 = true; // test for rms > 0.0 std::size_t imin, imax, jmin, jmax; double xmin, xmax; double wsum, wp; if( ndim == 1 ) { if( qualifiers[wxT("WEIGHTS")] ) { wsum = 0.0; } else { wp = 1.0; wsum = numX; } imax = 1; imin = 1; xmin = x[0]; xmax = xmin; for( std::size_t i=0; i xp ) { xmin = xp; imin = i+1; } if( xmax < xp ) { xmax = xp; imax = i+1; } xsum += wp*xp; sum += xp; xp>0.0 ? xmeang+=wp*log(xp) : flag=false; rms += wp*xp*xp; } } else if( ndim == 2 ) { int nrow = dimSizes[0]; int ncol = dimSizes[1]; if( qualifiers[wxT("WEIGHTS")] ) { wsum = 0.0; } else { wp = 1.0; wsum = nrow*ncol; } imax = 1; imin = 1; jmax = 1; jmin = 1; xmin = x[0]; xmax = xmin; for( int j=0; j xp ) { xmin = xp; imin = i+1; jmin = j+1; } if( xmax < xp ) { xmax = xp; imax = i+1; jmax = j+1; } xsum += xp*wp; sum += xp; if( xp > 0.0 ) { xmeang += wp*log(xp); } else { flag = false; } rms += wp*xp*xp; } } } if( wsum == 0.0 )throw ECommandError( command+wxT("sum of the weights = 0") ); double xmean = xsum/wsum; if( flag )xmeang = exp(xmeang/wsum); flag2 = (rms/wsum >= 0.0); if( flag2 )rms = sqrt(rms/wsum); // double var = 0.0; double adev = 0.0; double skew = 0.0; double xkurt = 0.0; // wp = 1.0; std::size_t num = ndim==2 ? dimSizes[0]*dimSizes[1] : numX; for( std::size_t i=0; i= 0.0 )sdev = sqrt( var ); if( var*var != 0.0 ) { skew = skew/(wsum*var*sdev); xkurt = xkurt/(wsum*var*var) - 3.0; } double xmedian = 0.0; if( valid[14] )xmedian = UsefulFunctions::Median( x ); // std::vector stats; stats.push_back( xmax ); stats.push_back( static_cast(imax) ); stats.push_back( static_cast(jmax) ); stats.push_back( xmin ); stats.push_back( static_cast(imin) ); stats.push_back( static_cast(jmin) ); stats.push_back( xmean ); stats.push_back( xmeang ); stats.push_back( rms ); stats.push_back( var ); stats.push_back( sdev ); stats.push_back( adev ); stats.push_back( xkurt ); stats.push_back( skew ); stats.push_back( xmedian ); stats.push_back( sum ); // if( output || nfld==counter+1 ) { wxChar c[100]; ::wxSnprintf( c, 100, wxT("minimum = %10lg | maximum = %10lg"), xmin, xmax ); ExGlobals::WriteOutput( c ); // if( ndim == 1 ) { wxString s(wxT("index of minimum = [")); s << imin << wxT("]"); std::size_t len = s.size(); s += wxString( 32-len, ' ' ); s << wxT("| index of maximum = [") << imax << wxT(']'); ExGlobals::WriteOutput( s ); } else if( ndim == 2 ) { wxString s(wxT("index of minimum = [")); s << imin << wxT(",") << jmin << wxT(']'); std::size_t len = s.size(); s += wxString( 32-len, ' ' ); s << wxT("| index of maximum = [") << imax << wxT(',') << jmax << wxT(']'); ExGlobals::WriteOutput( s ); } ::wxSnprintf( c, 100, wxT("sum = %10lg |"), sum ); ExGlobals::WriteOutput( c ); if( flag ) { ::wxSnprintf( c, 100, wxT("mean = %10lg | geometric mean = %10lg"), xmean, xmeang ); } else { ::wxSnprintf( c, 100, wxT("mean = %10lg | geometric mean unavailable"), xmean ); } ExGlobals::WriteOutput( c ); if( valid[14] ) { ::wxSnprintf( c, 100, wxT("median = %10lg | variance = %10lg"), xmedian, var ); } else { ::wxSnprintf( c, 100, wxT("median not requested | variance = %10lg"), var ); } ExGlobals::WriteOutput( c ); if( var >= 0.0 ) { ::wxSnprintf( c, 100, wxT("standard deviation = %10lg | average deviation = %10lg"), sdev, adev ); } else { ::wxSnprintf( c, 100, wxT("standard deviation unavailable | average deviation = %10lg"), adev ); } ExGlobals::WriteOutput( c ); if( var*var != 0.0 ) { ::wxSnprintf( c, 100, wxT("skewness = %10lg | kurtosis = %10lg"), skew, xkurt ); } else { ::wxSnprintf( c, 100, wxT("skewness unavailable | kurtosis unavailable") ); } ExGlobals::WriteOutput( c ); } for( int i=counter+1; iGetString(i), stats[validIdx[i]], p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } void CMD_statistics::Pearson( std::vector &x, std::vector &y, double &r, double &prob ) { // Given two arrays X and Y of length N, this routine computes their // correlation coefficient r. The significance level at which the // null hypothesis of zero correlation is disproved, prob, whose small // value indicates a significant correlation. // // From NUMERICAL RECIPES, THE ART OF SCIENTIFIC COMPUTING // William H. Press, Brian P. Flannery, Saul A. Teukolsky // and William T. Vetterling; 1987; Cambridge University Press // pg. 487 // double const tiny=1.e-20; // double ax = 0.0; double ay = 0.0; std::size_t const n = x.size(); for( std::size_t j=0; j(a,b) } catch( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } return; } // end of file extrema-4.4.5/src/Commands/CMD_rebin.h0000644012702201742730000000206111274636606016504 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_REBIN #define CMD_REBIN #include "Command.h" class ParseLine; class CMD_rebin : public Command { public: static CMD_rebin *Instance() { if( !cmd_rebin_ )cmd_rebin_ = new CMD_rebin(); return cmd_rebin_; } void Execute( ParseLine const * ); private: CMD_rebin(); static CMD_rebin *cmd_rebin_; }; #endif extrema-4.4.5/src/Commands/CMD_inquire.h0000644012702201742730000000225311274636606017064 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_INQUIRE #define CMD_INQUIRE #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_inquire : public Command { public: static CMD_inquire *Instance() { if( !cmd_inquire_ )cmd_inquire_ = new CMD_inquire(); return cmd_inquire_; } void Execute( ParseLine const * ); void ProcessString( wxString const & ); void ProcessYN( wxString const & ); private: CMD_inquire(); static CMD_inquire *cmd_inquire_; }; #endif extrema-4.4.5/src/Commands/CMD_bin2d.h0000644012702201742730000000206011274636606016402 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_BIN2D #define CMD_BIN2D #include "Command.h" class ParseLine; class CMD_bin2d : public Command { public: static CMD_bin2d *Instance() { if( !cmd_bin2d_ )cmd_bin2d_ = new CMD_bin2d(); return cmd_bin2d_; } void Execute( ParseLine const * ); private: CMD_bin2d(); static CMD_bin2d *cmd_bin2d_; }; #endif extrema-4.4.5/src/Commands/CMD_replot.h0000644012702201742730000000207411274636606016716 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_REPLOT #define CMD_REPLOT #include "Command.h" class ParseLine; class CMD_replot : public Command { public: static CMD_replot *Instance() { if( !cmd_replot_ )cmd_replot_ = new CMD_replot(); return cmd_replot_; } void Execute( ParseLine const * ); private: CMD_replot(); static CMD_replot *cmd_replot_; }; #endif extrema-4.4.5/src/Commands/CMD_hardcopy.cpp0000644012702201742730000001063011274636606017552 0ustar spangspang/* Copyright (C) 2005, 2006, 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "wx/filename.h" #include "CMD_hardcopy.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "EGraphicsError.h" #include "GRA_wxWidgets.h" #include "ExGlobals.h" #include "EVariableError.h" #include "TextVariable.h" #include "NumericVariable.h" #include "VisualizationWindow.h" CMD_hardcopy *CMD_hardcopy::cmd_hardcopy_ = 0; CMD_hardcopy::CMD_hardcopy() : Command( wxT("HARDCOPY") ) { AddQualifier( wxT("POSTSCRIPT"), true ); AddQualifier( wxT("PNG"), false ); AddQualifier( wxT("JPEG"), false ); AddQualifier( wxT("WMF"), false ); AddQualifier( wxT("EMF"), false ); } void CMD_hardcopy::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch( ECommandError const &e ) { throw; } wxString command( Name()+wxT(": ") ); if( !p->IsString(1) )throw ECommandError( command+wxT("filename not entered") ); wxString filename; try { TextVariable::GetVariable( p->GetString(1), true, filename ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); // wxFileName wxfn( filename ); if( wxfn.GetPath().empty() )filename = ExGlobals::GetCurrentPath() + wxfn.GetPathSeparator() + filename; // wxString extension; std::size_t len = filename.size(); std::size_t i = filename.find_last_of( wxT('.') ); extension = i==filename.npos ? wxT("") : filename.substr(i,len-i); try { if( qualifiers[wxT("PNG")] || qualifiers[wxT("JPEG")] ) { int type; if( qualifiers[wxT("PNG")] ) { if( extension.empty() )filename += wxT(".png"); type = wxBITMAP_TYPE_PNG; } else { if( extension.empty() )filename += wxT(".jpeg"); type = wxBITMAP_TYPE_JPEG; } int xminM, yminM, xmaxM, ymaxM; ExGlobals::GetMonitorLimits( xminM, yminM, xmaxM, ymaxM ); int width = xmaxM-xminM; int height = ymaxM-yminM; if( p->GetNumberOfTokens() == 4 ) { double v1, v2; try { NumericVariable::GetScalar( p->GetString(2), wxT("width"), v1 ); NumericVariable::GetScalar( p->GetString(3), wxT("height"), v2 ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } width = static_cast(v1+0.5); height = static_cast(v2+0.5); AddToStackLine( p->GetString(2) ); AddToStackLine( p->GetString(3) ); xminM = 0; xmaxM = width; yminM = 0; ymaxM = height; } try { ExGlobals::GetVisualizationWindow()->SaveBitmap( xminM, yminM, xmaxM, ymaxM, filename, type ); } catch( EGraphicsError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( qualifiers[wxT("POSTSCRIPT")] || qualifiers[wxT("PSA")] ) { if( extension.empty() )filename += wxT(".ps"); try { ExGlobals::GetVisualizationWindow()->SavePS( filename ); } catch( EGraphicsError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( qualifiers[wxT("WMF")] ) { throw ECommandError( command+wxT("windows metafiles are only available under windows") ); } else if( qualifiers[wxT("EMF")] ) // enhanced metafile { throw ECommandError( command+wxT("windows metafiles are only available under windows") ); } } catch( EGraphicsError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } // end of file extrema-4.4.5/src/Commands/CMD_fit.cpp0000644012702201742730000003343411274636606016532 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "CMD_fit.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "EExpressionError.h" #include "Expression.h" #include "EVariableError.h" #include "NumericVariable.h" #include "TextVariable.h" CMD_fit *CMD_fit::cmd_fit_ = 0; CMD_fit::CMD_fit() : Command( wxT("FIT") ) { AddQualifier( wxT("WEIGHTS"), false ); AddQualifier( wxT("ZEROS"), true ); AddQualifier( wxT("TOLERANCE"), false ); AddQualifier( wxT("POISSON"), false ); AddQualifier( wxT("MARQUARDT"), false ); AddQualifier( wxT("RESET"), false ); AddQualifier( wxT("ITMAX"), false ); AddQualifier( wxT("CORRELATIONS"), false ); AddQualifier( wxT("COVARIANCE"), false ); AddQualifier( wxT("E1"), false ); AddQualifier( wxT("E2"), false ); AddQualifier( wxT("CHISQ"), false ); AddQualifier( wxT("CL"), false ); AddQualifier( wxT("VARNAMES"), false ); AddQualifier( wxT("UPDATE"), false ); AddQualifier( wxT("MESSAGES"), true ); AddQualifier( wxT("FREE"), false ); } void CMD_fit::Execute( ParseLine const *p ) { // fit y = expression // fit/weight w y = expression // fit/itmax n y = expression // fit/weight/itmax w n y = expression // fit/poisson y = expression // fit/poisson/itmax n y = expression // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); bool output = qualifiers[wxT("MESSAGES")] || ExGlobals::NotInaScript() || ExGlobals::GetEcho(); if( !qualifiers[wxT("MESSAGES")] )output = false; // if( qualifiers[wxT("UPDATE")] ) { if( rhs_.length() == 0 )throw ECommandError( command+wxT("no previous fit") ); // if( !p->IsString(1) )throw ECommandError( command+wxT("no output variable") ); // wxString lhs( p->GetString(1) ); AddToStackLine( lhs+wxString(wxT(" ! ( = "))+rhs_+wxString(wxT(" )")) ); // // re-evaluate the last expression // Expression expr( rhs_ ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() )throw ECommandError( command+wxT("expecting numeric expression") ); // NumericData nd( expr.GetFinalAnswer() ); try { switch ( nd.GetNumberOfDimensions() ) { case 0: NumericVariable::PutVariable( lhs, nd.GetScalarValue(), p->GetInputLine() ); break; case 1: NumericVariable::PutVariable( lhs, nd.GetData(), 0, p->GetInputLine() ); break; case 2: NumericVariable::PutVariable( lhs, nd.GetData(), nd.GetDimMag(0), nd.GetDimMag(1), p->GetInputLine() ); } } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } return; } int icnt = 1; std::vector weightVec; if( qualifiers[wxT("WEIGHTS")] ) { try { NumericVariable::GetVector( p->GetString(icnt), wxT("weight vector"), weightVec ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt++) ); } else { qualifiers[wxT("ZEROS")] = false; } int ntmax; if( qualifiers[wxT("ITMAX")] ) { double dntmax; try { NumericVariable::GetScalar( p->GetString(icnt), wxT("iteration maximum"), dntmax ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ntmax = static_cast(dntmax); if( ntmax < 0 ) { throw ECommandError( command+wxT("maximum iteration number < 0") ); } else if( ntmax == 0 ) { throw ECommandError( command+wxT("maximum iteration number = 0") ); } AddToStackLine( p->GetString(icnt++) ); } else { ntmax = 51; } double tolerance = 0.00001; if( qualifiers[wxT("TOLERANCE")] ) { try { NumericVariable::GetScalar( p->GetString(icnt), wxT("iteration tolerance"), tolerance ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( tolerance < 0.0 ) { throw ECommandError( command+wxT("tolerance < 0") ); } else if( tolerance == 0.0 ) { throw ECommandError( command+wxT("tolerance = 0") ); } AddToStackLine( p->GetString(icnt++) ); } // // extract the vector from the left hand side of the wxT("=") // wxString lhs( p->GetString(icnt) ); std::vector yVec; try { NumericVariable::GetVector( lhs, wxT("left hand side of equation"), yVec ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( lhs ); // if( qualifiers[wxT("WEIGHTS")] ) { if( weightVec.size() != yVec.size() ) throw ECommandError( command+wxT("weight vector has different length than dependent variable") ); } else { weightVec.assign( yVec.size(), 1.0 ); } int ilf = -1; std::size_t const lhsEnd = lhsSave_.size(); for( std::size_t i=0; iGetNumberOfTokens()-1 < icnt ) { if( lhsSave_[ilf].length() == 0 ) { throw ECommandError( command+wxT("no previous expression has been entered for this variable") ); } rhs_ = rhsSave_[ilf]; } else if( p->IsNumeric(icnt) ) { throw ECommandError( command+wxT("attempt to fit a constant") ); } else if( p->IsString(icnt) ) { rhs_ = p->GetString(icnt); rhsSave_[ilf] = p->GetString(icnt); AddToStackLine( rhsSave_[ilf] ); } else if( p->IsEqualSign(icnt) ) { throw ECommandError( command+wxT("equal sign encountered, expecting right hand side of equation") ); } // // decode the expression // Expression expr( rhs_ ); expr.SetIsaFit(); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() )throw ECommandError( command+wxT("expecting a numeric expression") ); // std::size_t const nparam = expr.GetNumberOfFitParameters(); if( nparam == 0 ) throw ECommandError( command+wxT("no fitting parameters in the expression") ); if( yVec.size() < nparam ) throw ECommandError( command+wxT("number of data points < number of parameters") ); // // do the least squares fit // std::vector pp( nparam, 0.0 ); for( std::size_t i=0; i p1( pp ); // save original parameter values std::vector pSave( pp ); std::vector e1( nparam ), e2( nparam ); std::vector< std::vector > errmat( nparam ); for( std::size_t i=0; i corr( nparam*nparam, 0.0 ); for( std::size_t i=0; i 0.0 ) { corr[j+i*nparam] = errmat[j][i]/sqrt(errmat[j][j]*errmat[i][i]); corr[i+j*nparam] = corr[j+i*nparam]; } } } try { name = wxT("FIT$CORR"); NumericVariable::PutVariable( name, corr, nparam, nparam, GetStackLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( output )ExGlobals::WriteOutput( wxT("creating new correlation matrix: FIT$CORR") ); } // // output covariance matrix if covmat modifier specified // if( qualifiers[wxT("COVARIANCE")] ) { std::vector cov( nparam*nparam, 0.0 ); for( std::size_t i=0; i(nfree), GetStackLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( output )ExGlobals::WriteOutput( wxT("creating new degrees of freedom scalar: FIT$FREE") ); } } // end of file extrema-4.4.5/src/Commands/CMD_show.cpp0000644012702201742730000004337411274636606016734 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "CMD_show.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "NVariableTable.h" #include "TVariableTable.h" #include "NumericVariable.h" #include "TextVariable.h" CMD_show *CMD_show::cmd_show_ = 0; CMD_show::CMD_show() : Command( wxT("SHOW") ) { AddQualifier( wxT("ALL"), false ); AddQualifier( wxT("SCALARS"), false ); AddQualifier( wxT("VECTORS"), false ); AddQualifier( wxT("MATRICES"), false ); AddQualifier( wxT("TENSORS"), false ); AddQualifier( wxT("TEXT"), false ); AddQualifier( wxT("FIT"), true ); AddQualifier( wxT("VARY"), true ); AddQualifier( wxT("FIXED"), true ); AddQualifier( wxT("ORDERED"), true ); } void CMD_show::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } int nTokens = p->GetNumberOfTokens(); qualifiers[wxT("ALL")] = !(qualifiers[wxT("SCALARS")] || qualifiers[wxT("VECTORS")] || qualifiers[wxT("MATRICES")] || qualifiers[wxT("TENSORS")] || qualifiers[wxT("TEXT")] ); NVariableTable *nvTable = NVariableTable::GetTable(); TVariableTable *tvTable = TVariableTable::GetTable(); int nvEntries = nvTable->Entries(); int tvEntries = tvTable->Entries(); std::vector indexNV, indexTV; wxString command( wxT("SHOW") ); if( nTokens == 1 ) { for( int i=0; iIsString(j) )throw ECommandError( command+wxT("expecting variable names") ); AddToStackLine( p->GetString(j) ); GetWild( p->GetString(j), indexNV, indexTV ); } } int numericVars = indexNV.size(); int textVars = indexTV.size(); std::size_t maxTextName = 4; std::size_t maxNumberOfStrings = 0; std::size_t maxNumberOfChars = 0; if( textVars > 0 ) { for( int i=0; iGetEntry( i ); std::size_t len = tv->GetName().size(); if( maxTextName < len )maxTextName = len; TextData td( tv->GetData() ); if( td.GetNumberOfDimensions() == 0 ) { len = td.GetScalarValue().size(); if( maxNumberOfChars < len )maxNumberOfChars = len; } else { std::size_t vlen = td.GetData().size(); if( maxNumberOfStrings < vlen )maxNumberOfStrings = vlen; for( std::size_t j=0; j(log10(static_cast(maxNumberOfChars))) + 1; if( maxNumberOfStrings > 0 )maxNumberOfStrings = static_cast(log10(static_cast(maxNumberOfStrings))) + 1; } std::size_t maxVarNameLength = 6; // minimum variable name length is 6 std::size_t maxScalarValueLength = 5; std::size_t maxVecLength = 6; std::size_t maxMatrixRows = 5; std::size_t maxMatrixColumns = 8; wxChar c[50]; for( int i=0; iGetEntry( indexNV[i] ); NumericData nd( nv->GetData() ); std::size_t len = nv->GetName().size(); if( maxVarNameLength < len )maxVarNameLength = len; switch ( nd.GetNumberOfDimensions() ) { case 0: { double value = nd.GetScalarValue(); wxString s; if( value >= 0.0 )s << wxT(" ") << value; else s << value; maxScalarValueLength = std::max( maxScalarValueLength, s.size() ); } case 1: { wxString s; maxVecLength = std::max( maxVecLength, (s< 0 ) { if( qualifiers[wxT("ALL")] || qualifiers[wxT("SCALARS")] ) { bool first = true; for( int i=0; iGetEntry( indexNV[i] ); NumericData nd( nv->GetData() ); if( nd.GetNumberOfDimensions()==0 && ( (nd.IsFit() && fit) || (nd.IsFixed() && qualifiers[wxT("FIXED")])) ) { noVariablesFound = false; if( first ) { wxString title; if( maxVarNameLength > 6 )title += wxString( maxVarNameLength-6, ' ' ); title += wxString( wxT("scalar = value") ); if( maxScalarValueLength > 5 )title += wxString( maxScalarValueLength-5, ' ' ); title += wxString( wxT(" type history (most recent at the top)") ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); ExGlobals::WriteOutput( title ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); first = false; } wxString line; wxString name( nv->GetName() ); std::size_t len = name.size(); if( maxVarNameLength > len )line += wxString( maxVarNameLength-len, ' ' ); line += name + wxString( wxT(" = ") ); double value = nd.GetScalarValue(); wxString s; if( value >= 0.0 )s << wxT(" ") << value; else s << value; len = s.size(); if( maxScalarValueLength > len )line += wxString( maxScalarValueLength-len, ' ' ); line += s; line += nd.IsFit() ? wxString(wxT(" fit ")) : wxString(wxT(" fixed ")); std::deque history( nv->GetHistory() ); std::size_t hSize = history.size(); std::size_t nHistory; nhistory < 0 ? nHistory = hSize : nHistory = std::min(hSize,static_cast(nhistory)); line += history[0]; ExGlobals::WriteOutput( line ); if( nHistory > 1 ) { line.erase(); wxString blanks( maxVarNameLength+3+maxScalarValueLength+7, ' ' ); for( std::size_t j=1; jGetEntry( indexNV[i] ); NumericData nd( nv->GetData() ); if( nd.GetNumberOfDimensions() == 1 ) { noVariablesFound = false; if( first ) { wxString title; if( maxVarNameLength > 6 ) { wxString blanks( maxVarNameLength-6, ' ' ); title += blanks; } title += wxString( wxT("vector") ); if( maxVecLength > 6 )title += wxString( maxVecLength-6, ' ' ); title += wxString( wxT(" length order history (most recent at the top)") ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); ExGlobals::WriteOutput( title ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); first = false; } wxString line; wxString name( nv->GetName() ); std::size_t len = name.size(); if( maxVarNameLength > len )line += wxString( maxVarNameLength-len, ' ' ); line += name; len = nd.GetDimMag(0); ::wxSnprintf( c, 50, wxT(" %*d"), maxVecLength, len ); line += wxString( c ); if( nd.IsAscending() ) line += wxString(wxT(" ascending ")); else if( nd.IsDescending() ) line += wxString(wxT(" descending ")); else if( nd.IsUnordered() ) line += wxString(wxT(" unordered ")); std::deque history( nv->GetHistory() ); std::size_t hSize = history.size(); std::size_t nHistory = nhistory<0 ? hSize : std::min(hSize,static_cast(nhistory)); line += history[0]; ExGlobals::WriteOutput( line ); if( nHistory > 1 ) { line.erase(); wxString blanks(maxVarNameLength+17+maxVecLength,' '); for( std::size_t j=1; jGetEntry( indexNV[i] ); NumericData nd( nv->GetData() ); if( nd.GetNumberOfDimensions() == 2 ) { noVariablesFound = false; if( first ) { wxString title; if( maxVarNameLength > 6 )title += wxString( maxVarNameLength-6, ' ' ); title += wxString( wxT("matrix ") ); if( maxMatrixRows > 5 )title += wxString( maxMatrixRows-5, ' ' ); title += wxString( wxT(" #rows") ); if( maxMatrixColumns > 8 )title += wxString( maxMatrixColumns-8, ' ' ); title += wxString( wxT(" #columns history (most recent at the top)") ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); ExGlobals::WriteOutput( title ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); first = false; } wxString line; wxString name( nv->GetName() ); std::size_t len = name.size(); if( maxVarNameLength > len )line += wxString( maxVarNameLength-len, ' ' ); line += name; int nr = nd.GetDimMag(0); int nc = nd.GetDimMag(1); ::wxSnprintf( c, 50, wxT("%*d "), maxMatrixRows, nr ); wxString sr( c ); ::wxSnprintf( c, 50, wxT("%*d "), maxMatrixColumns, nc ); wxString sc( c ); line += sr + sc; std::deque history( nv->GetHistory() ); std::size_t hSize = history.size(); std::size_t nHistory = nhistory<0 ? hSize : std::min(hSize,static_cast(nhistory)); line += history[0]; ExGlobals::WriteOutput( line ); if( nHistory > 1 ) { line.erase(); wxString blanks( maxVarNameLength+maxMatrixRows+maxMatrixColumns+9, ' ' ); for( std::size_t j=1; j 0 ) { if( qualifiers[wxT("ALL")] || qualifiers[wxT("TEXT")] ) { wxString blanksSave; if( maxNumberOfStrings < 3 )blanksSave.assign( maxNumberOfStrings+3, ' ' ); bool first = true; for( int i=0; iGetEntry( indexTV[i] ); TextData td( tv->GetData() ); noVariablesFound = false; if( first ) { wxString title; if( maxTextName > 6 )title += wxString( maxTextName-4, ' ' ); title += wxString( wxT("text") ); if( maxNumberOfStrings > 0 ) { if( maxNumberOfStrings > 5 )title += wxString( maxNumberOfStrings-5, ' ' ); title += wxT(" index"); } if( maxNumberOfChars > 6 )title += wxString( maxNumberOfChars-6, ' ' ); title += wxString(wxT(" length contents")); ExGlobals::WriteOutput( wxString(title.size(),'-') ); ExGlobals::WriteOutput( title ); ExGlobals::WriteOutput( wxString(title.size(),'-') ); first = false; } wxString line; wxString name( tv->GetName() ); std::size_t len = name.size(); if( maxTextName > len )line += wxString( maxTextName-len, ' ' ); line += name; if( td.GetNumberOfDimensions() == 0 ) { if( maxNumberOfStrings > 0 ) { line += wxString( maxNumberOfStrings+3, ' ' ); if( maxNumberOfStrings < 3 )line += blanksSave; } wxString value( td.GetScalarValue() ); ::wxSnprintf( c, 50, wxT(" [%*d] "), maxNumberOfChars, td.GetScalarValue().size() ); line += wxString(c) + value; ExGlobals::WriteOutput( line ); line.erase(); } else { std::size_t vLen = td.GetData().size(); ::wxSnprintf( c, 50, wxT(" [%*d]"), maxNumberOfStrings, 1 ); line += wxString(c); if( maxNumberOfStrings < 3 )line += blanksSave; wxString value( td.GetData(0) ); ::wxSnprintf( c, 50, wxT("[%*d] "), maxNumberOfChars, value.size() ); line += wxString(c) + value; ExGlobals::WriteOutput( line ); line.erase(); for( std::size_t j=2; j<=vLen; ++j ) { line.assign( wxString(maxTextName,' ') ); ::wxSnprintf( c, 50, wxT(" [%*d]"), maxNumberOfStrings, j ); line += wxString( c ); if( maxNumberOfStrings < 3 )line += blanksSave; wxString value( td.GetData(j-1) ); ::wxSnprintf( c, 50, wxT("[%*d] "), maxNumberOfChars, value.size() ); line += wxString(c) + value; ExGlobals::WriteOutput( line ); line.erase(); } } } } } if( noVariablesFound ) { ExGlobals::WriteOutput( wxString(18,wxT('-')) ); ExGlobals::WriteOutput( wxT("no variables found") ); ExGlobals::WriteOutput( wxString(18,wxT('-')) ); } } void CMD_show::GetWild( wxString &s, std::vector &indexNV, std::vector &indexTV ) { s.UpperCase(); int ls = s.size(); wxChar wild = '*'; // // the only possibilities allowed are: *x, *x*, *x*y, x*y, x* // int i1 = s.find_first_of( wild ); int i2; if( i1 == 0 ) // wild is first character in string, e.g., *x { i2 = s.substr(2,ls-2).find_first_of( wild ); // // i2 >= 0 --> there is another wild in string, e.g., *x*y // i2 < 0 --> only first character is wild, e.g., *x // i2 >= 0 ? i2 += 2 : i2 = -1; } else if( i1 > 0 ) // wild is in string, but not first, e.g., x*y or x* { i2 = i1; i1 = -1; } else // no wild in string { i1 = -1; i2 = -1; } int idx; NVariableTable *nvTable = NVariableTable::GetTable(); int nvEntries = nvTable->Entries(); for( int i=0; iGetEntry( i ); wxString name( nv->GetName() ); int lnm = name.size(); if( i1 == 0 ) // *x or *x* or *x*y { if( i2 == ls-1 ) // *x* { wxString tmp( s.substr(1,ls-2) ); idx = name.find_first_of( tmp ); flag = ( idx>=0 ); } else if( i2>=0 && i2=0 && name.substr(lnm-ls+i2+1,ls-i2-1)==s.substr(i2+1,ls-i2-1) ); } else if( i2 == -1 ) // *x { flag = ( name.substr(lnm-ls+1,ls-1)==s.substr(1,ls-1) ); } } else if( i1 == -1 ) // x*y or x* or x { if( i2 == ls-1 ) // x* { flag = ( name.substr(0,i2)==s.substr(0,i2) ); } else if( i2>=0 && i2Entries(); for( int i=0; iGetEntry( i ); wxString name( tv->GetName() ); int lnm = name.size(); if( i1 == 0 ) // *x or *x* or *x*y { if( i2 == ls-1 ) // *x* { wxString tmp( s.substr(1,ls-2) ); idx = name.find_first_of( tmp ); flag = ( idx>=0 ); } else if( i2>=0 && i2=0 && name.substr(lnm-ls+i2+1,ls-i2-1)==s.substr(i2+1,ls-i2-1) ); } else if( i2 == -1 ) // *x { flag = ( name.substr(lnm-ls+1,ls-1)==s.substr(1,ls-1) ); } } else if( i1 == -1 ) // x*y or x* or x { if( i2 == ls-1 ) // x* { flag = ( name.substr(0,i2)==s.substr(0,i2) ); } else if( i2>=0 && i2 STACK\APPEND sameFilename // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens()<2 || !p->IsString(1) )throw ECommandError( command+wxT("no filename was entered") ); wxString filename; try { TextVariable::GetVariable( p->GetString(1), true, filename ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( filename.Upper() == wxT("OFF") ) { ExGlobals::SetStackOff(); } else if( filename.Upper() == wxT("ON") ) { filename = ExGlobals::GetStackFile(); if( filename.empty() )throw ECommandError( command+wxT("no previous stack file") ); if( !ExGlobals::SetStackOn(filename,true) )throw ECommandError( command+wxT("could not open ")+filename ); } else { // get the file extension, if there was one given wxString extension( ExGlobals::GetFileExtension(filename) ); if( extension.empty() )filename += wxT(".stk"); if( !ExGlobals::SetStackOn(filename,qualifiers[wxT("APPEND")]) ) throw ECommandError( command+wxT("could not open ")+filename ); } } // end of file extrema-4.4.5/src/Commands/CMD_vector.h0000644012702201742730000000207411274636606016713 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_VECTOR #define CMD_VECTOR #include "Command.h" class ParseLine; class CMD_vector : public Command { public: static CMD_vector *Instance() { if( !cmd_vector_ )cmd_vector_ = new CMD_vector(); return cmd_vector_; } void Execute( ParseLine const * ); private: CMD_vector(); static CMD_vector *cmd_vector_; }; #endif extrema-4.4.5/src/Commands/CMD_contour.cpp0000644012702201742730000005411111423433102017412 0ustar spangspang/* Copyright (C) 2005,...,2010 Joseph L. Chuma 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. */ #include #include "wx/wx.h" #include "CMD_contour.h" #include "GRA_contourLine.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "EVariableError.h" #include "NumericVariable.h" #include "UsefulFunctions.h" #include "EGraphicsError.h" #include "GRA_wxWidgets.h" #include "GRA_color.h" #include "GRA_colorControl.h" #include "GRA_window.h" #include "GRA_drawableText.h" #include "GRA_cartesianAxes.h" #include "GRA_rectangle.h" #include "GRA_sizeCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "ExGlobals.h" CMD_contour *CMD_contour::cmd_contour_ = 0; CMD_contour::CMD_contour() : Command( wxT("CONTOUR") ) { AddQualifier( wxT("PARTIAL"), false ); AddQualifier( wxT("POLAR"), false ); AddQualifier( wxT("SPECIFIC"), false ); AddQualifier( wxT("LEGEND"), false ); AddQualifier( wxT("RESET"), true ); AddQualifier( wxT("AXES"), true ); AddQualifier( wxT("BORDER"), true ); AddQualifier( wxT("COLORS"), false ); AddQualifier( wxT("COLOURS"), false ); AddQualifier( wxT("LINETYPES"), false ); AddQualifier( wxT("LINEWIDTHS"), false ); AddQualifier( wxT("CONTINUE"), false ); } void CMD_contour::Execute( ParseLine const *p ) { // CONTOUR { x y } v numcntrs { minlevel { incr }} // CONTOUR\COLOR colr x y z numcntrs { minlevel { incr }} // CONTOUR\SPECIFIC { x y } v cntrs // CONTOUR\SPECIFIC\COLOR colr x y z cntrs // CONTOUR\CONTINUE { x y } v numcntrs { minlevel { incr }} // CONTOUR\CONTINUE\COLOR colr x y z numcntrs { minlevel { incr }} // CONTOUR\CONTINUE\SPECIFIC { x y } v cntrs // CONTOUR\CONTINUE\SPECIFIC\COLOR colr x y z cntrs // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch( ECommandError const &e ) { throw; } GRA_window *gw = ExGlobals::GetGraphWindow(); // wxString command( wxT("CONTOUR") ); if( qualifiers[wxT("LEGEND")] ) { if( static_cast(gw->GetGeneralCharacteristics()->Get(wxT("LEGENDSIZE")))-> GetAsWorld() <= 0.0 ) throw ECommandError( command+wxT("legend is on, but legend size <= 0")); if( !qualifiers[wxT("AXES")] ) throw ECommandError( command+wxT("legend is on, but axes are off") ); } if( qualifiers[wxT("CONTINUE")] ) { qualifiers[wxT("AXES")] = false; qualifiers[wxT("BORDER")] = false; } int ifld = 1; std::vector colors, linetypes, linewidths; std::vector xVector, yVector, zVector; try { if( qualifiers[wxT("COLORS")]||qualifiers[wxT("COLOURS")] ) GetIntParameter( colors, p, ifld, wxT("expecting color (scalar or vector)") ); if( qualifiers[wxT("LINETYPES")] ) GetIntParameter( linetypes, p, ifld, wxT("expecting linetype (scalar or vector)") ); if( qualifiers[wxT("LINEWIDTHS")] ) GetIntParameter( linewidths, p, ifld, wxT("expecting linewidth (scalar or vector)") ); GetDataParameters( xVector, yVector, zVector, p, ifld ); } catch( ECommandError const &e ) { throw; } double xmin, xmax, ymin, ymax, zmin, zmax; if( !qualifiers[wxT("CONTINUE")] ) { if( qualifiers[wxT("POLAR")] ) { double const degToRad = M_PI/180.; xmin = xVector[0]*cos(yVector[0]*degToRad); xmax = xmin; ymin = xVector[0]*sin(yVector[0]*degToRad); ymax = ymin; std::size_t xsize( xVector.size() ); for( std::size_t i=0; i xp )xmin = xp; if( xmax < xp )xmax = xp; if( ymin > yp )ymin = yp; if( ymax < yp )ymax = yp; } } } else // not polar { xmin = xVector[0]; xmax = xmin; ymin = xVector[0]; ymax = ymin; std::size_t xsize( xVector.size() ); for( std::size_t j=0; j xVector[j] )xmin = xVector[j]; if( xmax < xVector[j] )xmax = xVector[j]; } std::size_t ysize( yVector.size() ); for( std::size_t j=0; j yVector[j] )ymin = yVector[j]; if( ymax < yVector[j] )ymax = yVector[j]; } } if( xmax == xmin ) throw ECommandError( command+wxT("minimum = maximum for independent variable") ); if( ymax == ymin ) throw ECommandError( command+wxT("minimum = maximum for dependent variable") ); } double xuaxisp=0.0, yuaxisp=0.0, xuaxis=0.0, yuaxis=0.0; double xll, yll, xll0; GRA_setOfCharacteristics *xAxis = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxis = gw->GetYAxisCharacteristics(); wxClientDC dc( ExGlobals::GetwxWindow() ); if( !qualifiers[wxT("CONTINUE")] ) { if( qualifiers[wxT("AXES")] ) { if( qualifiers[wxT("LEGEND")] ) { GRA_distanceCharacteristic *xupperaxis = static_cast(xAxis->Get(wxT("UPPERAXIS"))); GRA_distanceCharacteristic *yupperaxis = static_cast(yAxis->Get(wxT("UPPERAXIS"))); xuaxisp = xupperaxis->GetAsPercent(); xupperaxis->SetAsPercent(75.0); yuaxisp = yupperaxis->GetAsPercent(); yupperaxis->SetAsPercent(90.0); xuaxis = xupperaxis->GetAsWorld(); yuaxis = yupperaxis->GetAsWorld(); } std::vector xdum, ydum, xe1, ye1, xe2, ye2; xdum.push_back( xmin ); xdum.push_back( xmax ); xdum.push_back( xmax ); xdum.push_back( xmin ); xdum.push_back( xmin ); ydum.push_back( ymax ); ydum.push_back( ymax ); ydum.push_back( ymin ); ydum.push_back( ymin ); ydum.push_back( ymax ); GRA_cartesianAxes *cartesianAxes = new GRA_cartesianAxes( xdum, ydum, false, false ); try { cartesianAxes->Make(); } catch (EGraphicsError const &e) { delete cartesianAxes; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } cartesianAxes->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( cartesianAxes ); if( qualifiers[wxT("BORDER")] ) { double xlo, ylo, xhi, yhi; gw->GraphToWorld( xmin, ymin, xlo, ylo, true ); gw->GraphToWorld( xmax, ymax, xhi, yhi ); GRA_rectangle *border = new GRA_rectangle(xlo,ylo,xhi,yhi,0.0,false, GRA_colorControl::GetColor(wxT("BLACK")),0,1); border->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( border ); } if( qualifiers[wxT("LEGEND")] ) { GRA_setOfCharacteristics *general = gw->GetGeneralCharacteristics(); GRA_fontCharacteristic *generalFont = static_cast(general->Get(wxT("FONT"))); GRA_sizeCharacteristic *xLargeTicLength = static_cast(xAxis->Get(wxT("LARGETICLENGTH"))); GRA_sizeCharacteristic *legendSize = static_cast(general->Get(wxT("LEGENDSIZE"))); GRA_sizeCharacteristic *contourLabelHeight = static_cast(general->Get(wxT("CONTOURLABELHEIGHT"))); GRA_font *font = generalFont->Get(); xll = xuaxis + 1.1 * xLargeTicLength->GetAsWorld(); yll = yuaxis; double sizleg = legendSize->GetAsWorld(); double ht = sizleg; double angle = 50.0; double xll1, xll2; if( contourLabelHeight->GetAsWorld() > 0.0 ) { xll0 = xll + sizleg; xll1 = xll0 + 3*sizleg; xll2 = xll1 + 1.5*sizleg; GRA_drawableText *tb = new GRA_drawableText(wxT("label"),ht,angle,xll0,yll, 1,font,GRA_colorControl::GetColor(wxT("BLACK"))); try { tb->Parse(); } catch ( EGraphicsError const &e ) { delete tb; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } tb->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( tb ); } else { sizleg = 1.2 * sizleg; xll0 = xll + sizleg; xll1 = xll0 + 3 * sizleg; xll2 = xll1 + 2 * sizleg; } GRA_drawableText *tb = new GRA_drawableText(wxT("contour"),ht,angle,xll1,yll, 1,font,GRA_colorControl::GetColor(wxT("BLACK"))); try { tb->Parse(); } catch ( EGraphicsError const &e ) { delete tb; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } tb->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( tb ); tb = new GRA_drawableText(wxT("value"),ht,angle,xll2,yll, 1,font,GRA_colorControl::GetColor(wxT("BLACK"))); try { tb->Parse(); } catch ( EGraphicsError const &e ) { delete tb; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } tb->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( tb ); } } } int i1 = 0; int i2 = xVector.size()-1; int j1 = 0; int j2 = yVector.size()-1; if( qualifiers[wxT("PARTIAL")] ) { GRA_doubleCharacteristic *xminC = static_cast(xAxis->Get(wxT("MIN"))); GRA_doubleCharacteristic *yminC = static_cast(yAxis->Get(wxT("MIN"))); GRA_doubleCharacteristic *xmaxC = static_cast(xAxis->Get(wxT("MAX"))); GRA_doubleCharacteristic *ymaxC = static_cast(yAxis->Get(wxT("MAX"))); double xmn = xminC->Get(); double xmx = xmaxC->Get(); double ymn = yminC->Get(); double ymx = ymaxC->Get(); i1 = std::max( 0, static_cast((xmn-xmin)/(xmax-xmin)*(xVector.size()-1)) ); i2 = std::min( static_cast(xVector.size())-1, static_cast((xmx-xmin)/(xmax-xmin)*(xVector.size()-1)) ); j1 = std::max( 0, static_cast((ymn-ymin)/(ymax-ymin)*(yVector.size()-1)) ); j2 = std::min( static_cast(yVector.size())-1, static_cast((ymx-ymin)/(ymax-ymin)*(yVector.size()-1)) ); } std::vector contourVector; double zincs = 0.0; double zmins = 0.0; int numberOfContours = 0; if( qualifiers[wxT("SPECIFIC")] ) // a scalar or a vector of contour levels is expected { if( p->GetNumberOfTokens()-1 < ifld ) { throw ECommandError( command+wxT("expecting contour levels (scalar or vector)") ); } if( p->IsNumeric(ifld) ) { contourVector.push_back( p->GetNumeric(ifld) ); AddToStackLine( wxString() << p->GetNumeric(ifld++) ); } else if( p->IsString(ifld) ) { int ndm=0, dimSizes[]={0,0,0}; double d=0.0; try { NumericVariable::GetVariable( p->GetString(ifld), ndm, d, contourVector, dimSizes ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndm == 0 )contourVector.push_back( d ); else if( ndm != 1 ) throw ECommandError( command+wxT("expecting contour levels (scalar or vector)") ); AddToStackLine( p->GetString(ifld++) ); } else throw ECommandError( command+wxT("expecting contour level(s)") ); numberOfContours = contourVector.size(); } else // a number of contours is entered instead of a list of contour levels { if( p->GetNumberOfTokens() <= ifld ) throw ECommandError( command+wxT("expecting the number of contours") ); double dNumC; try { NumericVariable::GetScalar( p->GetString(ifld), wxT("number of contours"), dNumC ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } numberOfContours = abs( static_cast(dNumC) ); if( numberOfContours < 2 )throw ECommandError( command+wxT("number of contours requested < 2") ); AddToStackLine( p->GetString(ifld++) ); // bool zminsEntered = false; if( p->GetNumberOfTokens() > ifld ) { double d; NumericVariable::GetScalar( p->GetString(ifld), wxT("minimum contour level"), d ); zmins = d; AddToStackLine( p->GetString(ifld++) ); zminsEntered = true; if( p->GetNumberOfTokens() > ifld ) { NumericVariable::GetScalar( p->GetString(ifld), wxT("contour level increment"), d ); zincs = d; if( zincs == 0.0 ) throw ECommandError( command+wxT("contour increment = 0") ); AddToStackLine( p->GetString(ifld++) ); } } if( zincs == 0.0 ) { zmax = zVector[j1+i1*yVector.size()]; for( int ii=i1; ii<=i2; ++ii ) { for( int j=j1; j<=j2; ++j ) { if( zmax < zVector[j+ii*yVector.size()] )zmax = zVector[j+ii*yVector.size()]; } } if( zminsEntered )zmin = zmins; else { zmin = zVector[j1+i1*yVector.size()]; for( int ii=i1; ii<=i2; ++ii ) { for( int j=j1; j<=j2; ++j ) { if( zmin > zVector[j+ii*yVector.size()] )zmin = zVector[j+ii*yVector.size()]; } } } // // find some "nice" numbers for min, max and increment // double zmaxs; try { UsefulFunctions::Scale1( zmins, zmaxs, zincs, numberOfContours, zmin, zmax ); } catch ( std::runtime_error const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } numberOfContours = static_cast( (zmaxs-zmins)/zincs ) + 1; while( zmins < zmin ) { zmins += zincs; --numberOfContours; } while( zmaxs > zmax ) { zmaxs -= zincs; --numberOfContours; } } } static int labelSave = 1; double label, level; for( int i=0; iGetGeneralCharacteristics(); label = static_cast(i+labelSave); int ii = i + labelSave; double legendSize = static_cast(general->Get(wxT("LEGENDSIZE")))->GetAsWorld(); yll -= 1.4*legendSize; wxChar c[200]; double contourLabelHeight = static_cast(general->Get(wxT("CONTOURLABELHEIGHT")))->GetAsWorld(); if( contourLabelHeight > 0.0 ) ::wxSnprintf( c, 200, wxT("%2i = %9.2g"), ii, level ); else if( contourLabelHeight == 0.0 ) ::wxSnprintf( c, 200, wxT("%9.2g"), level ); double angle = 0.0; if( yll > 0.0 ) { GRA_font *font = static_cast(general->Get(wxT("FONT")))->Get(); GRA_color *color = colors.empty() ? GRA_colorControl::GetColor(wxT("BLACK")) : GRA_colorControl::GetColor(colors[i%colors.size()]); GRA_drawableText *dt = new GRA_drawableText(c,legendSize,angle,xll0,yll,1,font,color); try { dt->Parse(); } catch ( EGraphicsError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( dt ); } } std::size_t xsize = xVector.size(); std::size_t ysize = yVector.size(); // std::vector< std::vector > zMatrix; zMatrix.reserve( ysize ); zMatrix.resize( ysize ); std::vector temp; temp.resize( xsize ); for( std::size_t j=0; j x, y; UsefulFunctions::ContourCalculation( level, xVector, yVector, zMatrix, x, y ); GRA_contourLine *contour = new GRA_contourLine( label, x, y, color, lineType, lineWidth ); x.clear(); y.clear(); contour->Make(); contour->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( contour ); } // save the last legend value for the next plot // if( qualifiers[wxT("CONTINUE")] )labelSave = static_cast(label); if( qualifiers[wxT("LEGEND")] ) { if( qualifiers[wxT("RESET")] ) { static_cast(xAxis->Get(wxT("UPPERAXIS")))->SetAsPercent( xuaxisp ); static_cast(yAxis->Get(wxT("UPPERAXIS")))->SetAsPercent( yuaxisp ); } } ExGlobals::RefreshGraphics(); } void CMD_contour::GetIntParameter( std::vector &values, ParseLine const *p, int &ifld,wxString const &errorMessage ) { if( p->GetNumberOfTokens()-1 < ifld ) throw ECommandError( wxString(wxT("CONTOUR: "))+errorMessage ); if( p->IsNumeric(ifld) ) { values.push_back( static_cast(p->GetNumeric(ifld)) ); AddToStackLine( wxString() << p->GetNumeric(ifld++) ); } else if( p->IsString(ifld) ) { int ndm=0, dimSizes[]={0,0,0}; double d=0.0; std::vector doubles; try { NumericVariable::GetVariable( p->GetString(ifld), ndm, d, doubles, dimSizes ); } catch( EVariableError const &e ) { throw ECommandError( wxString(wxT("CONTOUR: "))+wxString(e.what(),wxConvUTF8) ); } if( ndm == 0 ) { values.push_back( static_cast(d) ); } else if( ndm == 1 ) { std::size_t size = doubles.size(); for( std::size_t i=0; i(doubles[i]) ); } else { throw ECommandError( wxString(wxT("CONTOUR: "))+errorMessage ); } AddToStackLine( p->GetString(ifld++) ); } else { throw ECommandError( wxString(wxT("CONTOUR: "))+errorMessage ); } } void CMD_contour::GetDataParameters( std::vector &x, std::vector &y, std::vector &z, ParseLine const *p, int &ifld ) { wxString command( wxT("CONTOUR: ") ); if( p->GetNumberOfTokens()-1 < ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting matrix or independent variable") ); int ndm=0, dimSizes[]={0,0,0}; double d=0.0; std::vector doubles; try { NumericVariable::GetVariable( p->GetString(ifld), ndm, d, doubles, dimSizes ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndm == 0 ) throw ECommandError( command+p->GetString(ifld)+wxT(" is a scalar") ); if( ndm == 2 ) // contour m ... { z.assign( doubles.begin(), doubles.end() ); AddToStackLine( p->GetString(ifld++) ); for( int i=0; i(i+1) ); for( int i=0; i(i+1) ); } else if( ndm == 1 ) // contour x y ... { AddToStackLine( p->GetString(ifld++) ); if( p->GetNumberOfTokens()-1 < ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting dependent variable") ); x.assign( doubles.begin(), doubles.end() ); try { NumericVariable::GetVector( p->GetString(ifld), wxT("dependent variable"), y ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld++) ); if( p->GetNumberOfTokens()-1 < ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting matrix or z-vector") ); try { NumericVariable::GetVariable( p->GetString(ifld), ndm, d, z, dimSizes ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndm == 0 ) throw ECommandError( command+p->GetString(ifld)+wxT(" is a scalar") ); else if( ndm == 1 ) // contour x y z ... { throw ECommandError( command+wxT("contouring of scattered data is not available") ); } else if( ndm == 2 ) // contour x y matrix ... { if( static_cast(x.size()) < dimSizes[1] ) throw ECommandError( command+wxT("independent vector length < number of columns of matrix") ); if( static_cast(x.size()) > dimSizes[1] ) throw ECommandError( command+wxT("independent vector length > number of columns of matrix") ); if( static_cast(y.size()) < dimSizes[0] ) throw ECommandError( command+wxT("dependent vector length < number of rows of matrix") ); if( static_cast(y.size()) > dimSizes[0] ) throw ECommandError( command+wxT("dependent vector length > number of rows of matrix") ); AddToStackLine( p->GetString(ifld++) ); } } } // end of file extrema-4.4.5/src/Commands/CMD_scales.cpp0000644012702201742730000002402511274636606017216 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_scales.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "NumericVariable.h" #include "GRA_doubleCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_window.h" #include "UsefulFunctions.h" CMD_scales *CMD_scales::cmd_scales_ = 0; CMD_scales::CMD_scales() : Command( wxT("SCALES") ) { AddQualifier( wxT("COMMENSURATE"), false ); AddQualifier( wxT("MESSAGES"), true ); } void CMD_scales::Execute( ParseLine const *p ) { // SCALES xmin xmax nlxinc ymin ymax nlyinc // SCALES xmin xmax ymin ymax // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch( ECommandError const &e ) { throw; } // bool output = qualifiers[wxT("MESSAGES")] || ExGlobals::NotInaScript() || ExGlobals::GetEcho(); if( !qualifiers[wxT("MESSAGES")] )output = false; // GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *xAxis = gw->GetXAxisCharacteristics(); GRA_setOfCharacteristics *yAxis = gw->GetYAxisCharacteristics(); GRA_setOfCharacteristics *general = gw->GetGeneralCharacteristics(); // GRA_doubleCharacteristic *xAxisMin = static_cast(xAxis->Get(wxT("MIN"))); GRA_doubleCharacteristic *xAxisMax = static_cast(xAxis->Get(wxT("MAX"))); GRA_doubleCharacteristic *xAxisVMin = static_cast(xAxis->Get(wxT("VIRTUALMIN"))); GRA_doubleCharacteristic *xAxisVMax = static_cast(xAxis->Get(wxT("VIRTUALMAX"))); GRA_doubleCharacteristic *yAxisMin = static_cast(yAxis->Get(wxT("MIN"))); GRA_doubleCharacteristic *yAxisMax = static_cast(yAxis->Get(wxT("MAX"))); GRA_doubleCharacteristic *yAxisVMin = static_cast(yAxis->Get(wxT("VIRTUALMIN"))); GRA_doubleCharacteristic *yAxisVMax = static_cast(yAxis->Get(wxT("VIRTUALMAX"))); GRA_intCharacteristic *xAxisNlincs = static_cast(xAxis->Get(wxT("NLINCS"))); GRA_intCharacteristic *yAxisNlincs = static_cast(yAxis->Get(wxT("NLINCS"))); GRA_stringCharacteristic *autoscale = static_cast(general->Get(wxT("AUTOSCALE"))); // double xmin = xAxisMin->Get(); double xmax = xAxisMax->Get(); int xnlinc = xAxisNlincs->Get(); double xvmin = xAxisVMin->Get(); double xvmax = xAxisVMax->Get(); double ymin = yAxisMin->Get(); double ymax = yAxisMax->Get(); int ynlinc = yAxisNlincs->Get(); double yvmin = yAxisVMin->Get(); double yvmax = yAxisVMax->Get(); // if( p->GetNumberOfTokens() == 1 ) { if( autoscale->Get()!=wxT("OFF") && output )ExGlobals::WriteOutput(wxT("graph autoscaling is off")); autoscale->Set(wxT("OFF")); } else { // autoscale = 0 means OFF // = -1 means COMMENSURATE // = 1 means ON, = 4 means ON /VIRTUAL // = 2 means X, = 5 means X /VIRTUAL // = 3 means Y, = 6 means Y /VIRTUAL // if( p->GetNumberOfTokens() == 7 ) { int tcnt = 1; double d; NumericVariable::GetScalar( p->GetString(tcnt), wxT("x-axis minimum"), d ); xmin = d; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("x-axis maximum"), d ); xmax = d; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("number of x-axis major tic marks"), d ); xnlinc = static_cast(d); xvmin = xmin; xvmax = xmax; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("y-axis minimum"), d ); ymin = d; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("y-axis maximum"), d ); ymax = d; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("number of y-axis major tic marks"), d ); ynlinc = static_cast(d); yvmin = ymin; yvmax = ymax; AddToStackLine( p->GetString(tcnt) ); } else if( p->GetNumberOfTokens() == 5 ) { int tcnt = 1; double d; NumericVariable::GetScalar( p->GetString(tcnt), wxT("x-axis minimum"), d ); xmin = d; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("x-axis maximum"), d ); xmax = d; AddToStackLine( p->GetString(tcnt) ); xnlinc = 5; double inc; try { UsefulFunctions::Scale1( xvmin, xvmax, inc, xnlinc, xmin, xmax ); } catch( std::runtime_error const &e ) { throw ECommandError( Name()+wxT(": ")+wxString(e.what(),wxConvUTF8) ); } xnlinc = static_cast( (xvmax-xvmin)/inc+0.5 ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("y-axis minimum"), d ); ymin = d; AddToStackLine( p->GetString(tcnt) ); NumericVariable::GetScalar( p->GetString(++tcnt), wxT("y-axis maximum"), d ); ymax = d; AddToStackLine( p->GetString(tcnt) ); ynlinc = 5; try { UsefulFunctions::Scale1( yvmin, yvmax, inc, ynlinc, ymin, ymax ); } catch( std::runtime_error const &e ) { throw ECommandError( Name()+wxT(": ")+wxString(e.what(),wxConvUTF8) ); } ynlinc = static_cast( (yvmax-yvmin)/inc+0.5 ); } else throw ECommandError( Name()+wxT(": expecting: xmin xmax nlxinc ymin ymax nlyinc or xmin xmax ymin ymax")); autoscale->Set(wxT("OFF")); xAxisMin->Set( xmin ); xAxisMax->Set( xmax ); xAxisVMin->Set( xvmin ); xAxisVMax->Set( xvmax ); xAxisNlincs->Set( xnlinc ); yAxisMin->Set( ymin ); yAxisMax->Set( ymax ); yAxisVMin->Set( yvmin ); yAxisVMax->Set( yvmax ); yAxisNlincs->Set( ynlinc ); } if( output ) { wxString c(wxT("xmin = ")); c << xmin << wxT(", xmax = ") << xmax << wxT(", number of large x incs = ") << xnlinc; ExGlobals::WriteOutput( c ); c.clear(); c << wxT("ymin = ") << ymin << wxT(", ymax = ") << ymax << wxT(", number of large y incs = ") << ynlinc; ExGlobals::WriteOutput( c ); } if( xmin==0.0 && xmax==0.0 && xnlinc==0.0 ) { autoscale->Set(wxT("X")); xAxisMax->Set( 1.0 ); qualifiers[wxT("COMMENSURATE")] = false; if( output )ExGlobals::WriteOutput( wxT("x-axis autoscaling is on") ); } if( ymin==0.0 && ymax==0.0 && ynlinc==0.0 ) { autoscale->Set(wxT("Y")); yAxisMax->Set( 1.0 ); qualifiers[wxT("COMMENSURATE")] = false; if( output )ExGlobals::WriteOutput( wxT("y-axis autoscaling is on") ); } if( qualifiers[wxT("COMMENSURATE")] ) { double xlwind = static_cast(general->Get(wxT("XLOWERWINDOW")))->GetAsWorld(); double xuwind = static_cast(general->Get(wxT("XUPPERWINDOW")))->GetAsWorld(); double ylwind = static_cast(general->Get(wxT("YLOWERWINDOW")))->GetAsWorld(); double yuwind = static_cast(general->Get(wxT("YUPPERWINDOW")))->GetAsWorld(); double delxwind = fabs(xuwind-xlwind); double delywind = fabs(yuwind-ylwind); // double xlaxis = 0.15*delxwind + xlwind; double xuaxis = 0.90*delxwind + xlwind; double ylaxis = 0.15*delywind + ylwind; double yuaxis = 0.90*delywind + ylwind; double xmid = 0.50*(xlwind+xuwind); double ymid = 0.50*(ylwind+yuwind); // double xd = xmax-xmin; double yd = ymax-ymin; // double delx, dely; if( xd >= yd ) { delx = xuaxis-xlaxis; dely = delx * yd / xd; ylaxis = ymid - 0.5*dely; yuaxis = ymid + 0.5*dely; } else { dely = yuaxis-ylaxis; delx = dely * xd / yd; xlaxis = xmid - 0.5*delx; xuaxis = xmid + 0.5*delx; } if( (ylaxis-ylwind)/delywind < 0.15 ) { dely = 0.15*delywind + ylwind - ylaxis; ylaxis = 0.15*delywind + ylwind; yuaxis = yuaxis - dely; xlaxis = xlaxis + dely; xuaxis = xuaxis - dely; } else if( (xlaxis-xlwind)/delxwind < 0.15 ) { delx = 0.15*delxwind + xlwind - xlaxis; xlaxis = 0.15*delxwind + xlwind; xuaxis = xuaxis - delx; ylaxis = ylaxis + delx; yuaxis = yuaxis - delx; } static_cast(yAxis->Get(wxT("LOWERAXIS")))->SetAsPercent( (ylaxis-ylwind)/delywind*100.0 ); static_cast(yAxis->Get(wxT("UPPERAXIS")))->SetAsPercent( (yuaxis-ylwind)/delywind*100.0 ); static_cast(xAxis->Get(wxT("LOWERAXIS")))->SetAsPercent( (xlaxis-xlwind)/delxwind*100.0 ); static_cast(xAxis->Get(wxT("UPPERAXIS")))->SetAsPercent( (xuaxis-xlwind)/delxwind*100.0 ); } static_cast(xAxis->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); static_cast(yAxis->Get(wxT("NUMBEROFDECIMALS")))->Set( -1 ); static_cast(xAxis->Get(wxT("NUMBEROFDIGITS")))->Set( 10 ); static_cast(yAxis->Get(wxT("NUMBEROFDIGITS")))->Set( 10 ); } // end of file extrema-4.4.5/src/Commands/CMD_matrix.cpp0000644012702201742730000000726311274636606017255 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_matrix.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "NumericVariable.h" #include "TextVariable.h" #include "NVariableTable.h" #include "TVariableTable.h" CMD_matrix *CMD_matrix::cmd_matrix_ = 0; CMD_matrix::CMD_matrix() : Command( wxT("MATRIX") ) {} void CMD_matrix::Execute( ParseLine const *p ) { SetUp( p ); wxString command( Name()+wxT(": ") ); std::vector names; for( int counter=1; counterGetNumberOfTokens()-2; ++counter ) { if( !p->IsString(counter) )throw ECommandError( command+wxT("expecting matrix name(s)") ); wxString name( p->GetString(counter) ); AddToStackLine( name ); names.push_back( name ); } if( names.empty() )throw ECommandError( command+wxT("expecting some matrix names") ); int counter = p->GetNumberOfTokens()-2; double v; try { NumericVariable::GetScalar( p->GetString(counter), wxT("number of rows"), v ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( static_cast(v+0.5) < 0 )throw ECommandError( command+wxT("number of rows < 0") ); else if( static_cast(v+0.5) == 0 )throw ECommandError( command+wxT("number of rows = 0") ); std::size_t nRows = static_cast(v+0.5); AddToStackLine( p->GetString(counter++) ); // try { NumericVariable::GetScalar( p->GetString(counter), wxT("number of columns"), v ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( static_cast(v+0.5) < 0 )throw ECommandError( command+wxT("number of columns < 0") ); else if( static_cast(v+0.5) == 0 )throw ECommandError( command+wxT("number of columns = 0") ); std::size_t nCols = static_cast(v+0.5); AddToStackLine( p->GetString(counter) ); // std::size_t numNames = names.size(); for( std::size_t j=0; j x( nRows*nCols, 0.0 ); NumericVariable *nv = NVariableTable::GetTable()->GetVariable(names[j]); if( nv ) { NumericData nd( nv->GetData() ); if( nd.GetNumberOfDimensions() == 2 ) { std::vector y( nd.GetData() ); std::size_t nr = nd.GetDimMag(0); std::size_t nc = nd.GetDimMag(1); std::size_t kc = 0; while ( kc < std::min(nCols,nc) ) { std::size_t kr = 0; while ( kr < std::min(nRows,nr) ) { x[kr+kc*nRows] = y[kr+kc*nr]; ++kr; } ++kc; } } else { NVariableTable::GetTable()->RemoveEntry( nv ); nv = 0; } } else { TextVariable *tv = TVariableTable::GetTable()->GetVariable(names[j]); if( tv )TVariableTable::GetTable()->RemoveEntry( tv ); tv = 0; } NumericVariable::PutVariable( names[j], x, nRows, nCols, p->GetInputLine() ); } } // end of file extrema-4.4.5/src/Commands/CMD_matrix.h0000644012702201742730000000207411274636606016715 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_MATRIX #define CMD_MATRIX #include "Command.h" class ParseLine; class CMD_matrix : public Command { public: static CMD_matrix *Instance() { if( !cmd_matrix_ )cmd_matrix_ = new CMD_matrix(); return cmd_matrix_; } void Execute( ParseLine const * ); private: CMD_matrix(); static CMD_matrix *cmd_matrix_; }; #endif extrema-4.4.5/src/Commands/CMD_display.cpp0000644012702201742730000000343211274636606017410 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_display.h" #include "ECommandError.h" #include "ParseLine.h" #include "EExpressionError.h" #include "Expression.h" CMD_display *CMD_display::cmd_display_ = 0; CMD_display::CMD_display() : Command( wxT("DISPLAY") ) { AddQualifier( wxT("CLEAR"), false ); } void CMD_display::Execute( ParseLine const *p ) { // // script macro command DISPLAY string // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens()==1 || !p->IsString(1) ) throw ECommandError( command+wxT("correct syntax: DISPLAY string") ); // // evaluate the expression // Expression expr( p->GetString(1) ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( !expr.IsCharacter() )throw ECommandError( command+wxT("correct syntax: DISPLAY string") ); //SetUpDisplayForm( expr.GetFinalString(), qualifiers[wxT("CLEAR")] ); } // end of file extrema-4.4.5/src/Commands/CMD_restore.h0000644012702201742730000000232211274636606017070 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_RESTORE #define CMD_RESTORE #include "Command.h" class ParseLine; class CMD_restore : public Command { public: static CMD_restore *Instance() { if( !cmd_restore_ )cmd_restore_ = new CMD_restore(); return cmd_restore_; } void Execute( ParseLine const * ); private: CMD_restore(); static CMD_restore *cmd_restore_; void RestoreMUD( ParseLine const *, wxString &, bool, bool, wxString const & ); unsigned long runNumber_; unsigned long elapsedSec_; }; #endif extrema-4.4.5/src/Commands/CMD_save.h0000644012702201742730000000215411274636606016346 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_SAVE #define CMD_SAVE #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_save : public Command { public: static CMD_save *Instance() { if( !cmd_save_ )cmd_save_ = new CMD_save(); return cmd_save_; } void Execute( ParseLine const * ); private: CMD_save(); static CMD_save *cmd_save_; std::ofstream ofStream_; wxString filename_; }; #endif extrema-4.4.5/src/Commands/CMD_set.h0000644012702201742730000000315011274636606016200 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_SET #define CMD_SET #include "wx/wx.h" #include "Command.h" class ParseLine; class GRA_color; class GRA_font; class CMD_set : public Command { public: static CMD_set *Instance() { if( !cmd_set_ )cmd_set_ = new CMD_set(); return cmd_set_; } void Execute( ParseLine const * ); wxString const &GetPCHARsymbol() const { return pcharSymbol_; } wxString const &GetPCHARsize() const { return pcharSize_; } wxString const &GetPCHARcolor() const { return pcharColor_; } wxString const &GetPCHARangle() const { return pcharAngle_; } private: CMD_set(); static CMD_set *cmd_set_; double GetValue( wxString const & ); GRA_color *GetColor( wxString const & ); GRA_font *GetFont( wxString const & ); wxString GetString( wxString const & ); // int valueIndex_; // wxString pcharSymbol_, pcharSize_, pcharColor_, pcharAngle_; }; #endif extrema-4.4.5/src/Commands/Extrema_fcn.h0000644012702201742730000000272511274636606017164 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef EXTREMA_FCN #define EXTREMA_FCN #ifdef HAVE_MINUIT #include #include "Minuit/FCNBase.h" class Expression; class Extrema_fcn : public FCNBase { public: Extrema_fcn( std::vector const &d, std::vector const &w ) : FCNBase(), data_(d), weights_(w), errorDef_(1.0), chisqDirect_(false), expression_(0) {} ~Extrema_fcn() {} virtual double up() const; void SetErrorDef( double ); void SetChisqDirect( bool ); void SetExpression( Expression * ); virtual double operator()( std::vector const & ) const; private: std::vector data_; std::vector weights_; double errorDef_; bool chisqDirect_; Expression *expression_; }; #else class Extrema_fcn {}; #endif #endif extrema-4.4.5/src/Commands/CMD_help.h0000644012702201742730000000204611274636606016340 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_HELP #define CMD_HELP #include "Command.h" class ParseLine; class CMD_help : public Command { public: static CMD_help *Instance() { if( !cmd_help_ )cmd_help_ = new CMD_help(); return cmd_help_; } void Execute( ParseLine const * ); private: CMD_help(); static CMD_help *cmd_help_; }; #endif extrema-4.4.5/src/Commands/CMD_help.cpp0000644012702201742730000000224611274636606016675 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_help.h" #include "ECommandError.h" #include "ParseLine.h" #include "ParseToken.h" #include "TextVariable.h" #include "ExGlobals.h" CMD_help *CMD_help::cmd_help_ = 0; CMD_help::CMD_help() : Command( wxT("HELP") ) {} void CMD_help::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } ExGlobals::StartHelp(); } // end of file extrema-4.4.5/src/Commands/CMD_dealias.cpp0000644012702201742730000000317211274636606017346 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_dealias.h" #include "ExGlobals.h" #include "ParseLine.h" #include "ECommandError.h" CMD_dealias *CMD_dealias::cmd_dealias_ = 0; CMD_dealias::CMD_dealias() : Command( wxT("DEALIAS") ) {} void CMD_dealias::Execute( ParseLine const *p ) { SetUp( p ); wxString command( Name()+wxT(": ") ); int nTokens = p->GetNumberOfTokens(); if( nTokens==1 || !p->IsString(1) )throw ECommandError( command+wxT("expecting an alias name") ); if( p->GetString(1).Upper() == wxT("ALL") ) { ExGlobals::RemoveAliases(); ExGlobals::WriteOutput( wxT("All aliases are now gone") ); } else { if( ExGlobals::RemoveAlias(p->GetString(1).Upper()) ) ExGlobals::WriteOutput( wxString()<GetString(1)<GetString(1)+wxT(" is not an alias") ); } AddToStackLine( p->GetString(1) ); } // end of file extrema-4.4.5/src/Commands/CMD_do.cpp0000644012702201742730000000442511274636606016350 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_do.h" #include "ECommandError.h" #include "ExGlobals.h" #include "Script.h" #include "ESyntaxError.h" #include "ParseLine.h" #include "EVariableError.h" #include "NumericVariable.h" CMD_do *CMD_do::cmd_do_ = 0; CMD_do::CMD_do() : Command( wxT("DO") ) {} void CMD_do::Execute( ParseLine const *p ) { // script macro command DO n = vector // SetUp( p ); wxString command( Name()+wxT(": ") ); if( !p->IsString(1) )throw ECommandError( command+wxT("correct syntax: DO i = vector") ); if( !p->IsEqualSign(2) )throw ECommandError( command+wxT("correct syntax: DO i = vector") ); if( !p->IsString(3) )throw ECommandError( command+wxT("correct syntax: DO i = vector") ); Script *script = ExGlobals::GetScript(); if( !script )throw ECommandError( command+wxT("DO is only valid in a script") ); // wxString name( p->GetString(1) ); bool setupDo; try { setupDo = script->ProcessDo( name.Upper() ); } catch (ESyntaxError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( setupDo ) { int ndim; double value; std::vector data; int dimSizes[3]; NumericVariable::GetVariable( p->GetString(3), ndim, value, data, dimSizes ); if( ndim != 1 )throw ECommandError( command+wxT("DO loop range must be a vector") ); script->SetDoData( data ); try { NumericVariable::PutVariable( name, data[0], p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } // end of file extrema-4.4.5/src/Commands/Command.cpp0000644012702201742730000000711711274636606016642 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "Command.h" #include "ECommandError.h" #include "CommandTable.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" Command::Command( wxChar const *c ) { wxString s( c ); names_.push_back( s ); stackLine_ = s; // // this variable allows for interactive TEXT and the STACK command to // not be stacked even when STACK is on // writeStack_ = true; CommandTable::GetTable()->AddEntry( this ); } void Command::AddQualifier( wxChar const *c, bool b ) { wxString s( c ); qualifiers_.insert(entry_type(s,b)); qualifierEntered_.insert(entry_type(s,false) ); } void Command::SetUp( ParseLine const *p ) { parseLine_ = p; stackLine_.erase(); stackLine_ = names_.at(0); } void Command::SetUp( ParseLine const *p, QualifierMap &qualifiers ) { parseLine_ = p; stackLine_.erase(); stackLine_ = names_.at(0); // // make a copy of the fixed qualifiers and default bool values // so the bool values can be altered // qualifiers = qualifiers_; QualifierMap::iterator qEnd = qualifiers.end(); // wxString const backSlash(1,wxT('\\')); std::vector currentQualifiers( p->GetToken(0)->GetQualifiers() ); std::size_t qsSize = currentQualifiers.size(); for( std::size_t i=0; ifirst ); if( q.find(qString) == 0 ) { j->second = !negate; stackLine_ += backSlash + qString; notFound = false; QualifierMap::iterator qe( qualifierEntered_.find(q) ); qe->second = true; break; } } if( notFound ) throw ECommandError( names_.at(0)+wxT(": unknown qualifier: ")+qString ); } } bool Command::IsCommand( wxString const &s ) const { std::size_t nEnd = names_.size(); for( std::size_t i=0; iGetInputLine(); } // end of file extrema-4.4.5/src/Commands/CMD_if.cpp0000644012702201742730000000612211274636606016340 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_if.h" #include "ECommandError.h" #include "ESyntaxError.h" #include "ParseLine.h" #include "Script.h" #include "NumericVariable.h" #include "ExGlobals.h" CMD_if *CMD_if::cmd_if_ = 0; CMD_if::CMD_if() : Command( wxT("IF") ) {} void CMD_if::Execute( ParseLine const *p ) { SetUp( p ); wxString command( Name()+wxT(": ") ); // // script command IF expression THEN command // or // IF expression THEN // command // ... // command // ENDIF // if( !p->IsString(1) )throw ECommandError( command+wxT("invalid IF syntax, expecting an expression") ); if( !p->IsString(2) )throw ECommandError( command+wxT("invalid IF syntax, expecting THEN") ); // Script *script = ExGlobals::GetScript(); if( !script )throw ECommandError( command+wxT("only valid in a script") ); // wxString s1( p->GetString(1) ); wxString s2( p->GetString(2) ); int n = p->GetNumberOfTokens(); // wxString then( s2.Upper() ); if( then != wxT("THEN") )throw ECommandError( command+wxT("invalid syntax, expecting THEN") ); int ndim; double value; std::vector data; int dimSizes[3]; NumericVariable::GetVariable( s1, ndim, value, data, dimSizes ); if( ndim > 0 )throw ECommandError( command+wxT("IF expression must have scalar result") ); if( n == 3 ) // there must be an ENDIF { if( value != 1.0 ) { try { script->ProcessIf(); } catch( ESyntaxError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } else // no ENDIF; some command follows THEN { if( value == 1.0 ) { wxString commandLine( p->GetInputLine() ); wxString tmp( commandLine.Upper() ); int i = tmp.find(wxT("THEN")); commandLine = commandLine.substr(i+5,tmp.size()-i-4); try { ExGlobals::ProcessCommand(commandLine); } catch( std::runtime_error const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ExGlobals::GetReturnCommand() )ExGlobals::PrepareToStopScript(); if( ExGlobals::GetExecuteCommand() )ExGlobals::PrepareToExecuteScript(); if( ExGlobals::GetPausingScript() )ExGlobals::PrepareToPauseScript(); } } } // end of file extrema-4.4.5/src/Commands/CMD_zerolines.cpp0000644012702201742730000000375011274636606017760 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_zerolines.h" #include "ECommandError.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "GRA_window.h" CMD_zerolines *CMD_zerolines::cmd_zerolines_ = 0; CMD_zerolines::CMD_zerolines() : Command( wxT("ZEROLINES") ) { AddQualifier( wxT("HORIZONTAL"), false ); AddQualifier( wxT("VERTICAL"), false ); } void CMD_zerolines::Execute( ParseLine const *p ) { // ZEROLINES draw both horizontal & vertical // ZEROLINES\HORIZONTAL draw horizontal only // ZEROLINES\VERTICAL draw vertical only // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } bool horizontal=false, vertical=false; if( qualifiers[wxT("HORIZONTAL")] ) { horizontal = true; vertical = false; } if( qualifiers[wxT("VERTICAL")] ) { horizontal = false; vertical = true; } if( !horizontal && !vertical ) { horizontal = true; vertical = true; } try { ExGlobals::GetGraphWindow()->DrawZerolines( horizontal, vertical ); } catch (EGraphicsError &e) { throw ECommandError( Name()+wxT(": ")+wxString(e.what(),wxConvUTF8) ); } ExGlobals::RefreshGraphics(); } // end of file extrema-4.4.5/src/Commands/CMD_pause.h0000644012702201742730000000206111274636606016522 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_PAUSE #define CMD_PAUSE #include "Command.h" class ParseLine; class CMD_pause : public Command { public: static CMD_pause *Instance() { if( !cmd_pause_ )cmd_pause_ = new CMD_pause(); return cmd_pause_; } void Execute( ParseLine const * ); private: CMD_pause(); static CMD_pause *cmd_pause_; }; #endif extrema-4.4.5/src/Commands/CMD_graph.h0000644012702201742730000000205711274636606016513 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_GRAPH #define CMD_GRAPH #include "Command.h" class ParseLine; class CMD_graph : public Command { public: static CMD_graph *Instance() { if( !cmd_graph_ )cmd_graph_ = new CMD_graph(); return cmd_graph_; } void Execute( ParseLine const * ); private: CMD_graph(); static CMD_graph *cmd_graph_; }; #endif extrema-4.4.5/src/Commands/CMD_defaults.h0000644012702201742730000000212111274636606017211 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_DEFAULTS #define CMD_DEFAULTS #include "Command.h" class ParseLine; class CMD_defaults : public Command { public: static CMD_defaults *Instance() { if( !cmd_defaults_ )cmd_defaults_ = new CMD_defaults(); return cmd_defaults_; } void Execute( ParseLine const * ); private: CMD_defaults(); static CMD_defaults *cmd_defaults_; }; #endif extrema-4.4.5/src/Commands/ECommandError.h0000644012702201742730000000176211274636606017426 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_COMMANDERROR #define EX_COMMANDERROR #include #include "wx/wx.h" class ECommandError : public std::runtime_error { public: ECommandError( wxString const &message ) : std::runtime_error( (char const *)message.mb_str(wxConvUTF8) ) {} }; #endif extrema-4.4.5/src/Commands/CMD_pause.cpp0000644012702201742730000000316611274636606017064 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_pause.h" #include "ECommandError.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "TextVariable.h" CMD_pause *CMD_pause::cmd_pause_ = 0; CMD_pause::CMD_pause() : Command( wxT("PAUSE") ) { AddName( wxT("TERMINAL") ); } void CMD_pause::Execute( ParseLine const *p ) { SetUp( p ); // wxString command( wxT("PAUSE") ); if( ExGlobals::NotInaScript() )return; wxString message( wxT("Hit the key to continue the script") ); if( p->GetNumberOfTokens() == 2 ) { try { TextVariable::GetVariable( p->GetString(1), true, message ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } if( !message.empty() ) { ExGlobals::WriteOutput( message ); AddToStackLine( message ); } ExGlobals::PauseScripts(); } // end of file extrema-4.4.5/src/Commands/CommandTable.h0000644012702201742730000000343011274636606017251 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef EX_COMMANDTABLE #define EX_COMMANDTABLE #include #include #include "wx/wx.h" #include "Command.h" class CommandTable { // CommandTable is the table of pointers to Commands // CommandTable is a "singleton" (only one static object) // In CommandTable, each Command pointer is stored // with its name as a key to itself, so each Command // object must have a unique name. protected: typedef std::map< wxString const, Command* > commandMap; typedef commandMap::value_type entryType; CommandTable(); CommandTable( CommandTable const & ); public: static CommandTable *GetTable(); ~CommandTable(); void ClearTable(); bool Contains( Command const *c ) const { return Contains( c->Name() ); } bool Contains( wxString const &name ) const { return ( cMap_->find(name) != cMap_->end() ); } int Entries() const { return cMap_->size(); } Command *Get( wxString const & ) const; void AddEntry( Command * ); void CreateCommands(); private: commandMap *cMap_; static CommandTable *commandTable_; }; #endif extrema-4.4.5/src/Commands/CommandTable.cpp0000644012702201742730000001160611274636606017610 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "CommandTable.h" #include "CMD_alias.h" #include "CMD_bestfit.h" #include "CMD_bin2d.h" #include "CMD_bin.h" #include "CMD_clear.h" #include "CMD_contour.h" #include "CMD_dealias.h" #include "CMD_defaults.h" #include "CMD_define.h" #include "CMD_density.h" #include "CMD_destroy.h" #include "CMD_display.h" #include "CMD_do.h" #include "CMD_ellipse.h" #include "CMD_enddo.h" #include "CMD_endif.h" #include "CMD_evaluateExpression.h" #include "CMD_execute.h" #include "CMD_figure.h" #include "CMD_filter.h" #include "CMD_fit.h" #include "CMD_form.h" #include "CMD_generate.h" #include "CMD_get.h" #include "CMD_goto.h" #include "CMD_graph.h" #include "CMD_grid.h" #include "CMD_hardcopy.h" #include "CMD_help.h" #include "CMD_if.h" #include "CMD_inquire.h" #include "CMD_list.h" #include "CMD_matrix.h" #include "CMD_minuit.h" #include "CMD_page.h" #include "CMD_pause.h" #include "CMD_polygon.h" #include "CMD_quit.h" #include "CMD_read.h" #include "CMD_rebin.h" #include "CMD_replot.h" #include "CMD_restore.h" #include "CMD_return.h" #include "CMD_save.h" #include "CMD_scalar.h" #include "CMD_scales.h" #include "CMD_set.h" #include "CMD_show.h" #include "CMD_sort.h" #include "CMD_stack.h" #include "CMD_statistics.h" #include "CMD_text.h" #include "CMD_vector.h" #include "CMD_window.h" #include "CMD_world.h" #include "CMD_write.h" #include "CMD_zerolines.h" CommandTable *CommandTable::commandTable_ = 0; CommandTable::CommandTable() { cMap_ = new commandMap; } CommandTable::CommandTable( CommandTable const &rhs ) { delete cMap_; cMap_ = new commandMap(*(rhs.cMap_)); } CommandTable::~CommandTable() { ClearTable(); } CommandTable *CommandTable::GetTable() { // CommandTable is a "singleton", and can get its pointer by this function. // The first time this function is called, the CommandTable object is created. // if( !CommandTable::commandTable_ )CommandTable::commandTable_ = new CommandTable(); return CommandTable::commandTable_; } void CommandTable::CreateCommands() { CMD_alias::Instance(); CMD_bestfit::Instance(); CMD_bin2d::Instance(); CMD_bin::Instance(); CMD_clear::Instance(); CMD_contour::Instance(); CMD_dealias::Instance(); CMD_defaults::Instance(); CMD_define::Instance(); CMD_density::Instance(); CMD_destroy::Instance(); CMD_display::Instance(); CMD_do::Instance(); CMD_ellipse::Instance(); CMD_enddo::Instance(); CMD_endif::Instance(); CMD_evaluateExpression::Instance(); CMD_execute::Instance(); CMD_figure::Instance(); CMD_filter::Instance(); CMD_fit::Instance(); CMD_form::Instance(); CMD_generate::Instance(); CMD_get::Instance(); CMD_goto::Instance(); CMD_graph::Instance(); CMD_grid::Instance(); CMD_hardcopy::Instance(); CMD_help::Instance(); CMD_if::Instance(); CMD_inquire::Instance(); CMD_list::Instance(); CMD_matrix::Instance(); CMD_minuit::Instance(); CMD_page::Instance(); CMD_pause::Instance(); CMD_polygon::Instance(); CMD_quit::Instance(); CMD_read::Instance(); CMD_rebin::Instance(); CMD_replot::Instance(); CMD_restore::Instance(); CMD_return::Instance(); CMD_save::Instance(); CMD_scalar::Instance(); CMD_scales::Instance(); CMD_set::Instance(); CMD_show::Instance(); CMD_sort::Instance(); CMD_stack::Instance(); CMD_statistics::Instance(); CMD_text::Instance(); CMD_vector::Instance(); CMD_window::Instance(); CMD_world::Instance(); CMD_write::Instance(); CMD_zerolines::Instance(); } void CommandTable::ClearTable() { commandMap::const_iterator cEnd = cMap_->end(); for( commandMap::const_iterator i=cMap_->begin(); i!=cEnd; ++i )delete (*i).second; delete cMap_; } Command *CommandTable::Get( wxString const &name ) const { Command *c = 0; commandMap::const_iterator cEnd = cMap_->end(); for( commandMap::const_iterator i=cMap_->begin(); i!=cEnd; ++i ) { if( (*i).second->IsCommand(name) ) { c = (*i).second; break; } } return c; } void CommandTable::AddEntry( Command *c ) { wxString name = c->Name(); if( Contains( name ) ) { //wxString s = wxString(wxT("The command "))+name+wxString(wxT(" is already in the table")); return; } cMap_->insert(entryType(name,c)); } // end of file extrema-4.4.5/src/Commands/CMD_replot.cpp0000644012702201742730000000660211274636606017252 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_replot.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "EVariableError.h" #include "NumericVariable.h" CMD_replot *CMD_replot::cmd_replot_ = 0; CMD_replot::CMD_replot() : Command( wxT("REPLOT") ) { AddQualifier( wxT("AXES"), true ); AddQualifier( wxT("ALLWINDOWS"), false ); AddQualifier( wxT("TEXT"), false ); } void CMD_replot::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); std::size_t numWindows = ExGlobals::GetNumberOfWindows(); ParseToken t( *p->GetToken(0) ); if( qualifiers[wxT("ALLWINDOWS")] ) { if( p->GetNumberOfTokens() > 1 ) throw ECommandError( command+wxT("a window number is inconsistent with the \\ALLWINDOWS qualifier") ); bool nothingToReplot = true; for( std::size_t i=0; iGetDrawableObjects().empty() ) { nothingToReplot = false; break; } } if( nothingToReplot ) { ExGlobals::WarningMessage( wxT("REPLOT: there is nothing to replot in any window") ); return; } try { ExGlobals::ReplotAllWindows(); } catch (EGraphicsError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else { int currentWindow = ExGlobals::GetWindowNumber(); if( p->GetNumberOfTokens() > 1 ) { try { double d; NumericVariable::GetScalar( p->GetString(1), wxT("window number"), d ); currentWindow = static_cast(d); } catch (EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( currentWindow < 0 )throw ECommandError( command+wxT("window number < 0") ); if( currentWindow >= static_cast(numWindows) ) { wxString s( wxString(wxT("window ")) ); throw ECommandError( command+(s << currentWindow << wxT(" is not defined")) ); } ExGlobals::SetWindowNumber( currentWindow ); AddToStackLine( p->GetString(1) ); } if( ExGlobals::GetGraphWindow(currentWindow)->GetDrawableObjects().empty() ) { wxString s( wxT("REPLOT: there is nothing to replot in window ") ); ExGlobals::WarningMessage( s << currentWindow ); return; } try { ExGlobals::ReplotCurrentWindow(); } catch (EGraphicsError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } // end of file extrema-4.4.5/src/Commands/CMD_return.cpp0000644012702201742730000000173411274636606017265 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_return.h" #include "ParseLine.h" #include "ExGlobals.h" CMD_return *CMD_return::cmd_return_ = 0; CMD_return::CMD_return() : Command( wxT("RETURN") ) {} void CMD_return::Execute( ParseLine const *p ) {} // end of file extrema-4.4.5/src/Commands/CMD_quit.h0000644012702201742730000000204611274636606016372 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_QUIT #define CMD_QUIT #include "Command.h" class ParseLine; class CMD_quit : public Command { public: static CMD_quit *Instance() { if( !cmd_quit_ )cmd_quit_ = new CMD_quit(); return cmd_quit_; } void Execute( ParseLine const * ); private: CMD_quit(); static CMD_quit *cmd_quit_; }; #endif extrema-4.4.5/src/Commands/CMD_density.cpp0000644012702201742730000003753011274636606017430 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/wx.h" #include "CMD_density.h" #include "ExGlobals.h" #include "GRA_window.h" #include "ParseToken.h" #include "ParseLine.h" #include "ECommandError.h" #include "EVariableError.h" #include "EExpressionError.h" #include "EGraphicsError.h" #include "UsefulFunctions.h" #include "NumericVariable.h" #include "GRA_thiessenTriangulation.h" #include "GRA_boxPlot.h" #include "GRA_diffusionPlot.h" #include "GRA_gradientPlot.h" #include "GRA_ditheringPlot.h" #include "GRA_cartesianAxes.h" CMD_density *CMD_density::cmd_density_ = 0; CMD_density::CMD_density() : Command( wxT("DENSITY") ) { // types of density plot // AddQualifier( wxT("SOLIDFILL"), true ); AddQualifier( wxT("GRADIENTS"), true ); AddQualifier( wxT("BOXES"), false ); AddQualifier( wxT("DIFFUSION"), false ); AddQualifier( wxT("DITHERING"), false ); // AddQualifier( wxT("AXES"), true ); AddQualifier( wxT("LEGEND"), false ); AddQualifier( wxT("XPROFILE"), false ); AddQualifier( wxT("YPROFILE"), false ); AddQualifier( wxT("BORDER"), true ); AddQualifier( wxT("RESET"), false ); // AddQualifier( wxT("LINEAR"), true ); // only applies to SolidFill and RandomPoints AddQualifier( wxT("HISTOGRAM"), false ); // opposite of linear AddQualifier( wxT("ZOOM"), false ); AddQualifier( wxT("CONTOURS"), false ); AddQualifier( wxT("EQUALLYSPACED"), false ); AddQualifier( wxT("LINES"), true ); AddQualifier( wxT("AREAS"), false ); AddQualifier( wxT("VOLUMES"), false ); AddQualifier( wxT("DITHERVECTOR"), false ); AddQualifier( wxT("CONTOURLEVELS"), false ); AddQualifier( wxT("COLOR"), false ); } void CMD_density::Execute( ParseLine const *p ) { // // DENSITY\BOXES x y v { p1 p2 { bscale }} // // DENSITY\DITHERING x y v // DENSITY\DITHERING\DITHERVECTOR d x y v // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError const &e) { throw; } wxString command( Name()+wxT(": ") ); if( !qualifiers[wxT("DITHERING")] ) { if( qualifiers[wxT("CONTOURLEVELS")] ) throw ECommandError( command+wxT("\\CONTOURLEVELS only applies to dithering type density plots") ); if( qualifiers[wxT("DITHERVECTOR")] ) throw ECommandError( command+wxT("\\DITHERVECTOR only applies to dithering type density plots") ); qualifiers[wxT("LINEAR")] = !qualifiers[wxT("HISTOGRAM")]; } int ifld = 1; std::size_t nLevels = 10; std::vector dither; std::vector contourLevels; if( qualifiers[wxT("DITHERING")] ) { if( qualifiers[wxT("DITHERVECTOR")] ) { std::vector tmp; if( p->GetNumberOfTokens()<=1 || !p->IsString(1) ) throw ECommandError( command+wxT("expecting a dithering vector") ); try { NumericVariable::GetVector( p->GetString(1), wxT("dithering vector"), tmp ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); ++ifld; nLevels = tmp.size()/2; for( std::size_t i=0; i<2*nLevels; ++i ) { dither.push_back( static_cast(tmp[i]) ); if( dither.back() == 0 )dither.back() = 10000; } } else { dither.push_back( 1 ); dither.push_back( 1 ); dither.push_back( 2 ); dither.push_back( 1 ); dither.push_back( 2 ); dither.push_back( 2 ); dither.push_back( 3 ); dither.push_back( 2 ); dither.push_back( 3 ); dither.push_back( 3 ); dither.push_back( 4 ); dither.push_back( 3 ); dither.push_back( 4 ); dither.push_back( 4 ); dither.push_back( 5 ); dither.push_back( 5 ); dither.push_back( 6 ); dither.push_back( 6 ); dither.push_back( 10000 ); dither.push_back( 10000 ); } if( qualifiers[wxT("CONTOURLEVELS")] ) { if( p->GetNumberOfTokens()<=ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting a contour levels vector") ); try { NumericVariable::GetVector( p->GetString(ifld), wxT("contour levels vector"), contourLevels ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld) ); for( std::size_t i=0; i= contourLevels[i+1] ) throw ECommandError( command+wxT("contour level vector must be strictly monotonically increasing") ); } ++ifld; if( qualifiers[wxT("DITHERVECTOR")] ) { if( contourLevels.size() != nLevels ) throw ECommandError( command+wxT("number of contour levels does not match the dithering vector") ); } else { if( contourLevels.size() > 9 ) { for( std::size_t i=19; i<=2*contourLevels.size()-1; i+=2 ) { dither.push_back( 7+(i-19)/2 ); dither.push_back( 7+(i-19)/2 ); } } nLevels = contourLevels.size()+1; dither.push_back( 10000 ); dither.push_back( 10000 ); } } } wxString namex, namey, namez; std::vector x, y, z; int nrow=0, ncol=0; // if( p->GetNumberOfTokens()<=ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting matrix or independent vector") ); namez = p->GetString( ifld ); int ndim; double v1; int dimSizes[3]; try { NumericVariable::GetVariable( namez, ndim, v1, z, dimSizes ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndim == 0 ) { throw ECommandError( command+namez+wxT(" is a scalar") ); } if( ndim == 3 ) { throw ECommandError( command+namez+wxT(" is a tensor") ); } ++ifld; if( ndim == 2 ) // DENSITY matrix ... { nrow = dimSizes[0]; for( int i=1; i<=nrow; ++i )y.push_back( static_cast(i) ); ncol = dimSizes[1]; for( int i=1; i<=ncol; ++i )x.push_back( static_cast(i) ); } else if( ndim == 1 ) // DENSITY x ... { x.assign( z.begin(), z.end() ); std::vector().swap( z ); // empty out z namex = namez; namez.clear(); if( p->GetNumberOfTokens()<=ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting dependant variable vector") ); namey = p->GetString(ifld); try { NumericVariable::GetVector( namey, wxT("dependant variable vector"), y ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( namey ); ++ifld; if( p->GetNumberOfTokens()<=ifld || !p->IsString(ifld) ) throw ECommandError( command+wxT("expecting matrix or z-variable vector") ); namez = p->GetString(ifld); try { NumericVariable::GetVariable( namez, ndim, v1, z, dimSizes ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndim == 0 ) { throw ECommandError( command+namez+wxT(" is a scalar") ); } if( ndim == 3 ) { throw ECommandError( command+namez+wxT(" is a tensor") ); } ++ifld; if( ndim == 1 ) // density x y z ... { if( qualifiers[wxT("BOXES")] && (qualifiers[wxT("XPROFILE")] || qualifiers[wxT("YPROFILE")]) ) throw ECommandError( command+wxT("profiles are not drawn with scatter plots") ); if( x.size() != y.size() ) throw ECommandError( command+namex+wxT(" has different length than ")+namey ); if( x.size() != z.size() ) throw ECommandError( command+namex+wxT(" has different length than ")+namez ); if( !qualifiers[wxT("BOXES")] && x.size()<4 ) throw ECommandError( command+wxT("grid interpolation requires at least 4 points") ); } else if( ndim == 2 ) // density x y matrix ... { nrow = dimSizes[0]; if( y.size() != static_cast(nrow) ) throw ECommandError( command+namey+ wxT(" does not have the same number of elements as the number of rows in the matrix") ); ncol = dimSizes[1]; if( x.size() != static_cast(ncol) ) throw ECommandError( command+namex+ wxT(" does not have the same number of elements as the number of columns in the matrix") ); } } double fmin=0.0, fmax=1.0; double qmin=0.0, qmax=1.0; double bscale = 1.0; if( p->GetNumberOfTokens() > ifld ) { try { NumericVariable::GetScalar( p->GetString(ifld), wxT("p1"), fmin ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld) ); if( p->GetNumberOfTokens() > ++ifld ) { try { NumericVariable::GetScalar( p->GetString(ifld), wxT("p2"), fmax ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld) ); if( p->GetNumberOfTokens() > ++ifld ) { try { NumericVariable::GetScalar( p->GetString(ifld), wxT("q1"), qmin ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld) ); if( p->GetNumberOfTokens() > ++ifld ) { try { NumericVariable::GetScalar( p->GetString(ifld), wxT("q2"), qmax ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld) ); if( qualifiers[wxT("BOXES")] ) { if( p->GetNumberOfTokens() > ++ifld ) { try { NumericVariable::GetScalar( p->GetString(ifld), wxT("box size scale factor"), bscale ); } catch (EVariableError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(ifld) ); ++ifld; } } } } } } if( !qualifiers[wxT("BOXES")] && nrow==0 ) { double xmin, xmax, ymin, ymax; UsefulFunctions::MinMax( x, 0, x.size(), xmin, xmax ); UsefulFunctions::MinMax( y, 0, y.size(), ymin, ymax ); // ncol = static_cast(sqrt(static_cast(x.size()))*5.0); nrow = ncol; double xinc = (xmax-xmin)/(ncol-1); double yinc = (ymax-ymin)/(ncol-1); std::vector xi, yi; xi.reserve(ncol); yi.reserve(ncol); for( int i=0; i array( ncol*ncol ); try { GRA_thiessenTriangulation tt( x, y, z ); tt.CreateMesh(); double eps = 0.001; std::size_t nit = 128; tt.Gradients( eps, nit ); tt.Interpolate( ncol, ncol, xi, yi, array ); } catch (EExpressionError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } x.assign( xi.begin(), xi.end() ); y.assign( yi.begin(), yi.end() ); z.assign( array.begin(), array.end() ); } wxClientDC dc( ExGlobals::GetwxWindow() ); if( qualifiers[wxT("BOXES")] ) { GRA_boxPlot *bp = new GRA_boxPlot( x, y, z, nrow, fmin, fmax, qmin, qmax, qualifiers[wxT("XPROFILE")], qualifiers[wxT("YPROFILE")], qualifiers[wxT("BORDER")], qualifiers[wxT("ZOOM")], qualifiers[wxT("AXES")], qualifiers[wxT("RESET")], bscale ); try { bp->Make(); bp->Draw( ExGlobals::GetGraphicsOutput(), dc ); } catch (EGraphicsError const &e) { delete bp; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ExGlobals::GetGraphWindow()->AddDrawableObject( bp ); } else if( qualifiers[wxT("DIFFUSION")] ) { GRA_diffusionPlot *dp = new GRA_diffusionPlot( x, y, z, nrow, fmin, fmax, qmin, qmax, qualifiers[wxT("XPROFILE")], qualifiers[wxT("YPROFILE")], qualifiers[wxT("BORDER")], qualifiers[wxT("ZOOM")], qualifiers[wxT("AXES")], qualifiers[wxT("RESET")] ); try { dp->Draw( ExGlobals::GetGraphicsOutput(), dc ); } catch (EGraphicsError const &e) { delete dp; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ExGlobals::GetGraphWindow()->AddDrawableObject( dp ); } else if( qualifiers[wxT("DITHERING")] ) { GRA_ditheringPlot *dp = new GRA_ditheringPlot( x, y, z, nrow, fmin, fmax, qmin, qmax, qualifiers[wxT("XPROFILE")], qualifiers[wxT("YPROFILE")], qualifiers[wxT("BORDER")], qualifiers[wxT("ZOOM")], qualifiers[wxT("AXES")], qualifiers[wxT("RESET")], qualifiers[wxT("LEGEND")], qualifiers[wxT("EQUALLYSPACED")], qualifiers[wxT("AREAS")], qualifiers[wxT("VOLUMES")], qualifiers[wxT("LINES")], dither, contourLevels ); try { dp->Draw( ExGlobals::GetGraphicsOutput(), dc ); } catch (EGraphicsError const &e) { delete dp; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ExGlobals::GetGraphWindow()->AddDrawableObject( dp ); try { wxString name; if( qualifiers[wxT("AREAS")] ) { name = wxT("DENSITY$AREAS"); NumericVariable::PutVariable( name, dp->GetAreaVec(), 0, p->GetInputLine() ); } if( qualifiers[wxT("VOLUMES")] ) { name = wxT("DENSITY$VOLUMES"); NumericVariable::PutVariable( name, dp->GetVolumeVec(), 0, p->GetInputLine() ); } if( qualifiers[wxT("CONTOURS")] ) { name = wxT("DENSITY$CONTOURS"); NumericVariable::PutVariable( name, dp->GetContourVec(), 0, p->GetInputLine() ); } } catch ( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( qualifiers[wxT("SOLIDFILL")] || qualifiers[wxT("GRADIENTS")] ) { GRA_gradientPlot *gp = new GRA_gradientPlot( x, y, z, nrow, fmin, fmax, qmin, qmax, qualifiers[wxT("XPROFILE")], qualifiers[wxT("YPROFILE")], qualifiers[wxT("BORDER")], qualifiers[wxT("ZOOM")], qualifiers[wxT("AXES")], qualifiers[wxT("RESET")], qualifiers[wxT("LEGEND")], qualifiers[wxT("LINEAR")] ); try { gp->Draw( ExGlobals::GetGraphicsOutput(), dc ); } catch (EGraphicsError const &e) { delete gp; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ExGlobals::GetGraphWindow()->AddDrawableObject( gp ); } ExGlobals::RefreshGraphics(); } // end of file extrema-4.4.5/src/Commands/CMD_graph.cpp0000644012702201742730000003464611304271725017046 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/wx.h" #include "CMD_graph.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "EVariableError.h" #include "NumericVariable.h" #include "TextVariable.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_legend.h" #include "GRA_plotSymbol.h" #include "GRA_intCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_boolCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_characteristic.h" #include "GRA_cartesianAxes.h" #include "GRA_cartesianCurve.h" #include "ExGlobals.h" #include "VisualizationWindow.h" #include "GRA_polarAxes.h" #include "GRA_polarCurve.h" CMD_graph *CMD_graph::cmd_graph_ = 0; CMD_graph::CMD_graph() : Command( wxT("GRAPH") ) { AddQualifier( wxT("POLAR"), false ); AddQualifier( wxT("RADAR"), false ); AddQualifier( wxT("HISTOGRAM"), false ); AddQualifier( wxT("REPLOT"), true ); AddQualifier( wxT("AXESONLY"), false ); AddQualifier( wxT("OVERLAY"), false ); AddQualifier( wxT("NOAXES"), false ); AddQualifier( wxT("YONRIGHT"), false ); AddQualifier( wxT("XONTOP"), false ); AddQualifier( wxT("SMOOTH"), false ); } void CMD_graph::Execute( ParseLine const *p ) { // GRAPH X Y Draw axes & curve autoscaling to X Y // GRAPH\HISTOGRAM X Y Draw axes & histgram of X Y // GRAPH X MATRIX Draw axes & " " to X matrix // GRAPH X Y YE1 XE1 YE2 XE2 " " & " " to X Y and error bars // GRAPH\AXESONLY Draw axes as previously set up // GRAPH\AXESONLY X Y " " autoscaling to X and Y // GRAPH\OVERLAY X Y Draw curve of X Y // GRAPH\OVERLAY X Y YE1 XE1 YE2 XE2 " " " " " and error bars // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError const &e) { throw; } wxString command( wxT("GRAPH: ") ); // ParseToken t( *p->GetToken(0) ); // double const degToRad = M_PI/180.; // GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_setOfCharacteristics *dataC = gw->GetDataCurveCharacteristics(); GRA_setOfCharacteristics *legendC = gw->GetGraphLegendCharacteristics(); GRA_intCharacteristic *histType = static_cast(dataC->Get(wxT("HISTOGRAMTYPE"))); int hstyp = histType->Get(); if( qualifiers[wxT("HISTOGRAM")] )histType->Set(2); // std::vector xe1, ye1, xe2, ye2; std::vector x, y; bool xE1=false, yE1=false, xE2=false, yE2=false; std::size_t num = 0; // int ifld = 0; bool legendIsOn = static_cast(legendC->Get(wxT("ON")))->Get(); if( qualifiers[wxT("POLAR")] || qualifiers[wxT("RADAR")] )legendIsOn = false; if( legendIsOn && !qualifiers[wxT("AXESONLY")] && (p->GetNumberOfTokens()<2 || !p->IsString(1)) ) throw ECommandError( command+wxT("expecting legend label") ); // wxString legendLabel; if( p->GetNumberOfTokens()>1 && p->IsString(1) ) { ++ifld; // there must be a legend entry, unless \AXESONLY try { TextVariable::GetVariable( p->GetString(1), false, legendLabel ); AddToStackLine( p->GetString(1) ); } catch( EVariableError const &e ) { if( qualifiers[wxT("AXESONLY")] || !legendIsOn )--ifld; else throw ECommandError( command+wxT("expecting legend label") ); } } if( p->GetNumberOfTokens() == ++ifld ) { num = 1; if( qualifiers[wxT("AXESONLY")] ) { x.push_back( 0.0 ); y.push_back( 0.0 ); if( qualifiers[wxT("POLAR")] || qualifiers[wxT("RADAR")] ) { num = 2; GRA_setOfCharacteristics *polarC = gw->GetPolarCharacteristics(); x.push_back( static_cast(polarC->Get(wxT("MAX")))->Get() ); y.push_back( 0.0 ); } } else throw ECommandError( command+wxT("expecting something to plot") ); } else { wxString xName, yName; if( p->GetNumberOfTokens() == ifld+1 ) // just a y vector entered { if( p->IsNull(ifld) )throw ECommandError( command+wxT("dependent variable not entered") ); if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting dependent variable") ); if( p->IsNumeric(ifld) ) { y.push_back( p->GetNumeric(ifld) ); x.push_back( 1.0 ); yName.clear(); yName << p->GetNumeric(ifld); AddToStackLine( yName ); } else { try { NumericVariable::GetVector( p->GetString(ifld), wxT("dependent variable"), y ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::size_t size = y.size(); for( std::size_t i=0; i(i+1) ); yName = p->GetString(ifld); AddToStackLine( yName ); } } else // at least x and y were entered { if( p->IsNull(ifld) )throw ECommandError( command+wxT("independent variable not entered") ); if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting independent variable") ); if( p->IsNumeric(ifld) ) { x.push_back( p->GetNumeric(ifld) ); xName.clear(); xName << p->GetNumeric(ifld); } else { try { NumericVariable::GetVector( p->GetString(ifld), wxT("independent variable"), x ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } xName = p->GetString(ifld); } AddToStackLine( xName ); ++ifld; if( p->IsNull(ifld) )throw ECommandError( command+wxT("dependent variable not entered") ); if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting dependent variable") ); if( p->IsNumeric(ifld) ) { y.push_back( p->GetNumeric(ifld) ); yName.clear(); yName << p->GetNumeric(ifld); } else { try { NumericVariable::GetVector( p->GetString(ifld), wxT("dependent variable"), y ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } yName = p->GetString(ifld); } AddToStackLine( yName ); if( x.size() != y.size() ) ExGlobals::WarningMessage( wxT("GRAPH: input vectors have different lengths, using minimum") ); } num = std::min(x.size(),y.size()); wxString ye1Name, ye2Name, xe1Name, xe2Name; ++ifld; if( p->GetNumberOfTokens() >= ifld+1 ) // there is a y error vector { if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting a y error vector") ); if( p->IsNull(ifld) ) { ye1Name.assign( wxT(",,") ); } else if( p->IsNumeric(ifld) ) { yE1 = true; ye1.push_back( p->GetNumeric(ifld) ); ye1Name.clear(); ye1Name << p->GetNumeric(ifld); } else if( p->IsString(ifld) ) { yE1 = true; try { NumericVariable::GetVector( p->GetString(ifld), wxT("y error vector"), ye1 ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ye1Name = p->GetString(ifld); } } if( !ye1Name.empty() )AddToStackLine( ye1Name ); ++ifld; if( p->GetNumberOfTokens() >= ifld+1 ) // there is an x error vector { if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting an x error vector") ); if( p->IsNull(ifld) ) { xe1Name.assign( wxT(",,") ); } else if( p->IsNumeric(ifld) ) { xE1 = true; xe1.push_back( p->GetNumeric(ifld) ); xe1Name.clear(); xe1Name << p->GetNumeric(ifld); } else if( p->IsString(ifld) ) { xE1 = true; try { NumericVariable::GetVector( p->GetString(ifld), wxT("x error vector"), xe1 ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } xe1Name = p->GetString(ifld); } } if( !xe1Name.empty() )AddToStackLine( xe1Name ); ++ifld; if( p->GetNumberOfTokens() >= ifld+1 ) // there is a second y error vector { if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting a second y error vector") ); if( p->IsNull(ifld) ) { ye2Name.assign( wxT(",,") ); } else if( p->IsNumeric(ifld) ) { yE2 = true; ye2.push_back( p->GetNumeric(ifld) ); ye2Name.clear(); ye2Name << p->GetNumeric(ifld); } else if( p->IsString(ifld) ) { yE2 = true; try { NumericVariable::GetVector( p->GetString(ifld), wxT("second y error vector"), ye2 ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ye2Name = p->GetString(ifld); } } if( !ye2Name.empty() )AddToStackLine( ye2Name ); ++ifld; if( p->GetNumberOfTokens() >= ifld+1 ) // there is a second x error vector { if( p->IsEqualSign(ifld) ) throw ECommandError( command+wxT("equal sign encountered; expecting second x error vector") ); if( p->IsNumeric(ifld) ) { xE2 = true; xe2.push_back( p->GetNumeric(ifld) ); xe2Name.clear(); xe2Name << p->GetNumeric(ifld); } else if( p->IsString(ifld) ) { xE2 = true; try { NumericVariable::GetVector( p->GetString(ifld), wxT("second x error vector"), xe2 ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } xe2Name = p->GetString(ifld); } } if( !xe2Name.empty() )AddToStackLine( xe2Name ); } if( yE1 )num = std::min(num,ye1.size()); if( xE1 )num = std::min(num,xe1.size()); if( yE2 )num = std::min(num,ye2.size()); if( xE2 )num = std::min(num,xe2.size()); if( num < x.size() )x.resize( num ); if( num < y.size() )y.resize( num ); if( xE1 && num < xe1.size() )xe1.resize( num ); if( yE1 && num < ye1.size() )ye1.resize( num ); if( xE2 && num < xe2.size() )xe2.resize( num ); if( yE2 && num < ye2.size() )ye2.resize( num ); // std::vector x2(x), y2(y); if( yE1 ) { if( yE2 ) { for( std::size_t i=0; iMake(); polarAxes->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( polarAxes ); } if( !qualifiers[wxT("AXESONLY")] ) { polarCurve = new GRA_polarCurve( x, y ); polarCurve->Make(); polarCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( polarCurve ); } } catch (EGraphicsError const &e) { delete polarAxes; delete polarCurve; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else { GRA_cartesianAxes *cartesianAxes = 0; GRA_cartesianCurve *cartesianCurve = 0; try { if( !qualifiers[wxT("OVERLAY")] ) cartesianAxes = new GRA_cartesianAxes(x2,y2,qualifiers[wxT("XONTOP")],qualifiers[wxT("YONRIGHT")]); if( !qualifiers[wxT("AXESONLY")] ) cartesianCurve = new GRA_cartesianCurve(x,y,xe1,ye1,xe2,ye2,qualifiers[wxT("SMOOTH")]); if( cartesianAxes ) { cartesianAxes->Make(); cartesianAxes->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( cartesianAxes ); } if( cartesianCurve ) { cartesianCurve->Make(); cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( cartesianCurve ); } } catch ( EGraphicsError const &e ) { delete cartesianAxes; delete cartesianCurve; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( legendIsOn && !qualifiers[wxT("AXESONLY")] ) { try { gw->GetGraphLegend()->AddEntry( legendLabel ); } catch (EGraphicsError const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } histType->Set( hstyp ); ExGlobals::RefreshGraphics(); } // end of file extrema-4.4.5/src/Commands/CMD_contour.h0000644012702201742730000000246711423400665017076 0ustar spangspang/* Copyright (C) 2005,,2010 Joseph L. Chuma 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. */ #ifndef CMD_CONTOUR #define CMD_CONTOUR #include "Command.h" class ParseLine; class CMD_contour : public Command { public: static CMD_contour *Instance() { if( !cmd_contour_ )cmd_contour_ = new CMD_contour(); return cmd_contour_; } void Execute( ParseLine const * ); private: CMD_contour(); static CMD_contour *cmd_contour_; void GetIntParameter( std::vector &, ParseLine const *, int &, wxString const & ); void GetDataParameters( std::vector &, std::vector &, std::vector &, ParseLine const *, int & ); }; #endif extrema-4.4.5/src/Commands/CMD_return.h0000644012702201742730000000207411274636606016730 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_RETURN #define CMD_RETURN #include "Command.h" class ParseLine; class CMD_return : public Command { public: static CMD_return *Instance() { if( !cmd_return_ )cmd_return_ = new CMD_return(); return cmd_return_; } void Execute( ParseLine const * ); private: CMD_return(); static CMD_return *cmd_return_; }; #endif extrema-4.4.5/src/Commands/CMD_bestfit.cpp0000644012702201742730000003755711274636606017422 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_bestfit.h" #include "ParseToken.h" #include "ParseLine.h" #include "ECommandError.h" #include "EVariableError.h" #include "EExpressionError.h" #include "UsefulFunctions.h" #include "NumericVariable.h" #include "ExGlobals.h" CMD_bestfit *CMD_bestfit::cmd_bestfit_ = 0; CMD_bestfit::CMD_bestfit() : Command( wxT("BESTFIT") ) { AddQualifier( wxT("WEIGHTS"), false ); AddQualifier( wxT("CYCLES"), false ); } void CMD_bestfit::Execute( ParseLine const *p ) { // BESTFIT pmin pmax penalty error parm pout // BESTFIT\CYCLES n pmin pmax penalty error parm pout // BESTFIT\WEIGHTS w pmin pmax penalty error parm pout // BESTFIT\CYCLES\WEIGHTS w n pmin pmax penalty error parm pout // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); int counter = 1; std::vector weights; int nwt; if( qualifiers[wxT("WEIGHTS")] ) { // // BESTFIT\WEIGHTS w pmin pmax penalty error parm pout // BESTFIT\CYCLES\WEIGHTS w n pmin pmax penalty error parm pout // if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting weight vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("weight vector"), weights ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } nwt = weights.size(); AddToStackLine( p->GetString(counter++) ); } int ncyc = 10; if( qualifiers[wxT("CYCLES")] ) { // BESTFIT\CYCLES n pmin pmax penalty error parm pout // BESTFIT\CYCLES\WEIGHTS w n pmin pmax penalty error parm pout // double v; try { NumericVariable::GetScalar( p->GetString(counter), wxT("number of cycles"), v ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } ncyc = static_cast(v); if( ncyc <= 0 ) throw ECommandError( command+wxT("number of cycles must be > 0") ); AddToStackLine( p->GetString(counter++) ); } std::vector pmin; try { NumericVariable::GetVector( p->GetString(counter), wxT("parameter minima"), pmin ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int npmin = pmin.size(); AddToStackLine( p->GetString(counter++) ); std::vector pmax; try { NumericVariable::GetVector( p->GetString(counter), wxT("parameter maxima"), pmax ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int npmax = pmax.size(); AddToStackLine( p->GetString(counter++) ); std::vector penalties; try { NumericVariable::GetVector( p->GetString(counter), wxT("parameter penalties"), penalties ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int npenalties = penalties.size(); AddToStackLine( p->GetString(counter++) ); std::vector errors; try { NumericVariable::GetVector( p->GetString(counter), wxT("error vector"), errors ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int nerror = errors.size(); AddToStackLine( p->GetString(counter++) ); if( !qualifiers[wxT("WEIGHTS")] ) { nwt = nerror; weights.assign( nwt, 1.0 ); } if( nwt != nerror )throw ECommandError( command+wxT("weight vector length must equal the error vector length") ); std::vector pcm; std::size_t nr, np; try { NumericVariable::GetMatrix( p->GetString(counter), wxT("parameter characteristic matrix"), pcm, nr, np ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( nerror != static_cast(nr) )throw ECommandError( command+wxT("error vector length must equal the number of rows of the matrix") ); if( npmin != static_cast(np) )throw ECommandError( command+wxT("parameter minimum vector length must equal the number of columns of the matrix") ); if( npmax != static_cast(np) )throw ECommandError( command+wxT("parameter maximum vector length must equal the number of columns of the matrix") ); if( npenalties != static_cast(np) )throw ECommandError( command+wxT("parameter penalty vector length must equal the number of columns of the matrix") ); if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output parameter vector name") ); // std::vector pout(np); try { FitData( static_cast(np), static_cast(nr), ncyc, pmin, pmax, penalties, errors, weights, pcm, pout ); } catch( ECommandError &e ) { throw; } wxString poutName( p->GetString(counter) ); try { NumericVariable::PutVariable( poutName, pout, 0, p->GetInputLine() ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( poutName ); } void CMD_bestfit::FitData( int np, int nr, int ncyc, std::vector const &pmin, std::vector const &pmax, std::vector const &penalties, std::vector const &errors, std::vector const &weights, std::vector const &pcm, std::vector &p ) { // original fortran code by C.J. Kost, 29 July, 1980 // See TRIUMF design note TRI-DN-69-31 // // Calculate parameters for least-squares fit to an error vector using np // adjustable parameters // // Given an error vector "errors" (error array at nr locations). // Given the influence function (that is the effect at the nr locations of a // unit change) of np ( a(nr*np,0.0); std::vector ip(np,0); int nc = np; for( int n=1; n<=nc; ++n ) { ip[n-1] = n; for( int m=n; m<=nc; ++m ) { int nm = n+(m-1)*nc-1; int mn = m+(n-1)*nc-1; a[nm] = 0.0; for( int ir=0; ir weightedErrors(nr,0.0); for( int ir=0; ir d(nc); std::vector dt(nc); std::vector ainv(nc*nc); for( int n=0; n cm ) { cm = cd; kill = n; } } if( kill == 0 ) // no violation of maximum constraints { // determine largest violation of minimum constraints // for( int n=1; n<=nc; ++n ) { double cd = pmin[ip[n-1]-1] - p[ip[n-1]-1]; if( cd > cm ) { cm = cd; kill = n; } } if( kill == 0 ) { FitDataInfo( cyclesUsed, np, nr, p, weights, errors, pcm ); return; } // // Parameter ikill is largest violator of minimum constraint // int ikill = ip[kill-1]; if( cyclesUsed > ncyc ) { ExGlobals::WriteOutput( wxString(wxT("limit on cycles reached, with parameter ")) << ip[kill]+1 << wxT(" still outside") ); FitDataInfo( cyclesUsed, np, nr, p, weights, errors, pcm ); return; } p[ikill-1] = pmin[ikill-1]; ExGlobals::WriteOutput( wxString(wxT("parameter ")) << ikill << wxT(" < min ") << pmin[ikill-1] << wxT(" so set to min") ); // // Modify contribution to vector D due to parameter ip[kill] // for( int ir=0; ir ncyc ) { ExGlobals::WriteOutput( wxString(wxT("limit on cycles reached, with parameter ")) << ip[kill]+1 << wxT(" still outside") ); FitDataInfo( cyclesUsed, np, nr, p, weights, errors, pcm ); return; } p[ikill-1] = pmax[ikill-1]; ExGlobals::WriteOutput( wxString(wxT("parameter ")) << ikill-1 << wxT(" > max ") << pmax[ikill-1] << wxT(" so set to max") ); // // Modify contribution to vector D due to parameter ip[kill] // Check if next < 0 since we return if have null matrix // if( next == 0 )return; for( int ir=0; ir &p, std::vector const &weights, std::vector const &errors, std::vector const &pcm ) { // // Write out RMS param changes, and residuals before and after fit // ExGlobals::WriteOutput( wxString(wxT("number of cycles used: ")) << cyclesUsed ); double sumpar = 0.0; for( int i=0; iGetNumberOfPages(); double d; try { NumericVariable::GetScalar( p->GetString(1), wxT("page number"), d ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int n = static_cast( d ); if( n < 0 )throw ECommandError( command+wxT("window number < 0") ); AddToStackLine( p->GetString(1) ); // int inherit = 0; if( qualifiers[wxT("INHERIT")] ) { if( p->GetNumberOfTokens() < 3 ) throw ECommandError( command+wxT("expecting target page number and page number to inherit from") ); try { NumericVariable::GetScalar( p->GetString(2), wxT("page number to inherit from"), d ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } inherit = static_cast( d ); if( inherit < 0 )throw ECommandError( command+wxT("page number to inherit from < 0") ); if( inherit > nPages ) throw ECommandError( command+wxT("page number to inherit from > largest defined page number") ); AddToStackLine( p->GetString(2) ); } n > nPages ? visWindow->NewPage(n) : visWindow->SetPage(n); if( qualifiers[wxT("INHERIT")] )visWindow->InheritPage( inherit ); } // end of file extrema-4.4.5/src/Commands/CMD_ellipse.h0000644012702201742730000000232211274636606017042 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_ELLIPSECOMMAND #define CMD_ELLIPSECOMMAND #include "Command.h" class ParseLine; class CMD_ellipse : public Command { public: static CMD_ellipse *Instance() { if( !cmd_ellipse_ )cmd_ellipse_ = new CMD_ellipse(); return cmd_ellipse_; } void Execute( ParseLine const * ); private: CMD_ellipse(); void PopulateEllipse( bool, bool, ParseLine const *, int, double, double, double, double, double ); static CMD_ellipse *cmd_ellipse_; }; #endif extrema-4.4.5/src/Commands/CMD_do.h0000644012702201742730000000202111274636606016003 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_DO #define CMD_DO #include "Command.h" class ParseLine; class CMD_do : public Command { public: static CMD_do *Instance() { if( !cmd_do_ )cmd_do_ = new CMD_do(); return cmd_do_; } void Execute( ParseLine const *p ); private: CMD_do(); static CMD_do *cmd_do_; }; #endif extrema-4.4.5/src/Commands/CMD_rebin.cpp0000644012702201742730000001311211274636606017036 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_rebin.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "NumericVariable.h" CMD_rebin *CMD_rebin::cmd_rebin_ = 0; CMD_rebin::CMD_rebin() : Command( wxT("REBIN") ) {} void CMD_rebin::Execute( ParseLine const *p ) { // REBIN vIn vOut n // REBIN mIn mOut nr nc // SetUp( p ); std::vector x; wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens() < 2 ) throw ECommandError( command+wxT("expecting data vector or matrix") ); double v1; int dimSizes[3]; wxString xName( p->GetString(1) ); int xDim, xLen, xRows, xCols; try { NumericVariable::GetVariable( xName, xDim, v1, x, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( xDim == 0 ) throw ECommandError( command+xName+wxT(" is a scalar") ); else if( xDim == 3 )throw ECommandError( command+xName+wxT(" is a tensor") ); else if( xDim == 1 )xLen = x.size(); else { xRows = dimSizes[0]; xCols = dimSizes[1]; } AddToStackLine( p->GetString(1) ); // if( p->GetNumberOfTokens()<3 || !p->IsString(2) ) throw ECommandError( command+wxT("expecting output counts variable name") ); wxString countsName( p->GetString(2) ); AddToStackLine( countsName ); if( xDim == 1 ) // rebin a vector { if( p->GetNumberOfTokens() < 4 )throw ECommandError( command+wxT("expecting data compression factor") ); int compressionFactor; try { double d; NumericVariable::GetScalar( p->GetString(3), wxT("compression factor"), d ); AddToStackLine( p->GetString(3) ); compressionFactor = static_cast(d+0.5); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( compressionFactor < 0 )throw ECommandError( command+wxT("compression factor < 0") ); if( compressionFactor == 0 )throw ECommandError( command+wxT("compression factor = 0") ); if( xLen%compressionFactor != 0 )ExGlobals::WarningMessage(wxT("REBIN: the last bin will not be complete")); int rNum = xLen/compressionFactor; std::vector y( rNum, 0.0 ); for( int i=0; iGetInputLine() ); } else // rebin a matrix { if( p->GetNumberOfTokens() < 4 )throw ECommandError( command+wxT("expecting row compression factor") ); int rowCompressionFactor; try { double d; NumericVariable::GetScalar( p->GetString(3), wxT("row compression factor"), d ); AddToStackLine( p->GetString(3) ); rowCompressionFactor = static_cast(d+0.5); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( rowCompressionFactor < 0 )throw ECommandError( command+wxT("row compression factor < 0") ); if( rowCompressionFactor == 0 )throw ECommandError( command+wxT("row compression factor = 0") ); if( xRows%rowCompressionFactor != 0 ) ExGlobals::WarningMessage(wxT("REBIN: the last bin row will not be complete")); if( p->GetNumberOfTokens() < 5 )throw ECommandError( command+wxT("expecting column compression factor") ); int columnCompressionFactor; try { double d; NumericVariable::GetScalar( p->GetString(4), wxT("column compression factor"), d ); AddToStackLine( p->GetString(4) ); columnCompressionFactor = static_cast(d+0.5); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( columnCompressionFactor < 0 )throw ECommandError( command+wxT("column compression factor < 0") ); if( columnCompressionFactor == 0 )throw ECommandError( command+wxT("column compression factor = 0") ); if( xCols%columnCompressionFactor != 0 ) ExGlobals::WarningMessage( wxT("REBIN: the last bin column will not be complete") ); int rNum = xRows/rowCompressionFactor; int cNum = xCols/columnCompressionFactor; // std::vector y1( rNum*xCols, 0.0 ); std::vector y2( rNum*cNum, 0.0 ); for( int k=0; k(rNum), static_cast(cNum), p->GetInputLine() ); } } // end of file extrema-4.4.5/src/Commands/CMD_save.cpp0000644012702201742730000000367311274636606016710 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "CMD_save.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "TextVariable.h" CMD_save *CMD_save::cmd_save_ = 0; CMD_save::CMD_save() : Command( wxT("SAVE") ) {} void CMD_save::Execute( ParseLine const *p ) { // SAVE filename // SetUp( p ); // wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens()<2 || !p->IsString(1) ) throw ECommandError( command+wxT("no filename was entered") ); wxString filename; try { TextVariable::GetVariable( p->GetString(1), true, filename ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } // get the file extension, if there was one given // wxString extension; std::size_t len = filename.size(); std::size_t i = filename.find_last_of( wxT('.') ); if( i != filename.npos )extension = filename.substr(i,len-i); // if( extension.empty() )filename += wxString(wxT(".xml")); AddToStackLine( p->GetString(1) ); try { ExGlobals::SaveSession( filename ); } catch (std::runtime_error &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } // end of file extrema-4.4.5/src/Commands/CMD_stack.h0000644012702201742730000000205711274636606016517 0ustar spangspang/* Copyright (C) 2006 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_STACK #define CMD_STACK #include "Command.h" class ParseLine; class CMD_stack : public Command { public: static CMD_stack *Instance() { if( !cmd_stack_ )cmd_stack_ = new CMD_stack(); return cmd_stack_; } void Execute( ParseLine const * ); private: CMD_stack(); static CMD_stack *cmd_stack_; }; #endif extrema-4.4.5/src/Commands/CMD_ellipse.cpp0000644012702201742730000003400711274636606017402 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "CMD_ellipse.h" #include "ExGlobals.h" #include "ParseToken.h" #include "ParseLine.h" #include "ECommandError.h" #include "EVariableError.h" #include "UsefulFunctions.h" #include "NumericVariable.h" #include "GRA_cartesianCurve.h" #include "GRA_window.h" CMD_ellipse *CMD_ellipse::cmd_ellipse_ = 0; CMD_ellipse::CMD_ellipse() : Command( wxT("ELLIPSE") ) { AddQualifier( wxT("POPULATE"), true ); AddQualifier( wxT("FIT"), false ); AddQualifier( wxT("NPTS"), false ); AddQualifier( wxT("FRACTION"), false ); AddQualifier( wxT("XYOUT"), false ); AddQualifier( wxT("PARAMETERS"), false ); AddQualifier( wxT("MESSAGES"), true ); } void CMD_ellipse::Execute( ParseLine const *p ) { // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError const &e) { throw; } wxString command( Name()+wxT(": ") ); if( qualifiers[wxT("FIT")] )qualifiers[wxT("POPULATE")] = false; if( qualifiers[wxT("POPULATE")] ) { if( qualifiers[wxT("FRACTION")] ) throw ECommandError( command+wxT("\\FRACTION qualifier not compatible with \\POPULATE qualifier") ); if( qualifiers[wxT("PARAMETERS")] ) throw ECommandError( command+wxT("\\PARAMATERS qualifier not compatible with \\POPULATE qualifier") ); } int counter = 1; if( qualifiers[wxT("FIT")] ) { // ELLIPSE\FIT XIN YIN // ELLIPSE\FIT\NPTS XIN YIN N // ELLIPSE\FIT\FRACTION XIN YIN FRAC // ELLIPSE\FIT\FRACTION\NPTS XIN YIN FRAC N // ELLIPSE\FIT\XYOUT XIN YIN XO YO // ELLIPSE\FIT\XYOUT\NPTS XIN YIN N XO YO // ELLIPSE\FIT\XYOUT\FRACTION XIN YIN FRAC XO YO // ELLIPSE\FIT\XYOUT\FRACTION\NPTS XIN YIN FRAC N XO YO // ELLIPSE\FIT\PARAMETERS XIN YIN A B XC YC ANGLE // ELLIPSE\FIT\PARAMETERS\NPTS XIN YIN A B XC YC ANGLE N // ELLIPSE\FIT\PARAMETERS\FRAC XIN YIN FRAC A B XC YC ANGLE // ELLIPSE\FIT\PARAMETERS\FRAC\NPTS XIN YIN FRAC A B XC YC ANGLE N // ELLIPSE\FIT\PARAMETERS\XYOUT XIN YIN A B XC YC ANGLE XO YO // ELLIPSE\FIT\PARAMETERS\XYOUT\NPTS XIN YIN A B XC YC ANGLE N XO YO // ELLIPSE\FIT\PARAMETERS\XYOUT\FRAC XIN YIN FRAC A B XC YC ANGLE XO YO // ELLIPSE\FIT\PARAMETERS\XYOUT\FRAC\NPTS XIN YIN FRAC A B XC YC ANGLE N XO YO // // Default value of fraction = 0.9 // std::vector x, y; if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting independent input vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("independent input vector"), x ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting dependent input vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("dependent input vector"), y ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( x.size() != y.size() ) throw ECommandError( command+wxT("data vector lengths are not equal") ); int num = static_cast(x.size()); if( num <= 1 )throw ECommandError( command+wxT("data vector lengths are <= 1") ); double fraction = 0.9; if( qualifiers[wxT("FRACTION")] ) { if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting fraction of points inside ellipse") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("fraction of points inside ellipse"), fraction ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( fraction < 0.0 ) throw ECommandError( command+wxT("fraction of points inside ellipse < 0") ); if( fraction == 0.0 ) throw ECommandError( command+wxT("fraction of points inside ellipse = 0") ); if( fraction > 1.0 ) throw ECommandError( command+wxT("fraction of points inside ellipse > 1") ); AddToStackLine( p->GetString(counter++) ); } if( fraction*num < 0.5 ) throw ECommandError( command+wxT("fraction of points * data vector length < 0.5") ); // fit ellipse to vectors // double xc, yc, a, b, angle; try { UsefulFunctions::EllipseFit( x, y, fraction, xc, yc, a, b, angle ); } catch (std::runtime_error const &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( qualifiers[wxT("MESSAGES")] ) { ExGlobals::WriteOutput( wxString()<GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting major axis output scalar name") ); wxString majorAxisName( p->GetString(counter++) ); AddToStackLine( majorAxisName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting minor axis output scalar name") ); wxString minorAxisName( p->GetString(counter++) ); AddToStackLine( minorAxisName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting centre x-coordinate output scalar name") ); wxString xcName( p->GetString(counter++) ); AddToStackLine( xcName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting centre y-coordinate output scalar name") ); wxString ycName( p->GetString(counter++) ); AddToStackLine( ycName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting angle output scalar name") ); wxString angleName( p->GetString(counter++) ); AddToStackLine( angleName ); // try { NumericVariable::PutVariable( majorAxisName, a, p->GetInputLine() ); NumericVariable::PutVariable( minorAxisName, b, p->GetInputLine() ); NumericVariable::PutVariable( xcName, xc, p->GetInputLine() ); NumericVariable::PutVariable( ycName, yc, p->GetInputLine() ); NumericVariable::PutVariable( angleName, angle, p->GetInputLine() ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } try { PopulateEllipse( qualifiers[wxT("NPTS")], qualifiers[wxT("XYOUT")], p, counter, a, b, xc, yc, angle ); } catch (ECommandError const &e) { throw; } } else // not a fit, must be populate { // ELLIPSE\POPULATE A B XC YC ANGLE // ELLIPSE\POPULATE\NPTS A B XC YC ANGLE N // ELLIPSE\POPULATE\XYOUT A B XC YC ANGLE XO YO // ELLIPSE\POPULATE\XYOUT\NPTS A B XC YC ANGLE N XO YO // double a, b, xc, yc, angle; if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting major axis length") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("major axis length"), a ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( a < 0.0 ) throw ECommandError( command+wxT("major axis length < 0") ); if( a == 0.0 ) throw ECommandError( command+wxT("major axis length = 0") ); // if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting minor axis length") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("minor axis length"), b ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( b < 0.0 ) throw ECommandError( command+wxT("minor axis length < 0") ); if( b == 0.0 ) throw ECommandError( command+wxT("minor axis length = 0") ); // if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting x-coordinate of ellipse centre") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("x-coordinate of ellipse centre"), xc ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting y-coordinate of ellipse centre") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("y-coordinate of ellipse centre"), yc ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting ellipse angle (degrees)") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("ellipse angle (degrees)"), angle ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // try { PopulateEllipse( qualifiers[wxT("NPTS")], qualifiers[wxT("XYOUT")], p, counter, a, b, xc, yc, angle ); } catch (ECommandError const &e) { throw; } } } void CMD_ellipse::PopulateEllipse( bool npts, bool xyout, ParseLine const *p, int counter, double a, double b, double xc, double yc, double angle ) { wxString command( wxT("ELLIPSE: ") ); int nOut = 260; if( npts ) { if( p->GetNumberOfTokens()IsString(counter)||p->IsNumeric(counter)) ) throw ECommandError( command+wxT("expecting number of output points") ); double tmp; try { NumericVariable::GetScalar( p->GetString(counter), wxT("number of output points"), tmp ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); nOut = static_cast(tmp+0.5); if( nOut < 0 ) throw ECommandError( command+wxT("number of output points < 0") ); if( nOut == 0 ) throw ECommandError( command+wxT("number of output points = 0") ); } int nd4 = nOut/4; std::vector xout(nOut+1), yout(nOut+1); double const pi = acos(-1.0); // // populate 1/4 of the ellipse with nOut/4 points in quadrant 1 of // the standard coordinate system for the ellipse // for( int i=0; iGetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output independent vector name") ); wxString xoutName( p->GetString(counter++) ); AddToStackLine( xoutName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output dependent vector name") ); wxString youtName( p->GetString(counter++) ); AddToStackLine( youtName ); // try { NumericVariable::PutVariable( xoutName, xout, 0, p->GetInputLine() ); NumericVariable::PutVariable( youtName, yout, 0, p->GetInputLine() ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else { wxClientDC dc( ExGlobals::GetwxWindow() ); std::vector xe1, ye1, xe2, ye2; GRA_cartesianCurve *cartesianCurve = new GRA_cartesianCurve(xout,yout,xe1,ye1,xe2,ye2); cartesianCurve->Make(); cartesianCurve->Draw( ExGlobals::GetGraphicsOutput(), dc ); ExGlobals::GetGraphWindow()->AddDrawableObject( cartesianCurve ); } } // end of file extrema-4.4.5/src/Commands/CMD_bin2d.cpp0000644012702201742730000002566011274636606016750 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_bin2d.h" #include "ECommandError.h" #include "ParseLine.h" #include "UsefulFunctions.h" #include "EVariableError.h" #include "NumericVariable.h" CMD_bin2d *CMD_bin2d::cmd_bin2d_ = 0; CMD_bin2d::CMD_bin2d() : Command( wxT("BIN2D") ) { AddQualifier( wxT("WEIGHTS"), false ); AddQualifier( wxT("EMPTY"), false ); AddQualifier( wxT("MATRIX"), false ); AddQualifier( wxT("XDISCARD"), false ); AddQualifier( wxT("YDISCARD"), false ); } void CMD_bin2d::Execute( ParseLine const *p ) { // BIN2D xin yin xb yb mc nx ny { xmin xmax ymin ymax } // BIN2D\WEIGHT w xin yin xb yb mc nx ny { xmin xmax ymin ymax } // BIN2D\EMPTY xin yin xb yb mc nx ny { xmin xmax ymin ymax } // BIN2D\EMPTY\WEIGHT w xin yin xb yb mc nx ny { xmin xmax ymin ymax } // BIN2D\MATRIX mdata mxin myin mout // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( qualifiers[wxT("MATRIX")] ) { // // bin2d\matrix mdata mxin myin mout // if( p->GetNumberOfTokens() < 5 )throw ECommandError( command+wxT("expecting: mdata mx my mc") ); std::vector data; std::size_t nRow, nCol; try { NumericVariable::GetMatrix( p->GetString(1), wxT("data matrix"), data, nRow, nCol ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(1) ); // std::vector x; std::size_t nRowx, nColx; try { NumericVariable::GetMatrix( p->GetString(2), wxT("x matrix"), x, nRowx, nColx ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); // std::vector y; std::size_t nRowy, nColy; try { NumericVariable::GetMatrix( p->GetString(3), wxT("y matrix"), y, nRowy, nColy ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(3) ); // if( (nRowy!=nRowx) || (nColy!=nColx) ) throw ECommandError( command+wxT("x and y matrices must be the same size") ); // wxString moutName( p->GetString(4) ); // int nrout = nRowx-1; int ncout = nColx-1; std::vector out(nrout*ncout,0.0); // int kc = 1; int kr = 1; for( std::size_t j=1; j<=nRow; ++j ) { for( std::size_t i=1; i<=nCol; ++i ) // do 1030 i = 1, ncxy { int icnt = 0; bool test = true; while( test ) { std::vector x, y; std::vector().swap( x ); std::vector().swap( y ); test = false; if( ++icnt > nrout*ncout )continue; x.push_back( x[kc-1+(kr-1)*nColx] ); y.push_back( y[kc-1+(kr-1)*nColx] ); x.push_back( x[kc+(kr-1)*nColx] ); y.push_back( y[kc+(kr-1)*nColx] ); x.push_back( x[kc+(kr)*nColx] ); y.push_back( y[kc+(kr)*nColx] ); x.push_back( x[kc-1+(kr)*nColx] ); y.push_back( y[kc-1+(kr)*nColx] ); if( UsefulFunctions::InsidePolygon(static_cast(i),static_cast(j),x,y) ) { out[kc-1+(kr-1)*ncout] = out[kc-1+(kr-1)*ncout] + data[i-1+(j-1)*nCol]; } else { if( ++kc > ncout ) { kc = 1; if( ++kr > nrout )kr = 1; } test = true; } } } } NumericVariable::PutVariable( moutName, out, static_cast(nrout), static_cast(ncout), p->GetInputLine() ); return; } // // bin2d xin yin xb yb mc nx ny { xmin xmax ymin ymax } // bin2d\weight w xin yin xb yb mc nx ny { xmin xmax ymin ymax } // bin2d\empty xin yin xb yb mc nx ny { xmin xmax ymin ymax } // bin2d\empty\weight w xin yin xb yb mc nx ny { xmin xmax ymin ymax } // int counter = 1; std::vector w; if( qualifiers[wxT("WEIGHTS")] ) { if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting weight vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("weight vector"), w ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); } if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting x vector") ); std::vector x; try { NumericVariable::GetVector( p->GetString(counter), wxT("x vector"), x ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( qualifiers[wxT("WEIGHTS")] ) { if( w.size() != x.size() ) throw ECommandError( command+wxT("weight vector length must be equal to data vector length") ); } int numx = x.size(); // if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting y vector") ); std::vector y; try { NumericVariable::GetVector( p->GetString(counter), wxT("y vector"), y ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); int numy = y.size(); // if( numy != numx ) throw ECommandError( command+wxT("x vector length must be equal to y vector length") ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output x bin vector name") ); wxString xbName( p->GetString(counter) ); AddToStackLine( xbName ); ++counter; // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output y bin vector name") ); wxString ybName( p->GetString(counter) ); AddToStackLine( ybName ); ++counter; // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output counts matrix name") ); wxString cName( p->GetString(counter) ); AddToStackLine( cName ); ++counter; // if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting number of x bins") ); double v; try { NumericVariable::GetScalar( p->GetString(counter), wxT("number of x bins"), v ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int nbinsx, nbinsy; if( v > 0.0 ) nbinsx = static_cast( v+0.5 ); else if( v < 0.0 ) throw ECommandError( command+wxT("number of x bins < 0") ); else throw ECommandError( command+wxT("number of x bins = 0") ); ++counter; // if( p->GetNumberOfTokens() < counter+1 )throw ECommandError( command+wxT("expecting number of y bins") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("number of y bins"), v ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( v > 0.0 ) nbinsy = static_cast( v+0.5 ); else if( v < 0.0 ) throw ECommandError( command+wxT("number of y bins < 0") ); else throw ECommandError( command+wxT("number of y bins = 0") ); ++counter; // double xmins, xmaxs, ymins, ymaxs; UsefulFunctions::MinMax( x, 0, numx, xmins, xmaxs ); UsefulFunctions::MinMax( y, 0, numy, ymins, ymaxs ); double xminsf = xmins; double xmaxsf = xmaxs; double yminsf = ymins; double ymaxsf = ymaxs; double dist, xminf, xmaxf, yminf, ymaxf; try { UsefulFunctions::Scale2(xminf,xmaxf,dist,nbinsx,xminsf,xmaxsf); UsefulFunctions::Scale2(yminf,ymaxf,dist,nbinsy,yminsf,ymaxsf); } catch ( std::runtime_error &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } double xmin = xminf; double xmax = xmaxf; double ymin = yminf; double ymax = ymaxf; // if( p->GetNumberOfTokens() >= counter+4 ) { try { NumericVariable::GetScalar( p->GetString(counter++), wxT("x bin minimum"), xmin ); NumericVariable::GetScalar( p->GetString(counter++), wxT("x bin maximum"), xmax ); NumericVariable::GetScalar( p->GetString(counter++), wxT("y bin minimum"), ymin ); NumericVariable::GetScalar( p->GetString(counter++), wxT("y bin maximum"), ymax ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } if( xmax == xmin )throw ECommandError( command+wxT("x bin minimum = x bin maximum") ); double bincx = (xmax-xmin)/nbinsx; if( ymax == ymin )throw ECommandError( command+wxT("y bin minimum = y bin maximum") ); double bincy = (ymax-ymin)/nbinsy; std::vector bx( nbinsx ); std::vector by( nbinsy ); std::vector m( nbinsx*nbinsy, 0.0 ); for( int i=0; ixmax) )continue; if( qualifiers[wxT("YDISCARD")] && (y[i-1]ymax) )continue; int j = static_cast((x[i-1]-xmin)/bincx) + 1; int k = static_cast((y[i-1]-ymin)/bincy) + 1; // // events outside of range are placed in extreme bins // if( j < 1 )j = 1; else if( j > nbinsx )j = nbinsx; if( k < 1 )k = 1; else if( k > nbinsy )k = nbinsy; if( qualifiers[wxT("EMPTY")] ) { if( m[k-1+(j-1)*nbinsy] == 0.0 ) { qualifiers[wxT("WEIGHTS")] ? m[k-1+(j-1)*nbinsy]+=w[i-1] : ++m[k-1+(j-1)*nbinsy]; } } else { qualifiers[wxT("WEIGHTS")] ? m[k-1+(j-1)*nbinsy]+=w[i-1] : ++m[k-1+(j-1)*nbinsy]; } } try { NumericVariable::PutVariable( xbName, bx, 0, p->GetInputLine() ); NumericVariable::PutVariable( ybName, by, 0, p->GetInputLine() ); NumericVariable::PutVariable( cName, m, static_cast(nbinsy), static_cast(nbinsx), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } // end of file extrema-4.4.5/src/Commands/CMD_clear.h0000644012702201742730000000207711274636606016502 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_CLEARCOMMAND #define CMD_CLEARCOMMAND #include "Command.h" class ParseLine; class CMD_clear : public Command { public: static CMD_clear *Instance() { if( !cmd_clear_ )cmd_clear_ = new CMD_clear(); return cmd_clear_; } void Execute( ParseLine const * ); private: CMD_clear(); static CMD_clear *cmd_clear_; }; #endif extrema-4.4.5/src/Commands/CMD_text.cpp0000644012702201742730000000533611274636606016734 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_text.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "TextVariable.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_boolCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "GRA_drawableText.h" #include "GRA_wxWidgets.h" #include "VisualizationWindow.h" CMD_text *CMD_text::cmd_text_ = 0; CMD_text::CMD_text() : Command( wxT("TEXT") ) { AddQualifier( wxT("ERASE"), false ); AddQualifier( wxT("GRAPHUNITS"), false ); } void CMD_text::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError const &e) { throw; } ParseToken t( *p->GetToken(0) ); GRA_window *gw = ExGlobals::GetGraphWindow(); // if( qualifiers[wxT("ERASE")] ) // delete the last drawn text string { if( p->GetNumberOfTokens() > 1 )ExGlobals::WarningMessage( wxT("TEXT\\ERASE: parameters will be ignored") ); gw->RemoveLastTextString(); } else { if( p->GetNumberOfTokens()<2 || !p->IsString(1) )throw ECommandError( Name()+wxT(": expecting text string")); wxString text; TextVariable::GetVariable( p->GetString(1), false, text ); AddToStackLine( p->GetString(1) ); if( text.empty() )return; GRA_drawableText *dt = new GRA_drawableText( text, qualifiers[wxT("GRAPHUNITS")] ); try { dt->Parse(); } catch ( EGraphicsError const &e ) { delete dt; throw ECommandError( Name()+wxT(": ")+wxString(e.what(),wxConvUTF8) ); } if( static_cast(gw->GetTextCharacteristics()->Get(wxT("INTERACTIVE")))->Get() ) { writeStack_ = false; ExGlobals::GetVisualizationWindow()->SetInteractiveText( dt ); ExGlobals::PauseScripts(); } else { wxClientDC dc( ExGlobals::GetwxWindow() ); dt->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( dt ); } } ExGlobals::RefreshGraphics(); } // end of file extrema-4.4.5/src/Commands/CMD_read.h0000644012702201742730000000342711274636606016327 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_READ #define CMD_READ #include #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_read : public Command { public: static CMD_read *Instance() { if( !cmd_read_ )cmd_read_ = new CMD_read(); return cmd_read_; } void SetErrorFill( double d ) { errorFill_ = d; } double const GetErrorFill() const { return errorFill_; } wxString &GetFilename() { return readInFilename_; } void SetReadInFilename( wxString const &s ) { readInFilename_ = s; } std::ifstream *GetStream() { return &inStream_; } void Execute( ParseLine const * ); private: CMD_read(); static CMD_read *cmd_read_; std::ifstream inStream_; wxString readInFilename_; int startingLine_; std::vector lineRange_; int lineRangeFlag_; double errorFill_; void ReadScalars( QualifierMap &, bool const ); void ReadMatrix( QualifierMap &, bool const ); void ReadText( QualifierMap &, bool const ); void ReadVectors( QualifierMap &, bool const ); void ReadTensor( QualifierMap &, bool const ); }; #endif extrema-4.4.5/src/Commands/CMD_figure.cpp0000644012702201742730000002461411274636606017231 0ustar spangspang/* Copyright (C) 2005,...,2009 Joseph L. Chuma 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. */ #include "wx/wx.h" #include "CMD_figure.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "GRA_window.h" #include "GRA_arrow1.h" #include "GRA_arrow2.h" #include "GRA_arrow3.h" #include "GRA_rectangle.h" #include "GRA_triangle.h" #include "GRA_ellipse.h" #include "GRA_colorCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "EVariableError.h" #include "NumericVariable.h" #include "ExGlobals.h" CMD_figure *CMD_figure::cmd_figure_ = 0; CMD_figure::CMD_figure() : Command( wxT("FIGURE") ) { AddQualifier( wxT("GRAPH"), false ); AddQualifier( wxT("PERCENT"), false ); AddQualifier( wxT("WORLD"), true ); } void CMD_figure::Execute( ParseLine const *p ) { // FIGURE ARROW style nheads x1 y1 x2 y2 // FIGURE RECTANGLE x1 y1 x2 y2 // FIGURE TRIANGLE x1 y1 x2 y2 x3 y3 // FIGURE ELLIPSE x1 y1 x2 y2 // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } GRA_window *gw = ExGlobals::GetGraphWindow(); GRA_color *cc = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("CURVECOLOR")))->Get(); GRA_setOfCharacteristics *generalChars = gw->GetGeneralCharacteristics(); GRA_colorCharacteristic *colorChar = static_cast(generalChars->Get(wxT("AREAFILLCOLOR"))); GRA_color *fc = colorChar->IsVector() ? colorChar->Gets().front() : colorChar->Get(); int lw = static_cast(generalChars->Get(wxT("LINEWIDTH")))->Get(); // if( p->GetNumberOfTokens() < 2 )throw ECommandError( wxT("FIGURE: expecting figure type") ); if( !p->IsString(1) )throw ECommandError( wxT("FIGURE: expecting figure type") ); AddToStackLine( p->GetString(1) ); wxString figType( p->GetString(1).Upper() ); // wxClientDC dc( ExGlobals::GetwxWindow() ); // if( figType == wxT("ARROW") ) { wxString command( wxT("FIGURE ARROW: ") ); // FIGURE ARROW style nheads x1 y1 x2 y2 // if( p->GetNumberOfTokens() < 3 ) throw ECommandError( command+wxT("expecting style code") ); double d; try { NumericVariable::GetScalar( p->GetString(2), wxT("style code"), d ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); int style = static_cast(d+0.5); if( style!=1 && style!=2 && style!=3 ) throw ECommandError( command+wxT("style code must be 1, 2, or 3") ); if( p->GetNumberOfTokens() < 4 ) throw ECommandError( command+wxT("expecting number of heads") ); try { NumericVariable::GetScalar( p->GetString(3), wxT("number of heads"), d ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(3) ); int heads = static_cast(d+0.5); if( heads!=1 && heads!=2 ) throw ECommandError( command+wxT("number of heads must be 1 or 2") ); if( p->GetNumberOfTokens() < 8 ) throw ECommandError( command+wxT("expecting x1, y1, x2, y2") ); // bool headsBothEnds = (heads==2); double x1, y1, x2, y2; try { NumericVariable::GetScalar( p->GetString(4), wxT("x1"), x1 ); NumericVariable::GetScalar( p->GetString(5), wxT("y1"), y1 ); NumericVariable::GetScalar( p->GetString(6), wxT("x2"), x2 ); NumericVariable::GetScalar( p->GetString(7), wxT("y2"), y2 ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(4) ); AddToStackLine( p->GetString(5) ); AddToStackLine( p->GetString(6) ); AddToStackLine( p->GetString(7) ); // double x1w, y1w, x2w, y2w; if( qualifiers[wxT("GRAPH")] ) { gw->GraphToWorld( x1, y1, x1w, y1w, true ); gw->GraphToWorld( x2, y2, x2w, y2w ); } else if( qualifiers[wxT("PERCENT")] ) { gw->PercentToWorld( x1, y1, x1w, y1w ); gw->PercentToWorld( x2, y2, x2w, y2w ); } else { x1w = x1; y1w = y1; x2w = x2; y2w = y2; } double headWidth = static_cast(generalChars->Get(wxT("ARROWHEADWIDTH")))->Get(); double headLength = static_cast(generalChars->Get(wxT("ARROWHEADLENGTH")))->Get(); switch (style) { case 1: { GRA_arrow1 *arrow = new GRA_arrow1(x2w,y2w,x1w,y1w,headsBothEnds,cc,fc,lw,headWidth,headLength); arrow->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( arrow ); break; } case 2: { GRA_arrow2 *arrow = new GRA_arrow2(x2w,y2w,x1w,y1w,headsBothEnds,cc,fc,lw,headWidth,headLength); arrow->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( arrow ); break; } case 3: { GRA_arrow3 *arrow = new GRA_arrow3(x2w,y2w,x1w,y1w,headsBothEnds,cc,lw,headWidth,headLength); arrow->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( arrow ); } } } else if( figType == wxT("RECTANGLE") ) { // FIGURE RECTANGLE x1 y1 x2 y2 // wxString command( wxT("FIGURE RECTANGLE") ); if( p->GetNumberOfTokens() < 6 ) throw ECommandError( command+wxT("expecting x1, y1, x2, y2") ); double x1, y1, x2, y2; try { NumericVariable::GetScalar( p->GetString(2), wxT("x1"), x1 ); NumericVariable::GetScalar( p->GetString(3), wxT("y1"), y1 ); NumericVariable::GetScalar( p->GetString(4), wxT("x2"), x2 ); NumericVariable::GetScalar( p->GetString(5), wxT("y2"), y2 ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); AddToStackLine( p->GetString(3) ); AddToStackLine( p->GetString(4) ); AddToStackLine( p->GetString(5) ); // double x1w, y1w, x2w, y2w; if( qualifiers[wxT("GRAPH")] ) { gw->GraphToWorld( x1, y1, x1w, y1w, true ); gw->GraphToWorld( x2, y2, x2w, y2w ); } else if( qualifiers[wxT("PERCENT")] ) { gw->PercentToWorld( x1, y1, x1w, y1w ); gw->PercentToWorld( x2, y2, x2w, y2w ); } else { x1w = x1; y1w = y1; x2w = x2; y2w = y2; } GRA_rectangle *rect = new GRA_rectangle(x1w,y1w,x2w,y2w,0.0,false,cc,fc,lw); rect->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( rect ); } else if( figType == wxString(wxT("TRIANGLE")) ) { // FIGURE TRIANGLE x1 y1 x2 y2 x3 y3 // wxString command( wxT("FIGURE TRIANGLE: ") ); if( p->GetNumberOfTokens() < 8 ) throw ECommandError( command+wxT("expecting x1,y1,x2,y2,x3,y3") ); double x1, y1, x2, y2, x3, y3; try { NumericVariable::GetScalar( p->GetString(2), wxT("x1"), x1 ); NumericVariable::GetScalar( p->GetString(3), wxT("y1"), y1 ); NumericVariable::GetScalar( p->GetString(4), wxT("x2"), x2 ); NumericVariable::GetScalar( p->GetString(5), wxT("y2"), y2 ); NumericVariable::GetScalar( p->GetString(6), wxT("x3"), x3 ); NumericVariable::GetScalar( p->GetString(7), wxT("y3"), y3 ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); AddToStackLine( p->GetString(3) ); AddToStackLine( p->GetString(4) ); AddToStackLine( p->GetString(5) ); AddToStackLine( p->GetString(6) ); AddToStackLine( p->GetString(7) ); // double x1w, y1w, x2w, y2w, x3w, y3w; if( qualifiers[wxT("GRAPH")] ) { gw->GraphToWorld( x1, y1, x1w, y1w, true ); gw->GraphToWorld( x2, y2, x2w, y2w ); gw->GraphToWorld( x3, y3, x3w, y3w ); } else if( qualifiers[wxT("PERCENT")] ) { gw->PercentToWorld( x1, y1, x1w, y1w ); gw->PercentToWorld( x2, y2, x2w, y2w ); gw->PercentToWorld( x3, y3, x3w, y3w ); } else { x1w = x1; y1w = y1; x2w = x2; y2w = y2; x3w = x3; y3w = y3; } GRA_triangle *tri = new GRA_triangle(x1w,y1w,x2w,y2w,x3w,y3w,cc,fc,lw); tri->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( tri ); } else if( figType == wxString(wxT("ELLIPSE")) ) { // FIGURE ELLIPSE x1 y1 x2 y2 // wxString command( wxT("FIGURE ELLIPSE: ") ); if( p->GetNumberOfTokens() < 6 )throw ECommandError( command+wxT("expecting x1, y1, x2, y2") ); double x1, y1, x2, y2; try { NumericVariable::GetScalar( p->GetString(2), wxT("x1"), x1 ); NumericVariable::GetScalar( p->GetString(3), wxT("y1"), y1 ); NumericVariable::GetScalar( p->GetString(4), wxT("x2"), x2 ); NumericVariable::GetScalar( p->GetString(5), wxT("y2"), y2 ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); AddToStackLine( p->GetString(3) ); AddToStackLine( p->GetString(4) ); AddToStackLine( p->GetString(5) ); // double x1w, y1w, x2w, y2w; if( qualifiers[wxT("GRAPH")] ) { gw->GraphToWorld( x1, y1, x1w, y1w, true ); gw->GraphToWorld( x2, y2, x2w, y2w ); } else if( qualifiers[wxT("PERCENT")] ) { gw->PercentToWorld( x1, y1, x1w, y1w ); gw->PercentToWorld( x2, y2, x2w, y2w ); } else { x1w = x1; y1w = y1; x2w = x2; y2w = y2; } GRA_ellipse *ellipse = new GRA_ellipse(x1w,y1w,x2w,y2w,false,cc,fc,lw,1); ellipse->Draw( ExGlobals::GetGraphicsOutput(), dc ); gw->AddDrawableObject( ellipse ); } ExGlobals::RefreshGraphics(); } // end of file extrema-4.4.5/src/Commands/CMD_endif.h0000644012702201742730000000206011274636606016471 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_ENDIF #define CMD_ENDIF #include "Command.h" class ParseLine; class CMD_endif : public Command { public: static CMD_endif *Instance() { if( !cmd_endif_ )cmd_endif_ = new CMD_endif(); return cmd_endif_; } void Execute( ParseLine const *p ); private: CMD_endif(); static CMD_endif *cmd_endif_; }; #endif extrema-4.4.5/src/Commands/CMD_write.cpp0000644012702201742730000002332011274636606017073 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/filename.h" #include "CMD_write.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "TextVariable.h" #include "NumericVariable.h" CMD_write *CMD_write::cmd_write_ = 0; CMD_write::CMD_write() : Command( wxT("WRITE") ) { AddQualifier( wxT("SCALARS"), false ); AddQualifier( wxT("VECTORS"), true ); AddQualifier( wxT("MATRIX"), false ); AddQualifier( wxT("TENSOR"), false ); AddQualifier( wxT("TEXT"), false ); AddQualifier( wxT("APPEND"), false ); AddQualifier( wxT("FORMAT"), false ); AddQualifier( wxT("BINARY"), false ); } void CMD_write::Execute( ParseLine const *p ) { // WRITE file x1 { x2 ... } // WRITE\FORMAT file format x1 { x2 ... } // WRITE\SCALARS file s1 { s2 ... } // WRITE\SCALARS\FORMAT file format s1 { s2 ... } // WRITE\MATRIX file m1 { m2 ... } // WRITE\MATRIX\FORMAT file format m1 { m2 ... } // WRITE\TENSOR file m1 { m2 ... } // WRITE\TENSOR\FORMAT file format m1 { m2 ... } // WRITE\TEXT file txtvar // WRITE\TEXT\FORMAT file format txtvar // /* #include #include #include int main() { double array[10]; using std::fill; fill(array,array+10,1.0f); std::ofstream out("data",std::ios::binary); out.write(reinterpret_cast(array), sizeof array); out.close(); fill(array,array+10,2.0f); std::ifstream in("data",std::ios::binary); in.read(reinterpret_cast(array), sizeof array); in.close(); using std::copy; copy(array,array+10,std::ostream_iterator(std::cout," ")); std::cout << '\n'; } writes 1 1 1 1 1 1 1 1 1 1 */ QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); if( qualifiers[wxT("FORMAT")] && qualifiers[wxT("BINARY")] ) throw ECommandError( command+wxT("BINARY and FORMAT qualifiers are not compatible") ); if( qualifiers[wxT("SCALARS")] || qualifiers[wxT("MATRIX")] || qualifiers[wxT("TENSOR")] || qualifiers[wxT("TEXT")] )qualifiers[wxT("VECTORS")] = false; // if( !p->IsString(1) )throw ECommandError( command+wxT("no filename was entered") ); try { TextVariable::GetVariable( p->GetString(1), true, filename_ ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } // wxFileName wxfn( filename_ ); if( wxfn.GetPath().empty() )filename_ = ExGlobals::GetCurrentPath() + wxfn.GetPathSeparator() + filename_; // if( ofStream_.is_open() )ofStream_.close(); if( qualifiers[wxT("BINARY")] ) { if( qualifiers[wxT("APPEND")] ) { ofStream_.open( filename_.mb_str(), std::ios_base::in | std::ios_base::out | std::ios_base::binary ); ofStream_.seekp( 0, std::ios_base::end ); } else { ofStream_.open( filename_.mb_str(), std::ios_base::out | std::ios_base::binary ); } } else { if( qualifiers[wxT("APPEND")] ) { ofStream_.open( filename_.mb_str(), std::ios_base::in | std::ios_base::out ); ofStream_.seekp( 0, std::ios_base::end ); } else { ofStream_.open( filename_.mb_str(), std::ios_base::out ); } } AddToStackLine( p->GetString(1) ); int icnt = 2; wxString format; if( qualifiers[wxT("FORMAT")] ) { if( !p->IsString(2) )throw ECommandError( command+wxT("expecting format") ); try { TextVariable::GetVariable( p->GetString(2), true, format ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(2) ); icnt = 3; } if( qualifiers[wxT("TEXT")] ) { if( !p->IsString(icnt) ) throw ECommandError( command+wxT("expecting text to write") ); wxString line; try { TextVariable::GetVariable( p->GetString(icnt), false, line ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt) ); if( qualifiers[wxT("FORMAT")] ) { wxChar c[32000]; ::wxSnprintf( c, 32000, format.c_str(), line.c_str() ); ofStream_ << c << std::endl; } else { ofStream_ << line.mb_str(wxConvUTF8) << std::endl; } ofStream_.close(); return; } // // write scalars, vectors, matrix, or tensor // std::vector names; std::vector values; std::vector id; std::vector< std::vector > data; std::vector d; std::vector nd1, nd2, nd3; // while( icnt < p->GetNumberOfTokens() ) { if( !p->IsString(icnt) ) throw ECommandError( command+( wxString(wxT("parameter ")) << icnt+1 << wxT(" is invalid")) ); int ndm; double value; int dimSizes[3]; std::vector().swap( d ); try { NumericVariable::GetVariable( p->GetString(icnt), ndm, value, d, dimSizes ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } names.push_back( p->GetString(icnt) ); values.push_back( value ); data.push_back( d ); id.push_back( 0 ); nd1.push_back( dimSizes[0] ); nd2.push_back( dimSizes[1] ); nd3.push_back( dimSizes[2] ); // if( qualifiers[wxT("TENSOR")] && ndm!=3 ) { wxString s( p->GetString(icnt) ); s += wxString(wxT(" is not a tensor")); throw ECommandError( command+s ); } if( qualifiers[wxT("MATRIX")] && ndm!=2 ) { wxString s( p->GetString(icnt) ); s += wxString(wxT(" is not a matrix")); throw ECommandError( command+s ); } if( qualifiers[wxT("VECTORS")] ) { if( ndm != 1 ) { wxString s( p->GetString(icnt) ); s += wxString(wxT(" is not a vector")); throw ECommandError( command+s ); } for( std::size_t j=0; j(j); break; } } } if( qualifiers[wxT("SCALARS")] && ndm!=0 ) { wxString s( p->GetString(icnt) ); s += wxString(wxT(" is not a scalar")); throw ECommandError( command+s ); } AddToStackLine( p->GetString(icnt) ); ++icnt; } if( names.empty() )throw ECommandError( command+wxT("no variables entered") ); // if( qualifiers[wxT("SCALARS")] ) { if( qualifiers[wxT("BINARY")] ) { for( std::size_t j=0; j mm( names.size(), 0 ); for( ;; ) { std::vector d; d.clear(); for( std::size_t i=0; iGetNumberOfTokens() < 3 )throw ECommandError( command+wxT("expecting x and y") ); if( p->IsNull(1) || p->IsNull(2) )throw ECommandError( command+wxT("expecting x and y") ); int xDim, yDim; double xValue, yValue; std::vector xData, yData; int dimSize[3]; try { NumericVariable::GetVariable( p->GetString(1), xDim, xValue, xData, dimSize ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( xDim == 2 )throw ECommandError( command+wxT("independent input variable is a matrix") ); if( xDim == 3 )throw ECommandError( command+wxT("independent input variable is a tensor") ); try { NumericVariable::GetVariable( p->GetString(2), yDim, yValue, yData, dimSize ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( yDim == 2 )throw ECommandError( command+wxT("dependent input variable is a matrix") ); if( yDim == 3 )throw ECommandError( command+wxT("dependent input variable is a tensor") ); if( xDim != yDim )throw ECommandError( command+wxT("input variables must be the same type") ); AddToStackLine( p->GetString(1) ); AddToStackLine( p->GetString(2) ); // wxString xName, yName; bool makeVar = false; if( p->IsString(3) ) { if( !p->IsString(4) ) throw ECommandError( command+wxT("both output variables must be present if one is present") ); makeVar = true; xName = p->GetString(3); yName = p->GetString(4); AddToStackLine( xName ); AddToStackLine( yName ); } if( xDim == 0 ) // scalars were input { double xout, yout; ExGlobals::GetGraphWindow()->GraphToWorld( xValue, yValue, xout, yout, true ); if( qualifiers[wxT("PERCENT")] ) { double xtmp, ytmp; ExGlobals::GetGraphWindow()->WorldToPercent( xout, yout, xtmp, ytmp ); xout = xtmp; yout = ytmp; } if( makeVar ) { try { NumericVariable::PutVariable( xName, xout, p->GetInputLine() ); NumericVariable::PutVariable( yName, yout, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else { wxString message = qualifiers[wxT("PERCENT")] ? wxT("percentage of the current window: xout = ") : wxT("world units: xout = "); ExGlobals::WriteOutput( message << xout << wxT(", yout = ") << yout ); } } else // vectors were input { std::size_t vSize = xData.size(); std::vector xout(vSize), yout(vSize); for( std::size_t i=0; iGraphToWorld( xData[i], yData[i], xtmp, ytmp ); xout[i] = xtmp; yout[i] = ytmp; if( qualifiers[wxT("PERCENT")] ) { double xtmp, ytmp; ExGlobals::GetGraphWindow()->WorldToPercent( xout[i], yout[i], xtmp, ytmp ); xout[i] = xtmp; yout[i] = ytmp; } } if( makeVar ) { try { NumericVariable::PutVariable( xName, xout, 0, p->GetInputLine() ); NumericVariable::PutVariable( yName, yout, 0, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else { wxString message = qualifiers[wxT("PERCENT")] ? wxT("percentage of the current window: xout = ") : wxT("world units: xout = "); ExGlobals::WriteOutput( message << xout[0] << wxT(", yout = ") << yout[0] ); for( std::size_t i=1; i xP, yP; if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting polygon x-vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("polygon x-vector"), xP ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting polygon y-vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("polygon y-vector"), yP ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( xP.size() != yP.size() ) throw ECommandError( command+wxT("polygon vector lengths are not equal") ); int numP = static_cast(xP.size()); if( numP <= 1 )throw ECommandError( command+wxT("polygon vector lengths are <= 1") ); // std::vector x, y; if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting data x-vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("data x-vector"), x ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting data y-vector") ); try { NumericVariable::GetVector( p->GetString(counter), wxT("data y-vector"), y ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( x.size() != y.size() ) throw ECommandError( command+wxT("data vector lengths are not equal") ); int num = static_cast(x.size()); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output index vector name") ); wxString indexName( p->GetString(counter++) ); AddToStackLine( indexName ); // std::vector idx(num); if( qualifiers[wxT("INSIDE")] ) { for( int i=0; iGetInputLine() ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } // end of file extrema-4.4.5/src/Commands/Makefile.am0000644012702201742730000000736711274636606016623 0ustar spangspang# Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libcommands.la libcommands_la_SOURCES = CMD_alias.cpp CMD_alias.h \ CMD_bestfit.cpp CMD_bestfit.h \ CMD_bin2d.cpp CMD_bin2d.h \ CMD_bin.cpp CMD_bin.h \ CMD_clear.cpp CMD_clear.h \ CMD_contour.cpp CMD_contour.h \ CMD_dealias.cpp CMD_dealias.h \ CMD_defaults.cpp CMD_defaults.h \ CMD_define.cpp CMD_define.h \ CMD_density.cpp CMD_density.h \ CMD_destroy.cpp CMD_destroy.h \ CMD_display.cpp CMD_display.h \ CMD_do.cpp CMD_do.h \ CMD_ellipse.cpp CMD_ellipse.h \ CMD_enddo.cpp CMD_enddo.h \ CMD_endif.cpp CMD_endif.h \ CMD_evaluateExpression.cpp CMD_evaluateExpression.h \ CMD_execute.cpp CMD_execute.h \ CMD_figure.cpp CMD_figure.h \ CMD_filter.cpp CMD_filter.h \ CMD_fit.cpp CMD_fit.h \ CMD_form.cpp CMD_form.h \ CMD_generate.cpp CMD_generate.h \ CMD_get.cpp CMD_get.h \ CMD_goto.cpp CMD_goto.h \ CMD_graph.cpp CMD_graph.h \ CMD_grid.cpp CMD_grid.h \ CMD_hardcopy.cpp CMD_hardcopy.h \ CMD_help.cpp CMD_help.h \ CMD_if.cpp CMD_if.h \ CMD_inquire.cpp CMD_inquire.h \ CMD_list.cpp CMD_list.h \ CMD_matrix.cpp CMD_matrix.h \ CMD_minuit.cpp CMD_minuit.h \ CMD_page.cpp CMD_page.h \ CMD_pause.cpp CMD_pause.h \ CMD_polygon.cpp CMD_polygon.h \ CMD_quit.cpp CMD_quit.h \ CMD_read.cpp CMD_read.h \ CMD_rebin.cpp CMD_rebin.h \ CMD_replot.cpp CMD_replot.h \ CMD_restore.cpp CMD_restore.h \ CMD_return.cpp CMD_return.h \ CMD_save.cpp CMD_save.h \ CMD_scalar.cpp CMD_scalar.h \ CMD_scales.cpp CMD_scales.h \ CMD_set.cpp CMD_set.h \ CMD_show.cpp CMD_show.h \ CMD_sort.cpp CMD_sort.h \ CMD_stack.cpp CMD_stack.h \ CMD_statistics.cpp CMD_statistics.h \ CMD_text.cpp CMD_text.h \ CMD_vector.cpp CMD_vector.h \ CMD_window.cpp CMD_window.h \ CMD_world.cpp CMD_world.h \ CMD_write.cpp CMD_write.h \ CMD_zerolines.cpp CMD_zerolines.h \ Command.cpp Command.h \ CommandTable.cpp CommandTable.h \ Extrema_fcn.cpp Extrema_fcn.h \ ECommandError.h extrema-4.4.5/src/Commands/CMD_goto.cpp0000644012702201742730000000270211274636606016712 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_goto.h" #include "ECommandError.h" #include "ESyntaxError.h" #include "ParseLine.h" #include "Script.h" #include "ExGlobals.h" CMD_goto *CMD_goto::cmd_goto_ = 0; CMD_goto::CMD_goto() : Command( wxT("GOTO") ) {} void CMD_goto::Execute( ParseLine const *p ) { SetUp( p ); wxString command( Name()+wxT(": ") ); if( !p->IsString(1) )throw ECommandError( command+wxT("invalid GOTO label") ); Script *script = ExGlobals::GetScript(); if( !script )throw ECommandError( command+wxT("GOTO is only valid in a script") ); try { script->ProcessGoTo( p->GetString(1).Upper() ); } catch (ESyntaxError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } // end of file extrema-4.4.5/src/Commands/CMD_dealias.h0000644012702201742730000000210511274636606017006 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_DEALIAS #define CMD_DEALIAS #include "Command.h" class ParseLine; class CMD_dealias : public Command { public: static CMD_dealias *Instance() { if( !cmd_dealias_ )cmd_dealias_ = new CMD_dealias(); return cmd_dealias_; } void Execute( ParseLine const * ); private: CMD_dealias(); static CMD_dealias *cmd_dealias_; }; #endif extrema-4.4.5/src/Commands/CMD_alias.cpp0000644012702201742730000000441111274636606017032 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include "wx/wx.h" #include "CMD_alias.h" #include "ExGlobals.h" #include "ParseLine.h" #include "ECommandError.h" #include "EVariableError.h" #include "TextVariable.h" CMD_alias *CMD_alias::cmd_alias_ = 0; CMD_alias::CMD_alias() : Command( wxT("ALIAS") ) { AddQualifier( wxT("EXPAND"), false ); } void CMD_alias::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch( ECommandError const &e ) { throw; } wxString command( Name()+wxT(": ") ); int nTokens = p->GetNumberOfTokens(); if( nTokens == 1 ) { ExGlobals::DisplayAliases(); } else if( nTokens == 2 ) { if( !p->IsString(1) )throw ECommandError( command+wxT("expecting an alias name") ); ExGlobals::DisplayAlias( p->GetString(1) ); AddToStackLine( p->GetString(1) ); } else { if( !p->IsString(1) )throw ECommandError( command+wxT("expecting an alias name") ); if( !p->IsString(2) )throw ECommandError( command+wxT("expecting name 'value'") ); wxString value; if( qualifiers[wxT("EXPAND")] ) { try { TextVariable::GetVariable( p->GetString(2), true, value ); } catch( EVariableError const &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else { value = p->GetInputLine().substr( 1+p->GetInputLine().find(wxString(wxT(" "))+p->GetString(2)) ); } ExGlobals::AddAlias( p->GetString(1).Upper(), value ); AddToStackLine( p->GetString(1) ); AddToStackLine( p->GetString(2) ); } } // end of file extrema-4.4.5/src/Commands/CMD_list.h0000644012702201742730000000204411274636606016361 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_LIST #define CMD_LIST #include "Command.h" class ParseLine; class CMD_list : public Command { public: static CMD_list *Instance() { if( !cmd_list_ )cmd_list_ = new CMD_list(); return cmd_list_; } void Execute( ParseLine const * ); private: CMD_list(); static CMD_list *cmd_list_; }; #endif extrema-4.4.5/src/Commands/CMD_evaluateExpression.h0000644012702201742730000000246111274636606021277 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_EVALUATEEXPRESSION #define CMD_EVALUATEEXPRESSION #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_evaluateExpression : public Command { public: static CMD_evaluateExpression *Instance() { if( !cmd_evaluateExpression_ )cmd_evaluateExpression_ = new CMD_evaluateExpression(); return cmd_evaluateExpression_; } ~CMD_evaluateExpression(); void Execute( ParseLine const *p ); private: CMD_evaluateExpression(); static CMD_evaluateExpression *cmd_evaluateExpression_; std::vector lhs_; std::vector rhs_; }; #endif extrema-4.4.5/src/Commands/CMD_page.h0000644012702201742730000000204611274636606016324 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_PAGE #define CMD_PAGE #include "Command.h" class ParseLine; class CMD_page : public Command { public: static CMD_page *Instance() { if( !cmd_page_ )cmd_page_ = new CMD_page(); return cmd_page_; } void Execute( ParseLine const * ); private: CMD_page(); static CMD_page *cmd_page_; }; #endif extrema-4.4.5/src/Commands/CMD_minuit.cpp0000644012702201742730000002376311274636606017261 0ustar spangspang/* Copyright (C) 2007 Joseph L. Chuma, TRIUMF 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. */ #include #include #ifdef HAVE_MINUIT #include "Minuit/MnUserParameters.h" #include "Minuit/MnApplication.h" #include "Minuit/MnMigrad.h" #include "Minuit/MnMinimize.h" #include "Minuit/MnSimplex.h" #include "Minuit/FunctionMinimum.h" #include "Minuit/MnPrint.h" #endif #include "CMD_minuit.h" #include "Extrema_fcn.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EExpressionError.h" #include "Expression.h" #include "EVariableError.h" #include "NumericVariable.h" #include "NumericData.h" #include "TextVariable.h" #include "NVariableTable.h" CMD_minuit *CMD_minuit::cmd_minuit_ = 0; CMD_minuit::CMD_minuit() : Command( wxT("MINUIT") ) { AddQualifier( wxT("WEIGHTS"), false ); AddQualifier( wxT("MESSAGES"), true ); AddQualifier( wxT("CHISQ"), false ); AddQualifier( wxT("VARNAMES"), false ); AddQualifier( wxT("UPDATE"), false ); AddQualifier( wxT("MINIMIZE"), true ); AddQualifier( wxT("MIGRAD"), false ); AddQualifier( wxT("SIMPLEX"), false ); } void CMD_minuit::Execute( ParseLine const *p ) { wxString command( Name()+wxT(": ") ); #ifndef HAVE_MINUIT throw ECommandError( wxString(wxT("MINUIT: the MINUIT minimization package is not available")) ); #else // minuit y=expression // minuit chisq_expression // minuit/weights w y=expression // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } bool output = qualifiers[wxT("MESSAGES")] || ExGlobals::NotInaScript() || ExGlobals::GetEcho(); if( !qualifiers[wxT("MESSAGES")] )output = false; // if( qualifiers[wxT("UPDATE")] ) { if( rhs_.length() == 0 )throw ECommandError( command+wxT("no previous fit") ); // if( !p->IsString(1) )throw ECommandError( command+wxT("no output variable") ); // wxString lhs( p->GetString(1) ); AddToStackLine( lhs+wxString(wxT(" ! ( = "))+rhs_+wxString(wxT(" )")) ); // // re-evaluate the last expression // Expression expr( rhs_ ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() )throw ECommandError( command+wxT("expecting numeric expression") ); // NumericData nd( expr.GetFinalAnswer() ); try { switch ( nd.GetNumberOfDimensions() ) { case 0: NumericVariable::PutVariable( lhs, nd.GetScalarValue(), p->GetInputLine() ); break; case 1: NumericVariable::PutVariable( lhs, nd.GetData(), 0, p->GetInputLine() ); break; case 2: NumericVariable::PutVariable( lhs, nd.GetData(), nd.GetDimMag(0), nd.GetDimMag(1), p->GetInputLine() ); } } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } return; } int nTokens = p->GetNumberOfTokens(); int icnt = 1; std::vector weightVec; if( qualifiers[wxT("WEIGHTS")] ) { if( icnt >= nTokens )throw ECommandError( command+wxT("expecting weight vector") ); try { NumericVariable::GetVector( p->GetString(icnt), wxT("weight vector"), weightVec ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(icnt++) ); } // extract the expression // wxString exprString; bool chisqDirect = false; std::vector yVec; if( !p->IsEqualSign(icnt+1) ) // not y=expression, instead it is chisq_expression { chisqDirect = true; if( (icnt>=nTokens) || !p->IsString(icnt) )throw ECommandError( command+wxT("expecting expression") ); exprString = p->GetString(icnt); } else { if( (icnt+2>=nTokens) || !p->IsString(icnt+2) )throw ECommandError( command+wxT("expecting expression") ); exprString = p->GetString(icnt+2); rhs_ = p->GetString(icnt+2); // // extract the vector from the left hand side of the wxT("=") // wxString lhs( p->GetString(icnt) ); try { NumericVariable::GetVector( lhs, wxT("left hand side of equation"), yVec ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( lhs+wxT("=") ); // if( qualifiers[wxT("WEIGHTS")] ) { if( weightVec.size() != yVec.size() ) throw ECommandError( command+wxT("weight vector has different length than dependent variable") ); } else { weightVec.assign( yVec.size(), 1.0 ); } } AddToStackLine( exprString ); // // decode the expression // Expression expr( exprString ); expr.SetIsaFit(); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() )throw ECommandError( command+wxT("expecting a numeric expression") ); // std::size_t const nparam = expr.GetNumberOfFitParameters(); if( nparam == 0 ) throw ECommandError( command+wxT("no fitting parameters in the expression") ); if( !chisqDirect && (yVec.size()GetVariable(name)->GetData() ); if( pvd.LowLimitSet() ) { if( pvd.HighLimitSet() ) upar.setLimits( name.mb_str(wxConvUTF8), pvd.GetLowLimit(), pvd.GetHighLimit() ); else upar.setLowerLimit( name.mb_str(wxConvUTF8), pvd.GetLowLimit() ); } else { if( pvd.HighLimitSet() ) upar.setUpperLimit( name.mb_str(wxConvUTF8), pvd.GetHighLimit() ); } } if( qualifiers[wxT("SIMPLEX")] ) { MnSimplex simplex( fcn, upar ); FunctionMinimum fmin = simplex(); if( !fmin.isValid() )throw ECommandError( command+wxT("Minuit simplex failed") ); // // make sure this is done before new variables are created // since making new variables changes the variable indices // // update the parameters and definition table after a successful fit // // also update variable history // for( std::size_t i=0; i temp( result.GetData() ); std::size_t N = yVec.size(); double chi2 = 0.0; if( temp.size() == 1 ) { for( std::size_t i=0; i nvs; std::vector tvs; std::vector nvNames, tvNames, sNames; // int nTokens = p->GetNumberOfTokens(); for( int j=1; jIsNull(j) || p->IsNumeric(j) || p->IsEqualSign(j) ) { wxString s(wxT("parameter ")); s << j << wxT(" is invalid"); throw ECommandError( command+s ); } if( output && p->GetToken(j)->GetNumberOfQualifiers()!=0 ) ExGlobals::WarningMessage( wxT("DESTROY command: there are no valid parameter qualifiers") ); wxString name( p->GetString(j) ); wxString uName( name.Upper() ); // convert to upper case // if( uName == wxT("*") ) { qualifiers[wxT("SCALARS")] = true; qualifiers[wxT("VECTORS")] = true; qualifiers[wxT("MATRICES")] = true; qualifiers[wxT("TENSORS")] = true; qualifiers[wxT("TEXT")] = true; continue; } else if( uName == wxT("*S") ) { qualifiers[wxT("SCALARS")] = true; continue; } else if( uName == wxT("*V") ) { qualifiers[wxT("VECTORS")] = true; continue; } else if( uName == wxT("*M") ) { qualifiers[wxT("MATRICES")] = true; continue; } else if( uName == wxT("*T") ) { qualifiers[wxT("TEXT")] = true; continue; } // // See if the variable name needs to be constructed, // i.e., `A'//RCHAR(I) could be `A3' if I=3 // if( qualifiers[wxT("EXPAND")] ) { Expression expr( name ); try { expr.Evaluate(); } catch ( EExpressionError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( expr.IsCharacter() )name = expr.GetFinalString(); } wxString sName( Variable::SimpleName(name) ); NumericVariable *nVar = NVariableTable::GetTable()->GetVariable( sName ); if( nVar ) { nvNames.push_back( name.Upper() ); nvs.push_back( nVar ); } else { TextVariable *tVar = TVariableTable::GetTable()->GetVariable( sName ); if( !tVar ) { if( output )ExGlobals::WarningMessage( wxString(wxT("DESTROY command: variable "))+sName+wxT(" does not exist") ); continue; } tvNames.push_back( name.Upper() ); tvs.push_back( tVar ); } sNames.push_back( sName ); } std::size_t nvSize = nvs.size(); std::size_t tvSize = tvs.size(); if( !nvSize && !tvSize && !(qualifiers[wxT("SCALARS")]||qualifiers[wxT("VECTORS")]||qualifiers[wxT("MATRICES")]|| qualifiers[wxT("TENSORS")]||qualifiers[wxT("TEXT")]) )return; // // delete scalars or parts of vectors, matrices, tensors, text variables // if( qualifiers[wxT("SCALARS")] ) { NVariableTable::GetTable()->RemoveScalars(); if( output )ExGlobals::WriteOutput( wxT("all scalars are gone") ); } if( qualifiers[wxT("VECTORS")] ) { NVariableTable::GetTable()->RemoveVectors(); if( output )ExGlobals::WriteOutput( wxT("all vectors are gone") ); } if( qualifiers[wxT("MATRICES")] ) { NVariableTable::GetTable()->RemoveMatrices(); if( output )ExGlobals::WriteOutput( wxT("all matrices are gone") ); } if( qualifiers[wxT("TENSORS")] ) { NVariableTable::GetTable()->RemoveTensors(); if( output )ExGlobals::WriteOutput( wxT("all tensors are gone") ); } if( qualifiers[wxT("TEXT")] ) { TVariableTable::GetTable()->ClearTable(); if( output )ExGlobals::WriteOutput( wxT("all text variables are gone") ); } for( std::size_t i=0; iContains(sNames[i]) ) { nvs[i] = 0; continue; } switch ( nvs[i]->GetData().GetNumberOfDimensions() ) { case 0: if( sNames[i] != nvNames[i] ) throw ECommandError( command+wxT("indices not allowed on scalars") ); NVariableTable::GetTable()->RemoveEntry( nvs[i] ); nvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("scalar "))+sNames[i]+wxT(" is gone") ); break; case 1: { if( sNames[i] == nvNames[i] ) // no indices { NVariableTable::GetTable()->RemoveEntry( nvs[i] ); nvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("vector "))+sNames[i]+wxT(" is gone") ); } else // indices were used { try { if( nvs[i]->DeletePartial(nvNames[i],p->GetInputLine()) ) { NVariableTable::GetTable()->RemoveEntry( nvs[i] ); nvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("vector "))+sNames[i]+wxT(" is gone") ); } } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } break; } case 2: if( sNames[i] != nvNames[i] ) throw ECommandError( command+wxT("indices not allowed on matrices") ); NVariableTable::GetTable()->RemoveEntry( nvs[i] ); nvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("matrix "))+sNames[i]+wxT(" is gone") ); break; case 3: if( sNames[i] != nvNames[i] ) throw ECommandError( command+wxT("indices not allowed on tensors") ); NVariableTable::GetTable()->RemoveEntry( nvs[i] ); nvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("tensor "))+sNames[i]+wxT(" is gone") ); break; } } // // now do the text variables // for( std::size_t i=0; iRemoveEntry( tvs[i] ); tvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("text variable "))+sNames[i]+wxT(" is gone") ); } else { try { if( tvs[i]->DeletePartial(tvNames[i],p->GetInputLine()) ) { TVariableTable::GetTable()->RemoveEntry( tvs[i] ); tvs[i] = 0; if( output )ExGlobals::WriteOutput( wxString(wxT("text variable "))+sNames[i]+wxT(" is gone") ); } } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } } // end of file extrema-4.4.5/src/Commands/CMD_show.h0000644012702201742730000000222411274636606016366 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_SHOW #define CMD_SHOW #include #include "wx/wx.h" #include "Command.h" class ParseLine; class CMD_show : public Command { public: static CMD_show *Instance() { if( !cmd_show_ )cmd_show_ = new CMD_show(); return cmd_show_; } void Execute( ParseLine const * ); private: CMD_show(); static CMD_show *cmd_show_; void GetWild( wxString &, std::vector &, std::vector & ); }; #endif extrema-4.4.5/src/Commands/CMD_restore.cpp0000644012702201742730000007124311274636606017433 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include #include "wx/wx.h" #include "CMD_restore.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "ExGlobals.h" #include "EVariableError.h" #include "NumericVariable.h" #include "TextVariable.h" #ifdef HAVE_MUD extern "C" { #include "mud.h" } #endif CMD_restore *CMD_restore::cmd_restore_ = 0; CMD_restore::CMD_restore() : Command( wxT("RESTORE") ) { AddQualifier( wxT("MUD"), false ); AddQualifier( wxT("TITLE"), false ); AddQualifier( wxT("MESSAGES"), true ); runNumber_ = 0; elapsedSec_ = 0; } void CMD_restore::Execute( ParseLine const *p ) { QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( wxT("RESTORE: ") ); // bool output = qualifiers[wxT("MESSAGES")] || ExGlobals::NotInaScript() || ExGlobals::GetEcho(); if( !qualifiers[wxT("MESSAGES")] )output = false; // if( !qualifiers[wxT("MUD")] && qualifiers[wxT("TITLE")] ) throw ECommandError( command+wxT("\\TITLE qualifier only applies to MUD files") ); // if( p->GetNumberOfTokens() < 2 )throw ECommandError( command+wxT("filename not entered") ); wxString fileName; try { TextVariable::GetVariable( p->GetString(1), true, fileName ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::ifstream in; in.open( fileName.mb_str(wxConvUTF8), std::ios_base::in ); wxString defaultExtension = qualifiers[wxT("MUD")] ? wxT(".msr") : wxT(".xml"); if( !in.is_open() ) { in.clear(); // // get the file extension, if there was one given // wxString extension( ExGlobals::GetFileExtension(fileName) ); if( extension.empty() ) // no extension given, append default extension to the filename { fileName += defaultExtension; in.open( fileName.mb_str(wxConvUTF8), std::ios_base::in ); } if( !in.is_open() ) throw ECommandError( wxString()<GetString(1) ); // if( qualifiers[wxT("MUD")] ) { #ifdef HAVE_MUD try { RestoreMUD( p, command, qualifiers[wxT("TITLE")], output, fileName ); } catch ( ECommandError &e ) { throw; } #else throw ECommandError( wxString()<((char const*)fileName.mb_str(wxConvUTF8)), &dum ); if( fileHandle == -1 ) throw ECommandError( wxString()<GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( output ) ExGlobals::WriteOutput( wxString(wxT("text variable RUNTITLE= \""))+ wxString(title,wxConvUTF8)+wxT("\"") ); return; } unsigned long runNumber; if( !MUD_getRunNumber( fileHandle, &runNumber ) ) throw ECommandError( command+wxT(" could not get run number") ); unsigned long elapsedSec; if( !MUD_getElapsedSec( fileHandle, &elapsedSec ) ) throw ECommandError( command+wxT(" could not get elapsed seconds") ); // if( runNumber == runNumber_ && elapsedSec == elapsedSec_ )return; runNumber_ = runNumber; elapsedSec_ = elapsedSec; // try { name = wxT("RUNNUMBER"); NumericVariable::PutVariable( name, (double)runNumber, p->GetInputLine() ); name = wxT("ELAPSEDSEC"); NumericVariable::PutVariable( name, (double)elapsedSec, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long runDesc; if( !MUD_getRunDesc( fileHandle, &runDesc ) ) throw ECommandError( command+wxT(" could not get run descriptor") ); try { name = wxT("RUNDESC"); NumericVariable::PutVariable( name, (double)runDesc, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long exptNumber; if( !MUD_getExptNumber( fileHandle, &exptNumber ) ) throw ECommandError( command+wxT(" could not get exptNumber") ); try { name = wxT("EXPTNUMBER"); NumericVariable::PutVariable( name, (double)exptNumber, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long timeBegin; if( !MUD_getTimeBegin( fileHandle, &timeBegin ) ) throw ECommandError( command+wxT(" could not get timeBegin") ); try { name = wxT("TIMEBEGIN"); NumericVariable::PutVariable( name, (double)timeBegin, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long timeEnd; if( !MUD_getTimeEnd( fileHandle, &timeEnd ) ) throw ECommandError( command+wxT(" could not get timeEnd") ); try { name = wxT("TIMEEND"); NumericVariable::PutVariable( name, (double)timeEnd, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char title[MAXSTRINGLENGTH]; if( !MUD_getTitle( fileHandle, title, len ) ) throw ECommandError( command+wxT(" could not get title") ); try { name = wxT("MUDTITLE"); TextVariable::PutVariable( name, wxString(title,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char lab[MAXSTRINGLENGTH]; if( !MUD_getLab( fileHandle, lab, len ) ) throw ECommandError( command+wxT(" could not get lab") ); try { name = wxT("LAB"); TextVariable::PutVariable( name, wxString(lab,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char area[MAXSTRINGLENGTH]; if( !MUD_getArea( fileHandle, area, len ) ) throw ECommandError( command+wxT(" could not get area") ); try { name = wxT("MUDAREA"); TextVariable::PutVariable( name, wxString(area,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char method[MAXSTRINGLENGTH]; if( !MUD_getMethod( fileHandle, method, len ) ) throw ECommandError( command+wxT(" could not get method") ); try { name = wxT("METHOD"); TextVariable::PutVariable( name, wxString(method,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char apparatus[MAXSTRINGLENGTH]; if( !MUD_getApparatus( fileHandle, apparatus, len ) ) throw ECommandError( command+wxT(" could not get apparatus") ); try { name = wxT("APPARATUS"); TextVariable::PutVariable( name, wxString(apparatus,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char insert[MAXSTRINGLENGTH]; if( !MUD_getInsert( fileHandle, insert, len ) ) throw ECommandError( command+wxT(" could not get insert") ); try { name = wxT("INSERT"); TextVariable::PutVariable( name, wxString(insert,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char sample[MAXSTRINGLENGTH]; if( !MUD_getSample( fileHandle, sample, len ) ) throw ECommandError( command+wxT(" could not get sample") ); try { name = wxT("SAMPLE"); TextVariable::PutVariable( name, wxString(sample,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char orient[MAXSTRINGLENGTH]; if( !MUD_getOrient( fileHandle, orient, len ) ) throw ECommandError( command+wxT(" could not get orient") ); try { name = wxT("ORIENT"); TextVariable::PutVariable( name, wxString(orient,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char temperature[MAXSTRINGLENGTH]; if( !MUD_getTemperature( fileHandle, temperature, len ) ) throw ECommandError( command+wxT(" could not get temperature") ); try { name = wxT("TEMPERATURE"); TextVariable::PutVariable( name, wxString(temperature,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char field[MAXSTRINGLENGTH]; if( !MUD_getField( fileHandle, field, len ) ) throw ECommandError( command+wxT(" could not get field") ); try { name = wxT("FIELD"); TextVariable::PutVariable( name, wxString(field,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char das[MAXSTRINGLENGTH]; if( !MUD_getDas( fileHandle, das, len ) ) throw ECommandError( command+wxT(" could not get das") ); try { name = wxT("DAS"); TextVariable::PutVariable( name, wxString(das,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } char experimenter[MAXSTRINGLENGTH]; if( !MUD_getExperimenter( fileHandle, experimenter, len ) ) throw ECommandError( command+wxT(" could not get experimenter") ); try { name = wxT("EXPERIMENTER"); TextVariable::PutVariable( name, wxString(experimenter,wxConvUTF8), p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long pType, nComments; if( !MUD_getComments( fileHandle, &pType, &nComments ) ) { pType = 0; nComments = 0; } try { name = wxT("COMMENTTYPE"); NumericVariable::PutVariable( name, (double)pType, p->GetInputLine() ); name = wxT("COMMENTNUM"); NumericVariable::PutVariable( name, (double)nComments, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( nComments > 0 ) { std::vector data; for( unsigned long i=1; i<=nComments; ++i ) { unsigned long a; if( !MUD_getCommentPrev( fileHandle, i, &a ) ) throw ECommandError( command+wxT(" could not get commentPrev") ); data.push_back(a); } try { name = wxT("COMMENTPREV"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=nComments; ++i ) { unsigned long a; if( !MUD_getCommentNext( fileHandle, i, &a ) ) throw ECommandError( command+wxT(" could not get commentNext") ); data.push_back(a); } try { name = wxT("COMMENTNEXT"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=nComments; ++i ) { unsigned long a; if( !MUD_getCommentTime( fileHandle, i, &a ) ) throw ECommandError( command+wxT(" could not get commentTime") ); data.push_back(a); } try { name = wxT("COMMENTTIME"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector sdata; for( unsigned long i=1; i<=nComments; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getCommentAuthor( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get commentAuthor") ); sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("COMMENTAUTHOR"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } sdata.clear(); for( unsigned long i=1; i<=nComments; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getCommentTitle( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get commentTitle") ); sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("COMMENTTITLE"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } sdata.clear(); for( unsigned long i=1; i<=nComments; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getCommentBody( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get commentBody") ); sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("COMMENTBODY"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } unsigned long pNum; if( !MUD_getHists( fileHandle, &pType, &pNum ) ) throw ECommandError( command+wxT(" could not get hists") ); try { name = wxT("HISTNUM"); NumericVariable::PutVariable( name, (double)pNum, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long nbintot = 0; unsigned long start = 0; std::vector sdata; std::vector nbins, starts, ends; for( unsigned long i=1; i<=pNum; ++i ) { char c[MAXSTRINGLENGTH]; if( !MUD_getHistTitle( fileHandle, i, c, len ) ) throw ECommandError( command+wxT(" could not get histTitle") ); sdata.push_back(wxString(c,wxConvUTF8)); unsigned long p; if( !MUD_getHistNumBins( fileHandle, i, &p ) ) throw ECommandError( command+wxT(" could not get histNumBins") ); nbins.push_back(static_cast(p)); nbintot += p; starts.push_back(static_cast(start+1)); start += p; ends.push_back(static_cast(start)); } try { name = wxT("HISTTITLE"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); name = wxT("NUMBINS"); NumericVariable::PutVariable( name, nbins, 0, p->GetInputLine() ); name = wxT("HISTSTART"); NumericVariable::PutVariable( name, starts, 0, p->GetInputLine() ); name = wxT("HISTEND"); NumericVariable::PutVariable( name, ends, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } int *pdata = new int[nbintot]; int istart = 0; for( unsigned long i=1; i<=pNum; ++i ) { if( !MUD_getHistData( fileHandle, i, pdata+istart ) ) { delete [] pdata; throw ECommandError( command+wxT(" could not get histData") ); } istart += static_cast(nbins[i-1]); } std::vector data; for( unsigned long i=0; i(pdata[i]) ); delete [] pdata; try { name = wxT("IH"); NumericVariable::PutVariable( name, data, (std::size_t)nbins[0], (std::size_t)pNum, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistType( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histType") ); data.push_back(static_cast(j)); } try { name = wxT("HISTTYPE"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistNumBytes( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histNumBytes") ); data.push_back(static_cast(j)); } try { name = wxT("HISTNUMBYTES"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistBytesPerBin( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histBytesPerBin") ); data.push_back(static_cast(j)); } try { name = wxT("HISTBYTESPERBIN"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistFsPerBin( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histFsPerBin") ); double d = static_cast(j); if( j < 16 )d = 78125*pow(2.0,d); else if( j < 32 )d = 48828.125*pow(2.0,d-16); data.push_back(d); } try { name = wxT("HISTFSPERBIN"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistT0_Ps( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histT0_Ps") ); data.push_back(static_cast(j)); } try { name = wxT("HISTT0_PS"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistT0_Bin( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histT0_Bin") ); data.push_back(static_cast(j)); } try { name = wxT("HISTT0_BIN"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistGoodBin1( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histGoodBin1") ); data.push_back(static_cast(j)); } try { name = wxT("HISTGOODBIN1"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistGoodBin2( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histGoodBin2") ); data.push_back(static_cast(j)); } try { name = wxT("HISTGOODBIN2"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistBkgd1( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histBkgd1") ); data.push_back(static_cast(j)); } try { name = wxT("HISTBKGD1"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistBkgd2( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histBkgd2") ); data.push_back(static_cast(j)); } try { name = wxT("HISTBKGD2"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=pNum; ++i ) { unsigned long j; if( !MUD_getHistNumEvents( fileHandle, i, &j ) ) throw ECommandError( command+wxT(" could not get histNumEvents") ); data.push_back(static_cast(j)); } try { name = wxT("NUMEVENTS"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } unsigned long scalerType, nscalers; if( !MUD_getScalers( fileHandle, &scalerType, &nscalers ) ) throw ECommandError( command+wxT(" could not get scalers") ); try { name = wxT("NUMSCALERS"); NumericVariable::PutVariable( name, (double)nscalers, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( nscalers > 0 ) { try { name = wxT("SCALERTYPE"); NumericVariable::PutVariable( name, (double)scalerType, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); data.resize( 2*nscalers ); unsigned long pCounts[2]; for( unsigned long i=1; i<=nscalers; ++i ) { if( !MUD_getScalerCounts( fileHandle, i, pCounts ) ) throw ECommandError( command+wxT(" could not get scalerCounts") ); data[i-1] = static_cast(pCounts[0]); data[i-1+nscalers] = static_cast(pCounts[1]); } try { name = wxT("SCALERCOUNTS"); NumericVariable::PutVariable( name, data, nscalers, 2, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector sdata; for( unsigned long i=1; i<=nscalers; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getScalerLabel( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get scalerLabel") ); if( strlen(a) == 0 )sdata.push_back(wxString(wxT(" "))); else sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("SCALERLABEL"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } unsigned long indvartype, indvarnum; if( !MUD_getIndVars( fileHandle, &indvartype, &indvarnum ) ) ExGlobals::WarningMessage( command + wxT(" could not get indVars") ); else { MUD_getIndVars( fileHandle, &indvartype, &indvarnum ); try { name = wxT("INDVARTYPE"); NumericVariable::PutVariable( name, (double)indvartype, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=indvarnum; ++i ) { double tmp; if( !MUD_getIndVarLow( fileHandle, i, &tmp ) ) throw ECommandError( command+wxT(" could not get indVarLow") ); data.push_back(tmp); } try { name = wxT("INDVARLOW"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=indvarnum; ++i ) { double tmp; if( !MUD_getIndVarHigh( fileHandle, i, &tmp ) ) throw ECommandError( command+wxT(" could not get indVarHigh") ); data.push_back(tmp); } try { name = wxT("INDVARHIGH"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=indvarnum; ++i ) { double tmp; if( !MUD_getIndVarMean( fileHandle, i, &tmp ) ) throw ECommandError( command+wxT(" could not get indVarMean") ); data.push_back(tmp); } try { name = wxT("INDVARMEAN"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=indvarnum; ++i ) { double tmp; if( !MUD_getIndVarStddev( fileHandle, i, &tmp ) ) throw ECommandError( command+wxT(" could not get indVarStddev") ); data.push_back(tmp); } try { name = wxT("INDVARSTDDEV"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } std::vector().swap( data ); for( unsigned long i=1; i<=indvarnum; ++i ) { double tmp; if( !MUD_getIndVarSkewness( fileHandle, i, &tmp ) ) throw ECommandError( command+wxT(" could not get indVarSkewness") ); data.push_back(tmp); } try { name = wxT("INDVARSKEWNESS"); NumericVariable::PutVariable( name, data, 0, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } sdata.clear(); for( unsigned long i=1; i<=indvarnum; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getIndVarName( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get indVarName") ); sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("INDVARNAME"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } sdata.clear(); for( unsigned long i=1; i<=indvarnum; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getIndVarDescription( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get indVarDescription") ); sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("INDVARDESCRIPTION"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } sdata.clear(); for( unsigned long i=1; i<=indvarnum; ++i ) { char a[MAXSTRINGLENGTH]; if( !MUD_getIndVarUnits( fileHandle, i, a, len ) ) throw ECommandError( command+wxT(" could not get indVarUnits") ); sdata.push_back(wxString(a,wxConvUTF8)); } try { name = wxT("INDVARUNITS"); TextVariable::PutVariable( name, sdata, p->GetInputLine() ); } catch ( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } #endif } // end of file extrema-4.4.5/src/Commands/CMD_density.h0000644012702201742730000000210511274636606017063 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_DENSITY #define CMD_DENSITY #include "Command.h" class ParseLine; class CMD_density : public Command { public: static CMD_density *Instance() { if( !cmd_density_ )cmd_density_ = new CMD_density(); return cmd_density_; } void Execute( ParseLine const * ); private: CMD_density(); static CMD_density *cmd_density_; }; #endif extrema-4.4.5/src/Commands/CMD_set.cpp0000644012702201742730000030072011274636606016536 0ustar spangspang/* Copyright (C) 2005,...,2009 Joseph L. Chuma 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. */ #include #include #include "CMD_set.h" #include "ECommandError.h" #include "ESyntaxError.h" #include "ParseLine.h" #include "ParseToken.h" #include "Script.h" #include "ExGlobals.h" #include "UsefulFunctions.h" #include "EVariableError.h" #include "TextVariable.h" #include "NumericVariable.h" #include "EGraphicsError.h" #include "GRA_window.h" #include "GRA_axis.h" #include "GRA_colorMap.h" #include "GRA_colorControl.h" #include "GRA_color.h" #include "GRA_fontControl.h" #include "GRA_font.h" #include "CMD_read.h" #include "GRA_boolCharacteristic.h" #include "GRA_intCharacteristic.h" #include "GRA_sizeCharacteristic.h" #include "GRA_angleCharacteristic.h" #include "GRA_distanceCharacteristic.h" #include "GRA_fontCharacteristic.h" #include "GRA_colorCharacteristic.h" #include "GRA_doubleCharacteristic.h" #include "GRA_stringCharacteristic.h" #include "GRA_setOfCharacteristics.h" #include "VisualizationWindow.h" #include "GraphicsPage.h" CMD_set *CMD_set::cmd_set_ = 0; CMD_set::CMD_set() : Command( wxT("SET") ) {} double CMD_set::GetValue( wxString const &keyword ) { ParseLine const *p = GetParseLine(); wxString command( Name()+wxT(": ") ); command += keyword; AddToStackLine( p->GetString(valueIndex_) ); try { double d; NumericVariable::GetScalar( p->GetString(valueIndex_), keyword.c_str(), d ); return d; } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } GRA_color *CMD_set::GetColor( wxString const &keyword ) { ParseLine const *p = GetParseLine(); wxString colorName; wxString command( Name()+wxT(": ") ); command += keyword + wxT(": "); AddToStackLine( p->GetString(valueIndex_) ); try { TextVariable::GetVariable( p->GetString(valueIndex_), true, colorName ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_color *color = GRA_colorControl::GetColor( colorName ); if( color )return color; double d; try { NumericVariable::GetScalar( p->GetString(valueIndex_), wxT(""), d ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } return GRA_colorControl::GetColor( static_cast(d) ); } GRA_font *CMD_set::GetFont( wxString const &keyword ) { ParseLine const *p = GetParseLine(); wxString fontName; wxString command( Name()+wxT(": ") ); command += keyword; AddToStackLine( p->GetString(valueIndex_) ); try { TextVariable::GetVariable( p->GetString(valueIndex_), true, fontName ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } return GRA_fontControl::GetFont( fontName ); } wxString CMD_set::GetString( wxString const &keyword ) { ParseLine const *p = GetParseLine(); wxString label; AddToStackLine( p->GetString(valueIndex_) ); try { TextVariable::GetVariable( p->GetString(valueIndex_), false, label ); } catch (EVariableError &e) { wxString command( Name()+wxT(": ") ); command += keyword; throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } return label; } void CMD_set::Execute( ParseLine const *p_in ) { ParseLine p( *p_in ); GRA_window *gw = ExGlobals::GetGraphWindow(); // SetUp( &p ); // wxString command( Name()+wxT(": ") ); if( p.GetNumberOfTokens()>=2 && !p.IsString(1) ) throw ECommandError( command+wxT("expecting keyword") ); bool multipleEntries = false; if( p.GetNumberOfTokens() == 1 ) { if( ExGlobals::NotInaScript() )throw ECommandError( command+wxT("expecting keyword") ); multipleEntries = true; WriteStackLine(); } // TOP: if( multipleEntries ) { wxString line; NEXTLINE: try { if( ExGlobals::GetScript()->GetNextLine(line) ) // end of script file found { ExGlobals::StopScript(); return; } } catch( std::runtime_error &e ) { ExGlobals::StopAllScripts(); throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( line.empty() || line==wxT(" ") )return; if( line.at(0) == Script::GetCommentCharacter() )goto NEXTLINE; line = wxString(wxT("SET "))+line; ParseLine p2( line ); try { p2.ParseIt(); } catch( ESyntaxError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } p = p2; } AddToStackLine( p.GetString(1) ); // wxString temp( p.GetString(1).Upper() ); // double value; bool percent = (temp.at(0) == wxT('%')); wxString keyword; percent ? keyword.assign( temp,1,temp.length()-1 ) : keyword.assign( temp,0,temp.length() ); valueIndex_ = 2; //command += keyword; if( p.GetNumberOfTokens()<3 && keyword!=wxT("LEGENDFRAME") ) throw ECommandError( command+wxT("expecting value") ); if( p.IsEqualSign(2) ) { valueIndex_ = 3; if( p.GetNumberOfTokens() < 4 )throw ECommandError( command+wxT("expecting value") ); } if( keyword==wxT("PLOTSYMBOL") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_intCharacteristic *plotsymbol = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOL"))); if( ndim == 0 ) { plotsymbol->Set( static_cast(dvalue) ); } else if( ndim == 1 ) { std::vector idata; std::vector::const_iterator dEnd = data.end(); for( std::vector::const_iterator i=data.begin(); i!=dEnd; ++i ) idata.push_back( static_cast(*i) ); plotsymbol->Set( idata ); } else { throw ECommandError( command+wxT("scalar or vector expected") ); } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("PLOTSYMBOLSIZE") || keyword==wxT("CHARSZ") ) { int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_sizeCharacteristic *plotsymbolsize = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLSIZE"))); if( ndim == 0 ) { plotsymbolsize->Set( dvalue, percent ); } else if( ndim == 1 ) { plotsymbolsize->Set( data, percent ); } else { throw ECommandError( command+wxT("must be scalar or vector") ); } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("PLOTSYMBOLANGLE") || keyword==wxT("CHARA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_angleCharacteristic *plotsymbolangle = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLANGLE"))); if( ndim == 0 ) { plotsymbolangle->Set( dvalue ); } else if( ndim == 1 ) { plotsymbolangle->Set( data ); } else { throw ECommandError( command+wxT("must be scalar or vector") ); } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("PLOTSYMBOLLINEWIDTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_intCharacteristic *plotsymbollinewidth = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLLINEWIDTH"))); if( ndim == 0 ) { plotsymbollinewidth->Set( static_cast(dvalue) ); } else if( ndim == 1 ) { std::vector idata; std::vector::const_iterator dEnd( data.end() ); for( std::vector::const_iterator i=data.begin(); i!=dEnd; ++i ) idata.push_back( static_cast(*i) ); plotsymbollinewidth->Set( idata ); } else { throw ECommandError( command+wxT("must be scalar or vector") ); } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("PLOTSYMBOLCOLOR") || keyword==wxT("PLOTSYMBOLCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); wxString colorName; try { TextVariable::GetVariable( p.GetString(valueIndex_), true, colorName ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_colorCharacteristic *plotsymbolcolor = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLCOLOR"))); // // first check to see if it is a named color, such as RED // GRA_color *color = GRA_colorControl::GetColor(colorName); if( color ) // it was a recognized name { plotsymbolcolor->Set( color ); } else // it was not a recognized name { int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndim == 0 ) // scalar { plotsymbolcolor->Set( GRA_colorControl::GetColor( static_cast(dvalue) ) ); } else if( ndim == 1 ) // vector { std::vector colors; for( int i=0; i(data[i]) ) ); plotsymbolcolor->Set( colors ); } else { throw ECommandError( command+wxT("expecting scalar or vector") ); } } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("PCHAR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_intCharacteristic *plotsymbol = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOL"))); if( ndim == 0 ) { plotsymbol->Set( static_cast(dvalue) ); } else if( ndim == 1 ) { std::vector idata; std::vector::const_iterator end( data.end() ); for( std::vector::const_iterator i=data.begin(); i!=end; ++i ) idata.push_back( static_cast(*i) ); plotsymbol->Set( idata ); } else { throw ECommandError( command+wxT("scalar or vector expected") ); } pcharSymbol_ = p.GetString(valueIndex_); AddToStackLine( p.GetString(valueIndex_) ); pcharSize_.erase(); pcharColor_.erase(); pcharAngle_.erase(); if( p.GetNumberOfTokens() >= valueIndex_+2 ) { try { std::vector().swap( data ); NumericVariable::GetVariable( p.GetString(valueIndex_+1), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_sizeCharacteristic *plotsymbolsize = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLSIZE"))); double oldValue = plotsymbolsize->GetAsWorld(); if( ndim == 0 ) { plotsymbolsize->SetAsWorld( dvalue*oldValue ); } else if( ndim == 1 ) { std::size_t dataSize = data.size(); for( std::size_t i=0; iSetAsWorld( data ); } else { throw ECommandError( command+wxT("scalar or vector expected for size scale factor") ); } pcharSize_ = p.GetString(valueIndex_+1); AddToStackLine( p.GetString(valueIndex_+1) ); if( p.GetNumberOfTokens() >= valueIndex_+3 ) { try { std::vector().swap( data ); NumericVariable::GetVariable( p.GetString(valueIndex_+2), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_colorCharacteristic *plotsymbolcolor = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLCOLOR"))); if( ndim == 0 ) { plotsymbolcolor->Set( GRA_colorControl::GetColor( static_cast(dvalue) ) ); } else if( ndim == 1 ) { std::vector colors; for( int i=0; i(data[i]) ) ); plotsymbolcolor->Set( colors ); } else { throw ECommandError( command+wxT("scalar or vector expected for color") ); } pcharColor_ = p.GetString(valueIndex_+2); AddToStackLine( p.GetString(valueIndex_+2) ); if( p.GetNumberOfTokens() >= valueIndex_+4 ) { try { std::vector().swap( data ); NumericVariable::GetVariable( p.GetString(valueIndex_+3), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_angleCharacteristic *plotsymbolangle = static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLANGLE"))); if( ndim == 0 ) { plotsymbolangle->Set( dvalue ); } else if( ndim == 1 ) { plotsymbolangle->Set( data ); } else { throw ECommandError( command+wxT("scalar or vector expected for angles") ); } pcharAngle_ = p.GetString(valueIndex_+3); AddToStackLine( p.GetString(valueIndex_+3) ); } } } } else if( keyword==wxT("HISTOGRAMTYPE") || keyword==wxT("HISTYP") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("HISTOGRAMTYPE")))-> Set(static_cast(GetValue(keyword))); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("COLOR") || keyword==wxT("COLOUR") ) { if( percent )throw ECommandError( command+wxT(" % is meaningless") ); try { GRA_color *color = GetColor( keyword ); static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLCOLOR")))-> Set( color ); static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("CURVECOLOR")))-> Set( color ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("AXISCOLOR")))-> Set( color ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("AXISCOLOR")))-> Set( color ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELCOLOR")))-> Set( color ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELCOLOR")))-> Set( color ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSCOLOR")))-> Set( color ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSCOLOR")))-> Set( color ); static_cast(gw->GetTextCharacteristics()->Get(wxT("COLOR")))-> Set( color ); static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TITLECOLOR")))-> Set( color ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("BACKGROUNDCOLOR") || keyword==wxT("BACKGROUNDCOLOUR") ) { if( percent )throw ECommandError( command+wxT(" % is meaningless") ); wxString colorName; try { TextVariable::GetVariable( p.GetString(valueIndex_), true, colorName ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } // // first check to see if it is a named color, such as RED // GRA_color *bgcolor = GRA_colorControl::GetColor( colorName ); if( bgcolor ) // it was a recognized name { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDCOLOR")))-> Set( bgcolor ); static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDFILE")))-> Set( wxString(wxT("")) ); // wxWindow *wxw = ExGlobals::GetVisualizationWindow()->GetPage(); wxClientDC dc( wxw ); GraphicsPage *page = dynamic_cast(wxw); page->EraseWindows(); page->DrawGraphWindows( ExGlobals::GetGraphicsOutput(), dc ); } else // it was not a recognized name { int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndim == 0 ) // scalar { int ivalue = static_cast(dvalue); GRA_colorCharacteristic *bgchar = static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDCOLOR"))); ivalue==0 ? bgchar->Set(reinterpret_cast(0)) : bgchar->Set(GRA_colorControl::GetColor(ivalue)); static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDFILE")))-> Set( wxString(wxT("")) ); // wxWindow *wxw = ExGlobals::GetVisualizationWindow()->GetPage(); wxClientDC dc( wxw ); GraphicsPage *page = dynamic_cast(wxw); page->EraseWindows(); page->DrawGraphWindows( ExGlobals::GetGraphicsOutput(), dc ); } else { throw ECommandError( command+wxT("expecting scalar value") ); } } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("BACKGROUNDFILE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { wxString bgfile( GetString(keyword) ); if( bgfile == wxT(" ") ) { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDFILE")))-> Set( wxString(wxT("")) ); static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDCOLOR")))-> Set( reinterpret_cast(0) ); } else { std::ifstream inStream; inStream.clear( std::ios::goodbit ); inStream.open( bgfile.mb_str(wxConvUTF8), std::ios_base::in ); if( !inStream.is_open() )throw ECommandError( command+wxT("could not open file: ")+bgfile ); inStream.close(); static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDFILE")))-> Set( bgfile ); static_cast(gw->GetGeneralCharacteristics()->Get(wxT("BACKGROUNDCOLOR")))-> Set( reinterpret_cast(0) ); } } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } wxWindow *wxw = ExGlobals::GetVisualizationWindow()->GetPage(); wxClientDC dc( wxw ); GraphicsPage *page = static_cast(wxw); page->EraseWindows(); page->DrawGraphWindows( ExGlobals::GetGraphicsOutput(), dc ); } else if( keyword==wxT("COLORMAPFILE") || keyword==wxT("COLOURMAPFILE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); wxString fileName; try { TextVariable::GetVariable( p.GetString(valueIndex_), true, fileName ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } try { GRA_colorControl::SetFile( fileName ); } catch (EGraphicsError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("COLORMAP") || keyword==wxT("COLOURMAP") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); if( p.GetNumberOfTokens() == valueIndex_+1 ) { wxString name; try { TextVariable::GetVariable( p.GetString(valueIndex_), true, name ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } try { GRA_colorControl::SetColorMap( name ); } catch (EGraphicsError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p.GetString(valueIndex_) ); } else { if( p.GetNumberOfTokens() != valueIndex_+3 )throw ECommandError( command+wxT("expecting 3 vectors") ); int ndim1, ndim2, ndim3; double dvalue1, dvalue2, dvalue3; std::vector data1; std::vector data2; std::vector data3; int dimSizes1[3]; int dimSizes2[3]; int dimSizes3[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim1, dvalue1, data1, dimSizes1 ); NumericVariable::GetVariable( p.GetString(valueIndex_+1), ndim2, dvalue2, data2, dimSizes2 ); NumericVariable::GetVariable( p.GetString(valueIndex_+2), ndim3, dvalue3, data3, dimSizes3 ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndim1!=1 || ndim2!=1 || ndim3!=1 ) throw ECommandError( command+wxT("must be 3 vectors") ); if( data1.size()!=data2.size() || data2.size()!=data3.size() ) throw ECommandError( command+wxT("R, G, and B vectors must be the same size") ); std::size_t size = data1.size(); GRA_colorMap *tmp2 = new GRA_colorMap(wxT("USERDEFINED")); for( std::size_t i=0; iAddColor( new GRA_color( static_cast(data1[i]), static_cast(data2[i]), static_cast(data3[i]) ) ); } GRA_colorControl::SetColorMapUser( tmp2 ); AddToStackLine( p.GetString(valueIndex_)+wxString(wxT(" "))+ p.GetString(valueIndex_+1)+wxString(wxT(" "))+ p.GetString(valueIndex_+2) ); } } else if( keyword==wxT("CURVECOLOR") || keyword==wxT("CURVECOLOUR") || keyword==wxT("LINECOLOR") || keyword==wxT("LINECOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("CURVECOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("AREAFILLCOLOR") || keyword==wxT("AREAFILLCOLOUR") || keyword==wxT("FILLCOLOR") || keyword==wxT("FILLCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); wxString colorName; try { TextVariable::GetVariable( p.GetString(valueIndex_), true, colorName ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } GRA_colorCharacteristic *areafillcolor = static_cast(gw->GetGeneralCharacteristics()->Get(wxT("AREAFILLCOLOR"))); // // first check to see if it is a named color, such as RED // GRA_color *color = GRA_colorControl::GetColor( colorName ); if( color ) // it was a recognized name { areafillcolor->Set( color ); } else // it was not a recognized name { int ndim; double dvalue; std::vector data; int dimSizes[3]; try { NumericVariable::GetVariable( p.GetString(valueIndex_), ndim, dvalue, data, dimSizes ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( ndim == 0 ) // scalar { int ivalue = static_cast(dvalue); ivalue==0 ? areafillcolor->Set(reinterpret_cast(0)) : areafillcolor->Set(GRA_colorControl::GetColor(ivalue)); } else if( ndim == 1 ) // vector { std::vector colors; for( int i=0; i(data[i]) ) ); areafillcolor->Set( colors ); } else { throw ECommandError( command+wxT("expecting scalar or vector") ); } } AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("LINETYPE") || keyword==wxT("LINTYP") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); static_cast(gw->GetGeneralCharacteristics()->Get(wxT("GRIDLINETYPE")))-> Set( static_cast(value) ); static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("CURVELINETYPE")))-> Set( static_cast(value) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("CURVELINETYPE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("CURVELINETYPE")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("GRIDLINETYPE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("GRIDLINETYPE")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("LINEWIDTH") || keyword==wxT("LINTHK") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); int w = static_cast(value+0.5); static_cast( gw->GetGeneralCharacteristics()->Get(wxT("LINEWIDTH")))->Set( w ); static_cast( gw->GetDataCurveCharacteristics()->Get(wxT("PLOTSYMBOLLINEWIDTH")))->Set( w ); static_cast( gw->GetDataCurveCharacteristics()->Get(wxT("CURVELINEWIDTH")))->Set( w ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("CURVELINEWIDTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetDataCurveCharacteristics()->Get(wxT("CURVELINEWIDTH")))-> Set(static_cast(GetValue(keyword)+0.5)); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XAXISLINEWIDTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LINEWIDTH")))-> Set(static_cast(GetValue(keyword)+0.5)); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YAXISLINEWIDTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LINEWIDTH")))-> Set(static_cast(GetValue(keyword)+0.5)); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARAXISLINEWIDTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LINEWIDTH")))-> Set(static_cast(GetValue(keyword)+0.5)); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XAXISCOLOR") || keyword==wxT("XAXISCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("AXISCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YAXISCOLOR") || keyword==wxT("YAXISCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("AXISCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARAXISCOLOR") || keyword==wxT("POLARAXISCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("AXISCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLABELFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLABELFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARLABELFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LABELFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLABELCOLOR") || keyword==wxT("XLABELCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLABELCOLOR") || keyword==wxT("YLABELCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARLABELCOLOR") || keyword==wxT("POLARLABELCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LABELCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNUMBERSFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNUMBERSFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNUMBERSFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBERSFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNUMBERSCOLOR") || keyword==wxT("XNUMBERSCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNUMBERSCOLOR") || keyword==wxT("YNUMBERSCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNUMBERSCOLOR") || keyword==wxT("POLARNUMBERSCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBERSCOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARORIGINX") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("XORIGIN")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARORIGINY") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("YORIGIN")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNAXES") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NAXES")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARAXISLENGTH") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("AXISLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARAXISANGLE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("AXISANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARCLOCKWISE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("CLOCKWISE")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARCOMPASSLABELS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("COMPASSLABELS")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLOWERAXIS") || keyword==wxT("XLAXIS") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LOWERAXIS")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XUPPERAXIS") || keyword==wxT("XUAXIS") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("UPPERAXIS")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLOWERAXIS") || keyword==wxT("YLAXIS") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LOWERAXIS")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YUPPERAXIS") || keyword==wxT("YUAXIS") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("UPPERAXIS")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLOWERWINDOW") || keyword==wxT("XLWIND") ) { try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("XLOWERWINDOW")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XUPPERWINDOW") || keyword==wxT("XUWIND") ) { try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("XUPPERWINDOW")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLOWERWINDOW") || keyword==wxT("YLWIND") ) { try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("YLOWERWINDOW")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YUPPERWINDOW") || keyword==wxT("YUWIND") ) { try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("YUPPERWINDOW")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("GRAPHBOX") || keyword==wxT("BOX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("GRAPHBOX")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XNUMBERSON") || keyword == wxT("XNUMBERS")) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YNUMBERSON") || keyword == wxT("YNUMBERS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARNUMBERSON") || keyword == wxT("POLARNUMBERS")) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBERSON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNUMBEROFDIGITS") || keyword==wxT("NXDIG") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBEROFDIGITS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNUMBEROFDIGITS") || keyword==wxT("NYDIG") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBEROFDIGITS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNUMBEROFDIGITS") || keyword==wxT("NPDIG") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBEROFDIGITS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNUMBEROFDECIMALS") || keyword==wxT("NXDEC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBEROFDECIMALS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNUMBEROFDECIMALS") || keyword==wxT("NYDEC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBEROFDECIMALS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNUMBEROFDECIMALS") || keyword==wxT("NPDEC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBEROFDECIMALS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNUMBERSHEIGHT") || keyword==wxT("XNUMSZ") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNUMBERSHEIGHT") || keyword==wxT("YNUMSZ") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNUMBERSHEIGHT") || keyword==wxT("POLARNUMSZ") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBERSHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XIMAGTICLENGTH") || keyword==wxT("XITICL") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("IMAGTICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YIMAGTICLENGTH") || keyword==wxT("YITICL") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("IMAGTICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARIMAGTICLENGTH") || keyword==wxT("PITICL") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("IMAGTICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XIMAGTICANGLE") || keyword==wxT("XITICA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("IMAGTICANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YIMAGTICANGLE") || keyword==wxT("YITICA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("IMAGTICANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARIMAGTICANGLE") || keyword==wxT("PITICA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("IMAGTICANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNUMBERSANGLE") || keyword==wxT("XNUMA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNUMBERSANGLE") || keyword==wxT("YNUMA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNUMBERSANGLE") || keyword==wxT("PNUMA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NUMBERSANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XPOWER") || keyword==wxT("XPOW") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("POWER")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YPOWER") || keyword==wxT("YPOW") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("POWER")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARPOWER") || keyword==wxT("PPOW") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("POWER")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XPOWERAUTO") || keyword==wxT("XPAUTO") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("POWERAUTO")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YPOWERAUTO") || keyword==wxT("YPAUTO") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("POWERAUTO")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARPOWERAUTO") || keyword==wxT("PPAUTO") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("POWERAUTO")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XLABEL") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABEL")))-> Set( GetString(keyword) ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELON")))-> Set( true ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( keyword == wxT("YLABEL") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABEL")))-> Set( GetString(keyword) ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELON")))-> Set( true ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( keyword == wxT("POLARLABEL") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LABEL")))-> Set( GetString(keyword) ); static_cast(gw->GetPolarCharacteristics()->Get(wxT("LABELON")))-> Set( true ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( keyword==wxT("XLABELHEIGHT") || keyword==wxT("XLABSZ") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLABELHEIGHT") || keyword==wxT("YLABSZ") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARLABELHEIGHT") || keyword==wxT("PLABSZ") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LABELHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XLABELON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YLABELON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARLABELON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LABELON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLARGETICLENGTH") || keyword==wxT("XTICL") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LARGETICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLARGETICLENGTH") || keyword==wxT("YTICL") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LARGETICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARLARGETICLENGTH") || keyword==wxT("PTICL") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LARGETICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XSMALLTICLENGTH") || keyword==wxT("XTICS") ) { try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("SMALLTICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YSMALLTICLENGTH") || keyword==wxT("YTICS") ) { try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("SMALLTICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARSMALLTICLENGTH") || keyword==wxT("PTICS") ) { try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("SMALLTICLENGTH")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XTICANGLE") || keyword==wxT("XTICA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("TICANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YTICANGLE") || keyword==wxT("YTICA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("TICANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARTICANGLE") || keyword==wxT("PTICA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("TICANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XFORCECROSS") || keyword==wxT("XCROSS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("FORCECROSS")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YFORCECROSS") || keyword==wxT("YCROSS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("FORCECROSS")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XMIN") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); double temp; try { temp = GetValue(keyword); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("MIN")))->Set(temp); } catch (ECommandError const &e) { throw; } static_cast(gw->GetXAxisCharacteristics()->Get(wxT("VIRTUALMIN")))->Set(temp); } else if( keyword == wxT("YMIN") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); double temp; try { temp = GetValue(keyword); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("MIN")))->Set(temp); } catch (ECommandError const &e) { throw; } static_cast(gw->GetYAxisCharacteristics()->Get(wxT("VIRTUALMIN")))->Set(temp); } else if( keyword == wxT("XMAX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); double temp; try { temp = GetValue(keyword); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("MAX")))->Set(temp); } catch (ECommandError const &e) { throw; } static_cast(gw->GetXAxisCharacteristics()->Get(wxT("VIRTUALMAX")))->Set(temp); } else if( keyword == wxT("YMAX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); double temp; try { temp = GetValue(keyword); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("MAX")))->Set(temp); } catch (ECommandError const &e) { throw; } static_cast(gw->GetYAxisCharacteristics()->Get(wxT("VIRTUALMAX")))->Set(temp); } else if( keyword == wxT("POLARMAX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); double temp; try { temp = GetValue(keyword); static_cast(gw->GetPolarCharacteristics()->Get(wxT("MAX")))->Set(temp); } catch (ECommandError const &e) { throw; } static_cast(gw->GetXAxisCharacteristics()->Get(wxT("VIRTUALMAX")))->Set(temp); } else if( keyword==wxT("XVIRTUALMIN") || keyword==wxT("XVMIN") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("VIRTUALMIN")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YVIRTUALMIN") || keyword==wxT("YVMIN") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("VIRTUALMIN")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XVIRTUALMAX") || keyword==wxT("XVMAX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("VIRTUALMAX")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YVIRTUALMAX") || keyword==wxT("YVMAX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("VIRTUALMAX")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARVIRTUALMAX") || keyword==wxT("PVMAX") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("VIRTUALMAX")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNLINCS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NLINCS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("NLXINC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } if( value < 0.0 ) { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("DROPFIRSTNUMBER")))-> Set( true ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("DROPLASTNUMBER")))-> Set( true ); value *= -1; } static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NLINCS")))-> Set( static_cast(value) ); } else if( keyword==wxT("YNLINCS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NLINCS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("NLYINC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } if( value < 0.0 ) { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("DROPFIRSTNUMBER")))-> Set( true ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("DROPLASTNUMBER")))-> Set( true ); value *= -1; } static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NLINCS")))-> Set( static_cast(value) ); } else if( keyword==wxT("POLARNLINCS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NLINCS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XNSINCS") || keyword==wxT("NSXINC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NSINCS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YNSINCS") || keyword==wxT("NSYINC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NSINCS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARNSINCS") || keyword==wxT("NSPINC") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("NSINCS")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XTICSON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("TICSON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YTICSON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("TICSON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARTICSON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("TICSON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XTICSBOTHSIDES") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("TICSBOTHSIDES")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YTICSBOTHSIDES") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("TICSBOTHSIDES")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARTICSBOTHSIDES") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("TICSBOTHSIDES")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XTICTP") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } bool ls = (static_cast(value) == 2); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("TICSBOTHSIDES")))-> Set( ls ); } else if( keyword == wxT("YTICTP") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } bool ls = (static_cast(value) == 2); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("TICSBOTHSIDES")))-> Set( ls ); } else if( keyword == wxT("XAXISON") || keyword == wxT("XAXIS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("AXISON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YAXISON") || keyword == wxT("YAXIS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("AXISON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARAXISON") || keyword == wxT("PAXIS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("AXISON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XGRID") || keyword==wxT("NXGRID") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("GRID")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YGRID") || keyword==wxT("NYGRID") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("GRID")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARGRID") || keyword==wxT("NPGRID") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("GRID")))-> Set( static_cast(GetValue(keyword)) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XAXISANGLE") || keyword==wxT("XAXISA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("AXISANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YAXISANGLE") || keyword==wxT("YAXISA") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("AXISANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLOGBASE") || keyword==wxT("XLOG") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LOGBASE")))-> Set( value ); //gw->GetReplot()->SetXLogBase( value ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLOGBASE") || keyword==wxT("YLOG") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LOGBASE")))-> Set( value ); //gw->GetReplot()->SetYLogBase( value ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XLOGSTYLE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LOGSTYLE")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YLOGSTYLE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LOGSTYLE")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XZERO") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("ZERO")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YZERO") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("ZERO")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XMOD") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("MOD")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YMOD") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("MOD")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARMOD") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("MOD")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XLEADINGZEROS") || keyword==wxT("XLEADZ") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LEADINGZEROS")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YLEADINGZEROS") || keyword==wxT("YLEADZ") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LEADINGZEROS")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLARLEADINGZEROS") || keyword==wxT("PLEADZ") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("LEADINGZEROS")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XOFFSET") || keyword==wxT("XOFF") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("OFFSET")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YOFFSET") || keyword==wxT("YOFF") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("OFFSET")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("POLAROFFSET") || keyword==wxT("POFF") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("OFFSET")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XDROPFIRSTNUMBER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("DROPFIRSTNUMBER")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YDROPFIRSTNUMBER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("DROPFIRSTNUMBER")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARDROPFIRSTNUMBER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("DROPFIRSTNUMBER")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("XDROPLASTNUMBER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("DROPLASTNUMBER")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("YDROPLASTNUMBER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetYAxisCharacteristics()->Get(wxT("DROPLASTNUMBER")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("POLARDROPLASTNUMBER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetPolarCharacteristics()->Get(wxT("DROPLASTNUMBER")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("EXTENSION") || keyword==wxT("SCRIPTEXTENSION") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); if( !p.IsString(valueIndex_) )throw ECommandError( command+wxT("expecting string value") ); ExGlobals::SetScriptExtension( p.GetString(valueIndex_) ); AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword==wxT("STACKEXTENSION") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); if( !p.IsString(valueIndex_) )throw ECommandError( command+wxT("expecting string value") ); ExGlobals::SetStackExtension( p.GetString(valueIndex_) ); AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword == wxT("COMMENT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); if( !p.IsString(valueIndex_) )throw ECommandError( command+wxT("expecting string value") ); Script::SetCommentCharacter( p.GetString(valueIndex_).at(0) ); AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword == wxT("PARAMETER") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); if( !p.IsString(valueIndex_) )throw ECommandError( command+wxT("expecting string value") ); Script::SetParameterCharacter( p.GetString(valueIndex_).at(0) ); AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword == wxT("ERRORFILL") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { CMD_read::Instance()->SetErrorFill( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("ORIENTATION") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); if( !p.IsString(valueIndex_) )throw ECommandError( command+wxT("expecting string value") ); wxString orient( p.GetString(valueIndex_) ); orient.UpperCase(); // if( orient != wxString(wxT("LANDSCAPE")) && orient != wxString(wxT("PORTRAIT")) ) throw ECommandError( command+wxT("expecting LANDSCAPE or PORTRAIT") ); AddToStackLine( p.GetString(valueIndex_) ); double ar = ExGlobals::GetAspectRatio(); bool landscape = (ar < 1.0); if( orient == wxT("LANDSCAPE") ) { if( !landscape )ExGlobals::SetAspectRatio( 1./ar ); } else if( orient == wxT("PORTRAIT") ) { if( landscape )ExGlobals::SetAspectRatio( 1./ar ); } } else if( keyword==wxT("FONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); GRA_font *font; try { font = GetFont(keyword); } catch (ECommandError const &e) { throw; } static_cast(gw->GetTextCharacteristics()->Get(wxT("FONT")))->Set(font); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LABELFONT")))->Set(font); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LABELFONT")))->Set(font); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NUMBERSFONT")))->Set(font); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NUMBERSFONT")))->Set(font); } else if( keyword==wxT("TEXTFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetTextCharacteristics()->Get(wxT("FONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("TEXTCOLOR") || keyword==wxT("TEXTCOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetTextCharacteristics()->Get(wxT("COLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("TEXTINTERACTIVE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetTextCharacteristics()->Get(wxT("INTERACTIVE")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("TEXTALIGN") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } int tj = static_cast(value); if( tj<1 || tj>12 )throw ECommandError( command+wxT("TEXTALIGN must be <= 12 and >= 1") ); static_cast(gw->GetTextCharacteristics()->Get(wxT("ALIGNMENT")))->Set( tj ); } else if( keyword==wxT("CURSOR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } int tj = static_cast(value); if( abs(tj)<1 || abs(tj)>12 )throw ECommandError( command+wxT("necessary condition: 1 <= |CURSOR| <= 12") ); if( tj < 0 ) { tj *= -1; static_cast(gw->GetTextCharacteristics()->Get(wxT("INTERACTIVE")))-> Set( false ); } else { static_cast(gw->GetTextCharacteristics()->Get(wxT("INTERACTIVE")))-> Set( true ); } static_cast(gw->GetTextCharacteristics()->Get(wxT("ALIGNMENT")))->Set( tj ); } else if( keyword==wxT("TEXTHEIGHT") || keyword==wxT("TXTHIT") ) { try { static_cast(gw->GetTextCharacteristics()->Get(wxT("HEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("TEXTANGLE") || keyword==wxT("TXTANG") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetTextCharacteristics()->Get(wxT("ANGLE")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("XTEXTLOCATION") || keyword==wxT("XLOC") ) { try { static_cast(gw->GetTextCharacteristics()->Get(wxT("XLOCATION")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("YTEXTLOCATION") || keyword==wxT("YLOC")) { try { static_cast(gw->GetTextCharacteristics()->Get(wxT("YLOCATION")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("WINDOWSIZE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = fabs( GetValue( keyword ) ); } catch (ECommandError const &e) { throw; } if( value <= 0.0001 ) { ExGlobals::DefaultSize(); } else { value = std::min(2.0,value); ExGlobals::ChangeSize( value ); } } else if( keyword == wxT("ARROWHEADWIDTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("ARROWHEADWIDTH")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("ARROWHEADLENGTH") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("ARROWHEADLENGTH")))-> Set( GetValue(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("ASPECTRATIO") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = fabs( GetValue( keyword ) ); } catch (ECommandError const &e) { throw; } ExGlobals::SetAspectRatio( value ); ExGlobals::GetVisualizationWindow()->ResetPages(); ExGlobals::GetVisualizationWindow()->ResetWindows(); //ExGlobals::GetVisualizationWindow()->DrawGraphWindows( ExGlobals::GetGraphicsOutput(), dc ); } else if( keyword == wxT("AUTOSCALE") ) { // autoscale = 0 means OFF // = -1 means COMMENSURATE // = 1 means ON, = 4 means ON \VIRTUAL // = 2 means X, = 5 means X \VIRTUAL // = 3 means Y, = 6 means Y \VIRTUAL // if( percent )throw ECommandError( command+wxT("% is meaningless") ); wxString name; try { TextVariable::GetVariable( p.GetString(valueIndex_), true, name ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } name.UpperCase(); // bool isVirtual = false; ParseToken *t = p.GetToken(valueIndex_); if( t->GetNumberOfQualifiers() > 0 ) { if( t->GetQualifier(0)->find(wxT("VIRTUAL")) == 0 ) { isVirtual = true; } else { throw ECommandError( command+wxT("VIRTUAL is the only valid qualifier") ); } } GRA_stringCharacteristic *autoscale = static_cast(gw->GetGeneralCharacteristics()->Get(wxT("AUTOSCALE"))); bool wasCommensurate = ( autoscale->Get() == wxT("COMMENSURATE") ); if( name == wxT("COMMENSURATE") )wasCommensurate = false; if( name!=wxT("OFF") && name!=wxT("ON") && name!=wxT("COMMENSURATE") && name!=wxT("X") && name!=wxT("Y") ) throw ECommandError( command+wxT("valid autoscale keywords: OFF, ON, COMMENSURATE, X, Y") ); if( wasCommensurate ) { static_cast(gw->GetXAxisCharacteristics()->Get(wxT("LOWERAXIS")))-> Set( 10.0, true ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("LOWERAXIS")))-> Set( 10.0, true ); static_cast(gw->GetXAxisCharacteristics()->Get(wxT("UPPERAXIS")))-> Set( 90.0, true ); static_cast(gw->GetYAxisCharacteristics()->Get(wxT("UPPERAXIS")))-> Set( 90.0, true ); } if( name==wxT("OFF") || name==wxT("X") ) static_cast(gw->GetXAxisCharacteristics()->Get(wxT("NLINCS")))->Set( 0 ); if( name==wxT("OFF") || name==wxT("Y") ) static_cast(gw->GetYAxisCharacteristics()->Get(wxT("NLINCS")))->Set( 0 ); // if( isVirtual ) { if( name == wxT("ON") )name = wxT("VIRTUAL"); else if( name==wxT("X") || name==wxT("Y") )name += wxT("VIRTUAL"); } autoscale->Set(name); // AddToStackLine( p.GetString(valueIndex_) ); } else if( keyword == wxT("TENSION") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } ExGlobals::SetTension( value ); } else if( keyword == wxT("LEGENDSIZE") ) // contour / density plot legend size { try { static_cast(gw->GetGeneralCharacteristics()->Get(wxT("LEGENDSIZE")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("ON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDENTRYLINEON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("ENTRYLINEON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDFRAMEON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("FRAMEON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDFRAME") ) { if( p.GetNumberOfTokens() == 6 ) { double xlo, ylo, xhi, yhi; wxString p2( p.GetString(valueIndex_) ); wxString p3( p.GetString(valueIndex_+1) ); wxString p4( p.GetString(valueIndex_+2) ); wxString p5( p.GetString(valueIndex_+3) ); AddToStackLine( p2 ); AddToStackLine( p3 ); AddToStackLine( p4 ); AddToStackLine( p5 ); try { NumericVariable::GetScalar( p2, wxT("x-coordinate of legend frame lower left corner"), xlo ); NumericVariable::GetScalar( p3, wxT("y-coordinate of legend frame lower left corner"), ylo ); NumericVariable::GetScalar( p4, wxT("x-coordinate of legend frame upper right corner"), xhi ); NumericVariable::GetScalar( p5, wxT("y-coordinate of legend frame upper right corner"), yhi ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("FRAMEXLO")))-> Set(xlo,percent); static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("FRAMEYLO")))-> Set(ylo,percent); static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("FRAMEXHI")))-> Set(xhi,percent); static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("FRAMEYHI")))-> Set(yhi,percent); } else ExGlobals::InteractiveLegendFrameSetup(); } else if( keyword==wxT("LEGENDFRAMECOLOR") || keyword==wxT("LEGENDFRAMECOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("FRAMECOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDTRANSPARENCY") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TRANSPARENCY")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDSYMBOLS") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { int u = static_cast(GetValue(keyword)); if( u<0 )throw ECommandError(command+wxT("number of symbols < 0")); static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("SYMBOLS")))-> Set( u ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDTITLEON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TITLEON")))-> Set( static_cast(static_cast(GetValue(keyword))) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDTITLE") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TITLE")))-> Set( GetString(keyword) ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } else if( keyword == wxT("LEGENDTITLEHEIGHT") ) { try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TITLEHEIGHT")))-> Set( GetValue(keyword), percent ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("LEGENDTITLECOLOR") || keyword==wxT("LEGENDTITLECOLOUR") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TITLECOLOR")))-> Set( GetColor(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("LEGENDTITLEFONT") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { static_cast(gw->GetGraphLegendCharacteristics()->Get(wxT("TITLEFONT")))-> Set( GetFont(keyword) ); } catch (ECommandError const &e) { throw; } } else if( keyword==wxT("MAXHISTORY") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } ExGlobals::SetMaxHistory( std::max(2,static_cast(value)) ); } else if( keyword==wxT("NHISTORY") || keyword==wxT("SHOWHISTORY") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } ExGlobals::SetNHistory( static_cast(value) ); } else if( keyword == wxT("CONTOURLABELHEIGHT") ) { try { static_cast( gw->GetGeneralCharacteristics()->Get(wxT("CONTOURLABELHEIGHT")))-> Set(GetValue(keyword),percent); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("CONTOURLABELSEPARATION") ) { try { static_cast( gw->GetGeneralCharacteristics()->Get(wxT("CONTOURLABELSEPARATION")))-> Set(GetValue(keyword),percent); } catch (ECommandError const &e) { throw; } } else if( keyword == wxT("ECHOON") ) { if( percent )throw ECommandError( command+wxT("% is meaningless") ); try { value = GetValue( keyword ); } catch (ECommandError const &e) { throw; } ExGlobals::SetEcho( static_cast(value)!=0 ); } else { wxString tmp( wxT("unknown keyword: ") ); tmp += keyword; throw ECommandError( command+tmp.c_str() ); } if( multipleEntries )goto TOP; } // end of file extrema-4.4.5/src/Commands/Command.h0000644012702201742730000000526011274636606016304 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_COMMAND #define CMD_COMMAND #include #include #include #include "wx/wx.h" class ParseLine; class Command { protected: typedef std::map QualifierMap; typedef QualifierMap::value_type entry_type; QualifierMap qualifiers_; bool writeStack_; Command( wxChar const * ); public: virtual ~Command(){} bool operator==( Command const & ) const; bool operator!=( Command const & ) const; // virtual void SetInitialize( bool const b ) {} // only used by ExecuteCommand virtual void Execute( ParseLine const * ) =0; ParseLine const *GetParseLine() const { return parseLine_; } void AddQualifier( wxChar const *, bool ); void AddName( wxChar const *c ) { names_.push_back( wxString(c) ); } void SetUp( QualifierMap &qualifierEntered ) { qualifierEntered = qualifierEntered_; } void SetUp( ParseLine const * ); void SetUp( ParseLine const *, QualifierMap & ); bool IsCommand( wxString const & ) const; wxString const &Name() const { return names_[0]; } wxString const &Name( int i ) const { return names_[i]; } int NumberOfNames() const { return static_cast(names_.size()); } void AddToStackLine( wxString const & ); void AddToStackLine( double ); void AddToStackLine( int ); void AddToStackLine(); void AddToStackLineNoBlank( wxString const & ); void AddToStackLineQualifier( wxString const & ); wxString const &GetStackLine() const { return stackLine_; } void WriteStackLine(); void EXStackLine(); // only used by EvaluateExpression bool GetWriteStack() const { return writeStack_; } private: // // cannot call default constructor, copy constructor, or operator= // Command() { exit(1); } Command( Command const & ) { exit(1); } Command const &operator=( Command const & ) { exit(1); return *this; } // wxString stackLine_; std::vector names_; ParseLine const *parseLine_; QualifierMap qualifierEntered_; }; #endif extrema-4.4.5/src/Commands/CMD_window.h0000644012702201742730000000207411274636606016720 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_WINDOW #define CMD_WINDOW #include "Command.h" class ParseLine; class CMD_window : public Command { public: static CMD_window *Instance() { if( !cmd_window_ )cmd_window_ = new CMD_window(); return cmd_window_; } void Execute( ParseLine const * ); private: CMD_window(); static CMD_window *cmd_window_; }; #endif extrema-4.4.5/src/Commands/CMD_grid.cpp0000644012702201742730000003612311274636606016673 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #include #include "wx/wx.h" #include "CMD_grid.h" #include "ECommandError.h" #include "ParseToken.h" #include "ParseLine.h" #include "EExpressionError.h" #include "EVariableError.h" #include "NumericVariable.h" #include "GRA_thiessenTriangulation.h" #include "ExGlobals.h" CMD_grid *CMD_grid::cmd_grid_ = 0; CMD_grid::CMD_grid() : Command( wxT("GRID") ) { AddQualifier( wxT("SIZE"), false ); AddQualifier( wxT("XYOUT"), false ); AddQualifier( wxT("BOUNDS"), false ); AddQualifier( wxT("PATTERN"), false ); AddQualifier( wxT("INDICES"), false ); AddQualifier( wxT("INTERPOLATE"), true ); AddQualifier( wxT("CHECKDUP"), false ); AddQualifier( wxT("MESSAGES"), true ); } void CMD_grid::Execute( ParseLine const *p ) { // GRID x y z m // GRID\SIZE size x y z m // GRID\XYOUT x y z m xout yout // GRID\SIZE\XYOUT size x y z m xout yout // GRID\BOUNDS x y z m minx maxx miny maxy // GRID\SIZE\BOUNDS size x y z m minx maxx miny maxy // GRID\XYOUT\BOUNDS x y z m xout yout minx maxx miny maxy // GRID\SIZE\XYOUT\BOUNDS size x y z m xout yout minx maxx miny maxy // GRID\SIZE matrix { size } x y z { xout yout } { minx maxx miny maxy } // // GRID\PATTERN x y z m // GRID\PATTERN\XYOUT x y z m xout yout // // GRID\INDICES x y z m // GRID\INDICES\XYOUT x y z m xout yout // QualifierMap qualifiers; try { SetUp( p, qualifiers ); } catch (ECommandError &e) { throw; } wxString command( Name()+wxT(": ") ); // int counter = 1; double size; if( qualifiers[wxT("SIZE")] ) { if( qualifiers[wxT("PATTERN")] ) throw ECommandError( command+wxT("\\SIZE incompatible with \\PATTERN") ); if( qualifiers[wxT("INDICES")] ) throw ECommandError( command+wxT("\\SIZE incompatible with \\INDICES") ); if( p->GetNumberOfTokens() < 2 ) throw ECommandError( command+wxT("expecting matrix output size") ); try { NumericVariable::GetScalar( p->GetString(1), wxT("matrix output size"), size ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } if( size < 0.0 )throw ECommandError( command+wxT("output matrix size < 0") ); if( size == 0.0 )throw ECommandError( command+wxT("output matrix size = 0") ); AddToStackLine( p->GetString(1) ); ++counter; } // if( p->GetNumberOfTokens() < 5 ) throw ECommandError( command+wxT("expecting x, y and z vectors") ); std::vector x, y, z; try { NumericVariable::GetVector( p->GetString(counter), wxT("x vector"), x ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // try { NumericVariable::GetVector( p->GetString(counter), wxT("y vector"), y ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( qualifiers[wxT("MESSAGES")] && x.size()!=y.size() ) ExGlobals::WarningMessage( wxT("GRID: x and y vectors have different lengths, using minimum") ); std::size_t num = std::min( x.size(), y.size() ); // try { NumericVariable::GetVector( p->GetString(counter), wxT("z vector"), z ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); if( qualifiers[wxT("MESSAGES")] && z.size()!=num )ExGlobals::WarningMessage( wxT("GRID: vectors have different lengths, using minimum") ); num = std::min( num, z.size() ); // if( qualifiers[wxT("INTERPOLATE")] && num<4 ) throw ECommandError( command+wxT("grid interpolation requires at least 4 points") ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting output matrix name") ); wxString matrixName( p->GetString(counter++) ); AddToStackLine( matrixName ); // if( qualifiers[wxT("CHECKDUP")] ) { std::vector dup( num ); for( std::size_t i=0; i 0 ) { if( qualifiers[wxT("MESSAGES")] ) ExGlobals::WarningMessage( wxString(wxT("GRID: "))+dup.size()+wxT(" duplicate points found") ); for( std::size_t i=0; i( x[0] ); for( std::size_t i=0; i(x[i]) )ncol = static_cast(x[i]); } std::size_t nrow = static_cast( y[0] ); for( std::size_t i=0; i(y[i]) )nrow = static_cast(y[i]); } std::vector xi, yi; wxString xoutName, youtName; if( qualifiers[wxT("XYOUT")] ) { if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting xout vector") ); xoutName = p->GetString(counter++); AddToStackLine( xoutName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting yout vector") ); youtName = p->GetString(counter++); AddToStackLine( youtName ); // for( std::size_t i=0; i(i+1) ); for( std::size_t i=0; i(i+1) ); } std::vector array( nrow*ncol, 0.0 ); for( std::size_t i=0; i(y[i]-1); std::size_t jcol = static_cast(x[i]-1); array[jrow+jcol*nrow] = z[i]; } if( qualifiers[wxT("XYOUT")] ) { NumericVariable::PutVariable( xoutName, xi, 1, p->GetInputLine() ); NumericVariable::PutVariable( youtName, yi, 1, p->GetInputLine() ); } NumericVariable::PutVariable( matrixName, array, nrow, ncol, p->GetInputLine() ); } else if( qualifiers[wxT("PATTERN")] ) // make matrix without interpolation using a full data set { // // GRID\PATTERN X Y Z M // GRID\PATTERN\XYOUT X Y Z M XOUT YOUT // std::size_t ncol, nrow = 1; while( x[0] == x[nrow] )++nrow; bool invert = false; if( nrow == 1 ) { invert = true; ncol = 1; while( y[0] == y[ncol] )++ncol; nrow = num / ncol; if( num!=nrow*ncol || nrow==1 || ncol==1 ) throw ECommandError( command+wxT("non-interpolated matrix is not possible with this data") ); std::vector yi( nrow ); for( std::size_t i=0; i xi( ncol ); if( x[1] < x[0] ) { for( std::size_t i=0; i xi( ncol ); for( std::size_t i=0; i yi( nrow ); if( y[1] < y[0] ) { for( std::size_t i=0; i xi, yi; wxString xoutName, youtName; if( qualifiers[wxT("XYOUT")] ) { if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting xout vector") ); xoutName = p->GetString(counter++); AddToStackLine( xoutName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting yout vector") ); youtName = p->GetString(counter++); AddToStackLine( youtName ); // for( std::size_t i=0; i(i+1) ); for( std::size_t i=0; i(i+1) ); } std::vector array( nrow*ncol, 0.0 ); if( invert ) { std::size_t ii = 0; for( std::size_t i=0; iGetInputLine() ); NumericVariable::PutVariable( youtName, yi, 1, p->GetInputLine() ); } NumericVariable::PutVariable( matrixName, array, nrow, ncol, p->GetInputLine() ); } else // make matrix using interpolation { std::size_t ncol = qualifiers[wxT("SIZE")] ? static_cast(size) : static_cast(5.0*sqrt(1.0*num)); std::size_t nrow = ncol; std::vector array( nrow*ncol, 0.0 ); wxString xoutName, youtName; if( qualifiers[wxT("XYOUT")] ) { if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting xout vector") ); xoutName = p->GetString(counter++); AddToStackLine( xoutName ); // if( p->GetNumberOfTokens()IsString(counter) ) throw ECommandError( command+wxT("expecting yout vector") ); youtName = p->GetString(counter++); AddToStackLine( youtName ); } // // if the xmin, xmax, ymin, and ymax were not entered as parameters // with the command then they will be taken from the minimum // and the maximum of the data // double xmin, xmax, ymin, ymax; if( qualifiers[wxT("BOUNDS")] ) { if( p->GetNumberOfTokens() < counter+1 ) throw ECommandError( command+wxT("expecting xmin") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("xmin"), xmin ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens() < counter+1 )throw ECommandError( command+wxT("expecting xmax") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("xmax"), xmax ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens() < counter+1 )throw ECommandError( command+wxT("expecting ymin") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("ymin"), ymin ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); // if( p->GetNumberOfTokens() < counter+1 )throw ECommandError( command+wxT("expecting ymax") ); try { NumericVariable::GetScalar( p->GetString(counter), wxT("ymax"), ymax ); } catch( EVariableError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } AddToStackLine( p->GetString(counter++) ); } else { xmin = x[0]; xmax = xmin; ymin = y[0]; ymax = ymin; for( std::size_t i=0; i x[i] )xmin = x[i]; if( xmax < x[i] )xmax = x[i]; if( ymin > y[i] )ymin = y[i]; if( ymax < y[i] )ymax = y[i]; } } double xinc = (xmax-xmin)/(ncol-1); double yinc = (ymax-ymin)/(ncol-1); std::vector xi( ncol ); std::vector yi( ncol ); for( std::size_t i=0; iGetInputLine() ); NumericVariable::PutVariable( youtName, yi, 1, p->GetInputLine() ); } NumericVariable::PutVariable( matrixName, array, ncol, ncol, p->GetInputLine() ); if( qualifiers[wxT("MESSAGES")] ) { ExGlobals::WriteOutput( wxT("grid completed successfully") ); wxString s(wxT("matrix ")); s << matrixName << wxT(" has ") << nrow << wxT(" rows and ") << ncol << wxT(" columns"); ExGlobals::WriteOutput( s ); } } } // end of file extrema-4.4.5/src/Commands/Makefile.in0000644012702201742730000005607011440762625016623 0ustar spangspang# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # Copyright (C) 2006 Joseph L. Chuma # # This file is free software; as a special exception the author 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. VPATH = @srcdir@ 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 = src/Commands DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcommands_la_LIBADD = am_libcommands_la_OBJECTS = CMD_alias.lo CMD_bestfit.lo CMD_bin2d.lo \ CMD_bin.lo CMD_clear.lo CMD_contour.lo CMD_dealias.lo \ CMD_defaults.lo CMD_define.lo CMD_density.lo CMD_destroy.lo \ CMD_display.lo CMD_do.lo CMD_ellipse.lo CMD_enddo.lo \ CMD_endif.lo CMD_evaluateExpression.lo CMD_execute.lo \ CMD_figure.lo CMD_filter.lo CMD_fit.lo CMD_form.lo \ CMD_generate.lo CMD_get.lo CMD_goto.lo CMD_graph.lo \ CMD_grid.lo CMD_hardcopy.lo CMD_help.lo CMD_if.lo \ CMD_inquire.lo CMD_list.lo CMD_matrix.lo CMD_minuit.lo \ CMD_page.lo CMD_pause.lo CMD_polygon.lo CMD_quit.lo \ CMD_read.lo CMD_rebin.lo CMD_replot.lo CMD_restore.lo \ CMD_return.lo CMD_save.lo CMD_scalar.lo CMD_scales.lo \ CMD_set.lo CMD_show.lo CMD_sort.lo CMD_stack.lo \ CMD_statistics.lo CMD_text.lo CMD_vector.lo CMD_window.lo \ CMD_world.lo CMD_write.lo CMD_zerolines.lo Command.lo \ CommandTable.lo Extrema_fcn.lo libcommands_la_OBJECTS = $(am_libcommands_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcommands_la_SOURCES) DIST_SOURCES = $(libcommands_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ 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@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EX_CXXFLAGS = @EX_CXXFLAGS@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ GTK_LIBS = @GTK_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@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINUIT_CXXFLAGS = @MINUIT_CXXFLAGS@ MINUIT_LIB = @MINUIT_LIB@ MKDIR_P = @MKDIR_P@ MUD_CXXFLAGS = @MUD_CXXFLAGS@ MUD_LIB = @MUD_LIB@ OBJEXT = @OBJEXT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CONFIG = @WX_CONFIG@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_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@ ac_ct_F77 = @ac_ct_F77@ 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@ AM_CPPFLAGS = $(EX_CXXFLAGS) $(WX_CXXFLAGS) $(MUD_CXXFLAGS) $(MINUIT_CXXFLAGS) noinst_LTLIBRARIES = libcommands.la libcommands_la_SOURCES = CMD_alias.cpp CMD_alias.h \ CMD_bestfit.cpp CMD_bestfit.h \ CMD_bin2d.cpp CMD_bin2d.h \ CMD_bin.cpp CMD_bin.h \ CMD_clear.cpp CMD_clear.h \ CMD_contour.cpp CMD_contour.h \ CMD_dealias.cpp CMD_dealias.h \ CMD_defaults.cpp CMD_defaults.h \ CMD_define.cpp CMD_define.h \ CMD_density.cpp CMD_density.h \ CMD_destroy.cpp CMD_destroy.h \ CMD_display.cpp CMD_display.h \ CMD_do.cpp CMD_do.h \ CMD_ellipse.cpp CMD_ellipse.h \ CMD_enddo.cpp CMD_enddo.h \ CMD_endif.cpp CMD_endif.h \ CMD_evaluateExpression.cpp CMD_evaluateExpression.h \ CMD_execute.cpp CMD_execute.h \ CMD_figure.cpp CMD_figure.h \ CMD_filter.cpp CMD_filter.h \ CMD_fit.cpp CMD_fit.h \ CMD_form.cpp CMD_form.h \ CMD_generate.cpp CMD_generate.h \ CMD_get.cpp CMD_get.h \ CMD_goto.cpp CMD_goto.h \ CMD_graph.cpp CMD_graph.h \ CMD_grid.cpp CMD_grid.h \ CMD_hardcopy.cpp CMD_hardcopy.h \ CMD_help.cpp CMD_help.h \ CMD_if.cpp CMD_if.h \ CMD_inquire.cpp CMD_inquire.h \ CMD_list.cpp CMD_list.h \ CMD_matrix.cpp CMD_matrix.h \ CMD_minuit.cpp CMD_minuit.h \ CMD_page.cpp CMD_page.h \ CMD_pause.cpp CMD_pause.h \ CMD_polygon.cpp CMD_polygon.h \ CMD_quit.cpp CMD_quit.h \ CMD_read.cpp CMD_read.h \ CMD_rebin.cpp CMD_rebin.h \ CMD_replot.cpp CMD_replot.h \ CMD_restore.cpp CMD_restore.h \ CMD_return.cpp CMD_return.h \ CMD_save.cpp CMD_save.h \ CMD_scalar.cpp CMD_scalar.h \ CMD_scales.cpp CMD_scales.h \ CMD_set.cpp CMD_set.h \ CMD_show.cpp CMD_show.h \ CMD_sort.cpp CMD_sort.h \ CMD_stack.cpp CMD_stack.h \ CMD_statistics.cpp CMD_statistics.h \ CMD_text.cpp CMD_text.h \ CMD_vector.cpp CMD_vector.h \ CMD_window.cpp CMD_window.h \ CMD_world.cpp CMD_world.h \ CMD_write.cpp CMD_write.h \ CMD_zerolines.cpp CMD_zerolines.h \ Command.cpp Command.h \ CommandTable.cpp CommandTable.h \ Extrema_fcn.cpp Extrema_fcn.h \ ECommandError.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .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) --gnu src/Commands/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Commands/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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcommands.la: $(libcommands_la_OBJECTS) $(libcommands_la_DEPENDENCIES) $(CXXLINK) $(libcommands_la_OBJECTS) $(libcommands_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_alias.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_bestfit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_bin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_bin2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_clear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_contour.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_dealias.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_defaults.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_define.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_density.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_destroy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_display.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_do.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_ellipse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_enddo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_endif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_evaluateExpression.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_execute.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_figure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_filter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_fit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_form.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_generate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_goto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_graph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_grid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_hardcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_help.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_if.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_inquire.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_minuit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_pause.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_polygon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_quit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_rebin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_replot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_restore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_return.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_save.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_scalar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_scales.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_set.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_show.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_sort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_stack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_statistics.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_world.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMD_zerolines.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Command.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Extrema_fcn.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(LTLIBRARIES) installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(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-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) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags 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: extrema-4.4.5/src/Commands/CMD_generate.h0000644012702201742730000000212011274636606017173 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_GENERATE #define CMD_GENERATE #include "Command.h" class ParseLine; class CMD_generate : public Command { public: static CMD_generate *Instance() { if( !cmd_generate_ )cmd_generate_ = new CMD_generate(); return cmd_generate_; } void Execute( ParseLine const * ); private: CMD_generate(); static CMD_generate *cmd_generate_; }; #endif extrema-4.4.5/src/Commands/CMD_zerolines.h0000644012702201742730000000213511274636606017421 0ustar spangspang/* Copyright (C) 2005 Joseph L. Chuma, TRIUMF 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. */ #ifndef CMD_ZEROLINES #define CMD_ZEROLINES #include "Command.h" class ParseLine; class CMD_zerolines : public Command { public: static CMD_zerolines *Instance() { if( !cmd_zerolines_ )cmd_zerolines_ = new CMD_zerolines(); return cmd_zerolines_; } void Execute( ParseLine const * ); private: CMD_zerolines(); static CMD_zerolines *cmd_zerolines_; }; #endif extrema-4.4.5/src/Commands/CMD_execute.cpp0000644012702201742730000001737311274636606017416 0ustar spangspang/* Copyright (C) 2005,...,2007 Joseph L. Chuma, TRIUMF 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. */ #include #include "CMD_execute.h" #include "ECommandError.h" #include "ESyntaxError.h" #include "ParseLine.h" #include "Script.h" #include "EVariableError.h" #include "TextVariable.h" #include "ExGlobals.h" CMD_execute *CMD_execute::cmd_execute_ = 0; CMD_execute::CMD_execute() : Command( wxT("EXECUTE") ) {} void CMD_execute::Execute( ParseLine const *p ) { // Commands will be read from a file instead of from the terminal // // The order in which things are done: // 1) parameters input with the EXECUTE command are stored in PARAM common // 2) read a line from the file // 3) continuation lines are fixed up, i.e., made into single line // 4) the line is stored, along with start and end pointers // 5) any ?'s that were not supplied with the EXEC command are now requested // SetUp( p ); // wxString command( Name()+wxT(": ") ); if( p->GetNumberOfTokens() == 1 ) throw ECommandError( command+wxT("expecting a script file name") ); // if( p->IsNull(1) || p->IsNumeric(1) || p->IsEqualSign(1) || p->GetString(1).empty() ) throw ECommandError( command+wxT("expecting a script file name") ); // wxString fname( p->GetString(1) ); ExGlobals::RemoveQuotes( fname ); try { TextVariable::GetVariable( p->GetString(1), true, fname ); } catch (EVariableError &e) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } wxString fnameSave( fname ); // inStream_.close(); inStream_.clear( std::ios::goodbit ); inStream_.open( fname.mb_str(wxConvUTF8), std::ios::in ); if( !inStream_.is_open() ) { inStream_.clear( std::ios::goodbit ); // // get the file extension, if there was one given // wxString extension( ExGlobals::GetFileExtension(fname) ); if( extension.empty() ) { // no extension given, append .pcm to the filename and try again // and if that fails, try the .stk extension // fname += wxT('.')+ExGlobals::GetScriptExtension(); try { TryPaths( fname ); } catch ( ECommandError &e ) { fname = fnameSave+wxT('.')+ExGlobals::GetStackExtension(); try { TryPaths( fname ); } catch ( ECommandError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } else // an extension was given { try { TryPaths( fname ); } catch ( ECommandError &e ) { throw ECommandError( command+wxString(e.what(),wxConvUTF8) ); } } } if( !inStream_.is_open() ) throw ECommandError( command+wxT("unable to open ")+fname ); // // do not allow the currently open stack file to be executed // this would lead to recursion // if( ExGlobals::StackIsOn() && ExGlobals::GetStackFile()==fname ) throw ECommandError( command+wxT("executing an open stack file leads to recursion") ); // AddToStackLine( p->GetString(1) ); std::auto_ptr